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()) {