iwanttobepowerful commented on code in PR #4637:
URL: https://github.com/apache/calcite/pull/4637#discussion_r2573827386
##########
core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java:
##########
@@ -1184,6 +1185,160 @@ private static void shiftMapping(Map<Integer, Integer>
mapping, int startIndex,
return null;
}
+ /**
+ * Given the SQL:
+ * SELECT ename,
+ * (SELECT sum(c)
+ * FROM
+ * (SELECT deptno AS c
+ * FROM dept
+ * WHERE dept.deptno = emp.deptno
+ * UNION ALL
+ * SELECT 2 AS c
+ * FROM bonus
+ * WHERE bonus.job = emp.job) AS union_subquery
+ * ) AS correlated_sum
+ * FROM emp;
+ *
+ * <p>from:
+ * LogicalProject(ENAME=[$1], CORRELATED_SUM=[$8])
+ * LogicalCorrelate(correlation=[$cor0], joinType=[left],
requiredColumns=[{2, 7}])
+ * LogicalTableScan(table=[[scott, EMP]])
+ * LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
+ * LogicalUnion(all=[true])
+ * LogicalProject(C=[CAST($0):INTEGER NOT NULL])
+ * LogicalFilter(condition=[=($0, $cor0.DEPTNO)])
+ * LogicalTableScan(table=[[scott, DEPT]])
+ * LogicalProject(C=[2])
+ * LogicalFilter(condition=[=($1, $cor0.JOB)])
+ * LogicalTableScan(table=[[scott, BONUS]])
+ *
+ * <p>to:
+ * LogicalProject(ENAME=[$1], CORRELATED_SUM=[$10])
+ * LogicalJoin(condition=[AND(IS NOT DISTINCT FROM($2, $8),
+ * IS NOT DISTINCT FROM($7, $9))],
joinType=[left])
+ * LogicalTableScan(table=[[scott, EMP]])
+ * LogicalAggregate(group=[{0, 1}], EXPR$0=[SUM($2)])
+ * LogicalProject(JOB=[$0], DEPTNO=[$1], C=[$2])
+ * LogicalUnion(all=[true])
+ * LogicalProject(JOB=[$0], DEPTNO=[$1], C=[$2])
+ * LogicalJoin(condition=[IS NOT DISTINCT FROM($1, $3)],
joinType=[inner])
+ * LogicalAggregate(group=[{2, 7}])
+ * LogicalTableScan(table=[[scott, EMP]])
+ * LogicalProject(C=[CAST($0):INTEGER NOT NULL], DEPTNO=[$0])
+ * LogicalTableScan(table=[[scott, DEPT]])
+ * LogicalProject(JOB=[$0], DEPTNO=[$1], C=[$2])
+ * LogicalJoin(condition=[IS NOT DISTINCT FROM($0, $3)],
joinType=[inner])
+ * LogicalAggregate(group=[{2, 7}])
+ * LogicalTableScan(table=[[scott, EMP]])
+ * LogicalProject(C=[2], JOB=[$1])
+ * LogicalFilter(condition=[IS NOT NULL($1)])
+ * LogicalTableScan(table=[[scott, BONUS]])
+ */
+ public @Nullable Frame decorrelateRel(SetOp rel, boolean isCorVarDefined,
+ boolean parentPropagatesNullValues) {
+ if (this.frameStack.peek() == null) {
+ return null;
+ }
+
+ final Pair<CorrelationId, Frame> outerFramePair =
requireNonNull(this.frameStack.peek());
+ final CorrelationId outFrameCorrId = outerFramePair.left;
+ final Frame outFrame = outerFramePair.right;
+
+ // Collect CorDef from all inputs
+ ImmutableBitSet.Builder corFieldBuilder = ImmutableBitSet.builder();
+ List<Frame> frames = new ArrayList<>();
+ for (RelNode oldInput : rel.getInputs()) {
+ if (!(oldInput instanceof Project)) {
Review Comment:
@mihaibudiu @suibianwanwank
```
FAILURE 0.0sec, org.apache.calcite.test.SqlOperatorUnparseTest >
testIntersectOperator()
java.sql.SQLException: Error while executing SQL "SELECT MULTISET["P0",
1] MULTISET INTERSECT DISTINCT MULTISET[1, 1] FROM (VALUES ROW(1)) AS "T"
("P0")": class org.apache.calcite.rel.logical.LogicalValues cannot be cast to
class org.apache.calcite.rel.core.Project
(org.apache.calcite.rel.logical.LogicalValues and
org.apache.calcite.rel.core.Project are in unnamed module of loader 'app')
at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:164)
at
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:228)
at
org.apache.calcite.test.SqlOperatorTest$TesterImpl.check(SqlOperatorTest.java:17724)
at
org.apache.calcite.test.SqlOperatorUnparseTest$UnparseTester.check(SqlOperatorUnparseTest.java:102)
at org.apache.calcite.sql.test.SqlTester.check(SqlTester.java:158)
at
org.apache.calcite.test.SqlOperatorFixtureImpl.lambda$checkScalar$2(SqlOperatorFixtureImpl.java:241)
at
org.apache.calcite.test.SqlOperatorUnparseTest$UnparseTester.forEachQuery(SqlOperatorUnparseTest.java:93)
Next exception 1: [CIRCULAR REFERENCE SQLException]
Next exception 2: java.lang.ClassCastException: class
org.apache.calcite.rel.logical.LogicalValues cannot be cast to class
org.apache.calcite.rel.core.Project
(org.apache.calcite.rel.logical.LogicalValues and
org.apache.calcite.rel.core.Project are in unnamed module of loader 'app')
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1308)
at
org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
at
org.apache.calcite.sql2rel.RelDecorrelator.getInvoke(RelDecorrelator.java:1033)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRelHelper(RelDecorrelator.java:537)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:525)
at
org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
at
org.apache.calcite.sql2rel.RelDecorrelator.getInvoke(RelDecorrelator.java:1033)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1815)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1789)
at
org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
at
org.apache.calcite.sql2rel.RelDecorrelator.getInvoke(RelDecorrelator.java:1033)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1927)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1906)
at
org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
at
org.apache.calcite.sql2rel.RelDecorrelator.getInvoke(RelDecorrelator.java:1033)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1366)
at
org.apache.calcite.sql2rel.RelDecorrelator.decorrelateRel(RelDecorrelator.java:1349)
at
org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
at
org.apache.calcite.sql2rel.RelDecorrelator.getInvoke(RelDecorrelator.java:1033)
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]