This is an automated email from the ASF dual-hosted git repository.

snuyanzin pushed a commit to branch release-2.3
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/release-2.3 by this push:
     new 0ca0bec4ae1 [FLINK-40799][table] FlinkMarkChangeLogNormalizeProgram 
should cast to `RexCall` only in case of `AND`
0ca0bec4ae1 is described below

commit 0ca0bec4ae171db1e78add24e75af64940468f06
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Thu Nov 5 18:26:37 2026 +0100

    [FLINK-40799][table] FlinkMarkChangeLogNormalizeProgram should cast to 
`RexCall` only in case of `AND`
---
 .../stream/FlinkMarkChangelogNormalizeProgram.java |   4 +-
 .../PushCalcPastChangelogNormalizeRuleTest.java    |  23 ++
 .../PushCalcPastChangelogNormalizeRuleTest.xml     | 234 ++++++++++-----------
 3 files changed, 142 insertions(+), 119 deletions(-)

diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/rules/physical/stream/FlinkMarkChangelogNormalizeProgram.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/rules/physical/stream/FlinkMarkChangelogNormalizeProgram.java
index 24d3ee495c7..482142706d4 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/rules/physical/stream/FlinkMarkChangelogNormalizeProgram.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/rules/physical/stream/FlinkMarkChangelogNormalizeProgram.java
@@ -180,12 +180,12 @@ public class FlinkMarkChangelogNormalizeProgram
                         changelogNormalizeContexts.stream()
                                 .map(ChangelogNormalizeContext::getConditions)
                                 .collect(Collectors.toList()));
-        final RexCall factors = (RexCall) RexUtil.pullFactors(rexBuilder, or);
+        final RexNode factors = RexUtil.pullFactors(rexBuilder, or);
 
         final List<RexNode> commonCondition = new ArrayList<>();
         // Since we are interested in factors only then look for AND
         if (factors.getKind() == SqlKind.AND) {
-            for (RexNode node : factors.getOperands()) {
+            for (RexNode node : ((RexCall) factors).getOperands()) {
                 // If there is OR on top level then it is not a common factor 
anymore
                 if (node.getKind() == SqlKind.OR) {
                     break;
diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.java
index a31f9c574c0..291b6fe16a5 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.java
@@ -31,8 +31,10 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.flink.table.api.DataTypes.BIGINT;
+import static org.apache.flink.table.api.DataTypes.BOOLEAN;
 import static org.apache.flink.table.api.DataTypes.INT;
 import static org.apache.flink.table.api.DataTypes.STRING;
+import static org.assertj.core.api.Assertions.assertThatCode;
 
 /** Tests for {@link PushCalcPastChangelogNormalizeRule}. */
 class PushCalcPastChangelogNormalizeRuleTest extends TableTestBase {
@@ -51,6 +53,7 @@ class PushCalcPastChangelogNormalizeRuleTest extends 
TableTestBase {
                                         .column("f1", INT().notNull())
                                         .column("f2", STRING())
                                         .column("f3", BIGINT().notNull())
+                                        .column("f4", BOOLEAN())
                                         .primaryKey("f1")
                                         .build())
                         .unboundedScanSource(ChangelogMode.upsert())
@@ -228,6 +231,26 @@ class PushCalcPastChangelogNormalizeRuleTest extends 
TableTestBase {
                         + " INTERSECT SELECT f3 FROM T WHERE f2 > 0 AND f2 < 
10");
     }
 
+    @Test
+    void testSelfJoinWithIdenticalBooleanColumnFilter() {
+        util.tableEnv().createTable("T", sourceDescriptor);
+        final String sql =
+                "SELECT f1.f1 FROM T AS f1 "
+                        + "JOIN T AS f2 ON f1.f1 = f2.f1 "
+                        + "WHERE f1.f4 AND f2.f4";
+        assertThatCode(() -> 
util.tableEnv().explainSql(sql)).doesNotThrowAnyException();
+    }
+
+    @Test
+    void testSelfJoinWithDisjunctiveFilter() {
+        util.tableEnv().createTable("T", sourceDescriptor);
+        final String sql =
+                "SELECT f1.f1 FROM T AS f1 "
+                        + "JOIN T AS f2 ON f1.f1 = f2.f1 "
+                        + "WHERE (f1.f4 OR f1.f3 < 1) AND (f2.f4 OR f2.f3 < 
1)";
+        assertThatCode(() -> 
util.tableEnv().explainSql(sql)).doesNotThrowAnyException();
+    }
+
     @Test
     void testPartialPushDownWithTrimmedFields() {
         util.tableEnv().createTable("T", sourceDescriptorWithTwoPrimaryKeys);
diff --git 
a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.xml
 
b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.xml
index 646fa9943b4..4865d9e492f 100644
--- 
a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.xml
+++ 
b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/physical/stream/PushCalcPastChangelogNormalizeRuleTest.xml
@@ -46,33 +46,33 @@ Calc(select=[f1, f5])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($0, 10), >($0, 1), IS NOT NULL($0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($0, 2), >($0, 0), IS NOT NULL($0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(<($0, 4), >($0, 2), IS NOT NULL($0))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
-      :- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f0, Sarg[(1..10)])])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
+      :- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f0, Sarg[(1..10)])])
       :  +- ChangelogNormalize(key=[f1], condition=[f0 IS NOT 
NULL])(reuse_id=[1])
       :     +- Exchange(distribution=[hash[f1]])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
-         :  +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f0, Sarg[(0..2)])])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+         :  +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f0, 
Sarg[(0..2)])])
          :     +- Reused(reference_id=[1])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
