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.

Reply via email to