Back to home page

OSCL-LXR

 
 

    


0001 --
0002 -- Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
0003 --
0004 --
0005 -- WITH
0006 -- https://github.com/postgres/postgres/blob/REL_12_BETA2/src/test/regress/sql/with.sql
0007 --
0008 -- This test uses the generate_series(...) function which is rewritten to EXPLODE(SEQUENCE(...)) as
0009 -- it's feature tracking ticket SPARK-27767 is closed as Won't Do.
0010 
0011 --
0012 -- Tests for common table expressions (WITH query, ... SELECT ...)
0013 --
0014 
0015 -- Basic WITH
0016 WITH q1(x,y) AS (SELECT 1,2)
0017 SELECT * FROM q1, q1 AS q2;
0018 
0019 -- Multiple uses are evaluated only once
0020 -- [SPARK-28299] Evaluation of multiple CTE uses
0021 -- [ORIGINAL SQL]
0022 --SELECT count(*) FROM (
0023 --  WITH q1(x) AS (SELECT random() FROM generate_series(1, 5))
0024 --    SELECT * FROM q1
0025 --  UNION
0026 --    SELECT * FROM q1
0027 --) ss;
0028 SELECT count(*) FROM (
0029   WITH q1(x) AS (SELECT rand() FROM (SELECT EXPLODE(SEQUENCE(1, 5))))
0030     SELECT * FROM q1
0031   UNION
0032     SELECT * FROM q1
0033 ) ss;
0034 
0035 -- WITH RECURSIVE
0036 
0037 -- sum of 1..100
0038 -- [SPARK-24497] Support recursive SQL query
0039 --WITH RECURSIVE t(n) AS (
0040 --    VALUES (1)
0041 --UNION ALL
0042 --    SELECT n+1 FROM t WHERE n < 100
0043 --)
0044 --SELECT sum(n) FROM t;
0045 
0046 -- [SPARK-24497] Support recursive SQL query
0047 --WITH RECURSIVE t(n) AS (
0048 --    SELECT (VALUES(1))
0049 --UNION ALL
0050 --    SELECT n+1 FROM t WHERE n < 5
0051 --)
0052 --SELECT * FROM t;
0053 
0054 -- recursive view
0055 -- [SPARK-24497] Support recursive SQL query
0056 --CREATE RECURSIVE VIEW nums (n) AS
0057 --    VALUES (1)
0058 --UNION ALL
0059 --    SELECT n+1 FROM nums WHERE n < 5;
0060 --
0061 --SELECT * FROM nums;
0062 
0063 -- [SPARK-24497] Support recursive SQL query
0064 --CREATE OR REPLACE RECURSIVE VIEW nums (n) AS
0065 --    VALUES (1)
0066 --UNION ALL
0067 --    SELECT n+1 FROM nums WHERE n < 6;
0068 --
0069 --SELECT * FROM nums;
0070 
0071 -- This is an infinite loop with UNION ALL, but not with UNION
0072 -- [SPARK-24497] Support recursive SQL query
0073 --WITH RECURSIVE t(n) AS (
0074 --    SELECT 1
0075 --UNION
0076 --    SELECT 10-n FROM t)
0077 --SELECT * FROM t;
0078 
0079 -- This'd be an infinite loop, but outside query reads only as much as needed
0080 -- [SPARK-24497] Support recursive SQL query
0081 --WITH RECURSIVE t(n) AS (
0082 --    VALUES (1)
0083 --UNION ALL
0084 --    SELECT n+1 FROM t)
0085 --SELECT * FROM t LIMIT 10;
0086 
0087 -- UNION case should have same property
0088 -- [SPARK-24497] Support recursive SQL query
0089 --WITH RECURSIVE t(n) AS (
0090 --    SELECT 1
0091 --UNION
0092 --    SELECT n+1 FROM t)
0093 --SELECT * FROM t LIMIT 10;
0094 
0095 -- Test behavior with an unknown-type literal in the WITH
0096 -- [SPARK-28146] Support IS OF type predicate
0097 --WITH q AS (SELECT 'foo' AS x)
0098 --SELECT x, x IS OF (text) AS is_text FROM q;
0099 
0100 -- [SPARK-24497] Support recursive SQL query
0101 -- [SPARK-28146] Support IS OF type predicate
0102 --WITH RECURSIVE t(n) AS (
0103 --    SELECT 'foo'
0104 --UNION ALL
0105 --    SELECT n || ' bar' FROM t WHERE length(n) < 20
0106 --)
0107 --SELECT n, n IS OF (text) AS is_text FROM t;
0108 
0109 -- In a perfect world, this would work and resolve the literal as int ...
0110 -- but for now, we have to be content with resolving to text too soon.
0111 -- [SPARK-24497] Support recursive SQL query
0112 -- [SPARK-28146] Support IS OF type predicate
0113 --WITH RECURSIVE t(n) AS (
0114 --    SELECT '7'
0115 --UNION ALL
0116 --    SELECT n+1 FROM t WHERE n < 10
0117 --)
0118 --SELECT n, n IS OF (int) AS is_int FROM t;
0119 
0120 --
0121 -- Some examples with a tree
0122 --
0123 -- department structure represented here is as follows:
0124 --
0125 -- ROOT-+->A-+->B-+->C
0126 --      |         |
0127 --      |         +->D-+->F
0128 --      +->E-+->G
0129 
0130 
0131 -- [ORIGINAL SQL]
0132 --CREATE TEMP TABLE department (
0133 --      id INTEGER PRIMARY KEY,  -- department ID
0134 --      parent_department INTEGER REFERENCES department, -- upper department ID
0135 --      name string -- department name
0136 --);
0137 CREATE TABLE department (
0138         id INTEGER,  -- department ID
0139         parent_department INTEGER, -- upper department ID
0140         name string -- department name
0141 ) USING parquet;
0142 
0143 INSERT INTO department VALUES (0, NULL, 'ROOT');
0144 INSERT INTO department VALUES (1, 0, 'A');
0145 INSERT INTO department VALUES (2, 1, 'B');
0146 INSERT INTO department VALUES (3, 2, 'C');
0147 INSERT INTO department VALUES (4, 2, 'D');
0148 INSERT INTO department VALUES (5, 0, 'E');
0149 INSERT INTO department VALUES (6, 4, 'F');
0150 INSERT INTO department VALUES (7, 5, 'G');
0151 
0152 
0153 -- extract all departments under 'A'. Result should be A, B, C, D and F
0154 -- [SPARK-24497] Support recursive SQL query
0155 --WITH RECURSIVE subdepartment AS
0156 --(
0157 --      -- non recursive term
0158 --      SELECT name as root_name, * FROM department WHERE name = 'A'
0159 --
0160 --      UNION ALL
0161 --
0162 --      -- recursive term
0163 --      SELECT sd.root_name, d.* FROM department AS d, subdepartment AS sd
0164 --              WHERE d.parent_department = sd.id
0165 --)
0166 --SELECT * FROM subdepartment ORDER BY name;
0167 
0168 -- extract all departments under 'A' with "level" number
0169 -- [SPARK-24497] Support recursive SQL query
0170 --WITH RECURSIVE subdepartment(level, id, parent_department, name) AS
0171 --(
0172 --      -- non recursive term
0173 --      SELECT 1, * FROM department WHERE name = 'A'
0174 --
0175 --      UNION ALL
0176 --
0177 --      -- recursive term
0178 --      SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd
0179 --              WHERE d.parent_department = sd.id
0180 --)
0181 --SELECT * FROM subdepartment ORDER BY name;
0182 
0183 -- extract all departments under 'A' with "level" number.
0184 -- Only shows level 2 or more
0185 -- [SPARK-24497] Support recursive SQL query
0186 --WITH RECURSIVE subdepartment(level, id, parent_department, name) AS
0187 --(
0188 --      -- non recursive term
0189 --      SELECT 1, * FROM department WHERE name = 'A'
0190 --
0191 --      UNION ALL
0192 --
0193 --      -- recursive term
0194 --      SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd
0195 --              WHERE d.parent_department = sd.id
0196 --)
0197 --SELECT * FROM subdepartment WHERE level >= 2 ORDER BY name;
0198 
0199 -- "RECURSIVE" is ignored if the query has no self-reference
0200 -- [SPARK-24497] Support recursive SQL query
0201 --WITH RECURSIVE subdepartment AS
0202 --(
0203 --      -- note lack of recursive UNION structure
0204 --      SELECT * FROM department WHERE name = 'A'
0205 --)
0206 --SELECT * FROM subdepartment ORDER BY name;
0207 
0208 -- inside subqueries
0209 -- [SPARK-24497] Support recursive SQL query
0210 --SELECT count(*) FROM (
0211 --    WITH RECURSIVE t(n) AS (
0212 --        SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 500
0213 --    )
0214 --    SELECT * FROM t) AS t WHERE n < (
0215 --        SELECT count(*) FROM (
0216 --            WITH RECURSIVE t(n) AS (
0217 --                   SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 100
0218 --                )
0219 --            SELECT * FROM t WHERE n < 50000
0220 --         ) AS t WHERE n < 100);
0221 
0222 -- use same CTE twice at different subquery levels
0223 -- [SPARK-24497] Support recursive SQL query
0224 --WITH q1(x,y) AS (
0225 --    SELECT hundred, sum(ten) FROM tenk1 GROUP BY hundred
0226 --  )
0227 --SELECT count(*) FROM q1 WHERE y > (SELECT sum(y)/100 FROM q1 qsub);
0228 
0229 -- via a VIEW
0230 -- [SPARK-24497] Support recursive SQL query
0231 --CREATE TEMPORARY VIEW vsubdepartment AS
0232 --      WITH RECURSIVE subdepartment AS
0233 --      (
0234 --               -- non recursive term
0235 --              SELECT * FROM department WHERE name = 'A'
0236 --              UNION ALL
0237 --              -- recursive term
0238 --              SELECT d.* FROM department AS d, subdepartment AS sd
0239 --                      WHERE d.parent_department = sd.id
0240 --      )
0241 --      SELECT * FROM subdepartment;
0242 --
0243 --SELECT * FROM vsubdepartment ORDER BY name;
0244 --
0245 ---- Check reverse listing
0246 --SELECT pg_get_viewdef('vsubdepartment'::regclass);
0247 --SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
0248 
0249 -- Another reverse-listing example
0250 -- [SPARK-24497] Support recursive SQL query
0251 --CREATE VIEW sums_1_100 AS
0252 --WITH RECURSIVE t(n) AS (
0253 --    VALUES (1)
0254 --UNION ALL
0255 --    SELECT n+1 FROM t WHERE n < 100
0256 --)
0257 --SELECT sum(n) FROM t;
0258 --
0259 --\d+ sums_1_100
0260 
0261 -- corner case in which sub-WITH gets initialized first
0262 -- [SPARK-24497] Support recursive SQL query
0263 --with recursive q as (
0264 --      select * from department
0265 --    union all
0266 --      (with x as (select * from q)
0267 --       select * from x)
0268 --    )
0269 --select * from q limit 24;
0270 
0271 -- [SPARK-24497] Support recursive SQL query
0272 --with recursive q as (
0273 --      select * from department
0274 --    union all
0275 --      (with recursive x as (
0276 --           select * from department
0277 --         union all
0278 --           (select * from q union all select * from x)
0279 --        )
0280 --       select * from x)
0281 --    )
0282 --select * from q limit 32;
0283 
0284 -- recursive term has sub-UNION
0285 -- [SPARK-24497] Support recursive SQL query
0286 --WITH RECURSIVE t(i,j) AS (
0287 --      VALUES (1,2)
0288 --      UNION ALL
0289 --      SELECT t2.i, t.j+1 FROM
0290 --              (SELECT 2 AS i UNION ALL SELECT 3 AS i) AS t2
0291 --              JOIN t ON (t2.i = t.i+1))
0292 --
0293 --      SELECT * FROM t;
0294 
0295 --
0296 -- different tree example
0297 --
0298 -- [ORIGINAL SQL]
0299 --CREATE TEMPORARY TABLE tree(
0300 --    id INTEGER PRIMARY KEY,
0301 --    parent_id INTEGER REFERENCES tree(id)
0302 --);
0303 CREATE TABLE tree(
0304     id INTEGER,
0305     parent_id INTEGER
0306 ) USING parquet;
0307 
0308 INSERT INTO tree
0309 VALUES (1, NULL), (2, 1), (3,1), (4,2), (5,2), (6,2), (7,3), (8,3),
0310        (9,4), (10,4), (11,7), (12,7), (13,7), (14, 9), (15,11), (16,11);
0311 
0312 --
0313 -- get all paths from "second level" nodes to leaf nodes
0314 --
0315 -- [SPARK-24497] Support recursive SQL query
0316 --WITH RECURSIVE t(id, path) AS (
0317 --    VALUES(1,ARRAY[]::integer[])
0318 --UNION ALL
0319 --    SELECT tree.id, t.path || tree.id
0320 --    FROM tree JOIN t ON (tree.parent_id = t.id)
0321 --)
0322 --SELECT t1.*, t2.* FROM t AS t1 JOIN t AS t2 ON
0323 --      (t1.path[1] = t2.path[1] AND
0324 --      array_upper(t1.path,1) = 1 AND
0325 --      array_upper(t2.path,1) > 1)
0326 --      ORDER BY t1.id, t2.id;
0327 
0328 -- just count 'em
0329 -- [SPARK-24497] Support recursive SQL query
0330 --WITH RECURSIVE t(id, path) AS (
0331 --    VALUES(1,ARRAY[]::integer[])
0332 --UNION ALL
0333 --    SELECT tree.id, t.path || tree.id
0334 --    FROM tree JOIN t ON (tree.parent_id = t.id)
0335 --)
0336 --SELECT t1.id, count(t2.*) FROM t AS t1 JOIN t AS t2 ON
0337 --      (t1.path[1] = t2.path[1] AND
0338 --      array_upper(t1.path,1) = 1 AND
0339 --      array_upper(t2.path,1) > 1)
0340 --      GROUP BY t1.id
0341 --      ORDER BY t1.id;
0342 
0343 -- this variant tickled a whole-row-variable bug in 8.4devel
0344 -- [SPARK-24497] Support recursive SQL query
0345 --WITH RECURSIVE t(id, path) AS (
0346 --    VALUES(1,ARRAY[]::integer[])
0347 --UNION ALL
0348 --    SELECT tree.id, t.path || tree.id
0349 --    FROM tree JOIN t ON (tree.parent_id = t.id)
0350 --)
0351 --SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON
0352 --(t1.id=t2.id);
0353 
0354 --
0355 -- test cycle detection
0356 --
0357 -- [ORIGINAL SQL]
0358 --create temp table graph( f int, t int, label text );
0359 create table graph( f int, t int, label string ) USING parquet;
0360 
0361 insert into graph values
0362         (1, 2, 'arc 1 -> 2'),
0363         (1, 3, 'arc 1 -> 3'),
0364         (2, 3, 'arc 2 -> 3'),
0365         (1, 4, 'arc 1 -> 4'),
0366         (4, 5, 'arc 4 -> 5'),
0367         (5, 1, 'arc 5 -> 1');
0368 
0369 -- [SPARK-24497] Support recursive SQL query
0370 --with recursive search_graph(f, t, label, path, cycle) as (
0371 --      select *, array[row(g.f, g.t)], false from graph g
0372 --      union all
0373 --      select g.*, path || row(g.f, g.t), row(g.f, g.t) = any(path)
0374 --      from graph g, search_graph sg
0375 --      where g.f = sg.t and not cycle
0376 --)
0377 --select * from search_graph;
0378 
0379 -- ordering by the path column has same effect as SEARCH DEPTH FIRST
0380 -- [SPARK-24497] Support recursive SQL query
0381 --with recursive search_graph(f, t, label, path, cycle) as (
0382 --      select *, array[row(g.f, g.t)], false from graph g
0383 --      union all
0384 --      select g.*, path || row(g.f, g.t), row(g.f, g.t) = any(path)
0385 --      from graph g, search_graph sg
0386 --      where g.f = sg.t and not cycle
0387 --)
0388 --select * from search_graph order by path;
0389 
0390 --
0391 -- test multiple WITH queries
0392 --
0393 -- [SPARK-24497] Support recursive SQL query
0394 --WITH RECURSIVE
0395 --  y (id) AS (VALUES (1)),
0396 --  x (id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5)
0397 --SELECT * FROM x;
0398 
0399 -- forward reference OK
0400 -- [SPARK-24497] Support recursive SQL query
0401 --WITH RECURSIVE
0402 --    x(id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5),
0403 --    y(id) AS (values (1))
0404 -- SELECT * FROM x;
0405 
0406 -- [SPARK-24497] Support recursive SQL query
0407 --WITH RECURSIVE
0408 --   x(id) AS
0409 --     (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5),
0410 --   y(id) AS
0411 --     (VALUES (1) UNION ALL SELECT id+1 FROM y WHERE id < 10)
0412 -- SELECT y.*, x.* FROM y LEFT JOIN x USING (id);
0413 
0414 -- [SPARK-24497] Support recursive SQL query
0415 --WITH RECURSIVE
0416 --   x(id) AS
0417 --     (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5),
0418 --   y(id) AS
0419 --     (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 10)
0420 -- SELECT y.*, x.* FROM y LEFT JOIN x USING (id);
0421 
0422 -- [SPARK-24497] Support recursive SQL query
0423 --WITH RECURSIVE
0424 --   x(id) AS
0425 --     (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ),
0426 --   y(id) AS
0427 --     (SELECT * FROM x UNION ALL SELECT * FROM x),
0428 --   z(id) AS
0429 --     (SELECT * FROM x UNION ALL SELECT id+1 FROM z WHERE id < 10)
0430 -- SELECT * FROM z;
0431 
0432 -- [SPARK-24497] Support recursive SQL query
0433 --WITH RECURSIVE
0434 --   x(id) AS
0435 --     (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ),
0436 --   y(id) AS
0437 --     (SELECT * FROM x UNION ALL SELECT * FROM x),
0438 --   z(id) AS
0439 --     (SELECT * FROM y UNION ALL SELECT id+1 FROM z WHERE id < 10)
0440 -- SELECT * FROM z;
0441 
0442 --
0443 -- Test WITH attached to a data-modifying statement
0444 --
0445 
0446 -- [ORIGINAL SQL]
0447 --CREATE TEMPORARY TABLE y (a INTEGER);
0448 CREATE TABLE y (a INTEGER) USING parquet;
0449 -- [ORIGINAL SQL]
0450 --INSERT INTO y SELECT generate_series(1, 10);
0451 INSERT INTO y SELECT EXPLODE(SEQUENCE(1, 10));
0452 
0453 -- [SPARK-28147] Support RETURNING clause
0454 --WITH t AS (
0455 --      SELECT a FROM y
0456 --)
0457 --INSERT INTO y
0458 --SELECT a+20 FROM t RETURNING *;
0459 --
0460 --SELECT * FROM y;
0461 
0462 -- [NOTE] Spark SQL doesn't support UPDATE statement
0463 --WITH t AS (
0464 --      SELECT a FROM y
0465 --)
0466 --UPDATE y SET a = y.a-10 FROM t WHERE y.a > 20 AND t.a = y.a RETURNING y.a;
0467 --
0468 --SELECT * FROM y;
0469 
0470 -- [NOTE] Spark SQL doesn't support DELETE statement
0471 --WITH RECURSIVE t(a) AS (
0472 --      SELECT 11
0473 --      UNION ALL
0474 --      SELECT a+1 FROM t WHERE a < 50
0475 --)
0476 --DELETE FROM y USING t WHERE t.a = y.a RETURNING y.a;
0477 --
0478 --SELECT * FROM y;
0479 
0480 DROP TABLE y;
0481 
0482 --
0483 -- error cases
0484 --
0485 
0486 -- INTERSECT
0487 -- [SPARK-24497] Support recursive SQL query
0488 --WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x)
0489 --      SELECT * FROM x;
0490 
0491 -- [SPARK-24497] Support recursive SQL query
0492 --WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FROM x)
0493 --      SELECT * FROM x;
0494 
0495 -- EXCEPT
0496 -- [SPARK-24497] Support recursive SQL query
0497 --WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x)
0498 --      SELECT * FROM x;
0499 
0500 -- [SPARK-24497] Support recursive SQL query
0501 --WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM x)
0502 --      SELECT * FROM x;
0503 
0504 -- no non-recursive term
0505 -- [SPARK-24497] Support recursive SQL query
0506 --WITH RECURSIVE x(n) AS (SELECT n FROM x)
0507 --      SELECT * FROM x;
0508 
0509 -- recursive term in the left hand side (strictly speaking, should allow this)
0510 -- [SPARK-24497] Support recursive SQL query
0511 --WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1)
0512 --      SELECT * FROM x;
0513 
0514 -- [ORIGINAL SQL]
0515 --CREATE TEMPORARY TABLE y (a INTEGER);
0516 CREATE TABLE y (a INTEGER) USING parquet;
0517 -- [ORIGINAL SQL]
0518 --INSERT INTO y SELECT generate_series(1, 10);
0519 INSERT INTO y SELECT EXPLODE(SEQUENCE(1, 10));
0520 
0521 -- LEFT JOIN
0522 
0523 -- [SPARK-24497] Support recursive SQL query
0524 --WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
0525 --      UNION ALL
0526 --      SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10)
0527 --SELECT * FROM x;
0528 
0529 -- RIGHT JOIN
0530 -- [SPARK-24497] Support recursive SQL query
0531 --WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
0532 --      UNION ALL
0533 --      SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10)
0534 --SELECT * FROM x;
0535 
0536 -- FULL JOIN
0537 -- [SPARK-24497] Support recursive SQL query
0538 --WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
0539 --      UNION ALL
0540 --      SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10)
0541 --SELECT * FROM x;
0542 
0543 -- subquery
0544 -- [SPARK-24497] Support recursive SQL query
0545 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x
0546 --                          WHERE n IN (SELECT * FROM x))
0547 --  SELECT * FROM x;
0548 
0549 -- aggregate functions
0550 -- [SPARK-24497] Support recursive SQL query
0551 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) FROM x)
0552 --  SELECT * FROM x;
0553 
0554 -- [SPARK-24497] Support recursive SQL query
0555 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FROM x)
0556 --  SELECT * FROM x;
0557 
0558 -- ORDER BY
0559 -- [SPARK-24497] Support recursive SQL query
0560 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1)
0561 --  SELECT * FROM x;
0562 
0563 -- LIMIT/OFFSET
0564 -- [SPARK-24497] Support recursive SQL query
0565 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1)
0566 --  SELECT * FROM x;
0567 
0568 -- FOR UPDATE
0569 -- [SPARK-24497] Support recursive SQL query
0570 --WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x FOR UPDATE)
0571 --  SELECT * FROM x;
0572 
0573 -- target list has a recursive query name
0574 -- [SPARK-24497] Support recursive SQL query
0575 --WITH RECURSIVE x(id) AS (values (1)
0576 --    UNION ALL
0577 --    SELECT (SELECT * FROM x) FROM x WHERE id < 5
0578 --) SELECT * FROM x;
0579 
0580 -- mutual recursive query (not implemented)
0581 -- [SPARK-24497] Support recursive SQL query
0582 --WITH RECURSIVE
0583 --  x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id < 5),
0584 --  y (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 5)
0585 --SELECT * FROM x;
0586 
0587 -- non-linear recursion is not allowed
0588 -- [SPARK-24497] Support recursive SQL query
0589 --WITH RECURSIVE foo(i) AS
0590 --    (values (1)
0591 --    UNION ALL
0592 --       (SELECT i+1 FROM foo WHERE i < 10
0593 --          UNION ALL
0594 --       SELECT i+1 FROM foo WHERE i < 5)
0595 --) SELECT * FROM foo;
0596 
0597 -- [SPARK-24497] Support recursive SQL query
0598 --WITH RECURSIVE foo(i) AS
0599 --    (values (1)
0600 --    UNION ALL
0601 --         SELECT * FROM
0602 --       (SELECT i+1 FROM foo WHERE i < 10
0603 --          UNION ALL
0604 --       SELECT i+1 FROM foo WHERE i < 5) AS t
0605 --) SELECT * FROM foo;
0606 
0607 -- [SPARK-24497] Support recursive SQL query
0608 --WITH RECURSIVE foo(i) AS
0609 --    (values (1)
0610 --    UNION ALL
0611 --       (SELECT i+1 FROM foo WHERE i < 10
0612 --          EXCEPT
0613 --       SELECT i+1 FROM foo WHERE i < 5)
0614 --) SELECT * FROM foo;
0615 
0616 -- [SPARK-24497] Support recursive SQL query
0617 --WITH RECURSIVE foo(i) AS
0618 --    (values (1)
0619 --    UNION ALL
0620 --       (SELECT i+1 FROM foo WHERE i < 10
0621 --          INTERSECT
0622 --       SELECT i+1 FROM foo WHERE i < 5)
0623 --) SELECT * FROM foo;
0624 
0625 -- Wrong type induced from non-recursive term
0626 -- [SPARK-24497] Support recursive SQL query
0627 --WITH RECURSIVE foo(i) AS
0628 --   (SELECT i FROM (VALUES(1),(2)) t(i)
0629 --   UNION ALL
0630 --   SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10)
0631 --SELECT * FROM foo;
0632 
0633 -- rejects different typmod, too (should we allow this?)
0634 -- [SPARK-24497] Support recursive SQL query
0635 --WITH RECURSIVE foo(i) AS
0636 --   (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i)
0637 --   UNION ALL
0638 --   SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10)
0639 --SELECT * FROM foo;
0640 
0641 -- [NOTE] Spark SQL doesn't support RULEs
0642 -- disallow OLD/NEW reference in CTE
0643 --CREATE TABLE x (n integer) USING parquet;
0644 --CREATE RULE r2 AS ON UPDATE TO x DO INSTEAD
0645 --    WITH t AS (SELECT OLD.*) UPDATE y SET a = t.n FROM t;
0646 
0647 --
0648 -- test for bug #4902
0649 --
0650 -- [SPARK-28296] Improved VALUES support
0651 --with cte(foo) as ( values(42) ) values((select foo from cte));
0652 with cte(foo) as ( select 42 ) select * from ((select foo from cte)) q;
0653 
0654 -- test CTE referencing an outer-level variable (to see that changed-parameter
0655 -- signaling still works properly after fixing this bug)
0656 -- [SPARK-28296] Improved VALUES support
0657 -- [SPARK-28297] Handling outer links in CTE subquery expressions
0658 --select ( with cte(foo) as ( values(f1) )
0659 --         select (select foo from cte) )
0660 --from int4_tbl;
0661 
0662 -- [SPARK-28296] Improved VALUES support
0663 -- [SPARK-28297] Handling outer links in CTE subquery expressions
0664 --select ( with cte(foo) as ( values(f1) )
0665 --          values((select foo from cte)) )
0666 --from int4_tbl;
0667 
0668 --
0669 -- test for nested-recursive-WITH bug
0670 --
0671 -- [SPARK-24497] Support recursive SQL query
0672 --WITH RECURSIVE t(j) AS (
0673 --    WITH RECURSIVE s(i) AS (
0674 --        VALUES (1)
0675 --        UNION ALL
0676 --        SELECT i+1 FROM s WHERE i < 10
0677 --    )
0678 --    SELECT i FROM s
0679 --    UNION ALL
0680 --    SELECT j+1 FROM t WHERE j < 10
0681 --)
0682 --SELECT * FROM t;
0683 
0684 --
0685 -- test WITH attached to intermediate-level set operation
0686 --
0687 
0688 WITH outermost(x) AS (
0689   SELECT 1
0690   UNION (WITH innermost as (SELECT 2)
0691          SELECT * FROM innermost
0692          UNION SELECT 3)
0693 )
0694 SELECT * FROM outermost ORDER BY 1;
0695 
0696 WITH outermost(x) AS (
0697   SELECT 1
0698   UNION (WITH innermost as (SELECT 2)
0699          SELECT * FROM outermost  -- fail
0700          UNION SELECT * FROM innermost)
0701 )
0702 SELECT * FROM outermost ORDER BY 1;
0703 
0704 -- [SPARK-24497] Support recursive SQL query
0705 --WITH RECURSIVE outermost(x) AS (
0706 --  SELECT 1
0707 --  UNION (WITH innermost as (SELECT 2)
0708 --         SELECT * FROM outermost
0709 --         UNION SELECT * FROM innermost)
0710 --)
0711 --SELECT * FROM outermost ORDER BY 1;
0712 
0713 -- [SPARK-24497] Support recursive SQL query
0714 --WITH RECURSIVE outermost(x) AS (
0715 --  WITH innermost as (SELECT 2 FROM outermost) -- fail
0716 --    SELECT * FROM innermost
0717 --    UNION SELECT * from outermost
0718 --)
0719 --SELECT * FROM outermost ORDER BY 1;
0720 
0721 --
0722 -- This test will fail with the old implementation of PARAM_EXEC parameter
0723 -- assignment, because the "q1" Var passed down to A's targetlist subselect
0724 -- looks exactly like the "A.id" Var passed down to C's subselect, causing
0725 -- the old code to give them the same runtime PARAM_EXEC slot.  But the
0726 -- lifespans of the two parameters overlap, thanks to B also reading A.
0727 --
0728 
0729 -- [SPARK-27878] Support ARRAY(sub-SELECT) expressions
0730 --with
0731 --A as ( select q2 as id, (select q1) as x from int8_tbl ),
0732 --B as ( select id, row_number() over (partition by id) as r from A ),
0733 --C as ( select A.id, array(select B.id from B where B.id = A.id) from A )
0734 --select * from C;
0735 
0736 --
0737 -- Test CTEs read in non-initialization orders
0738 --
0739 
0740 -- [SPARK-24497] Support recursive SQL query
0741 --WITH RECURSIVE
0742 --  tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)),
0743 --  iter (id_key, row_type, link) AS (
0744 --      SELECT 0, 'base', 17
0745 --    UNION ALL (
0746 --      WITH remaining(id_key, row_type, link, min) AS (
0747 --        SELECT tab.id_key, 'true'::text, iter.link, MIN(tab.id_key) OVER ()
0748 --        FROM tab INNER JOIN iter USING (link)
0749 --        WHERE tab.id_key > iter.id_key
0750 --      ),
0751 --      first_remaining AS (
0752 --        SELECT id_key, row_type, link
0753 --        FROM remaining
0754 --        WHERE id_key=min
0755 --      ),
0756 --      effect AS (
0757 --        SELECT tab.id_key, 'new'::text, tab.link
0758 --        FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key
0759 --        WHERE e.row_type = 'false'
0760 --      )
0761 --      SELECT * FROM first_remaining
0762 --      UNION ALL SELECT * FROM effect
0763 --    )
0764 --  )
0765 --SELECT * FROM iter;
0766 
0767 -- [SPARK-24497] Support recursive SQL query
0768 --WITH RECURSIVE
0769 --  tab(id_key,link) AS (VALUES (1,17), (2,17), (3,17), (4,17), (6,17), (5,17)),
0770 --  iter (id_key, row_type, link) AS (
0771 --      SELECT 0, 'base', 17
0772 --    UNION (
0773 --      WITH remaining(id_key, row_type, link, min) AS (
0774 --        SELECT tab.id_key, 'true'::text, iter.link, MIN(tab.id_key) OVER ()
0775 --        FROM tab INNER JOIN iter USING (link)
0776 --        WHERE tab.id_key > iter.id_key
0777 --      ),
0778 --      first_remaining AS (
0779 --        SELECT id_key, row_type, link
0780 --        FROM remaining
0781 --        WHERE id_key=min
0782 --      ),
0783 --      effect AS (
0784 --        SELECT tab.id_key, 'new'::text, tab.link
0785 --        FROM first_remaining e INNER JOIN tab ON e.id_key=tab.id_key
0786 --        WHERE e.row_type = 'false'
0787 --      )
0788 --      SELECT * FROM first_remaining
0789 --      UNION ALL SELECT * FROM effect
0790 --    )
0791 --  )
0792 --SELECT * FROM iter;
0793 
0794 --
0795 -- Data-modifying statements in WITH
0796 --
0797 
0798 -- INSERT ... RETURNING
0799 -- [SPARK-28147] Support RETURNING clause
0800 --WITH t AS (
0801 --    INSERT INTO y
0802 --    VALUES
0803 --        (11),
0804 --        (12),
0805 --        (13),
0806 --        (14),
0807 --        (15),
0808 --        (16),
0809 --        (17),
0810 --        (18),
0811 --        (19),
0812 --        (20)
0813 --    RETURNING *
0814 --)
0815 --SELECT * FROM t;
0816 --
0817 --SELECT * FROM y;
0818 
0819 -- UPDATE ... RETURNING
0820 -- [NOTE] Spark SQL doesn't support UPDATE statement
0821 --WITH t AS (
0822 --    UPDATE y
0823 --    SET a=a+1
0824 --    RETURNING *
0825 --)
0826 --SELECT * FROM t;
0827 --
0828 --SELECT * FROM y;
0829 
0830 -- DELETE ... RETURNING
0831 -- [NOTE] Spark SQL doesn't support DELETE statement
0832 --WITH t AS (
0833 --    DELETE FROM y
0834 --    WHERE a <= 10
0835 --    RETURNING *
0836 --)
0837 --SELECT * FROM t;
0838 --
0839 --SELECT * FROM y;
0840 
0841 -- forward reference
0842 -- [NOTE] Spark SQL doesn't support UPDATE statement
0843 --WITH RECURSIVE t AS (
0844 --      INSERT INTO y
0845 --              SELECT a+5 FROM t2 WHERE a > 5
0846 --      RETURNING *
0847 --), t2 AS (
0848 --      UPDATE y SET a=a-11 RETURNING *
0849 --)
0850 --SELECT * FROM t
0851 --UNION ALL
0852 --SELECT * FROM t2;
0853 --
0854 --SELECT * FROM y;
0855 
0856 -- unconditional DO INSTEAD rule
0857 -- [NOTE] Spark SQL doesn't support RULEs
0858 --CREATE RULE y_rule AS ON DELETE TO y DO INSTEAD
0859 --  INSERT INTO y VALUES(42) RETURNING *;
0860 
0861 -- [NOTE] Spark SQL doesn't support DELETE statement
0862 --WITH t AS (
0863 --      DELETE FROM y RETURNING *
0864 --)
0865 --SELECT * FROM t;
0866 --
0867 --SELECT * FROM y;
0868 
0869 --DROP RULE y_rule ON y;
0870 
0871 -- check merging of outer CTE with CTE in a rule action
0872 --CREATE TEMP TABLE bug6051 AS
0873 --  select i from generate_series(1,3) as t(i);
0874 
0875 --SELECT * FROM bug6051;
0876 
0877 -- [NOTE] Spark SQL doesn't support DELETE statement
0878 --WITH t1 AS ( DELETE FROM bug6051 RETURNING * )
0879 --INSERT INTO bug6051 SELECT * FROM t1;
0880 --
0881 --SELECT * FROM bug6051;
0882 
0883 -- [NOTE] Spark SQL doesn't support RULEs
0884 --CREATE TEMP TABLE bug6051_2 (i int);
0885 --
0886 --CREATE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD
0887 -- INSERT INTO bug6051_2
0888 -- SELECT NEW.i;
0889 
0890 -- [NOTE] Spark SQL doesn't support DELETE statement
0891 --WITH t1 AS ( DELETE FROM bug6051 RETURNING * )
0892 --INSERT INTO bug6051 SELECT * FROM t1;
0893 --
0894 --SELECT * FROM bug6051;
0895 --SELECT * FROM bug6051_2;
0896 
0897 -- a truly recursive CTE in the same list
0898 -- [SPARK-24497] Support recursive SQL query
0899 --WITH RECURSIVE t(a) AS (
0900 --      SELECT 0
0901 --              UNION ALL
0902 --      SELECT a+1 FROM t WHERE a+1 < 5
0903 --), t2 as (
0904 --      INSERT INTO y
0905 --              SELECT * FROM t RETURNING *
0906 --)
0907 --SELECT * FROM t2 JOIN y USING (a) ORDER BY a;
0908 --
0909 --SELECT * FROM y;
0910 
0911 -- data-modifying WITH in a modifying statement
0912 -- [NOTE] Spark SQL doesn't support DELETE statement
0913 --WITH t AS (
0914 --    DELETE FROM y
0915 --    WHERE a <= 10
0916 --    RETURNING *
0917 --)
0918 --INSERT INTO y SELECT -a FROM t RETURNING *;
0919 --
0920 --SELECT * FROM y;
0921 
0922 -- check that WITH query is run to completion even if outer query isn't
0923 -- [NOTE] Spark SQL doesn't support UPDATE statement
0924 --WITH t AS (
0925 --    UPDATE y SET a = a * 100 RETURNING *
0926 --)
0927 --SELECT * FROM t LIMIT 10;
0928 --
0929 --SELECT * FROM y;
0930 
0931 -- data-modifying WITH containing INSERT...ON CONFLICT DO UPDATE
0932 -- [ORIGINAL SQL]
0933 --CREATE TABLE withz AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i;
0934 CREATE TABLE withz USING parquet AS SELECT i AS k, CAST(i || ' v' AS string) v FROM (SELECT EXPLODE(SEQUENCE(1, 16, 3)) i);
0935 -- [NOTE] Spark SQL doesn't support UNIQUE constraints
0936 --ALTER TABLE withz ADD UNIQUE (k);
0937 
0938 -- [NOTE] Spark SQL doesn't support UPDATE statement
0939 --WITH t AS (
0940 --    INSERT INTO withz SELECT i, 'insert'
0941 --    FROM generate_series(0, 16) i
0942 --    ON CONFLICT (k) DO UPDATE SET v = withz.v || ', now update'
0943 --    RETURNING *
0944 --)
0945 --SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k;
0946 
0947 -- Test EXCLUDED.* reference within CTE
0948 -- [NOTE] Spark SQL doesn't support ON CONFLICT clause
0949 --WITH aa AS (
0950 --    INSERT INTO withz VALUES(1, 5) ON CONFLICT (k) DO UPDATE SET v = EXCLUDED.v
0951 --    WHERE withz.k != EXCLUDED.k
0952 --    RETURNING *
0953 --)
0954 --SELECT * FROM aa;
0955 
0956 -- New query/snapshot demonstrates side-effects of previous query.
0957 SELECT * FROM withz ORDER BY k;
0958 
0959 --
0960 -- Ensure subqueries within the update clause work, even if they
0961 -- reference outside values
0962 --
0963 -- [NOTE] Spark SQL doesn't support ON CONFLICT clause
0964 --WITH aa AS (SELECT 1 a, 2 b)
0965 --INSERT INTO withz VALUES(1, 'insert')
0966 --ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
0967 --WITH aa AS (SELECT 1 a, 2 b)
0968 --INSERT INTO withz VALUES(1, 'insert')
0969 --ON CONFLICT (k) DO UPDATE SET v = ' update' WHERE withz.k = (SELECT a FROM aa);
0970 --WITH aa AS (SELECT 1 a, 2 b)
0971 --INSERT INTO withz VALUES(1, 'insert')
0972 --ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
0973 --WITH aa AS (SELECT 'a' a, 'b' b UNION ALL SELECT 'a' a, 'b' b)
0974 --INSERT INTO withz VALUES(1, 'insert')
0975 --ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 'a' LIMIT 1);
0976 --WITH aa AS (SELECT 1 a, 2 b)
0977 --INSERT INTO withz VALUES(1, (SELECT b || ' insert' FROM aa WHERE a = 1 ))
0978 --ON CONFLICT (k) DO UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
0979 
0980 -- Update a row more than once, in different parts of a wCTE. That is
0981 -- an allowed, presumably very rare, edge case, but since it was
0982 -- broken in the past, having a test seems worthwhile.
0983 -- [NOTE] Spark SQL doesn't support ON CONFLICT clause
0984 --WITH simpletup AS (
0985 --  SELECT 2 k, 'Green' v),
0986 --upsert_cte AS (
0987 --  INSERT INTO withz VALUES(2, 'Blue') ON CONFLICT (k) DO
0988 --    UPDATE SET (k, v) = (SELECT k, v FROM simpletup WHERE simpletup.k = withz.k)
0989 --    RETURNING k, v)
0990 --INSERT INTO withz VALUES(2, 'Red') ON CONFLICT (k) DO
0991 --UPDATE SET (k, v) = (SELECT k, v FROM upsert_cte WHERE upsert_cte.k = withz.k)
0992 --RETURNING k, v;
0993 
0994 DROP TABLE withz;
0995 
0996 -- check that run to completion happens in proper ordering
0997 
0998 TRUNCATE TABLE y;
0999 -- [ORIGINAL SQL]
1000 --INSERT INTO y SELECT generate_series(1, 3);
1001 INSERT INTO y SELECT EXPLODE(SEQUENCE(1, 3));
1002 -- [ORIGINAL SQL]
1003 --CREATE TEMPORARY TABLE yy (a INTEGER);
1004 CREATE TABLE yy (a INTEGER) USING parquet;
1005 
1006 -- [SPARK-24497] Support recursive SQL query
1007 -- [SPARK-28147] Support RETURNING clause
1008 --WITH RECURSIVE t1 AS (
1009 --  INSERT INTO y SELECT * FROM y RETURNING *
1010 --), t2 AS (
1011 --  INSERT INTO yy SELECT * FROM t1 RETURNING *
1012 --)
1013 --SELECT 1;
1014 
1015 SELECT * FROM y;
1016 SELECT * FROM yy;
1017 
1018 -- [SPARK-24497] Support recursive SQL query
1019 -- [SPARK-28147] Support RETURNING clause
1020 --WITH RECURSIVE t1 AS (
1021 --  INSERT INTO yy SELECT * FROM t2 RETURNING *
1022 --), t2 AS (
1023 --  INSERT INTO y SELECT * FROM y RETURNING *
1024 --)
1025 --SELECT 1;
1026 
1027 SELECT * FROM y;
1028 SELECT * FROM yy;
1029 
1030 -- [NOTE] Spark SQL doesn't support TRIGGERs
1031 -- triggers
1032 --
1033 --TRUNCATE TABLE y;
1034 --INSERT INTO y SELECT generate_series(1, 10);
1035 --
1036 --CREATE FUNCTION y_trigger() RETURNS trigger AS $$
1037 --begin
1038 --  raise notice 'y_trigger: a = %', new.a;
1039 --  return new;
1040 --end;
1041 --$$ LANGUAGE plpgsql;
1042 --
1043 --
1044 --CREATE TRIGGER y_trig BEFORE INSERT ON y FOR EACH ROW
1045 --    EXECUTE PROCEDURE y_trigger();
1046 --
1047 --WITH t AS (
1048 --    INSERT INTO y
1049 --    VALUES
1050 --        (21),
1051 --        (22),
1052 --        (23)
1053 --    RETURNING *
1054 --)
1055 --SELECT * FROM t;
1056 --
1057 --SELECT * FROM y;
1058 --
1059 --DROP TRIGGER y_trig ON y;
1060 --
1061 --CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH ROW
1062 --    EXECUTE PROCEDURE y_trigger();
1063 --
1064 --WITH t AS (
1065 --    INSERT INTO y
1066 --    VALUES
1067 --        (31),
1068 --        (32),
1069 --        (33)
1070 --    RETURNING *
1071 --)
1072 --SELECT * FROM t LIMIT 1;
1073 --
1074 --SELECT * FROM y;
1075 --
1076 --DROP TRIGGER y_trig ON y;
1077 --
1078 --CREATE OR REPLACE FUNCTION y_trigger() RETURNS trigger AS $$
1079 --begin
1080 --  raise notice 'y_trigger';
1081 --  return null;
1082 --end;
1083 --$$ LANGUAGE plpgsql;
1084 --
1085 --CREATE TRIGGER y_trig AFTER INSERT ON y FOR EACH STATEMENT
1086 --    EXECUTE PROCEDURE y_trigger();
1087 --
1088 --WITH t AS (
1089 --    INSERT INTO y
1090 --    VALUES
1091 --        (41),
1092 --        (42),
1093 --        (43)
1094 --    RETURNING *
1095 --)
1096 --SELECT * FROM t;
1097 --
1098 --SELECT * FROM y;
1099 --
1100 --DROP TRIGGER y_trig ON y;
1101 --DROP FUNCTION y_trigger();
1102 
1103 -- WITH attached to inherited UPDATE or DELETE
1104 
1105 -- [ORIGINAL SQL]
1106 --CREATE TEMP TABLE parent ( id int, val text );
1107 CREATE TABLE parent ( id int, val string ) USING parquet;
1108 -- [NOTE] Spark SQL doesn't support INHERITS clause
1109 --CREATE TEMP TABLE child1 ( ) INHERITS ( parent );
1110 -- [NOTE] Spark SQL doesn't support INHERITS clause
1111 --CREATE TEMP TABLE child2 ( ) INHERITS ( parent );
1112 
1113 INSERT INTO parent VALUES ( 1, 'p1' );
1114 --INSERT INTO child1 VALUES ( 11, 'c11' ),( 12, 'c12' );
1115 --INSERT INTO child2 VALUES ( 23, 'c21' ),( 24, 'c22' );
1116 
1117 -- [NOTE] Spark SQL doesn't support UPDATE statement
1118 --WITH rcte AS ( SELECT sum(id) AS totalid FROM parent )
1119 --UPDATE parent SET id = id + totalid FROM rcte;
1120 
1121 SELECT * FROM parent;
1122 
1123 -- [SPARK-28147] Support RETURNING clause
1124 --WITH wcte AS ( INSERT INTO child1 VALUES ( 42, 'new' ) RETURNING id AS newid )
1125 --UPDATE parent SET id = id + newid FROM wcte;
1126 --
1127 --SELECT * FROM parent;
1128 
1129 -- [NOTE] Spark SQL doesn't support DELETE statement
1130 --WITH rcte AS ( SELECT max(id) AS maxid FROM parent )
1131 --DELETE FROM parent USING rcte WHERE id = maxid;
1132 
1133 SELECT * FROM parent;
1134 
1135 -- [NOTE] Spark SQL doesn't support DELETE statement
1136 --WITH wcte AS ( INSERT INTO child2 VALUES ( 42, 'new2' ) RETURNING id AS newid )
1137 --DELETE FROM parent USING wcte WHERE id = newid;
1138 --
1139 --SELECT * FROM parent;
1140 
1141 -- check EXPLAIN VERBOSE for a wCTE with RETURNING
1142 
1143 -- [NOTE] Spark SQL doesn't support DELETE statement
1144 --EXPLAIN (VERBOSE, COSTS OFF)
1145 --WITH wcte AS ( INSERT INTO int8_tbl VALUES ( 42, 47 ) RETURNING q2 )
1146 --DELETE FROM a USING wcte WHERE aa = q2;
1147 
1148 -- error cases
1149 
1150 -- data-modifying WITH tries to use its own output
1151 -- [SPARK-24497] Support recursive SQL query
1152 --WITH RECURSIVE t AS (
1153 --      INSERT INTO y
1154 --              SELECT * FROM t
1155 --)
1156 --VALUES(FALSE);
1157 
1158 -- no RETURNING in a referenced data-modifying WITH
1159 -- [SPARK-24497] Support recursive SQL query
1160 --WITH t AS (
1161 --      INSERT INTO y VALUES(0)
1162 --)
1163 --SELECT * FROM t;
1164 
1165 -- data-modifying WITH allowed only at the top level
1166 -- [SPARK-28147] Support RETURNING clause
1167 --SELECT * FROM (
1168 --      WITH t AS (UPDATE y SET a=a+1 RETURNING *)
1169 --      SELECT * FROM t
1170 --) ss;
1171 
1172 -- most variants of rules aren't allowed
1173 -- [NOTE] Spark SQL doesn't support RULEs
1174 --CREATE RULE y_rule AS ON INSERT TO y WHERE a=0 DO INSTEAD DELETE FROM y;
1175 --WITH t AS (
1176 --      INSERT INTO y VALUES(0)
1177 --)
1178 --VALUES(FALSE);
1179 --DROP RULE y_rule ON y;
1180 
1181 -- check that parser lookahead for WITH doesn't cause any odd behavior
1182 create table foo (with baz);  -- fail, WITH is a reserved word
1183 create table foo (with ordinality);  -- fail, WITH is a reserved word
1184 with ordinality as (select 1 as x) select * from ordinality;
1185 
1186 -- check sane response to attempt to modify CTE relation
1187 WITH test AS (SELECT 42) INSERT INTO test VALUES (1);
1188 
1189 -- check response to attempt to modify table with same name as a CTE (perhaps
1190 -- surprisingly it works, because CTEs don't hide tables from data-modifying
1191 -- statements)
1192 -- [ORIGINAL SQL]
1193 --create temp table test (i int);
1194 create table test (i int) USING parquet;
1195 with test as (select 42) insert into test select * from test;
1196 select * from test;
1197 drop table test;
1198 
1199 --
1200 -- Clean up
1201 --
1202 
1203 DROP TABLE department;
1204 DROP TABLE tree;
1205 DROP TABLE graph;
1206 DROP TABLE y;
1207 DROP TABLE yy;
1208 DROP TABLE parent;