diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/cte-with-multi-children-operators.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/cte-with-multi-children-operators.sql.out new file mode 100644 index 000000000000..d8ff97e8342d --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/cte-with-multi-children-operators.sql.out @@ -0,0 +1,581 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +CREATE TEMPORARY VIEW t1 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2) +-- !query analysis +CreateViewCommand `t1`, SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2), false, false, LocalTempView, UNSUPPORTED, true + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +CREATE TEMPORARY VIEW t2 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2) +-- !query analysis +CreateViewCommand `t2`, SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2), false, false, LocalTempView, UNSUPPORTED, true + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- Join LeftOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- WithCTE + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- View (`t1`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t2 + : : +- View (`t2`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- Join Inner + :- SubqueryAlias __auto_generated_subquery_name + : +- WithCTE + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- View (`t1`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t2 + : : +- View (`t2`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- Join RightOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- WithCTE + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- View (`t1`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t2 + : : +- View (`t2`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- Join FullOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- WithCTE + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- View (`t1`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t2 + : : +- View (`t2`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Distinct ++- Union false, false + :- Project [col1#x, col2#x] + : +- SubqueryAlias __auto_generated_subquery_name + : +- WithCTE + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- View (`t1`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : :- CTERelationDef xxxx, false + : : +- SubqueryAlias cte + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t2 + : : +- View (`t2`, [col1#x, col2#x]) + : : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : : +- Project [col1#x, col2#x] + : : +- SubqueryAlias t1 + : : +- LocalRelation [col1#x, col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Except false +:- Project [col1#x, col2#x] +: +- SubqueryAlias __auto_generated_subquery_name +: +- WithCTE +: :- CTERelationDef xxxx, false +: : +- SubqueryAlias cte +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- View (`t1`, [col1#x, col2#x]) +: : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- LocalRelation [col1#x, col2#x] +: :- CTERelationDef xxxx, false +: : +- SubqueryAlias cte +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t2 +: : +- View (`t2`, [col1#x, col2#x]) +: : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- LocalRelation [col1#x, col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- View (`t1`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] ++- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query analysis +Intersect false +:- Project [col1#x, col2#x] +: +- SubqueryAlias __auto_generated_subquery_name +: +- WithCTE +: :- CTERelationDef xxxx, false +: : +- SubqueryAlias cte +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- View (`t1`, [col1#x, col2#x]) +: : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- LocalRelation [col1#x, col2#x] +: :- CTERelationDef xxxx, false +: : +- SubqueryAlias cte +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t2 +: : +- View (`t2`, [col1#x, col2#x]) +: : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: : +- Project [col1#x, col2#x] +: : +- SubqueryAlias t1 +: : +- LocalRelation [col1#x, col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- View (`t1`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] ++- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias t2 + +- View (`t2`, [col1#x, col2#x]) + +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + +- Project [col1#x, col2#x] + +- SubqueryAlias t1 + +- LocalRelation [col1#x, col2#x] + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- WithCTE + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t2 + : +- View (`t2`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Join LeftOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- WithCTE + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t2 + : +- View (`t2`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Join Inner + :- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- WithCTE + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t2 + : +- View (`t2`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Join RightOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +Project [col1#x, col2#x, col1#x, col2#x] ++- WithCTE + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t2 + : +- View (`t2`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Join FullOuter + :- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +Distinct ++- WithCTE + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- View (`t1`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + :- CTERelationDef xxxx, false + : +- SubqueryAlias cte + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t2 + : +- View (`t2`, [col1#x, col2#x]) + : +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] + : +- Project [col1#x, col2#x] + : +- SubqueryAlias t1 + : +- LocalRelation [col1#x, col2#x] + +- Union false, false + :- Project [col1#x, col2#x] + : +- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +WithCTE +:- CTERelationDef xxxx, false +: +- SubqueryAlias cte +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- View (`t1`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] +:- CTERelationDef xxxx, false +: +- SubqueryAlias cte +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t2 +: +- View (`t2`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] ++- Except false + :- Project [col1#x, col2#x] + : +- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query analysis +WithCTE +:- CTERelationDef xxxx, false +: +- SubqueryAlias cte +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- View (`t1`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] +:- CTERelationDef xxxx, false +: +- SubqueryAlias cte +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t2 +: +- View (`t2`, [col1#x, col2#x]) +: +- Project [cast(col1#x as string) AS col1#x, cast(col2#x as int) AS col2#x] +: +- Project [col1#x, col2#x] +: +- SubqueryAlias t1 +: +- LocalRelation [col1#x, col2#x] ++- Intersect false + :- Project [col1#x, col2#x] + : +- SubqueryAlias __auto_generated_subquery_name + : +- Project [col1#x, col2#x] + : +- SubqueryAlias cte + : +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false + +- Project [col1#x, col2#x] + +- SubqueryAlias __auto_generated_subquery_name + +- Project [col1#x, col2#x] + +- SubqueryAlias cte + +- CTERelationRef xxxx, true, [col1#x, col2#x], false, false diff --git a/sql/core/src/test/resources/sql-tests/inputs/cte-with-multi-children-operators.sql b/sql/core/src/test/resources/sql-tests/inputs/cte-with-multi-children-operators.sql new file mode 100644 index 000000000000..731ade96c40f --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/inputs/cte-with-multi-children-operators.sql @@ -0,0 +1,71 @@ +-- This test tests CTEs with multi-children operators (Union, Intersect, Except, Join etc). + +CREATE TEMPORARY VIEW t1 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2); + +CREATE TEMPORARY VIEW t2 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2); + +-- LEFT JOIN +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- INNER JOIN +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- RIGHT JOIN +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- FULL OUTER JOIN +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2); + +-- Tests with CTE reference + +-- LEFT JOIN with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- INNER JOIN with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- RIGHT JOIN with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- FULL OUTER JOIN with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- UNION with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- EXCEPT with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); + +-- INTERSECT with CTE reference +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte); diff --git a/sql/core/src/test/resources/sql-tests/results/cte-with-multi-children-operators.sql.out b/sql/core/src/test/resources/sql-tests/results/cte-with-multi-children-operators.sql.out new file mode 100644 index 000000000000..45c5af253f4c --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/results/cte-with-multi-children-operators.sql.out @@ -0,0 +1,281 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +CREATE TEMPORARY VIEW t1 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2) +-- !query schema +struct<> +-- !query output + + + +-- !query +CREATE TEMPORARY VIEW t2 AS SELECT * FROM VALUES + ("one", 1), ("two", 2), ("three", 3), ("one", 5) AS t1(col1, col2) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 +one 5 +three 3 +two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output + + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM t1) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM t2) +-- !query schema +struct +-- !query output +one 1 +one 5 +three 3 +two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +LEFT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INNER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +RIGHT JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +FULL OUTER JOIN (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 one 1 +one 1 one 5 +one 1 three 3 +one 1 two 2 +one 5 one 1 +one 5 one 5 +one 5 three 3 +one 5 two 2 +three 3 one 1 +three 3 one 5 +three 3 three 3 +three 3 two 2 +two 2 one 1 +two 2 one 5 +two 2 three 3 +two 2 two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +UNION +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 +one 5 +three 3 +two 2 + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +EXCEPT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output + + + +-- !query +SELECT * FROM (WITH cte AS (SELECT * FROM t1) SELECT * FROM cte) +INTERSECT +SELECT * FROM (WITH cte AS (SELECT * FROM t2) SELECT * FROM cte) +-- !query schema +struct +-- !query output +one 1 +one 5 +three 3 +two 2