Adding upstream version 15.0.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
70d5d3451a
commit
bb75596aa9
167 changed files with 58268 additions and 51337 deletions
4
tests/fixtures/optimizer/canonicalize.sql
vendored
4
tests/fixtures/optimizer/canonicalize.sql
vendored
|
@ -10,8 +10,8 @@ SELECT CAST(1 AS VARCHAR) AS "a" FROM "w" AS "w";
|
|||
SELECT CAST(1 + 3.2 AS DOUBLE) AS a FROM w AS w;
|
||||
SELECT 1 + 3.2 AS "a" FROM "w" AS "w";
|
||||
|
||||
SELECT CAST("2022-01-01" AS DATE) + INTERVAL '1' day;
|
||||
SELECT CAST("2022-01-01" AS DATE) + INTERVAL '1' day AS "_col_0";
|
||||
SELECT CAST('2022-01-01' AS DATE) + INTERVAL '1' day;
|
||||
SELECT CAST('2022-01-01' AS DATE) + INTERVAL '1' day AS "_col_0";
|
||||
|
||||
--------------------------------------
|
||||
-- Ensure boolean predicates
|
||||
|
|
|
@ -35,8 +35,8 @@ SELECT * FROM (SELECT * FROM (SELECT a FROM x) AS x) AS y JOIN (SELECT * FROM x)
|
|||
WITH x_2 AS (SELECT a FROM x), y AS (SELECT * FROM x_2 AS x), z AS (SELECT * FROM x) SELECT * FROM y AS y JOIN z AS z ON x.a = y.a;
|
||||
|
||||
-- Name conflicts with table alias
|
||||
SELECT a FROM (SELECT a FROM (SELECT a FROM x) AS y) AS z JOIN q AS y;
|
||||
WITH y AS (SELECT a FROM x), z AS (SELECT a FROM y AS y) SELECT a FROM z AS z JOIN q AS y;
|
||||
SELECT a FROM (SELECT a FROM (SELECT a FROM x) AS y) AS z CROSS JOIN q AS y;
|
||||
WITH y AS (SELECT a FROM x), z AS (SELECT a FROM y AS y) SELECT a FROM z AS z CROSS JOIN q AS y;
|
||||
|
||||
-- Name conflicts with existing CTE
|
||||
WITH y AS (SELECT a FROM (SELECT a FROM x) AS y) SELECT a FROM y;
|
||||
|
@ -63,12 +63,12 @@ SELECT a FROM x WHERE b = (SELECT c FROM y WHERE y.a = x.a);
|
|||
SELECT a FROM x WHERE b = (SELECT c FROM y WHERE y.a = x.a);
|
||||
|
||||
-- Duplicate CTE
|
||||
SELECT a FROM (SELECT b FROM x) AS y JOIN (SELECT b FROM x) AS z;
|
||||
WITH y AS (SELECT b FROM x) SELECT a FROM y AS y JOIN y AS z;
|
||||
SELECT a FROM (SELECT b FROM x) AS y CROSS JOIN (SELECT b FROM x) AS z;
|
||||
WITH y AS (SELECT b FROM x) SELECT a FROM y AS y CROSS JOIN y AS z;
|
||||
|
||||
-- Doubly duplicate CTE
|
||||
SELECT * FROM (SELECT * FROM x JOIN (SELECT * FROM x) AS y) AS z JOIN (SELECT * FROM x JOIN (SELECT * FROM x) AS y) AS q;
|
||||
WITH y AS (SELECT * FROM x), z AS (SELECT * FROM x JOIN y AS y) SELECT * FROM z AS z JOIN z AS q;
|
||||
WITH y AS (SELECT * FROM x), z AS (SELECT * FROM x, y AS y) SELECT * FROM z AS z, z AS q;
|
||||
|
||||
-- Another duplicate...
|
||||
SELECT x.id FROM (SELECT * FROM x AS x JOIN y AS y ON x.id = y.id) AS x JOIN (SELECT * FROM x AS x JOIN y AS y ON x.id = y.id) AS y ON x.id = y.id;
|
||||
|
@ -79,8 +79,8 @@ WITH x_2 AS (SELECT * FROM x AS x JOIN y AS y ON x.id = y.id) SELECT x.id FROM x
|
|||
(WITH cte AS (SELECT * FROM x) SELECT * FROM cte AS cte) LIMIT 1;
|
||||
|
||||
-- Existing duplicate CTE
|
||||
WITH y AS (SELECT a FROM x) SELECT a FROM (SELECT a FROM x) AS y JOIN y AS z;
|
||||
WITH y AS (SELECT a FROM x) SELECT a FROM y AS y JOIN y AS z;
|
||||
WITH y AS (SELECT a FROM x) SELECT a FROM (SELECT a FROM x) AS y CROSS JOIN y AS z;
|
||||
WITH y AS (SELECT a FROM x) SELECT a FROM y AS y CROSS JOIN y AS z;
|
||||
|
||||
-- Nested CTE
|
||||
WITH cte1 AS (SELECT a FROM x) SELECT a FROM (WITH cte2 AS (SELECT a FROM cte1) SELECT a FROM cte2);
|
||||
|
|
40
tests/fixtures/optimizer/expand_laterals.sql
vendored
40
tests/fixtures/optimizer/expand_laterals.sql
vendored
|
@ -1,40 +0,0 @@
|
|||
# title: expand alias reference
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
i + 1 AS j,
|
||||
j + 1 AS k
|
||||
FROM x;
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
x.a + 1 + 1 AS j,
|
||||
x.a + 1 + 1 + 1 AS k
|
||||
FROM x;
|
||||
|
||||
# title: noop - reference comes before alias
|
||||
SELECT
|
||||
b + 1 AS j,
|
||||
x.a + 1 AS i
|
||||
FROM x;
|
||||
SELECT
|
||||
b + 1 AS j,
|
||||
x.a + 1 AS i
|
||||
FROM x;
|
||||
|
||||
|
||||
# title: subquery
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
i + 1 AS j
|
||||
FROM x
|
||||
);
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
x.a + 1 + 1 AS j
|
||||
FROM x
|
||||
);
|
|
@ -1,11 +0,0 @@
|
|||
--------------------------------------
|
||||
-- Multi Table Selects
|
||||
--------------------------------------
|
||||
SELECT * FROM x AS x, y AS y WHERE x.a = y.a;
|
||||
SELECT * FROM x AS x CROSS JOIN y AS y WHERE x.a = y.a;
|
||||
|
||||
SELECT * FROM x AS x, y AS y WHERE x.a = y.a AND x.a = 1 and y.b = 1;
|
||||
SELECT * FROM x AS x CROSS JOIN y AS y WHERE x.a = y.a AND x.a = 1 AND y.b = 1;
|
||||
|
||||
SELECT * FROM x AS x, y AS y WHERE x.a > y.a;
|
||||
SELECT * FROM x AS x CROSS JOIN y AS y WHERE x.a > y.a;
|
|
@ -4,20 +4,20 @@ SELECT * FROM (SELECT * FROM x AS x) AS x, (SELECT * FROM y AS y) AS y2;
|
|||
SELECT * FROM x AS x WHERE x = 1;
|
||||
SELECT * FROM x AS x WHERE x = 1;
|
||||
|
||||
SELECT * FROM x AS x JOIN y AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x JOIN (SELECT * FROM y AS y) AS y;
|
||||
SELECT * FROM x AS x CROSS JOIN y AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x CROSS JOIN (SELECT * FROM y AS y) AS y;
|
||||
|
||||
SELECT * FROM (SELECT 1) AS x JOIN y AS y;
|
||||
SELECT * FROM (SELECT 1) AS x JOIN (SELECT * FROM y AS y) AS y;
|
||||
SELECT * FROM (SELECT 1) AS x CROSS JOIN y AS y;
|
||||
SELECT * FROM (SELECT 1) AS x CROSS JOIN (SELECT * FROM y AS y) AS y;
|
||||
|
||||
SELECT * FROM x AS x JOIN (SELECT * FROM y) AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x JOIN (SELECT * FROM y) AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x, (SELECT * FROM y) AS y;
|
||||
|
||||
WITH y AS (SELECT *) SELECT * FROM x AS x;
|
||||
WITH y AS (SELECT *) SELECT * FROM x AS x;
|
||||
|
||||
WITH y AS (SELECT * FROM y AS y2 JOIN x AS z2) SELECT * FROM x AS x JOIN y as y;
|
||||
WITH y AS (SELECT * FROM (SELECT * FROM y AS y) AS y2 JOIN (SELECT * FROM x AS x) AS z2) SELECT * FROM (SELECT * FROM x AS x) AS x JOIN y AS y;
|
||||
WITH y AS (SELECT * FROM y AS y2 CROSS JOIN x AS z2) SELECT * FROM x AS x CROSS JOIN y as y;
|
||||
WITH y AS (SELECT * FROM (SELECT * FROM y AS y) AS y2 CROSS JOIN (SELECT * FROM x AS x) AS z2) SELECT * FROM (SELECT * FROM x AS x) AS x CROSS JOIN y AS y;
|
||||
|
||||
SELECT * FROM x AS x JOIN xx AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x JOIN xx AS y;
|
||||
SELECT * FROM x AS x CROSS JOIN xx AS y;
|
||||
SELECT * FROM (SELECT * FROM x AS x) AS x CROSS JOIN xx AS y;
|
||||
|
|
|
@ -48,8 +48,8 @@ SELECT r.b FROM (SELECT b FROM x AS x) AS q JOIN (SELECT b FROM x) AS r ON q.b =
|
|||
SELECT x_2.b AS b FROM x AS x JOIN x AS x_2 ON x.b = x_2.b;
|
||||
|
||||
# title: WHERE clause in joined derived table is merged to ON clause
|
||||
SELECT x.a, y.c FROM x JOIN (SELECT b, c FROM y WHERE c > 1) AS y ON x.b = y.b;
|
||||
SELECT x.a AS a, y.c AS c FROM x AS x JOIN y AS y ON x.b = y.b AND y.c > 1;
|
||||
SELECT x.a, y.c FROM x JOIN (SELECT b, c FROM y WHERE c > 1) AS y ON x.b = y.b ORDER BY x.a;
|
||||
SELECT x.a AS a, y.c AS c FROM x AS x JOIN y AS y ON x.b = y.b AND y.c > 1 ORDER BY x.a;
|
||||
|
||||
# title: Comma JOIN in outer query
|
||||
SELECT x.a, y.c FROM (SELECT a FROM x) AS x, (SELECT c FROM y) AS y;
|
||||
|
@ -57,7 +57,7 @@ SELECT x.a AS a, y.c AS c FROM x AS x, y AS y;
|
|||
|
||||
# title: Comma JOIN in inner query
|
||||
SELECT x.a, x.c FROM (SELECT x.a, z.c FROM x, y AS z) AS x;
|
||||
SELECT x.a AS a, z.c AS c FROM x AS x CROSS JOIN y AS z;
|
||||
SELECT x.a AS a, z.c AS c FROM x AS x, y AS z;
|
||||
|
||||
# title: (Regression) Column in ORDER BY
|
||||
SELECT * FROM (SELECT * FROM (SELECT * FROM x)) ORDER BY a LIMIT 1;
|
||||
|
|
3
tests/fixtures/optimizer/normalize.sql
vendored
3
tests/fixtures/optimizer/normalize.sql
vendored
|
@ -42,3 +42,6 @@ A OR ((((B OR C) AND (B OR D)) OR C) AND (((B OR C) AND (B OR D)) OR D));
|
|||
|
||||
SELECT * FROM x WHERE (A AND B) OR C;
|
||||
SELECT * FROM x WHERE (A OR C) AND (B OR C);
|
||||
|
||||
dt2 between '2022-01-01 12:00:00' and '2022-12-31' and dt2 >= '2022-05-01 12:00:00' or dt2 = '2021-06-01 12:00:00';
|
||||
(dt2 <= '2022-12-31' OR dt2 = '2021-06-01 12:00:00') AND (dt2 = '2021-06-01 12:00:00' OR dt2 >= '2022-01-01 12:00:00') AND (dt2 = '2021-06-01 12:00:00' OR dt2 >= '2022-05-01 12:00:00')
|
||||
|
|
|
@ -1,11 +1,19 @@
|
|||
SELECT a FROM x;
|
||||
SELECT a FROM x;
|
||||
|
||||
# dialect: snowflake
|
||||
SELECT A FROM X;
|
||||
SELECT A FROM X;
|
||||
|
||||
SELECT "A" FROM "X";
|
||||
SELECT "A" FROM "X";
|
||||
|
||||
SELECT a AS A FROM x;
|
||||
SELECT a AS A FROM x;
|
||||
SELECT a AS a FROM x;
|
||||
|
||||
# dialect: snowflake
|
||||
SELECT A AS a FROM X;
|
||||
SELECT A AS A FROM X;
|
||||
|
||||
SELECT * FROM x;
|
||||
SELECT * FROM x;
|
||||
|
@ -13,29 +21,37 @@ SELECT * FROM x;
|
|||
SELECT A FROM x;
|
||||
SELECT a FROM x;
|
||||
|
||||
# dialect: snowflake
|
||||
SELECT a FROM X;
|
||||
SELECT A FROM X;
|
||||
|
||||
SELECT a FROM X;
|
||||
SELECT a FROM x;
|
||||
|
||||
# dialect: snowflake
|
||||
SELECT A FROM x;
|
||||
SELECT A FROM X;
|
||||
|
||||
SELECT A AS A FROM (SELECT a AS A FROM x);
|
||||
SELECT a AS A FROM (SELECT a AS a FROM x);
|
||||
SELECT a AS a FROM (SELECT a AS a FROM x);
|
||||
|
||||
SELECT a AS B FROM x ORDER BY B;
|
||||
SELECT a AS B FROM x ORDER BY B;
|
||||
SELECT a AS b FROM x ORDER BY b;
|
||||
|
||||
SELECT A FROM x ORDER BY A;
|
||||
SELECT a FROM x ORDER BY a;
|
||||
|
||||
SELECT A AS B FROM X GROUP BY A HAVING SUM(B) > 0;
|
||||
SELECT a AS B FROM x GROUP BY a HAVING SUM(b) > 0;
|
||||
SELECT a AS b FROM x GROUP BY a HAVING SUM(b) > 0;
|
||||
|
||||
SELECT A AS B, SUM(B) AS C FROM X GROUP BY A HAVING C > 0;
|
||||
SELECT a AS B, SUM(b) AS C FROM x GROUP BY a HAVING C > 0;
|
||||
SELECT a AS b, SUM(b) AS c FROM x GROUP BY a HAVING c > 0;
|
||||
|
||||
SELECT A FROM X UNION SELECT A FROM X;
|
||||
SELECT a FROM x UNION SELECT a FROM x;
|
||||
|
||||
SELECT A AS A FROM X UNION SELECT A AS A FROM X;
|
||||
SELECT a AS A FROM x UNION SELECT a AS A FROM x;
|
||||
SELECT a AS a FROM x UNION SELECT a AS a FROM x;
|
||||
|
||||
(SELECT A AS A FROM X);
|
||||
(SELECT a AS A FROM x);
|
||||
(SELECT a AS a FROM x);
|
16
tests/fixtures/optimizer/optimize_joins.sql
vendored
16
tests/fixtures/optimizer/optimize_joins.sql
vendored
|
@ -10,11 +10,23 @@ SELECT * FROM x JOIN z ON x.a = z.a AND TRUE JOIN y ON y.a = z.a;
|
|||
SELECT * FROM x LEFT JOIN y ON y.a = 1 JOIN z ON x.a = z.a AND y.a = z.a;
|
||||
SELECT * FROM x JOIN z ON x.a = z.a AND TRUE LEFT JOIN y ON y.a = 1 AND y.a = z.a;
|
||||
|
||||
SELECT * FROM x INNER JOIN z;
|
||||
SELECT * FROM x JOIN z;
|
||||
SELECT * FROM x INNER JOIN z ON x.id = z.id;
|
||||
SELECT * FROM x JOIN z ON x.id = z.id;
|
||||
|
||||
SELECT * FROM x LEFT OUTER JOIN z;
|
||||
SELECT * FROM x LEFT JOIN z;
|
||||
|
||||
SELECT * FROM x CROSS JOIN z;
|
||||
SELECT * FROM x CROSS JOIN z;
|
||||
|
||||
SELECT * FROM x JOIN z;
|
||||
SELECT * FROM x CROSS JOIN z;
|
||||
|
||||
SELECT * FROM x NATURAL JOIN z;
|
||||
SELECT * FROM x NATURAL JOIN z;
|
||||
|
||||
SELECT * FROM x RIGHT JOIN z;
|
||||
SELECT * FROM x RIGHT JOIN z;
|
||||
|
||||
SELECT * FROM x JOIN z USING (id);
|
||||
SELECT * FROM x JOIN z USING (id);
|
||||
|
|
121
tests/fixtures/optimizer/optimizer.sql
vendored
121
tests/fixtures/optimizer/optimizer.sql
vendored
|
@ -101,10 +101,10 @@ SELECT
|
|||
"x"."a" AS "a",
|
||||
SUM("y"."b") AS "sum_b"
|
||||
FROM "x" AS "x"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "x"."b" = "_u_0"."_u_1"
|
||||
JOIN "y" AS "y"
|
||||
ON "x"."b" = "y"."b"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "x"."b" = "_u_0"."_u_1"
|
||||
WHERE
|
||||
"_u_0"."_col_0" >= 0 AND "x"."a" > 1
|
||||
GROUP BY
|
||||
|
@ -502,3 +502,120 @@ WHERE
|
|||
"unioned"."source_system" = 'bamboohr' OR "unioned"."source_system" = 'workday'
|
||||
QUALIFY
|
||||
ROW_NUMBER() OVER (PARTITION BY "unioned"."unique_filter_key" ORDER BY "unioned"."sort_order" DESC, 1) = 1;
|
||||
|
||||
# title: pivoted source with explicit selections
|
||||
# execute: false
|
||||
SELECT * FROM (SELECT a, b, c FROM sc.tb) PIVOT (SUM(c) FOR b IN ('x','y','z'));
|
||||
SELECT
|
||||
"_q_1"."a" AS "a",
|
||||
"_q_1"."x" AS "x",
|
||||
"_q_1"."y" AS "y",
|
||||
"_q_1"."z" AS "z"
|
||||
FROM (
|
||||
SELECT
|
||||
"tb"."a" AS "a",
|
||||
"tb"."b" AS "b",
|
||||
"tb"."c" AS "c"
|
||||
FROM "sc"."tb" AS "tb"
|
||||
) AS "_q_0" PIVOT(SUM("_q_0"."c") FOR "_q_0"."b" IN ('x', 'y', 'z')) AS "_q_1";
|
||||
|
||||
# title: pivoted source with implicit selections
|
||||
# execute: false
|
||||
SELECT * FROM (SELECT * FROM u) PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
||||
SELECT
|
||||
"_q_1"."g" AS "g",
|
||||
"_q_1"."x" AS "x",
|
||||
"_q_1"."y" AS "y"
|
||||
FROM (
|
||||
SELECT
|
||||
"u"."f" AS "f",
|
||||
"u"."g" AS "g",
|
||||
"u"."h" AS "h"
|
||||
FROM "u" AS "u"
|
||||
) AS "_q_0" PIVOT(SUM("_q_0"."f") FOR "_q_0"."h" IN ('x', 'y')) AS "_q_1";
|
||||
|
||||
# title: selecting explicit qualified columns from pivoted source with explicit selections
|
||||
# execute: false
|
||||
SELECT piv.x, piv.y FROM (SELECT f, h FROM u) PIVOT (SUM(f) FOR h IN ('x', 'y')) AS piv;
|
||||
SELECT
|
||||
"piv"."x" AS "x",
|
||||
"piv"."y" AS "y"
|
||||
FROM (
|
||||
SELECT
|
||||
"u"."f" AS "f",
|
||||
"u"."h" AS "h"
|
||||
FROM "u" AS "u"
|
||||
) AS "_q_0" PIVOT(SUM("_q_0"."f") FOR "_q_0"."h" IN ('x', 'y')) AS "piv";
|
||||
|
||||
# title: selecting explicit unqualified columns from pivoted source with implicit selections
|
||||
# execute: false
|
||||
SELECT x, y FROM u PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
||||
SELECT
|
||||
"_q_0"."x" AS "x",
|
||||
"_q_0"."y" AS "y"
|
||||
FROM "u" AS "u" PIVOT(SUM("u"."f") FOR "u"."h" IN ('x', 'y')) AS "_q_0";
|
||||
|
||||
# title: selecting all columns from a pivoted CTE source, using alias for the aggregation and generating bigquery
|
||||
# execute: false
|
||||
# dialect: bigquery
|
||||
WITH u_cte(f, g, h) AS (SELECT * FROM u) SELECT * FROM u_cte PIVOT(SUM(f) AS sum FOR h IN ('x', 'y'));
|
||||
WITH `u_cte` AS (
|
||||
SELECT
|
||||
`u`.`f` AS `f`,
|
||||
`u`.`g` AS `g`,
|
||||
`u`.`h` AS `h`
|
||||
FROM `u` AS `u`
|
||||
)
|
||||
SELECT
|
||||
`_q_0`.`g` AS `g`,
|
||||
`_q_0`.`sum_x` AS `sum_x`,
|
||||
`_q_0`.`sum_y` AS `sum_y`
|
||||
FROM `u_cte` AS `u_cte` PIVOT(SUM(`u_cte`.`f`) AS `sum` FOR `u_cte`.`h` IN ('x', 'y')) AS `_q_0`;
|
||||
|
||||
# title: selecting all columns from a pivoted source and generating snowflake
|
||||
# execute: false
|
||||
# dialect: snowflake
|
||||
SELECT * FROM u PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
||||
SELECT
|
||||
"_q_0"."G" AS "G",
|
||||
"_q_0"."'x'" AS "'x'",
|
||||
"_q_0"."'y'" AS "'y'"
|
||||
FROM "U" AS "U" PIVOT(SUM("U"."F") FOR "U"."H" IN ('x', 'y')) AS "_q_0"
|
||||
;
|
||||
|
||||
# title: selecting all columns from a pivoted source and generating spark
|
||||
# note: spark doesn't allow pivot aliases or qualified columns for the pivot's "field" (`h`)
|
||||
# execute: false
|
||||
# dialect: spark
|
||||
SELECT * FROM u PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
||||
SELECT
|
||||
`_q_0`.`g` AS `g`,
|
||||
`_q_0`.`x` AS `x`,
|
||||
`_q_0`.`y` AS `y`
|
||||
FROM (
|
||||
SELECT
|
||||
*
|
||||
FROM `u` AS `u` PIVOT(SUM(`u`.`f`) FOR `h` IN ('x', 'y'))
|
||||
) AS `_q_0`;
|
||||
|
||||
# title: quoting is maintained
|
||||
# dialect: snowflake
|
||||
with cte1("id", foo) as (select 1, 2) select "id" from cte1;
|
||||
WITH "CTE1" AS (
|
||||
SELECT
|
||||
1 AS "id"
|
||||
)
|
||||
SELECT
|
||||
"CTE1"."id" AS "id"
|
||||
FROM "CTE1";
|
||||
|
||||
# title: ensures proper quoting happens after all optimizations
|
||||
# execute: false
|
||||
SELECT "foO".x FROM (SELECT 1 AS x) AS "foO";
|
||||
WITH "foO" AS (
|
||||
SELECT
|
||||
1 AS "x"
|
||||
)
|
||||
SELECT
|
||||
"foO"."x" AS "x"
|
||||
FROM "foO" AS "foO";
|
||||
|
|
|
@ -4,8 +4,8 @@ SELECT x.a AS a FROM (SELECT x.a FROM x AS x WHERE x.a = 1 AND x.b = 1) AS x JOI
|
|||
WITH x AS (SELECT y.a FROM y) SELECT * FROM x WHERE x.a = 1;
|
||||
WITH x AS (SELECT y.a FROM y WHERE y.a = 1) SELECT * FROM x WHERE TRUE;
|
||||
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y WHERE y.a = 1 OR (x.a = 1 AND x.b = 1);
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y WHERE (x.a = 1 AND x.b = 1) OR y.a = 1;
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x CROSS JOIN y WHERE y.a = 1 OR (x.a = 1 AND x.b = 1);
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x CROSS JOIN y WHERE (x.a = 1 AND x.b = 1) OR y.a = 1;
|
||||
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y WHERE (x.a = y.a AND x.a = 1 AND x.b = 1) OR x.a = y.a;
|
||||
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y ON x.a = y.a WHERE TRUE;
|
||||
|
|
|
@ -61,9 +61,13 @@ SELECT q.x AS x FROM (VALUES (1, 2)) AS q(x, y);
|
|||
SELECT i.a FROM x AS i LEFT JOIN (SELECT a, b FROM (SELECT a, b FROM x)) AS j ON i.a = j.a;
|
||||
SELECT i.a AS a FROM x AS i LEFT JOIN (SELECT _q_0.a AS a FROM (SELECT x.a AS a FROM x AS x) AS _q_0) AS j ON i.a = j.a;
|
||||
|
||||
WITH cte AS (SELECT source.a AS a, ROW_NUMBER() OVER (PARTITION BY source.id, source.timestamp ORDER BY source.a DESC) AS index FROM source AS source QUALIFY index) SELECT cte.a AS a FROM cte;
|
||||
WITH cte AS (SELECT source.a AS a FROM source AS source QUALIFY ROW_NUMBER() OVER (PARTITION BY source.id, source.timestamp ORDER BY source.a DESC)) SELECT cte.a AS a FROM cte;
|
||||
|
||||
--------------------------------------
|
||||
-- Unknown Star Expansion
|
||||
--------------------------------------
|
||||
|
||||
SELECT a FROM (SELECT * FROM zz) WHERE b = 1;
|
||||
SELECT _q_0.a AS a FROM (SELECT zz.a AS a, zz.b AS b FROM zz AS zz) AS _q_0 WHERE _q_0.b = 1;
|
||||
|
||||
|
|
35
tests/fixtures/optimizer/qualify_columns.sql
vendored
35
tests/fixtures/optimizer/qualify_columns.sql
vendored
|
@ -5,7 +5,7 @@ SELECT a FROM x;
|
|||
SELECT x.a AS a FROM x AS x;
|
||||
|
||||
SELECT "a" FROM x;
|
||||
SELECT x."a" AS "a" FROM x AS x;
|
||||
SELECT x.a AS a FROM x AS x;
|
||||
|
||||
# execute: false
|
||||
SELECT a FROM zz GROUP BY a ORDER BY a;
|
||||
|
@ -396,8 +396,39 @@ SELECT x.a + 1 AS a, ROW_NUMBER() OVER (PARTITION BY x.b ORDER BY x.a) AS row_nu
|
|||
|
||||
# dialect: bigquery
|
||||
SELECT ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) AS row_num FROM x QUALIFY row_num = 1;
|
||||
SELECT ROW_NUMBER() OVER (PARTITION BY x.a ORDER BY x.b) AS row_num FROM x AS x QUALIFY row_num = 1;
|
||||
SELECT ROW_NUMBER() OVER (PARTITION BY x.a ORDER BY x.b) AS row_num FROM x AS x QUALIFY ROW_NUMBER() OVER (PARTITION BY x.a ORDER BY x.b) = 1;
|
||||
|
||||
# dialect: bigquery
|
||||
SELECT x.b, x.a FROM x LEFT JOIN y ON x.b = y.b QUALIFY ROW_NUMBER() OVER(PARTITION BY x.b ORDER BY x.a DESC) = 1;
|
||||
SELECT x.b AS b, x.a AS a FROM x AS x LEFT JOIN y AS y ON x.b = y.b QUALIFY ROW_NUMBER() OVER (PARTITION BY x.b ORDER BY x.a DESC) = 1;
|
||||
|
||||
SELECT * FROM x QUALIFY COUNT(a) OVER (PARTITION BY b) > 1;
|
||||
SELECT x.a AS a, x.b AS b FROM x AS x QUALIFY COUNT(x.a) OVER (PARTITION BY x.b) > 1;
|
||||
|
||||
--------------------------------------
|
||||
-- Expand laterals
|
||||
--------------------------------------
|
||||
|
||||
# title: expand alias reference
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
i + 1 AS j,
|
||||
j + 1 AS k
|
||||
FROM x;
|
||||
SELECT x.a + 1 AS i, x.a + 1 + 1 AS j, x.a + 1 + 1 + 1 AS k FROM x AS x;
|
||||
|
||||
# title: noop - reference comes before alias
|
||||
# execute: false
|
||||
SELECT i + 1 AS j, x.a + 1 AS i FROM x;
|
||||
SELECT i + 1 AS j, x.a + 1 AS i FROM x AS x;
|
||||
|
||||
# title: subquery
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
SELECT
|
||||
x.a + 1 AS i,
|
||||
i + 1 AS j
|
||||
FROM x
|
||||
);
|
||||
SELECT _q_0.i AS i, _q_0.j AS j FROM (SELECT x.a + 1 AS i, x.a + 1 + 1 AS j FROM x AS x) AS _q_0;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
SELECT z.a FROM x;
|
||||
SELECT z.* FROM x;
|
||||
SELECT x FROM x;
|
||||
INSERT INTO x VALUES (1, 2);
|
||||
SELECT x FROM VALUES (1, 2);
|
||||
SELECT a FROM x AS z JOIN y AS z;
|
||||
SELECT a FROM x JOIN (SELECT b FROM y WHERE y.b = x.c);
|
||||
SELECT a FROM x AS y JOIN (SELECT a FROM y) AS q ON y.a = q.a;
|
||||
|
|
|
@ -10,11 +10,11 @@ SELECT x.b AS b FROM x AS x;
|
|||
--------------------------------------
|
||||
-- Derived tables
|
||||
--------------------------------------
|
||||
SELECT x.a FROM x AS x JOIN (SELECT * FROM x);
|
||||
SELECT x.a AS a FROM x AS x JOIN (SELECT x.a AS a FROM x AS x) AS _q_0;
|
||||
SELECT x.a FROM x AS x CROSS JOIN (SELECT * FROM x);
|
||||
SELECT x.a AS a FROM x AS x CROSS JOIN (SELECT x.a AS a FROM x AS x) AS _q_0;
|
||||
|
||||
SELECT x.b FROM x AS x JOIN (SELECT b FROM x);
|
||||
SELECT x.b AS b FROM x AS x JOIN (SELECT x.b AS b FROM x AS x) AS _q_0;
|
||||
SELECT x.b FROM x AS x CROSS JOIN (SELECT b FROM x);
|
||||
SELECT x.b AS b FROM x AS x CROSS JOIN (SELECT x.b AS b FROM x AS x) AS _q_0;
|
||||
|
||||
--------------------------------------
|
||||
-- Expand *
|
||||
|
@ -22,11 +22,11 @@ SELECT x.b AS b FROM x AS x JOIN (SELECT x.b AS b FROM x AS x) AS _q_0;
|
|||
SELECT * FROM x;
|
||||
SELECT x.a AS a FROM x AS x;
|
||||
|
||||
SELECT * FROM y JOIN z ON y.b = z.b;
|
||||
SELECT y.b AS b, z.b AS b FROM y AS y JOIN z AS z ON y.b = z.b;
|
||||
SELECT * FROM y CROSS JOIN z ON y.b = z.b;
|
||||
SELECT y.b AS b, z.b AS b FROM y AS y CROSS JOIN z AS z ON y.b = z.b;
|
||||
|
||||
SELECT * FROM y JOIN z ON y.c = z.c;
|
||||
SELECT y.b AS b, z.b AS b FROM y AS y JOIN z AS z ON y.c = z.c;
|
||||
SELECT * FROM y CROSS JOIN z ON y.c = z.c;
|
||||
SELECT y.b AS b, z.b AS b FROM y AS y CROSS JOIN z AS z ON y.c = z.c;
|
||||
|
||||
SELECT a FROM (SELECT * FROM x);
|
||||
SELECT _q_0.a AS a FROM (SELECT x.a AS a FROM x AS x) AS _q_0;
|
||||
|
|
7
tests/fixtures/optimizer/qualify_tables.sql
vendored
7
tests/fixtures/optimizer/qualify_tables.sql
vendored
|
@ -16,9 +16,12 @@ WITH a AS (SELECT 1 FROM c.db.z AS z) SELECT 1 FROM a;
|
|||
SELECT (SELECT y.c FROM y AS y) FROM x;
|
||||
SELECT (SELECT y.c FROM c.db.y AS y) FROM c.db.x AS x;
|
||||
|
||||
-------------------------
|
||||
SELECT * FROM x PIVOT (SUM(a) FOR b IN ('a', 'b'));
|
||||
SELECT * FROM c.db.x AS x PIVOT(SUM(a) FOR b IN ('a', 'b')) AS _q_0;
|
||||
|
||||
----------------------------
|
||||
-- Expand join constructs
|
||||
-------------------------
|
||||
----------------------------
|
||||
|
||||
-- This is valid in Trino, so we treat the (tbl AS tbl) as a "join construct" per postgres' terminology.
|
||||
SELECT * FROM (tbl AS tbl) AS _q_0;
|
||||
|
|
17
tests/fixtures/optimizer/simplify.sql
vendored
17
tests/fixtures/optimizer/simplify.sql
vendored
|
@ -201,6 +201,21 @@ A AND B AND C AND D;
|
|||
(((((A) AND B)) AND C)) AND D;
|
||||
A AND B AND C AND D;
|
||||
|
||||
(x + 1) + 2;
|
||||
x + 3;
|
||||
|
||||
x + (1 + 2);
|
||||
x + 3;
|
||||
|
||||
(x * 2) * 4 + (1 + 3) + 5;
|
||||
x * 8 + 9;
|
||||
|
||||
(x - 1) - 2;
|
||||
(x - 1) - 2;
|
||||
|
||||
x - (3 - 2);
|
||||
x - 1;
|
||||
|
||||
--------------------------------------
|
||||
-- Comparison and Pruning
|
||||
--------------------------------------
|
||||
|
@ -574,4 +589,4 @@ x > 3;
|
|||
TRUE;
|
||||
|
||||
x = 2018 OR x <> 2018;
|
||||
x <> 2018 OR x = 2018;
|
||||
x <> 2018 OR x = 2018;
|
||||
|
|
540
tests/fixtures/optimizer/tpc-ds/tpc-ds.sql
vendored
540
tests/fixtures/optimizer/tpc-ds/tpc-ds.sql
vendored
File diff suppressed because it is too large
Load diff
40
tests/fixtures/optimizer/tpc-h/tpc-h.sql
vendored
40
tests/fixtures/optimizer/tpc-h/tpc-h.sql
vendored
|
@ -99,19 +99,19 @@ order by
|
|||
p_partkey
|
||||
limit
|
||||
100;
|
||||
WITH "partsupp_2" AS (
|
||||
SELECT
|
||||
"partsupp"."ps_partkey" AS "ps_partkey",
|
||||
"partsupp"."ps_suppkey" AS "ps_suppkey",
|
||||
"partsupp"."ps_supplycost" AS "ps_supplycost"
|
||||
FROM "partsupp" AS "partsupp"
|
||||
), "region_2" AS (
|
||||
WITH "region_2" AS (
|
||||
SELECT
|
||||
"region"."r_regionkey" AS "r_regionkey",
|
||||
"region"."r_name" AS "r_name"
|
||||
FROM "region" AS "region"
|
||||
WHERE
|
||||
"region"."r_name" = 'EUROPE'
|
||||
), "partsupp_2" AS (
|
||||
SELECT
|
||||
"partsupp"."ps_partkey" AS "ps_partkey",
|
||||
"partsupp"."ps_suppkey" AS "ps_suppkey",
|
||||
"partsupp"."ps_supplycost" AS "ps_supplycost"
|
||||
FROM "partsupp" AS "partsupp"
|
||||
), "_u_0" AS (
|
||||
SELECT
|
||||
MIN("partsupp"."ps_supplycost") AS "_col_0",
|
||||
|
@ -136,8 +136,6 @@ SELECT
|
|||
"supplier"."s_phone" AS "s_phone",
|
||||
"supplier"."s_comment" AS "s_comment"
|
||||
FROM "part" AS "part"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "part"."p_partkey" = "_u_0"."_u_1"
|
||||
CROSS JOIN "region_2" AS "region"
|
||||
JOIN "nation" AS "nation"
|
||||
ON "nation"."n_regionkey" = "region"."r_regionkey"
|
||||
|
@ -146,6 +144,8 @@ JOIN "partsupp_2" AS "partsupp"
|
|||
JOIN "supplier" AS "supplier"
|
||||
ON "supplier"."s_nationkey" = "nation"."n_nationkey"
|
||||
AND "supplier"."s_suppkey" = "partsupp"."ps_suppkey"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "part"."p_partkey" = "_u_0"."_u_1"
|
||||
WHERE
|
||||
"part"."p_size" = 15
|
||||
AND "part"."p_type" LIKE '%BRASS'
|
||||
|
@ -681,11 +681,11 @@ SELECT
|
|||
"partsupp"."ps_partkey" AS "ps_partkey",
|
||||
SUM("partsupp"."ps_supplycost" * "partsupp"."ps_availqty") AS "value"
|
||||
FROM "partsupp" AS "partsupp"
|
||||
CROSS JOIN "_u_0" AS "_u_0"
|
||||
JOIN "supplier_2" AS "supplier"
|
||||
ON "partsupp"."ps_suppkey" = "supplier"."s_suppkey"
|
||||
JOIN "nation_2" AS "nation"
|
||||
ON "supplier"."s_nationkey" = "nation"."n_nationkey"
|
||||
CROSS JOIN "_u_0" AS "_u_0"
|
||||
GROUP BY
|
||||
"partsupp"."ps_partkey"
|
||||
HAVING
|
||||
|
@ -950,13 +950,13 @@ SELECT
|
|||
"part"."p_size" AS "p_size",
|
||||
COUNT(DISTINCT "partsupp"."ps_suppkey") AS "supplier_cnt"
|
||||
FROM "partsupp" AS "partsupp"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "partsupp"."ps_suppkey" = "_u_0"."s_suppkey"
|
||||
JOIN "part" AS "part"
|
||||
ON "part"."p_brand" <> 'Brand#45'
|
||||
AND "part"."p_partkey" = "partsupp"."ps_partkey"
|
||||
AND "part"."p_size" IN (49, 14, 23, 45, 19, 3, 36, 9)
|
||||
AND NOT "part"."p_type" LIKE 'MEDIUM POLISHED%'
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "partsupp"."ps_suppkey" = "_u_0"."s_suppkey"
|
||||
WHERE
|
||||
"_u_0"."s_suppkey" IS NULL
|
||||
GROUP BY
|
||||
|
@ -1066,10 +1066,10 @@ SELECT
|
|||
FROM "customer" AS "customer"
|
||||
JOIN "orders" AS "orders"
|
||||
ON "customer"."c_custkey" = "orders"."o_custkey"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "orders"."o_orderkey" = "_u_0"."l_orderkey"
|
||||
JOIN "lineitem" AS "lineitem"
|
||||
ON "orders"."o_orderkey" = "lineitem"."l_orderkey"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "orders"."o_orderkey" = "_u_0"."l_orderkey"
|
||||
WHERE
|
||||
NOT "_u_0"."l_orderkey" IS NULL
|
||||
GROUP BY
|
||||
|
@ -1260,10 +1260,10 @@ SELECT
|
|||
"supplier"."s_name" AS "s_name",
|
||||
"supplier"."s_address" AS "s_address"
|
||||
FROM "supplier" AS "supplier"
|
||||
LEFT JOIN "_u_4" AS "_u_4"
|
||||
ON "supplier"."s_suppkey" = "_u_4"."ps_suppkey"
|
||||
JOIN "nation" AS "nation"
|
||||
ON "nation"."n_name" = 'CANADA' AND "supplier"."s_nationkey" = "nation"."n_nationkey"
|
||||
LEFT JOIN "_u_4" AS "_u_4"
|
||||
ON "supplier"."s_suppkey" = "_u_4"."ps_suppkey"
|
||||
WHERE
|
||||
NOT "_u_4"."ps_suppkey" IS NULL
|
||||
ORDER BY
|
||||
|
@ -1337,15 +1337,15 @@ FROM "supplier" AS "supplier"
|
|||
JOIN "lineitem" AS "lineitem"
|
||||
ON "lineitem"."l_receiptdate" > "lineitem"."l_commitdate"
|
||||
AND "supplier"."s_suppkey" = "lineitem"."l_suppkey"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "_u_0"."l_orderkey" = "lineitem"."l_orderkey"
|
||||
LEFT JOIN "_u_2" AS "_u_2"
|
||||
ON "_u_2"."l_orderkey" = "lineitem"."l_orderkey"
|
||||
JOIN "orders" AS "orders"
|
||||
ON "orders"."o_orderkey" = "lineitem"."l_orderkey" AND "orders"."o_orderstatus" = 'F'
|
||||
JOIN "nation" AS "nation"
|
||||
ON "nation"."n_name" = 'SAUDI ARABIA'
|
||||
AND "supplier"."s_nationkey" = "nation"."n_nationkey"
|
||||
LEFT JOIN "_u_0" AS "_u_0"
|
||||
ON "_u_0"."l_orderkey" = "lineitem"."l_orderkey"
|
||||
LEFT JOIN "_u_2" AS "_u_2"
|
||||
ON "_u_2"."l_orderkey" = "lineitem"."l_orderkey"
|
||||
WHERE
|
||||
(
|
||||
"_u_2"."l_orderkey" IS NULL
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue