Maksim Zhuravkov created IGNITE-25658: -----------------------------------------
Summary: Sql. Cannot cancel a query fragment with a sequence of NestedLoopJoin operators Key: IGNITE-25658 URL: https://issues.apache.org/jira/browse/IGNITE-25658 Project: Ignite Issue Type: Bug Components: sql ai3 Reporter: Maksim Zhuravkov This query demonstrates that a sequence of NestedLoopJoin operators does not preempt itself, thus preventing the SQL engine from cancelling a query: {noformat} @Test public void cancelStatement2() throws InterruptedException { IgniteSql sql = igniteSql(); sql.executeScript("CREATE TABLE TEST(ID INT PRIMARY KEY, VAL INT)"); for (int i = 0; i < 10; i++) { sql.executeScript("INSERT INTO TEST VALUES (?, ?)", i, i); } var crossJoin10x = "SELECT count(*) FROM (" + "SELECT " + "t1.ID AS ID1, t2.ID AS ID2, t3.ID AS ID3, t4.ID AS ID4, t5.ID AS ID5, " + "t6.ID AS ID6, t7.ID AS ID7, t8.ID AS ID8, t9.ID AS ID9, t10.ID AS ID10 " + "FROM TEST t1 " + "CROSS JOIN TEST t2 " + "CROSS JOIN TEST t3 " + "CROSS JOIN TEST t4 " + "CROSS JOIN TEST t5 " + "CROSS JOIN TEST t6 " + "CROSS JOIN TEST t7 " + "CROSS JOIN TEST t8 " + "CROSS JOIN TEST t9 " + "CROSS JOIN TEST t10" + ")"; { ResultSet<SqlRow> rs = sql.execute(null, "EXPLAIN PLAN FOR " + crossJoin10x); System.err.println(rs.next().stringValue(0)); rs.close(); } { Statement statement = sql.statementBuilder() .query(crossJoin10x) .build(); CancelHandle cancelHandle = CancelHandle.create(); CompletableFuture<AsyncResultSet<SqlRow>> fut = sql.executeAsync(null, cancelHandle.token(), statement); Thread.sleep(2000); cancelHandle.cancel(); fut.join(); } } {noformat} Plan: {noformat} ColocatedHashAggregate fieldNames: [EXPR$0] group: [] aggregation: [COUNT()] est: (rows=1) Project fieldNames: [DUMMY7, DUMMY1, DUMMY3, DUMMY5, DUMMY8, DUMMY6, DUMMY, DUMMY0, DUMMY2, DUMMY4] projection: [DUMMY7, DUMMY1, DUMMY3, DUMMY5, DUMMY8, DUMMY6, DUMMY, DUMMY0, DUMMY2, DUMMY4] est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3, DUMMY4, DUMMY5, DUMMY6, DUMMY7, DUMMY8] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3, DUMMY4, DUMMY5, DUMMY6, DUMMY7] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3, DUMMY4, DUMMY5, DUMMY6] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3, DUMMY4, DUMMY5] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3, DUMMY4] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2, DUMMY3] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1, DUMMY2] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0, DUMMY1] type: inner est: (rows=1) NestedLoopJoin predicate: true fieldNames: [DUMMY, DUMMY0] type: inner est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) Exchange distribution: single est: (rows=1) TableScan table: PUBLIC.TEST fieldNames: [DUMMY] projection: [0] est: (rows=1) {noformat} Thread dump: {noformat} at SC.project(Unknown Source) at org.apache.ignite.internal.sql.engine.exec.exp.JoinProjectionImplementor$SqlJoinProjectionImpl.project(JoinProjectionImplementor.java:176) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:217) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.join(NestedLoopJoinNode.java:218) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode.pushLeft(AbstractRightMaterializedJoinNode.java:129) at org.apache.ignite.internal.sql.engine.exec.rel.NestedLoopJoinNode$InnerJoin.pushLeft(NestedLoopJoinNode.java:190) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractRightMaterializedJoinNode$1.push(AbstractRightMaterializedJoinNode.java:73) at org.apache.ignite.internal.sql.engine.exec.rel.Inbox.pushUnordered(Inbox.java:337) at org.apache.ignite.internal.sql.engine.exec.rel.Inbox.push(Inbox.java:220) at org.apache.ignite.internal.sql.engine.exec.rel.Inbox.onBatchReceived(Inbox.java:204) at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.onMessage(ExchangeServiceImpl.java:178) at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.lambda$start$1(ExchangeServiceImpl.java:78) at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl$$Lambda$2785/0x0000000800da5440.onMessage(Unknown Source) at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.onMessageInternal(MessageServiceImpl.java:171) at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.lambda$onMessage$1(MessageServiceImpl.java:135) at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl$$Lambda$3989/0x00000008010f7040.run(Unknown Source) at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:86) at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl$$Lambda$3014/0x0000000800e36840.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.14.1/ThreadPoolExecutor.java:1128) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.14.1/ThreadPoolExecutor.java:628) at java.lang.Thread.run(java.base@11.0.14.1/Thread.java:829) {noformat} -- This message was sent by Atlassian Jira (v8.20.10#820010)