-            +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f0, Sarg[(2..4)])])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+            +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f0, 
Sarg[(2..4)])])
                +- Reused(reference_id=[1])
 ]]>
     </Resource>
@@ -86,35 +86,35 @@ GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, 
f2, f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T2]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T3]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
       :- ChangelogNormalize(key=[f1], condition=[SEARCH(f3, Sarg[(0..1)])])
       :  +- Exchange(distribution=[hash[f1]])
-      :     +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
+      :     +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
          :  +- ChangelogNormalize(key=[f1], condition=[SEARCH(f3, 
Sarg[(0..1)])])
          :     +- Exchange(distribution=[hash[f1]])
-         :        +- TableSourceScan(table=[[default_catalog, 
default_database, T2]], fields=[f0, f1, f2, f3])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
+         :        +- TableSourceScan(table=[[default_catalog, 
default_database, T2]], fields=[f0, f1, f2, f3, f4])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
             +- ChangelogNormalize(key=[f1], condition=[SEARCH(f3, 
Sarg[(0..1)])])
                +- Exchange(distribution=[hash[f1]])
-                  +- TableSourceScan(table=[[default_catalog, 
default_database, T3]], fields=[f0, f1, f2, f3])
+                  +- TableSourceScan(table=[[default_catalog, 
default_database, T3]], fields=[f0, f1, f2, f3, f4])
 ]]>
     </Resource>
   </TestCase>
@@ -127,33 +127,33 @@ INTERSECT SELECT * FROM T WHERE f3 > 0]]>
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[<($3, 1)])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[<($3, 3)])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[>($3, 0)])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
-      :- Calc(select=[f0, f1, f2, f3], where=[(f3 < 1)])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
+      :- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 < 1)])
       :  +- ChangelogNormalize(key=[f1])(reuse_id=[1])
       :     +- Exchange(distribution=[hash[f1]])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
-         :  +- Calc(select=[f0, f1, f2, f3], where=[(f3 < 3)])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+         :  +- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 < 3)])
          :     +- Reused(reference_id=[1])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
-            +- Calc(select=[f0, f1, f2, f3], where=[(f3 > 0)])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+            +- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 > 0)])
                +- Reused(reference_id=[1])
 ]]>
     </Resource>
@@ -167,33 +167,33 @@ GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, 
f2, f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($3, 3), >($3, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(>($3, 0), <($3, 10))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
-      :- Calc(select=[f0, f1, f2, f3], where=[(f3 < 1)])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
+      :- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 < 1)])
       :  +- ChangelogNormalize(key=[f1], condition=[(f3 > 0)])(reuse_id=[1])
       :     +- Exchange(distribution=[hash[f1]])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
-         :  +- Calc(select=[f0, f1, f2, f3], where=[(f3 < 3)])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+         :  +- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 < 3)])
          :     +- Reused(reference_id=[1])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
-            +- Calc(select=[f0, f1, f2, f3], where=[(f3 < 10)])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+            +- Calc(select=[f0, f1, f2, f3, f4], where=[(f3 < 10)])
                +- Reused(reference_id=[1])
 ]]>
     </Resource>
@@ -207,28 +207,28 @@ GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, 
f2, f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(<($3, 1), >($3, 0))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
       :- ChangelogNormalize(key=[f1], condition=[SEARCH(f3, 
Sarg[(0..1)])])(reuse_id=[1])
       :  +- Exchange(distribution=[hash[f1]])
-      :     +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])(reuse_id=[2])
+      :     +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])(reuse_id=[2])
          :  +- Reused(reference_id=[1])
          +- Reused(reference_id=[2])
 ]]>
@@ -249,7 +249,7 @@ LogicalProject(f1=[$1], f2=[$2])
 ChangelogNormalize(key=[f1])
 +- Exchange(distribution=[hash[f1]])
    +- Calc(select=[f1, f2])
-      +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3])
+      +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3, f4])
 ]]>
     </Resource>
   </TestCase>
@@ -365,38 +365,38 @@ GroupAggregate(groupBy=[f3], select=[f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T2]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T3]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
       :- ChangelogNormalize(key=[f1])
       :  +- Exchange(distribution=[hash[f1]])
-      :     +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f1, Sarg[(0..1)])])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
+      :     +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f1, 
Sarg[(0..1)])])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
          :  +- ChangelogNormalize(key=[f1])
          :     +- Exchange(distribution=[hash[f1]])
-         :        +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f1, 
Sarg[(0..1)])])
-         :           +- TableSourceScan(table=[[default_catalog, 
default_database, T2]], fields=[f0, f1, f2, f3])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
+         :        +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f1, 
Sarg[(0..1)])])
+         :           +- TableSourceScan(table=[[default_catalog, 
default_database, T2]], fields=[f0, f1, f2, f3, f4])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
             +- ChangelogNormalize(key=[f1])
                +- Exchange(distribution=[hash[f1]])
-                  +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f1, 
Sarg[(0..1)])])
-                     +- TableSourceScan(table=[[default_catalog, 
default_database, T3]], fields=[f0, f1, f2, f3])
+                  +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f1, 
Sarg[(0..1)])])
+                     +- TableSourceScan(table=[[default_catalog, 
default_database, T3]], fields=[f0, f1, f2, f3, f4])
 ]]>
     </Resource>
   </TestCase>
@@ -409,33 +409,33 @@ INTERSECT SELECT * FROM T WHERE f1 > 0]]>
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[<($1, 1)])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[<($1, 3)])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[>($1, 0)])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
-      :- Calc(select=[f0, f1, f2, f3], where=[(f1 < 1)])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
+      :- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 < 1)])
       :  +- ChangelogNormalize(key=[f1])(reuse_id=[1])
       :     +- Exchange(distribution=[hash[f1]])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
-         :  +- Calc(select=[f0, f1, f2, f3], where=[(f1 < 3)])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+         :  +- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 < 3)])
          :     +- Reused(reference_id=[1])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
-            +- Calc(select=[f0, f1, f2, f3], where=[(f1 > 0)])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+            +- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 > 0)])
                +- Reused(reference_id=[1])
 ]]>
     </Resource>
@@ -449,29 +449,29 @@ GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, 
f2, f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
       :- ChangelogNormalize(key=[f1])(reuse_id=[1])
       :  +- Exchange(distribution=[hash[f1]])
-      :     +- Calc(select=[f0, f1, f2, f3], where=[SEARCH(f1, Sarg[(0..1)])])
-      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])(reuse_id=[2])
+      :     +- Calc(select=[f0, f1, f2, f3, f4], where=[SEARCH(f1, 
Sarg[(0..1)])])
+      :        +- TableSourceScan(table=[[default_catalog, default_database, 
T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])(reuse_id=[2])
          :  +- Reused(reference_id=[1])
          +- Reused(reference_id=[2])
 ]]>
