This is an automated email from the ASF dual-hosted git repository. mbudiu pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/calcite.git
commit d6e4cc437fa92c363dfbb66916a4227ef93c430e Author: Mihai Budiu <[email protected]> AuthorDate: Wed Jan 8 13:02:00 2025 -0800 [CALCITE-6770] Preserve column names when casts are inserted in projects Signed-off-by: Mihai Budiu <[email protected]> --- .../validate/implicit/AbstractTypeCoercion.java | 8 +++++- .../org/apache/calcite/test/JdbcAdapterTest.java | 4 +-- .../apache/calcite/test/SqlToRelConverterTest.java | 9 +++++++ .../org/apache/calcite/test/HepPlannerTest.xml | 16 ++++++------ .../org/apache/calcite/test/RelOptRulesTest.xml | 8 +++--- .../apache/calcite/test/SqlToRelConverterTest.xml | 30 ++++++++++++++++------ .../calcite/test/TypeCoercionConverterTest.xml | 2 +- core/src/test/resources/sql/sub-query.iq | 16 ++++++------ 8 files changed, 61 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java index c77cf0befe..5de65959b5 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java @@ -44,6 +44,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorNamespace; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.apache.calcite.sql.validate.SqlValidatorUtil; import org.apache.calcite.util.Pair; import org.apache.calcite.util.Util; @@ -212,7 +213,12 @@ public abstract class AbstractTypeCoercion implements TypeCoercion { return false; } RelDataType targetType3 = syncAttributes(validator.deriveType(scope, node), targetType); - final SqlNode node3 = castTo(node, targetType3); + SqlNode node3 = castTo(node, targetType3); + if (node.getKind() == SqlKind.IDENTIFIER) { + SqlIdentifier id = (SqlIdentifier) node; + String name = id.getComponent(id.names.size() - 1).getSimple(); + node3 = SqlValidatorUtil.addAlias(node3, name); + } nodeList.set(index, node3); updateInferredType(node3, targetType3); return true; diff --git a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java index 7a35870d12..9e604b8031 100644 --- a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java +++ b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java @@ -127,7 +127,7 @@ class JdbcAdapterTest { + " JdbcFilter(condition=[<($0, 10)])\n" + " JdbcTableScan(table=[[foodmart, store]])\n" + " JdbcToEnumerableConverter\n" - + " JdbcProject(EXPR$0=[CAST($1):VARCHAR(30)])\n" + + " JdbcProject(ENAME=[CAST($1):VARCHAR(30)])\n" + " JdbcFilter(condition=[>(CAST($0):INTEGER NOT NULL, 10)])\n" + " JdbcTableScan(table=[[SCOTT, EMP]])") .runs() @@ -135,7 +135,7 @@ class JdbcAdapterTest { .planHasSql("SELECT \"store_name\"\n" + "FROM \"foodmart\".\"store\"\n" + "WHERE \"store_id\" < 10") - .planHasSql("SELECT CAST(\"ENAME\" AS VARCHAR(30))\n" + .planHasSql("SELECT CAST(\"ENAME\" AS VARCHAR(30)) AS \"ENAME\"\n" + "FROM \"SCOTT\".\"EMP\"\n" + "WHERE CAST(\"EMPNO\" AS INTEGER) > 10"); } diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java index f2a7cbb911..2981be81d4 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -257,6 +257,15 @@ class SqlToRelConverterTest extends SqlToRelTestBase { sql(sql).ok(); } + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-6770">[CALCITE-6770] + * Preserve column names when casts are inserted in projects</a>. */ + @Test void testCastNames() { + final String sql = "SELECT * FROM (SELECT empno, 'x' AS X FROM emp) " + + "UNION ALL (SELECT empno, 'xx' AS X from emp)"; + sql(sql).ok(); + } + /** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-245">[CALCITE-245] * Off-by-one translation of ON clause of JOIN</a>. */ diff --git a/core/src/test/resources/org/apache/calcite/test/HepPlannerTest.xml b/core/src/test/resources/org/apache/calcite/test/HepPlannerTest.xml index 58c63851b8..ce092dcedc 100644 --- a/core/src/test/resources/org/apache/calcite/test/HepPlannerTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/HepPlannerTest.xml @@ -54,7 +54,7 @@ LogicalCalc(expr#0..1=[{inputs}], expr#2=[UPPER($t1)], expr#3=[20], expr#4=[=($t <![CDATA[ LogicalUnion(all=[false]) LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -67,7 +67,7 @@ LogicalUnion(all=[false]) LogicalUnion(all=[false]) LogicalAggregate(group=[{0}]) LogicalUnion(all=[true]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -84,7 +84,7 @@ LogicalUnion(all=[false]) <![CDATA[ LogicalUnion(all=[false]) LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -97,7 +97,7 @@ LogicalUnion(all=[false]) LogicalAggregate(group=[{0}]) LogicalUnion(all=[true]) LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -114,7 +114,7 @@ LogicalAggregate(group=[{0}]) <![CDATA[ LogicalUnion(all=[false]) LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -128,7 +128,7 @@ LogicalAggregate(group=[{0}]) LogicalUnion(all=[true]) LogicalAggregate(group=[{0}]) LogicalUnion(all=[true]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) @@ -227,11 +227,11 @@ intersect (select fname from customer.contact)]]> <![CDATA[ LogicalIntersect(all=[false]) LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) LogicalProject(ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL]) + LogicalProject(FNAME=[CAST($1):VARCHAR(20) NOT NULL]) LogicalTableScan(table=[[CATALOG, CUSTOMER, CONTACT]]) ]]> </Resource> diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml index 1b2b895032..5e8739f5df 100644 --- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml @@ -17113,9 +17113,9 @@ from (values (5)) as t(y)]]> <Resource name="planBefore"> <![CDATA[ LogicalUnion(all=[false]) - LogicalProject(EXPR$0=[CAST($0):DECIMAL(11, 1) NOT NULL]) + LogicalProject(X=[CAST($0):DECIMAL(11, 1) NOT NULL]) LogicalValues(tuples=[[{ 5.0 }]]) - LogicalProject(EXPR$0=[CAST($0):DECIMAL(11, 1) NOT NULL]) + LogicalProject(Y=[CAST($0):DECIMAL(11, 1) NOT NULL]) LogicalValues(tuples=[[{ 5 }]]) ]]> </Resource> @@ -17205,9 +17205,9 @@ from (values (5)) as t(y)]]> <Resource name="planBefore"> <![CDATA[ LogicalUnion(all=[true]) - LogicalProject(EXPR$0=[CAST($0):DECIMAL(11, 1) NOT NULL]) + LogicalProject(X=[CAST($0):DECIMAL(11, 1) NOT NULL]) LogicalValues(tuples=[[{ 5.0 }]]) - LogicalProject(EXPR$0=[CAST($0):DECIMAL(11, 1) NOT NULL]) + LogicalProject(Y=[CAST($0):DECIMAL(11, 1) NOT NULL]) LogicalValues(tuples=[[{ 5 }]]) ]]> </Resource> diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index 35baf36dcd..b50f1e56f4 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -615,6 +615,20 @@ GROUP BY GROUPING SETS ( LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]]) LogicalProject(EMPNO=[$0], EXPR$1=[CASE(SEARCH($1, Sarg['Eric':VARCHAR(20), 'Fred':VARCHAR(20)]:VARCHAR(20)), 'Manager', 'Other ')]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> + <TestCase name="testCastNames"> + <Resource name="sql"> + <![CDATA[SELECT * FROM (SELECT empno, 'x' AS X FROM emp) UNION ALL (SELECT empno, 'xx' AS X from emp)]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalUnion(all=[true]) + LogicalProject(EMPNO=[$0], X=['x ']) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) + LogicalProject(EMPNO=[$0], X=['xx']) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) ]]> </Resource> </TestCase> @@ -2969,7 +2983,7 @@ where cast(deptno + 20 as bigint) in (select deptno from dept)]]> <![CDATA[ LogicalProject(DEPTNO=[$0], NAME=[$1]) LogicalFilter(condition=[IN(CAST(+($0, 20)):BIGINT NOT NULL, { -LogicalProject(EXPR$0=[CAST($0):BIGINT NOT NULL]) +LogicalProject(DEPTNO=[CAST($0):BIGINT NOT NULL]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) })]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) @@ -6461,9 +6475,9 @@ QUALIFY RANK() OVER (PARTITION BY ename <![CDATA[ LogicalTableModify(table=[[CATALOG, SALES, DEPT]], operation=[INSERT], flattened=[true]) LogicalAggregate(group=[{0, 1}]) - LogicalProject(EMPNO=[$0], EXPR$1=[$1]) + LogicalProject(EMPNO=[$0], ENAME=[$1]) LogicalFilter(condition=[$2]) - LogicalProject(EMPNO=[$0], EXPR$1=[CAST($1):VARCHAR(10) NOT NULL], QualifyExpression=[=(RANK() OVER (PARTITION BY $1 ORDER BY $8 DESC), 1)]) + LogicalProject(EMPNO=[$0], ENAME=[CAST($1):VARCHAR(10) NOT NULL], QualifyExpression=[=(RANK() OVER (PARTITION BY $1 ORDER BY $8 DESC), 1)]) LogicalFilter(condition=[>($7, 5)]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) ]]> @@ -8402,7 +8416,7 @@ LogicalProject(DEPTNO=[$1]) LogicalMinus(all=[true]) LogicalProject(ENAME=[$1], DEPTNO=[$7]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) ]]> </Resource> @@ -8420,7 +8434,7 @@ LogicalProject(DEPTNO=[$1]) LogicalMinus(all=[false]) LogicalProject(ENAME=[$1], DEPTNO=[$7]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) ]]> </Resource> @@ -8438,7 +8452,7 @@ LogicalProject(DEPTNO=[$1]) LogicalIntersect(all=[true]) LogicalProject(ENAME=[$1], DEPTNO=[$7]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) ]]> </Resource> @@ -8456,7 +8470,7 @@ LogicalProject(DEPTNO=[$1]) LogicalIntersect(all=[false]) LogicalProject(ENAME=[$1], DEPTNO=[$7]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) ]]> </Resource> @@ -8539,7 +8553,7 @@ LogicalProject(DEPTNO=[$1]) LogicalUnion(all=[false]) LogicalProject(ENAME=[$1], DEPTNO=[$7]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) - LogicalProject(EXPR$0=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) + LogicalProject(NAME=[CAST($1):VARCHAR(20) NOT NULL], DEPTNO=[$0]) LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) ]]> </Resource> diff --git a/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml index b3d85ee3ab..79c16c4858 100644 --- a/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml @@ -183,7 +183,7 @@ LogicalProject(X=[$0]) LogicalProject(T1=[$0]) LogicalValues(tuples=[[{ 1 }, { 2 }]]) LogicalAggregate(group=[{0}]) - LogicalProject(EXPR$0=[CAST($0):BIGINT NOT NULL]) + LogicalProject(X=[CAST($0):BIGINT NOT NULL]) LogicalValues(tuples=[[{ 3 }, { 4 }]]) ]]> </Resource> diff --git a/core/src/test/resources/sql/sub-query.iq b/core/src/test/resources/sql/sub-query.iq index 6a7927c15f..d820b853f6 100644 --- a/core/src/test/resources/sql/sub-query.iq +++ b/core/src/test/resources/sql/sub-query.iq @@ -556,7 +556,7 @@ with t (a, b) as (select * from (values (60, 'b'))) select * from t where a in (select deptno from "scott".dept); EnumerableCalc(expr#0=[{inputs}], expr#1=[60], expr#2=['b'], A=[$t1], B=[$t2]) EnumerableAggregate(group=[{0}]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], expr#4=[60], expr#5=[=($t4, $t3)], EXPR$0=[$t3], $condition=[$t5]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], expr#4=[60], expr#5=[=($t4, $t3)], DEPTNO=[$t3], $condition=[$t5]) EnumerableTableScan(table=[[scott, DEPT]]) !plan +---+---+ @@ -571,7 +571,7 @@ with t (a, b) as (select * from (values (30, 'b'))) select * from t where a in (select deptno from "scott".dept); EnumerableCalc(expr#0=[{inputs}], expr#1=[30], expr#2=['b'], A=[$t1], B=[$t2]) EnumerableAggregate(group=[{0}]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], expr#4=[30], expr#5=[=($t4, $t3)], EXPR$0=[$t3], $condition=[$t5]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], expr#4=[30], expr#5=[=($t4, $t3)], DEPTNO=[$t3], $condition=[$t5]) EnumerableTableScan(table=[[scott, DEPT]]) !plan +----+---+ @@ -800,7 +800,7 @@ EnumerableCalc(expr#0..2=[{inputs}], SAL=[$t1]) EnumerableHashJoin(condition=[AND(=($2, $4), =($0, $3))], joinType=[semi]) EnumerableCalc(expr#0..7=[{inputs}], expr#8=[CAST($t2):VARCHAR(14)], EMPNO=[$t0], SAL=[$t5], JOB0=[$t8]) EnumerableTableScan(table=[[scott, EMP]]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):SMALLINT NOT NULL], expr#4=[IS NOT NULL($t1)], EXPR$0=[$t3], DNAME=[$t1], $condition=[$t4]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):SMALLINT NOT NULL], expr#4=[IS NOT NULL($t1)], DEPTNO=[$t3], DNAME=[$t1], $condition=[$t4]) EnumerableTableScan(table=[[scott, DEPT]]) !plan @@ -2032,7 +2032,7 @@ EnumerableCalc(expr#0..4=[{inputs}], expr#5=[NOT($t4)], expr#6=[IS NOT NULL($t4) EnumerableSort(sort0=[$2], dir0=[ASC]) EnumerableCalc(expr#0..7=[{inputs}], EMPNO=[$t0], SAL=[$t5], DEPTNO=[$t7]) EnumerableTableScan(table=[[scott, EMP]]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[true], expr#4=[10], expr#5=[CAST($t0):INTEGER NOT NULL], expr#6=[=($t4, $t5)], DEPTNO=[$t0], $f1=[$t3], $condition=[$t6]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[true], expr#4=[10], expr#5=[CAST($t0):INTEGER NOT NULL], expr#6=[=($t4, $t5)], DEPTNO1=[$t0], $f1=[$t3], $condition=[$t6]) EnumerableTableScan(table=[[scott, DEPT]]) !plan @@ -2257,7 +2257,7 @@ EnumerableAggregate(group=[{}], C=[COUNT()]) EnumerableCalc(expr#0..2=[{inputs}], expr#3=[1:BIGINT], expr#4=[IS NOT NULL($t1)], c=[$t3], ck=[$t3], DNAME=[$t1], $condition=[$t4]) EnumerableTableScan(table=[[scott, DEPT]]) EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):DECIMAL(13, 2) NOT NULL], expr#4=[true], expr#5=[IS NOT NULL($t1)], EXPR$0=[$t3], DNAME=[$t1], i=[$t4], $condition=[$t5]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):DECIMAL(13, 2) NOT NULL], expr#4=[true], expr#5=[IS NOT NULL($t1)], DEPTNO=[$t3], DNAME=[$t1], i=[$t4], $condition=[$t5]) EnumerableTableScan(table=[[scott, DEPT]]) !plan @@ -4176,7 +4176,7 @@ EnumerableCalc(expr#0..3=[{inputs}], proj#0..2=[{exprs}]) EnumerableHashJoin(condition=[=($3, $4)], joinType=[semi]) EnumerableCalc(expr#0..2=[{inputs}], expr#3=[20], expr#4=[+($t0, $t3)], proj#0..2=[{exprs}], $f3=[$t4]) EnumerableTableScan(table=[[scott, DEPT]]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], EXPR$0=[$t3]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):INTEGER NOT NULL], DEPTNO=[$t3]) EnumerableTableScan(table=[[scott, DEPT]]) !plan @@ -4200,7 +4200,7 @@ EnumerableCalc(expr#0..3=[{inputs}], proj#0..2=[{exprs}]) EnumerableHashJoin(condition=[=($3, $4)], joinType=[semi]) EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):BIGINT NOT NULL], proj#0..3=[{exprs}]) EnumerableTableScan(table=[[scott, DEPT]]) - EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):BIGINT NOT NULL], EXPR$0=[$t3]) + EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t0):BIGINT NOT NULL], DEPTNO=[$t3]) EnumerableTableScan(table=[[scott, DEPT]]) !plan @@ -4244,7 +4244,7 @@ EnumerableCalc(expr#0..8=[{inputs}], proj#0..7=[{exprs}]) EnumerableHashJoin(condition=[=($8, $9)], joinType=[semi]) EnumerableCalc(expr#0..7=[{inputs}], expr#8=[7349], expr#9=[-($t0, $t8)], expr#10=[CAST($t9):SMALLINT NOT NULL], expr#11=['SMITH':VARCHAR(10)], expr#12=[=($t1, $t11)], proj#0..7=[{exprs}], $f8=[$t10], $condition=[$t12]) EnumerableTableScan(table=[[scott, EMP]]) - EnumerableCalc(expr#0..7=[{inputs}], expr#8=[CAST($t7):SMALLINT], EXPR$0=[$t8]) + EnumerableCalc(expr#0..7=[{inputs}], expr#8=[CAST($t7):SMALLINT], DEPTNO=[$t8]) EnumerableTableScan(table=[[scott, EMP]]) !plan
