You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by zs...@apache.org on 2022/02/02 05:43:52 UTC

[ignite-3] branch main updated: IGNITE-16349 Sql. Check for potential NPE after IGNITE-15462 - Fixes #585.

This is an automated email from the ASF dual-hosted git repository.

zstan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 0cef02c  IGNITE-16349 Sql. Check for potential NPE after IGNITE-15462 - Fixes #585.
0cef02c is described below

commit 0cef02c935e56216834fbc2758bd3f81f8e271a6
Author: vladimirermakov <vl...@gmail.com>
AuthorDate: Wed Feb 2 08:38:19 2022 +0300

    IGNITE-16349 Sql. Check for potential NPE after IGNITE-15462 - Fixes #585.
    
    Signed-off-by: zstan <st...@gmail.com>
---
 .../ignite/internal/sql/engine/exec/ExchangeServiceImpl.java   |  3 ++-
 .../ignite/internal/sql/engine/exec/ExecutionContext.java      |  3 ++-
 .../org/apache/ignite/internal/sql/engine/exec/rel/Inbox.java  |  1 +
 .../internal/sql/engine/metadata/FragmentDescription.java      |  8 ++++----
 .../ignite/internal/sql/engine/metadata/IgniteMdCollation.java | 10 ++++++----
 .../internal/sql/engine/exec/rel/AbstractExecutionTest.java    |  3 ++-
 6 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
index 6d6c1c1..3d5fcb5 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine.exec;
 
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
+import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -262,7 +263,7 @@ public class ExchangeServiceImpl implements ExchangeService {
                         fragmentId,
                         null,
                         null,
-                        null),
+                        Long2ObjectMaps.emptyMap()),
                 null,
                 Map.of());
     }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
index 456dce2..9b20c90 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionContext.java
@@ -154,8 +154,9 @@ public class ExecutionContext<RowT> extends AbstractQueryContext implements Data
      * Get remote nodes for the given exchange id.
      *
      * @param exchangeId ExchangeId to find remote nodes for.
-     * @return Remote nodes for given exchangeId.
+     * @return Remote nodes for given exchangeId, or {@code null}, when remote nodes not found for given exchangeId.
      */
+    @Nullable
     public List<String> remotes(long exchangeId) {
         return fragmentDesc.remotes().get(exchangeId);
     }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/Inbox.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/Inbox.java
index 27d1434..6b42626 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/Inbox.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/Inbox.java
@@ -104,6 +104,7 @@ public class Inbox<RowT> extends AbstractNode<RowT> implements Mailbox<RowT>, Si
      */
     public void init(
             ExecutionContext<RowT> ctx, RelDataType rowType, Collection<String> srcNodeIds, @Nullable Comparator<RowT> comp) {
+        assert srcNodeIds != null : "Collection srcNodeIds not found for exchangeId: " + exchangeId;
         assert context().fragmentId() == ctx.fragmentId() : "different fragments unsupported: previous=" + context().fragmentId()
                 + " current=" + ctx.fragmentId();
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/FragmentDescription.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/FragmentDescription.java
index 3713eb9..0cd845e 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/FragmentDescription.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/FragmentDescription.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.metadata;
 
-import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
 import java.io.Serializable;
 import java.util.List;
 
@@ -32,7 +32,7 @@ public class FragmentDescription implements Serializable {
 
     private ColocationGroup target;
 
-    private Long2ObjectOpenHashMap<List<String>> remoteSources;
+    private Long2ObjectMap<List<String>> remoteSources;
 
     /**
      * Constructor.
@@ -46,7 +46,7 @@ public class FragmentDescription implements Serializable {
      * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
      */
     public FragmentDescription(long fragmentId, FragmentMapping mapping, ColocationGroup target,
-            Long2ObjectOpenHashMap<List<String>> remoteSources) {
+            Long2ObjectMap<List<String>> remoteSources) {
         this.fragmentId = fragmentId;
         this.mapping = mapping;
         this.target = target;
@@ -77,7 +77,7 @@ public class FragmentDescription implements Serializable {
     /**
      * Get remotes.
      */
-    public Long2ObjectOpenHashMap<List<String>> remotes() {
+    public Long2ObjectMap<List<String>> remotes() {
         return remoteSources;
     }
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdCollation.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdCollation.java
index b1f15f1..0163996 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdCollation.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdCollation.java
@@ -23,9 +23,10 @@ import com.google.common.collect.ImmutableList;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
+import it.unimi.dsi.fastutil.ints.IntLists;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -311,7 +312,7 @@ public class IgniteMdCollation implements MetadataHandler<BuiltInMetadata.Collat
         if (inputCollations == null || inputCollations.isEmpty()) {
             return List.of();
         }
-        final Int2ObjectOpenHashMap<List<Integer>> targets = new Int2ObjectOpenHashMap<>();
+        final Int2ObjectOpenHashMap<IntList> targets = new Int2ObjectOpenHashMap<>();
         final Int2ObjectOpenHashMap<SqlMonotonicity> targetsWithMonotonicity =
                 new Int2ObjectOpenHashMap<>();
         for (Ord<RexNode> project : Ord.<RexNode>zip(projects)) {
@@ -342,14 +343,15 @@ public class IgniteMdCollation implements MetadataHandler<BuiltInMetadata.Collat
             fieldCollations.clear();
             boolean skip = false;
             for (RelFieldCollation ifc : ic.getFieldCollations()) {
-                final Collection<Integer> integers = targets.get(ifc.getFieldIndex());
+                final IntList integers = targets.getOrDefault(ifc.getFieldIndex(),
+                        IntLists.emptyList());
                 if (integers.isEmpty()) {
                     skip = true; // cannot do this collation
 
                     break;
                 }
 
-                fieldCollations.add(ifc.withFieldIndex(integers.iterator().next()));
+                fieldCollations.add(ifc.withFieldIndex(integers.intIterator().nextInt()));
             }
 
             if (skip) {
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/AbstractExecutionTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/AbstractExecutionTest.java
index cc35f1d..be35c16 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/AbstractExecutionTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/AbstractExecutionTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine.exec.rel;
 
 import com.google.common.collect.ImmutableMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.Iterator;
@@ -92,7 +93,7 @@ public class AbstractExecutionTest extends IgniteAbstractTest {
             IgniteTestUtils.setFieldValue(taskExecutor, "stripedThreadPoolExecutor", testExecutor);
         }
 
-        FragmentDescription fragmentDesc = new FragmentDescription(0, null, null, null);
+        FragmentDescription fragmentDesc = new FragmentDescription(0, null, null, Long2ObjectMaps.emptyMap());
         return new ExecutionContext<>(
                 BaseQueryContext.builder()
                         .logger(log)