|
||||
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;
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |