This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-28389 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 3026367787089193f0a70f97e8d34ea871f066fa Author: AMashenkov <[email protected]> AuthorDate: Wed Apr 8 20:23:16 2026 +0300 wip --- .../engine/rule/logical/FilterScanMergeRule.java | 15 ++++++ .../resources/mapping/test_partition_pruning.test | 58 +++++++--------------- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/FilterScanMergeRule.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/FilterScanMergeRule.java index 77828bb5de7..42cf90fc975 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/FilterScanMergeRule.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/FilterScanMergeRule.java @@ -26,6 +26,7 @@ import org.apache.calcite.plan.RelRule; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.logical.LogicalFilter; +import org.apache.calcite.rel.logical.LogicalValues; import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; @@ -99,6 +100,20 @@ public abstract class FilterScanMergeRule<T extends ProjectableFilterableTableSc // We need to replace RexInputRef with RexLocalRef because TableScan doesn't have inputs. condition = RexUtils.replaceInputRefs(condition); + // Eliminate scan if always false condition found. + if (condition.isAlwaysFalse()) { + call.transformTo(LogicalValues.createEmpty(cluster, scan.getRowType())); + call.getPlanner().prune(filter); + return; + } + + // Eliminate always true condition. + if (condition.isAlwaysTrue()) { + call.transformTo(scan); + call.getPlanner().prune(filter); + return; + } + // Set default traits, real traits will be calculated for physical node. RelTraitSet trait = cluster.traitSet(); diff --git a/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test b/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test index d0932226f45..f3df6dc3497 100644 --- a/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test +++ b/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test @@ -164,7 +164,6 @@ Fragment#4 est: (rows=1) --- # Self join, different predicates that produce disjoint set of partitions -# TODO https://issues.apache.org/jira/browse/IGNITE-28389: Fix the test. We expect the mapper should eliminate all the disjoined parts. N1 SELECT /*+ DISABLE_RULE('NestedLoopJoinConverter', 'HashJoinConverter', 'CorrelatedNestedLoopJoin') */ * FROM t1_n1n2n3 as t1, t1_n1n2n3 as t2 @@ -173,48 +172,27 @@ SELECT /*+ DISABLE_RULE('NestedLoopJoinConverter', 'HashJoinConverter', 'Correla Fragment#2 root distribution: single executionNodes: [N1] - exchangeSourceNodes: {3=[N1, N2, N3]} - colocationGroup[-1]: {nodes=[N1], sourceIds=[-1, 3], assignments={}, partitionsWithConsistencyTokens={N1=[]}} - colocationGroup[3]: {nodes=[N1], sourceIds=[-1, 3], assignments={}, partitionsWithConsistencyTokens={N1=[]}} + colocationGroup[-1]: {nodes=[N1], sourceIds=[-1], assignments={}, partitionsWithConsistencyTokens={N1=[]}} tree: - Receiver + MergeJoin + predicate: =(ID, ID$0) fieldNames: [ID, C1, C2, ID$0, C1$0, C2$0] - sourceFragmentId: 3 + type: inner est: (rows=1) - -Fragment#3 - distribution: table PUBLIC.T1_N1N2N3 in zone ZONE_1 - executionNodes: [N1, N2, N3] - targetNodes: [N1] - colocationGroup[0]: {nodes=[N1, N2, N3], sourceIds=[0, 1], assignments={part_0=N1:3, part_1=N2:3, part_2=N3:3}, partitionsWithConsistencyTokens={N1=[part_0:3], N2=[part_1:3], N3=[part_2:3]}} - colocationGroup[1]: {nodes=[N1, N2, N3], sourceIds=[0, 1], assignments={part_0=N1:3, part_1=N2:3, part_2=N3:3}, partitionsWithConsistencyTokens={N1=[part_0:3], N2=[part_1:3], N3=[part_2:3]}} - partitions: [T1_N1N2N3=[N1={0}, N2={1}, N3={2}]] - tree: - Sender - distribution: single - targetFragmentId: 2 - est: (rows=6250) - MergeJoin - predicate: =(ID, ID$0) - fieldNames: [ID, C1, C2, ID$0, C1$0, C2$0] - type: inner - est: (rows=6250) - Sort - collation: [ID ASC] - est: (rows=25000) - TableScan - table: PUBLIC.T1_N1N2N3 - predicate: false - fieldNames: [ID, C1, C2] - est: (rows=25000) - Sort - collation: [ID ASC] - est: (rows=25000) - TableScan - table: PUBLIC.T1_N1N2N3 - predicate: false - fieldNames: [ID, C1, C2] - est: (rows=25000) + Sort + collation: [ID ASC] + est: (rows=1) + Values + fieldNames: [ID, C1, C2] + tuples: [] + est: (rows=1) + Sort + collation: [ID ASC] + est: (rows=1) + Values + fieldNames: [ID, C1, C2] + tuples: [] + est: (rows=1) --- # Correlated # Prune partitions from left arm statically, and pass meta to the right arm.
