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 <[email protected]>
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()) {