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

ppa 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 8a848cb24e IGNITE-21722 Sql. Fix NPE in correlated nested loop join 
(#3504)
8a848cb24e is described below

commit 8a848cb24e5863d749ddb88fb447c57df88263cc
Author: Pavel Pereslegin <xxt...@gmail.com>
AuthorDate: Fri Mar 29 10:39:11 2024 +0300

    IGNITE-21722 Sql. Fix NPE in correlated nested loop join (#3504)
---
 .../engine/exec/rel/CorrelatedNestedLoopJoinNode.java    | 16 +++++++++++-----
 .../internal/sql/engine/exec/rel/ExecutionTest.java      |  5 ++++-
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/CorrelatedNestedLoopJoinNode.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/CorrelatedNestedLoopJoinNode.java
index 9befc478c6..c298cb553a 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/CorrelatedNestedLoopJoinNode.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/CorrelatedNestedLoopJoinNode.java
@@ -408,14 +408,20 @@ public class CorrelatedNestedLoopJoinNode<RowT> extends 
AbstractNode<RowT> {
             if (joinType == JoinRelType.LEFT && !nullOrEmpty(leftInBuf)) {
                 int notMatchedIdx = leftMatched.nextClearBit(0);
 
-                while (requested > 0 && notMatchedIdx < leftInBuf.size()) {
-                    
downstream().push(handler.concat(leftInBuf.get(notMatchedIdx), rightEmptyRow));
+                state = State.IN_LOOP;
 
-                    requested--;
+                try {
+                    while (requested > 0 && notMatchedIdx < leftInBuf.size()) {
+                        requested--;
+
+                        
downstream().push(handler.concat(leftInBuf.get(notMatchedIdx), rightEmptyRow));
 
-                    leftMatched.set(notMatchedIdx);
+                        leftMatched.set(notMatchedIdx);
 
-                    notMatchedIdx = leftMatched.nextClearBit(notMatchedIdx + 
1);
+                        notMatchedIdx = leftMatched.nextClearBit(notMatchedIdx 
+ 1);
+                    }
+                } finally {
+                    state = State.IDLE;
                 }
 
                 if (requested == 0 && notMatchedIdx < leftInBuf.size()) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
index 136753087d..162b8b06df 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExecutionTest.java
@@ -496,8 +496,11 @@ public class ExecutionTest extends 
AbstractExecutionTest<Object[]> {
 
         join.register(Arrays.asList(left, right));
 
+        FilterNode<Object[]> filter = new FilterNode<>(ctx, r -> true);
+        filter.register(join);
+
         RootNode<Object[]> root = new RootNode<>(ctx);
-        root.register(join);
+        root.register(filter);
 
         int cnt = 0;
         while (root.hasNext()) {

Reply via email to