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
The following commit(s) were added to refs/heads/main by this push:
new 40cadca10d [CALCITE-6651] Use RelBuilder in SqlToRelConverter to
construct Union
40cadca10d is described below
commit 40cadca10d832d348b6b0a14229a1d0e74f0c1c1
Author: suibianwanwan <[email protected]>
AuthorDate: Thu Nov 7 11:34:37 2024 +0800
[CALCITE-6651] Use RelBuilder in SqlToRelConverter to construct Union
---
.../apache/calcite/sql2rel/SqlToRelConverter.java | 11 ++--
.../org/apache/calcite/test/RelMetadataTest.java | 15 ++++--
.../org/apache/calcite/test/RelOptRulesTest.java | 20 +++++--
.../java/org/apache/calcite/tools/PlannerTest.java | 5 --
.../org/apache/calcite/test/RelOptRulesTest.xml | 63 ++++++++++++++--------
.../apache/calcite/test/SqlToRelConverterTest.xml | 31 ++++-------
.../calcite/test/TypeCoercionConverterTest.xml | 14 +----
core/src/test/resources/sql/sub-query.iq | 30 +++++------
.../apache/calcite/test/RelMetadataFixture.java | 11 ++++
9 files changed, 108 insertions(+), 92 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 183d041617..00bebe369f 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -66,7 +66,6 @@ import org.apache.calcite.rel.logical.LogicalSort;
import org.apache.calcite.rel.logical.LogicalTableFunctionScan;
import org.apache.calcite.rel.logical.LogicalTableModify;
import org.apache.calcite.rel.logical.LogicalTableScan;
-import org.apache.calcite.rel.logical.LogicalUnion;
import org.apache.calcite.rel.logical.LogicalValues;
import org.apache.calcite.rel.metadata.RelColumnMapping;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
@@ -1957,7 +1956,9 @@ public class SqlToRelConverter {
if (!values.getTuples().isEmpty()) {
unionInputs.add(values);
}
- resultRel = LogicalUnion.create(unionInputs, true);
+ resultRel = relBuilder
+ .pushAll(unionInputs)
+ .union(true, unionInputs.size()).build();
}
leaves.put(resultRel, resultRel.getRowType().getFieldCount());
return resultRel;
@@ -3945,7 +3946,11 @@ public class SqlToRelConverter {
}
}
}
- return LogicalUnion.create(ImmutableList.of(left, right), all);
+ return relBuilder
+ .push(left)
+ .push(right)
+ .union(all, 2)
+ .build();
}
/**
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index d5511bd35e..5c679b77e9 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -2605,7 +2605,8 @@ public class RelMetadataTest {
final String sql = "select cast(null as integer) as a\n"
+ "union all\n"
+ "select 5 as a";
- final Union rel = (Union) sql(sql).toRel();
+ final Union rel =
+ (Union) sql(sql).withRelBuilderConfig(c ->
c.withSimplifyValues(false)).toRel();
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
RelOptPredicateList inputSet = mq.getPulledUpPredicates(rel);
ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates;
@@ -2616,7 +2617,8 @@ public class RelMetadataTest {
final String sql = "select 6 as a\n"
+ "union all\n"
+ "select 5 as a";
- final Union rel = (Union) sql(sql).toRel();
+ final Union rel =
+ (Union) sql(sql).withRelBuilderConfig(c ->
c.withSimplifyValues(false)).toRel();
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
RelOptPredicateList inputSet = mq.getPulledUpPredicates(rel);
ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates;
@@ -2627,7 +2629,8 @@ public class RelMetadataTest {
final String sql = "select cast(null as integer) as a, 6 as b, 7 as c\n"
+ "union all\n"
+ "select 5 as a, cast(null as integer) as b, 7 as c";
- final Union rel = (Union) sql(sql).toRel();
+ final Union rel =
+ (Union) sql(sql).withRelBuilderConfig(c ->
c.withSimplifyValues(false)).toRel();
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
RelOptPredicateList inputSet = mq.getPulledUpPredicates(rel);
ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates;
@@ -2641,7 +2644,8 @@ public class RelMetadataTest {
final String sql = "select null from emp where empno = 1\n"
+ "union all\n"
+ "select null from emp where comm = 2";
- final Union rel = (Union) sql(sql).toRel();
+ final Union rel =
+ (Union) sql(sql).withRelBuilderConfig(c ->
c.withSimplifyValues(false)).toRel();
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
RelOptPredicateList inputSet = mq.getPulledUpPredicates(rel);
ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates;
@@ -2653,7 +2657,8 @@ public class RelMetadataTest {
final String sql = "select empno = null from emp where comm = 2\n"
+ "union all\n"
+ "select comm = 2 from emp where comm = 2";
- final Union rel = (Union) sql(sql).toRel();
+ final Union rel =
+ (Union) sql(sql).withRelBuilderConfig(c ->
c.withSimplifyValues(false)).toRel();
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
RelOptPredicateList inputSet = mq.getPulledUpPredicates(rel);
ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates;
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index ed5fccb3f3..0454021eee 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -3146,7 +3146,9 @@ class RelOptRulesTest extends RelOptTestBase {
+ "from t1\n"
+ "where (t1.a, t1.y) in ((1, 2), (3, null), (7369, null), (7499, 30),
(null, 20), (null, 5))";
sql(sql)
- .withRule(CoreRules.UNION_TO_VALUES)
+ .withRelBuilderConfig(b -> b.withSimplifyValues(false))
+ .withRule(CoreRules.PROJECT_VALUES_MERGE,
+ CoreRules.UNION_TO_VALUES)
.withInSubQueryThreshold(0)
.check();
}
@@ -3159,7 +3161,9 @@ class RelOptRulesTest extends RelOptTestBase {
+ "from t1\n"
+ "where (t1.a, t1.y) in ((cast(1.1 as int), 2), (3, null), (7369,
null), (7499, 30), (null, cast(20.2 as int)), (null, 5))";
sql(sql)
- .withRule(CoreRules.UNION_TO_VALUES)
+ .withRelBuilderConfig(b -> b.withSimplifyValues(false))
+ .withRule(CoreRules.PROJECT_VALUES_MERGE,
+ CoreRules.UNION_TO_VALUES)
.withInSubQueryThreshold(0)
.check();
}
@@ -3167,7 +3171,9 @@ class RelOptRulesTest extends RelOptTestBase {
@Test void testUnionToValuesByInList3() {
final String sql = "select * from dept where deptno in (12, 34, cast(56.4
as int))";
sql(sql)
- .withRule(CoreRules.UNION_TO_VALUES)
+ .withRelBuilderConfig(b -> b.withSimplifyValues(false))
+ .withRule(CoreRules.PROJECT_VALUES_MERGE,
+ CoreRules.UNION_TO_VALUES)
.withInSubQueryThreshold(0)
.check();
}
@@ -3175,7 +3181,9 @@ class RelOptRulesTest extends RelOptTestBase {
@Test void testUnionToValuesByInList4() {
final String sql = "select * from dept where deptno in (12, 34, cast(56.4
as double))";
sql(sql)
- .withRule(CoreRules.UNION_TO_VALUES)
+ .withRelBuilderConfig(b -> b.withSimplifyValues(false))
+ .withRule(CoreRules.PROJECT_VALUES_MERGE,
+ CoreRules.UNION_TO_VALUES)
.withInSubQueryThreshold(0)
.check();
}
@@ -3183,7 +3191,9 @@ class RelOptRulesTest extends RelOptTestBase {
@Test void testUnionToValuesByInList5() {
final String sql = "select deptno in (12, 34, cast(56.4 as double)) from
dept";
sql(sql)
- .withRule(CoreRules.UNION_TO_VALUES)
+ .withRelBuilderConfig(b -> b.withSimplifyValues(false))
+ .withRule(CoreRules.PROJECT_VALUES_MERGE,
+ CoreRules.UNION_TO_VALUES)
.withInSubQueryThreshold(0)
.check();
}
diff --git a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
index 08abc8f751..16ca49f172 100644
--- a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
@@ -452,11 +452,6 @@ class PlannerTest {
+ " EnumerableValues(tuples=[[{ 1 }]])\n"
+ " EnumerableValues(tuples=[[{ 2 }]])\n";
- checkUnionPruning("values(1)"
- + " union all values(2)"
- + " union all select * from (values(3)) where false",
- plan, extraRules);
-
checkUnionPruning("values(1)"
+ " union all select * from (values(3)) where false"
+ " union all values(2)",
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 4b9adfabc3..dacda972b1 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -16543,10 +16543,14 @@ LogicalProject(A=[$0], Y=[$1])
LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
LogicalAggregate(group=[{0, 1}])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 3, null }]])
- LogicalValues(tuples=[[{ 7369, null }]])
- LogicalValues(tuples=[[{ null, 20 }]])
- LogicalValues(tuples=[[{ null, 5 }]])
+ LogicalProject(EXPR$0=[3], EXPR$1=[null:INTEGER])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[7369], EXPR$1=[null:INTEGER])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[20])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[5])
+ LogicalValues(tuples=[[{ 0 }]])
LogicalValues(tuples=[[{ 1, 2 }, { 7499, 30 }]])
]]>
</Resource>
@@ -16554,8 +16558,7 @@ LogicalProject(A=[$0], Y=[$1])
<![CDATA[
LogicalProject(A=[$0], Y=[$1])
LogicalJoin(condition=[AND(=($0, $2), =($1, $3))], joinType=[inner])
- LogicalProject(EXPR$0=[$0], EXPR$1=[$1])
- LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
+ LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
LogicalAggregate(group=[{0, 1}])
LogicalValues(tuples=[[{ 3, null }, { 7369, null }, { null, 20 }, {
null, 5 }, { 1, 2 }, { 7499, 30 }]])
]]>
@@ -16577,11 +16580,16 @@ LogicalProject(A=[$0], Y=[$1])
LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
LogicalAggregate(group=[{0, 1}])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 1, 2 }]])
- LogicalValues(tuples=[[{ 3, null }]])
- LogicalValues(tuples=[[{ 7369, null }]])
- LogicalValues(tuples=[[{ null, 20 }]])
- LogicalValues(tuples=[[{ null, 5 }]])
+ LogicalProject(EXPR$0=[1], EXPR$1=[2])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[3], EXPR$1=[null:INTEGER])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[7369], EXPR$1=[null:INTEGER])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[20])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[5])
+ LogicalValues(tuples=[[{ 0 }]])
LogicalValues(tuples=[[{ 7499, 30 }]])
]]>
</Resource>
@@ -16589,8 +16597,7 @@ LogicalProject(A=[$0], Y=[$1])
<![CDATA[
LogicalProject(A=[$0], Y=[$1])
LogicalJoin(condition=[AND(=($0, $2), =($1, $3))], joinType=[inner])
- LogicalProject(EXPR$0=[$0], EXPR$1=[$1])
- LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
+ LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { 7499, 30
}, { null, 20 }, { null, 5 }]])
LogicalAggregate(group=[{0, 1}])
LogicalValues(tuples=[[{ 1, 2 }, { 3, null }, { 7369, null }, { null, 20
}, { null, 5 }, { 7499, 30 }]])
]]>
@@ -16607,7 +16614,8 @@ LogicalProject(DEPTNO=[$0], NAME=[$1])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
LogicalAggregate(group=[{0}])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 56 }]])
+ LogicalProject(EXPR$0=[56])
+ LogicalValues(tuples=[[{ 0 }]])
LogicalValues(tuples=[[{ 12 }, { 34 }]])
]]>
</Resource>
@@ -16633,9 +16641,12 @@ LogicalProject(DEPTNO=[$0], NAME=[$1])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
LogicalAggregate(group=[{0}])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 12.0E0 }]])
- LogicalValues(tuples=[[{ 34.0E0 }]])
- LogicalValues(tuples=[[{ 56.4E0 }]])
+ LogicalProject(EXPR$0=[12.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[34.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[56.4E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
<Resource name="planAfter">
@@ -16663,15 +16674,21 @@ LogicalProject(EXPR$0=[CAST(OR(AND(IS NOT NULL($6),
<>($2, 0)), AND(<($3, $2), n
LogicalAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
LogicalProject(EXPR$0=[$0], $f1=[true])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 12.0E0 }]])
- LogicalValues(tuples=[[{ 34.0E0 }]])
- LogicalValues(tuples=[[{ 56.4E0 }]])
+ LogicalProject(EXPR$0=[12.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[34.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[56.4E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
LogicalProject(EXPR$0=[$0], $f1=[true])
LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 12.0E0 }]])
- LogicalValues(tuples=[[{ 34.0E0 }]])
- LogicalValues(tuples=[[{ 56.4E0 }]])
+ LogicalProject(EXPR$0=[12.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[34.0E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[56.4E0:DOUBLE])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
<Resource name="planAfter">
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 3a5c3d0b6f..f62be7d0bf 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -2959,12 +2959,7 @@ LogicalProject(EMPNO=[$0])
LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4],
SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[CAST($0):BIGINT NOT
NULL])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalAggregate(group=[{0}])
- LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 130 }]])
- LogicalValues(tuples=[[{ 131 }]])
- LogicalValues(tuples=[[{ 132 }]])
- LogicalValues(tuples=[[{ 133 }]])
- LogicalValues(tuples=[[{ 134 }]])
+ LogicalValues(tuples=[[{ 130 }, { 131 }, { 132 }, { 133 }, { 134 }]])
]]>
</Resource>
</TestCase>
@@ -3803,9 +3798,8 @@ LogicalProject(DEPTNO=[$0], NAME=[$1], EXPR$0=[$2])
Uncollect
LogicalProject(EXPR$0=[$SLICE($0)])
Collect(field=[EXPR$0])
- LogicalUnion(all=[true])
- LogicalProject(EXPR$0=[$cor0.$f2])
- LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[$cor0.$f2])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
</TestCase>
@@ -3823,9 +3817,8 @@ LogicalProject(DEPTNO=[$0], NAME=[$1], EXPR$0=[$2])
Uncollect
LogicalProject(EXPR$0=[$SLICE($0)])
Collect(field=[EXPR$0])
- LogicalUnion(all=[true])
- LogicalProject(EXPR$0=[$cor0.$f2])
- LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[$cor0.$f2])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
</TestCase>
@@ -8599,9 +8592,7 @@ LogicalProject(X0=[$0], X1=[$1])
<![CDATA[
LogicalProject(I=[$0])
LogicalFilter(condition=[=($0, CAST('w'):CHAR(4) NOT NULL)])
- LogicalUnion(all=[true])
- LogicalValues(tuples=[[{ 'word' }]])
- LogicalValues(tuples=[[{ 'w ' }]])
+ LogicalValues(tuples=[[{ 'word' }, { 'w ' }]])
]]>
</Resource>
</TestCase>
@@ -8833,9 +8824,8 @@ LogicalProject(EXPR$0=[$0])
LogicalCorrelate(correlation=[$cor0], joinType=[inner],
requiredColumns=[{0}])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
Collect(field=[EXPR$0])
- LogicalUnion(all=[true])
- LogicalProject(EXPR$0=[$cor0.DEPTNO])
- LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[$cor0.DEPTNO])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
<Resource name="sql">
@@ -8854,9 +8844,8 @@ LogicalProject(EXPR$0=[$0])
LogicalCorrelate(correlation=[$cor0], joinType=[inner],
requiredColumns=[{0}])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
Collect(field=[EXPR$0])
- LogicalUnion(all=[true])
- LogicalProject(EXPR$0=[$cor0.DEPTNO])
- LogicalValues(tuples=[[{ 0 }]])
+ LogicalProject(EXPR$0=[$cor0.DEPTNO])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
</TestCase>
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 4106146cc4..b3d85ee3ab 100644
---
a/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml
+++
b/core/src/test/resources/org/apache/calcite/test/TypeCoercionConverterTest.xml
@@ -83,9 +83,7 @@ LogicalProject(EXPR$0=[CAST($3):DECIMAL(19, 0) NOT NULL])
</Resource>
<Resource name="plan">
<![CDATA[
-LogicalUnion(all=[false])
- LogicalValues(tuples=[[{ null }]])
- LogicalValues(tuples=[[{ '10' }]])
+LogicalValues(tuples=[[{ null }, { '10' }]])
]]>
</Resource>
</TestCase>
@@ -154,15 +152,7 @@ LogicalTableModify(table=[[CATALOG, SALES, T1]],
operation=[INSERT], flattened=[
<Resource name="plan">
<![CDATA[
LogicalTableModify(table=[[CATALOG, SALES, T1]], operation=[INSERT],
flattened=[false])
- LogicalUnion(all=[false])
- LogicalUnion(all=[false])
- LogicalUnion(all=[false])
- LogicalUnion(all=[false])
- LogicalValues(tuples=[[{ 'a', 1, 1, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }]])
- LogicalValues(tuples=[[{ 'b', 2, 2, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }]])
- LogicalValues(tuples=[[{ 'c', 3, 3, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }]])
- LogicalValues(tuples=[[{ 'd', 4, 4, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }]])
- LogicalValues(tuples=[[{ 'e', 5, 5, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }]])
+ LogicalValues(tuples=[[{ 'a', 1, 1, 0, 0.0E0, 0.0E0, 0, 2021-11-28 00:00:00,
2021-11-28, X'0a', false }, { 'b', 2, 2, 0, 0.0E0, 0.0E0, 0, 2021-11-28
00:00:00, 2021-11-28, X'0a', false }, { 'c', 3, 3, 0, 0.0E0, 0.0E0, 0,
2021-11-28 00:00:00, 2021-11-28, X'0a', false }, { 'd', 4, 4, 0, 0.0E0, 0.0E0,
0, 2021-11-28 00:00:00, 2021-11-28, X'0a', false }, { 'e', 5, 5, 0, 0.0E0,
0.0E0, 0, 2021-11-28 00:00:00, 2021-11-28, X'0a', false }]])
]]>
</Resource>
</TestCase>
diff --git a/core/src/test/resources/sql/sub-query.iq
b/core/src/test/resources/sql/sub-query.iq
index c32362f778..382ad91ebd 100644
--- a/core/src/test/resources/sql/sub-query.iq
+++ b/core/src/test/resources/sql/sub-query.iq
@@ -3452,9 +3452,8 @@ EnumerableCalc(expr#0..12=[{inputs}], expr#13=[0:BIGINT],
expr#14=[=($t8, $t13)]
EnumerableAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
EnumerableValues(tuples=[[{ null }, { 7782 }]])
EnumerableSort(sort0=[$0], dir0=[ASC])
- EnumerableAggregate(group=[{0}], agg#0=[MIN($1)])
- EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
- EnumerableValues(tuples=[[{ null }, { 7782 }]])
+ EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
+ EnumerableValues(tuples=[[{ null }, { 7782 }]])
!plan
select * from "scott".emp where (empno, deptno) not in ((1, 2), (3, null));
@@ -3475,9 +3474,8 @@ EnumerableCalc(expr#0..14=[{inputs}], expr#15=[0:BIGINT],
expr#16=[=($t8, $t15)]
EnumerableAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($1)])
EnumerableValues(tuples=[[{ 3, null }, { 1, 2 }]])
EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC])
- EnumerableAggregate(group=[{0, 1}], agg#0=[MIN($2)])
- EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
proj#0..2=[{exprs}])
- EnumerableValues(tuples=[[{ 3, null }, { 1, 2 }]])
+ EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true], proj#0..2=[{exprs}])
+ EnumerableValues(tuples=[[{ 3, null }, { 1, 2 }]])
!plan
select * from "scott".emp where (empno, deptno) not in ((7369, 20), (7499,
30));
@@ -3944,9 +3942,8 @@ EnumerableCalc(expr#0..5=[{inputs}], expr#6=[IS NOT
NULL($t5)], expr#7=[0:BIGINT
EnumerableAggregate(group=[{}], agg#0=[COUNT()])
EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }]])
EnumerableSort(sort0=[$0], dir0=[ASC])
- EnumerableAggregate(group=[{0}], agg#0=[MIN($1)])
- EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
- EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }]])
+ EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
+ EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }]])
!plan
# Test LHS is nullable and RHS is nullable
@@ -3984,9 +3981,8 @@ EnumerableCalc(expr#0..5=[{inputs}], expr#6=[IS NOT
NULL($t5)], expr#7=[0:BIGINT
EnumerableAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }, { null
}]])
EnumerableSort(sort0=[$0], dir0=[ASC])
- EnumerableAggregate(group=[{0}], agg#0=[MIN($1)])
- EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
- EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }, { null
}]])
+ EnumerableCalc(expr#0=[{inputs}], expr#1=[true], proj#0..1=[{exprs}])
+ EnumerableValues(tuples=[[{ 500.00 }, { 300.00 }, { 0.00 }, { null }]])
!plan
# Test LHS is (not nullable, not nullable) and RHS is (not nullable, not
nullable)
@@ -4065,9 +4061,8 @@ EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NOT
NULL($t7)], expr#9=[0:BIGINT
EnumerableAggregate(group=[{}], agg#0=[COUNT()])
EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00
}, { 0.00, 0.00 }]])
EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC])
- EnumerableAggregate(group=[{0, 1}], agg#0=[MIN($2)])
- EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
proj#0..2=[{exprs}])
- EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00 }, {
0.00, 0.00 }]])
+ EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true], proj#0..2=[{exprs}])
+ EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00 }, {
0.00, 0.00 }]])
!plan
# Test LHS is (nullable, nullable) and RHS is (nullable, nullable)
@@ -4105,9 +4100,8 @@ EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NOT
NULL($t7)], expr#9=[0:BIGINT
EnumerableAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0,
$1)])
EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00 },
{ 0.00, 0.00 }, { null, null }]])
EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC])
- EnumerableAggregate(group=[{0, 1}], agg#0=[MIN($2)])
- EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
proj#0..2=[{exprs}])
- EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00 }, {
0.00, 0.00 }, { null, null }]])
+ EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true], proj#0..2=[{exprs}])
+ EnumerableValues(tuples=[[{ 500.00, 500.00 }, { 300.00, 300.00 }, {
0.00, 0.00 }, { null, null }]])
!plan
# [CALCITE-5156] Support implicit integer types cast for IN Sub-query
diff --git
a/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java
b/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java
index 3dff044762..74e5d7b709 100644
--- a/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java
+++ b/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java
@@ -37,6 +37,7 @@ import org.apache.calcite.runtime.SqlFunctions;
import org.apache.calcite.sql.SqlExplainLevel;
import org.apache.calcite.sql.test.SqlTestFactory;
import org.apache.calcite.sql.test.SqlTester;
+import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.calcite.tools.RelBuilder;
import org.apache.calcite.util.ImmutableBitSet;
@@ -121,6 +122,16 @@ public class RelMetadataFixture {
convertAsCalc, relTransform);
}
+ public RelMetadataFixture withConfig(
+ UnaryOperator<SqlToRelConverter.Config> transform) {
+ return withFactory(f -> f.withSqlToRelConfig(transform));
+ }
+
+ public RelMetadataFixture withRelBuilderConfig(
+ UnaryOperator<RelBuilder.Config> transform) {
+ return withConfig(c -> c.addRelBuilderConfigTransform(transform));
+ }
+
/** Creates a copy of this fixture that uses a given function to create a
* {@link RelNode}. */
public RelMetadataFixture withRelFn(Function<RelBuilder, RelNode> relFn) {