@@ -486,34 +486,34 @@ GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, 
f2, f3])
     <Resource name="ast">
       <![CDATA[
 LogicalUnion(all=[false])
-:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+:- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 :  +- LogicalFilter(condition=[AND(<($1, 1), >($1, 0))])
 :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 +- LogicalIntersect(all=[false])
-   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   :- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
    :  +- LogicalFilter(condition=[AND(<($1, 3), >($1, 0))])
    :     +- LogicalTableScan(table=[[default_catalog, default_database, T]])
-   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+   +- LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
       +- LogicalFilter(condition=[AND(>($1, 0), <($1, 10))])
          +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
     </Resource>
     <Resource name="optimized exec plan">
       <![CDATA[
-GroupAggregate(groupBy=[f0, f1, f2, f3], select=[f0, f1, f2, f3])
-+- Exchange(distribution=[hash[f0, f1, f2, f3]])
-   +- Union(all=[true], union=[f0, f1, f2, f3])
-      :- Calc(select=[f0, f1, f2, f3], where=[(f1 < 1)])
+GroupAggregate(groupBy=[f0, f1, f2, f3, f4], select=[f0, f1, f2, f3, f4])
++- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+   +- Union(all=[true], union=[f0, f1, f2, f3, f4])
+      :- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 < 1)])
       :  +- ChangelogNormalize(key=[f1])(reuse_id=[1])
       :     +- Exchange(distribution=[hash[f1]])
-      :        +- Calc(select=[f0, f1, f2, f3], where=[(f1 > 0)])
-      :           +- TableSourceScan(table=[[default_catalog, 
default_database, T]], fields=[f0, f1, f2, f3])
-      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30))], select=[f0, f1, f2, f3], 
leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
-         :- Exchange(distribution=[hash[f0, f1, f2, f3]])
-         :  +- Calc(select=[f0, f1, f2, f3], where=[(f1 < 3)])
+      :        +- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 > 0)])
+      :           +- TableSourceScan(table=[[default_catalog, 
default_database, T]], fields=[f0, f1, f2, f3, f4])
+      +- Join(joinType=[LeftSemiJoin], where=[(((f0 = f00) OR (f0 IS NULL AND 
f00 IS NULL)) AND (f1 = f10) AND ((f2 = f20) OR (f2 IS NULL AND f20 IS NULL)) 
AND (f3 = f30) AND ((f4 = f40) OR (f4 IS NULL AND f40 IS NULL)))], select=[f0, 
f1, f2, f3, f4], leftInputSpec=[JoinKeyContainsUniqueKey], 
rightInputSpec=[JoinKeyContainsUniqueKey])
+         :- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+         :  +- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 < 3)])
          :     +- Reused(reference_id=[1])
-         +- Exchange(distribution=[hash[f0, f1, f2, f3]])
-            +- Calc(select=[f0, f1, f2, f3], where=[(f1 < 10)])
+         +- Exchange(distribution=[hash[f0, f1, f2, f3, f4]])
+            +- Calc(select=[f0, f1, f2, f3, f4], where=[(f1 < 10)])
                +- Reused(reference_id=[1])
 ]]>
     </Resource>
@@ -536,7 +536,7 @@ Calc(select=[f1, f1 AS sum])
 +- ChangelogNormalize(key=[f1], condition=[OR(IS NULL(f2), >(f1, 3))])
    +- Exchange(distribution=[hash[f1]])
       +- Calc(select=[f1, f2], where=[<(f1, 10)])
-         +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3])
+         +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3, f4])
 ]]>
     </Resource>
   </TestCase>
@@ -567,7 +567,7 @@ Calc(select=[f0, f1])
     </Resource>
     <Resource name="ast">
       <![CDATA[
-LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
+LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3], f4=[$4])
 +- LogicalFilter(condition=[<($1, 1)])
    +- LogicalTableScan(table=[[default_catalog, default_database, T]])
 ]]>
@@ -576,8 +576,8 @@ LogicalProject(f0=[$0], f1=[$1], f2=[$2], f3=[$3])
       <![CDATA[
 ChangelogNormalize(key=[f1])
 +- Exchange(distribution=[hash[f1]])
-   +- Calc(select=[f0, f1, f2, f3], where=[<(f1, 1)])
-      +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3])
+   +- Calc(select=[f0, f1, f2, f3, f4], where=[<(f1, 1)])
+      +- TableSourceScan(table=[[default_catalog, default_database, T]], 
fields=[f0, f1, f2, f3, f4])
 ]]>
     </Resource>
   </TestCase>

Reply via email to