xref: /sqlite-3.40.0/test/with6.test (revision 67f70bea)
1dee1cb30Sdrh# 2021-02-22
2dee1cb30Sdrh#
3dee1cb30Sdrh# The author disclaims copyright to this source code.  In place of
4dee1cb30Sdrh# a legal notice, here is a blessing:
5dee1cb30Sdrh#
6dee1cb30Sdrh#    May you do good and not evil.
7dee1cb30Sdrh#    May you find forgiveness for yourself and forgive others.
8dee1cb30Sdrh#    May you share freely, never taking more than you give.
9dee1cb30Sdrh#
10dee1cb30Sdrh#***********************************************************************
11dee1cb30Sdrh# This file implements regression tests for SQLite library.  The
12dee1cb30Sdrh# focus of this file is the MATERIALIZED hint to common table expressions
13dee1cb30Sdrh#
14dee1cb30Sdrh
15dee1cb30Sdrhset testdir [file dirname $argv0]
16dee1cb30Sdrhsource $testdir/tester.tcl
17dee1cb30Sdrhset ::testprefix with6
18dee1cb30Sdrh
19dee1cb30Sdrhifcapable {!cte} {
20dee1cb30Sdrh  finish_test
21dee1cb30Sdrh  return
22dee1cb30Sdrh}
23dee1cb30Sdrh
24dee1cb30Sdrhdo_execsql_test 100 {
25dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
26dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
27dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
28dee1cb30Sdrhdo_eqp_test 101 {
29dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
30dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
31dee1cb30Sdrh} {
32dee1cb30Sdrh  QUERY PLAN
332f2091b1Sdrh  |--MATERIALIZE c
34dee1cb30Sdrh  |  `--SCAN 2 CONSTANT ROWS
358210233cSdrh  |--SCAN c1
368210233cSdrh  |--SCAN c2
378210233cSdrh  `--SCAN c3
38dee1cb30Sdrh}
39dee1cb30Sdrh
40dee1cb30Sdrhdo_execsql_test 110 {
41dee1cb30Sdrh  WITH c(x) AS MATERIALIZED (VALUES(0),(1))
42dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
43dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
44dee1cb30Sdrhdo_eqp_test 111 {
45dee1cb30Sdrh  WITH c(x) AS MATERIALIZED (VALUES(0),(1))
46dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
47dee1cb30Sdrh} {
48dee1cb30Sdrh  QUERY PLAN
492f2091b1Sdrh  |--MATERIALIZE c
50dee1cb30Sdrh  |  `--SCAN 2 CONSTANT ROWS
518210233cSdrh  |--SCAN c1
528210233cSdrh  |--SCAN c2
538210233cSdrh  `--SCAN c3
54dee1cb30Sdrh}
55dee1cb30Sdrh
56dee1cb30Sdrh# Even though the CTE is not materialized, the self-join optimization
57dee1cb30Sdrh# kicks in and does the materialization for us.
58dee1cb30Sdrh#
59dee1cb30Sdrhdo_execsql_test 120 {
60dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
61dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
62dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
63dee1cb30Sdrhdo_eqp_test 121 {
64dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
65dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
66dee1cb30Sdrh} {
67dee1cb30Sdrh  QUERY PLAN
682f2091b1Sdrh  |--MATERIALIZE c
69dee1cb30Sdrh  |  `--SCAN 2 CONSTANT ROWS
708210233cSdrh  |--SCAN c1
718210233cSdrh  |--SCAN c2
728210233cSdrh  `--SCAN c3
73dee1cb30Sdrh}
74dee1cb30Sdrh
75dee1cb30Sdrhdo_execsql_test 130 {
76dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
77dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
78dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
79dee1cb30Sdrh         (SELECT x FROM c LIMIT 5) AS c2,
80dee1cb30Sdrh         (SELECT x FROM c LIMIT 5) AS c3;
81dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
82dee1cb30Sdrhdo_eqp_test 131 {
83dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
84dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
85dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
86dee1cb30Sdrh         (SELECT x FROM c LIMIT 5) AS c2,
87dee1cb30Sdrh         (SELECT x FROM c LIMIT 5) AS c3;
88dee1cb30Sdrh} {
89dee1cb30Sdrh  QUERY PLAN
908210233cSdrh  |--MATERIALIZE c1
918210233cSdrh  |  |--CO-ROUTINE c
92dee1cb30Sdrh  |  |  `--SCAN 2 CONSTANT ROWS
938210233cSdrh  |  `--SCAN c
948210233cSdrh  |--MATERIALIZE c2
958210233cSdrh  |  |--CO-ROUTINE c
96dee1cb30Sdrh  |  |  `--SCAN 2 CONSTANT ROWS
978210233cSdrh  |  `--SCAN c
988210233cSdrh  |--MATERIALIZE c3
998210233cSdrh  |  |--CO-ROUTINE c
100dee1cb30Sdrh  |  |  `--SCAN 2 CONSTANT ROWS
1018210233cSdrh  |  `--SCAN c
1028210233cSdrh  |--SCAN c1
1038210233cSdrh  |--SCAN c2
1048210233cSdrh  `--SCAN c3
105dee1cb30Sdrh}
106dee1cb30Sdrh
107dee1cb30Sdrh# The (SELECT x FROM c LIMIT N) subqueries get materialized once each.
108dee1cb30Sdrh# Show multiple materializations are shown.  But there is only one
109dee1cb30Sdrh# materialization for c, shown by the "SCAN 2 CONSTANT ROWS" line.
110dee1cb30Sdrh#
111dee1cb30Sdrhdo_execsql_test 140 {
112dee1cb30Sdrh  WITH c(x) AS MATERIALIZED (VALUES(0),(1))
113dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
114dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
115dee1cb30Sdrh         (SELECT x FROM c LIMIT 6) AS c2,
116dee1cb30Sdrh         (SELECT x FROM c LIMIT 7) AS c3;
117dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
118dee1cb30Sdrhdo_eqp_test 141 {
119dee1cb30Sdrh  WITH c(x) AS MATERIALIZED (VALUES(0),(1))
120dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
121dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
122dee1cb30Sdrh         (SELECT x FROM c LIMIT 6) AS c2,
123dee1cb30Sdrh         (SELECT x FROM c LIMIT 7) AS c3;
124dee1cb30Sdrh} {
125dee1cb30Sdrh  QUERY PLAN
1268210233cSdrh  |--MATERIALIZE c1
1278210233cSdrh  |  |--MATERIALIZE c
128dee1cb30Sdrh  |  |  `--SCAN 2 CONSTANT ROWS
1298210233cSdrh  |  `--SCAN c
1308210233cSdrh  |--MATERIALIZE c2
1318210233cSdrh  |  `--SCAN c
1328210233cSdrh  |--MATERIALIZE c3
1338210233cSdrh  |  `--SCAN c
1348210233cSdrh  |--SCAN c1
1358210233cSdrh  |--SCAN c2
1368210233cSdrh  `--SCAN c3
137dee1cb30Sdrh}
138dee1cb30Sdrh
139dee1cb30Sdrhdo_execsql_test 150 {
140dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
141dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
142dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
143dee1cb30Sdrh         (SELECT x FROM c LIMIT 6) AS c2,
144dee1cb30Sdrh         (SELECT x FROM c LIMIT 7) AS c3;
145dee1cb30Sdrh} {000 001 010 011 100 101 110 111}
146dee1cb30Sdrhdo_eqp_test 151 {
147dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
148dee1cb30Sdrh  SELECT c1.x||c2.x||c3.x
149dee1cb30Sdrh    FROM (SELECT x FROM c LIMIT 5) AS c1,
150dee1cb30Sdrh         (SELECT x FROM c LIMIT 6) AS c2,
151dee1cb30Sdrh         (SELECT x FROM c LIMIT 7) AS c3;
152dee1cb30Sdrh} {
153dee1cb30Sdrh  QUERY PLAN
1548210233cSdrh  |--MATERIALIZE c1
1558210233cSdrh  |  |--MATERIALIZE c
156dee1cb30Sdrh  |  |  `--SCAN 2 CONSTANT ROWS
1578210233cSdrh  |  `--SCAN c
1588210233cSdrh  |--MATERIALIZE c2
1598210233cSdrh  |  `--SCAN c
1608210233cSdrh  |--MATERIALIZE c3
1618210233cSdrh  |  `--SCAN c
1628210233cSdrh  |--SCAN c1
1638210233cSdrh  |--SCAN c2
1648210233cSdrh  `--SCAN c3
165dee1cb30Sdrh}
166dee1cb30Sdrh
167dee1cb30Sdrhdo_execsql_test 160 {
168dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
169dee1cb30Sdrh  SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
170dee1cb30Sdrh    FROM c AS c2 WHERE c2.x<10;
171dee1cb30Sdrh} {100 301}
172dee1cb30Sdrhdo_eqp_test 161 {
173dee1cb30Sdrh  WITH c(x) AS (VALUES(0),(1))
174dee1cb30Sdrh  SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
175dee1cb30Sdrh    FROM c AS c2 WHERE c2.x<10;
176dee1cb30Sdrh} {
177dee1cb30Sdrh  QUERY PLAN
1782f2091b1Sdrh  |--MATERIALIZE c
179dee1cb30Sdrh  |  `--SCAN 2 CONSTANT ROWS
1808210233cSdrh  |--SCAN c2
181dee1cb30Sdrh  `--CORRELATED SCALAR SUBQUERY xxxxxx
1828210233cSdrh     `--SCAN c
183dee1cb30Sdrh}
184dee1cb30Sdrh
185dee1cb30Sdrhdo_execsql_test 170 {
186dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
187dee1cb30Sdrh  SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
188dee1cb30Sdrh    FROM c AS c2 WHERE c2.x<10;
189dee1cb30Sdrh} {100 301}
190dee1cb30Sdrhdo_eqp_test 171 {
191dee1cb30Sdrh  WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
192dee1cb30Sdrh  SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
193dee1cb30Sdrh    FROM c AS c2 WHERE c2.x<10;
194dee1cb30Sdrh} {
195dee1cb30Sdrh  QUERY PLAN
1962f2091b1Sdrh  |--CO-ROUTINE c
197dee1cb30Sdrh  |  `--SCAN 2 CONSTANT ROWS
1988210233cSdrh  |--SCAN c2
199dee1cb30Sdrh  `--CORRELATED SCALAR SUBQUERY xxxxxx
2008210233cSdrh     |--CO-ROUTINE c
201dee1cb30Sdrh     |  `--SCAN 2 CONSTANT ROWS
2028210233cSdrh     `--SCAN c
203dee1cb30Sdrh}
204dee1cb30Sdrh
205dee1cb30Sdrh
206dee1cb30Sdrhdo_execsql_test 200 {
207dee1cb30Sdrh  CREATE TABLE t1(x);
208dee1cb30Sdrh  INSERT INTO t1(x) VALUES(4);
209dee1cb30Sdrh  CREATE VIEW t2(y) AS
210dee1cb30Sdrh    WITH c(z) AS (VALUES(4),(5),(6))
211dee1cb30Sdrh    SELECT c1.z+c2.z*100+t1.x*10000
212dee1cb30Sdrh      FROM t1,
213dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c1,
214dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c2;
215dee1cb30Sdrh  SELECT y FROM t2 ORDER BY y;
216dee1cb30Sdrh} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
217dee1cb30Sdrhdo_execsql_test 210 {
218dee1cb30Sdrh  DROP VIEW t2;
219dee1cb30Sdrh  CREATE VIEW t2(y) AS
220dee1cb30Sdrh    WITH c(z) AS NOT MATERIALIZED (VALUES(4),(5),(6))
221dee1cb30Sdrh    SELECT c1.z+c2.z*100+t1.x*10000
222dee1cb30Sdrh      FROM t1,
223dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c1,
224dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c2;
225dee1cb30Sdrh  SELECT y FROM t2 ORDER BY y;
226dee1cb30Sdrh} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
227dee1cb30Sdrhdo_eqp_test 211 {
228dee1cb30Sdrh  SELECT y FROM t2 ORDER BY y;
229dee1cb30Sdrh} {
230dee1cb30Sdrh  QUERY PLAN
2318210233cSdrh  |--MATERIALIZE c1
232*67f70beaSdrh  |  |--CO-ROUTINE c
233dee1cb30Sdrh  |  |  `--SCAN 3 CONSTANT ROWS
2348210233cSdrh  |  `--SCAN c
2358210233cSdrh  |--MATERIALIZE c2
236*67f70beaSdrh  |  |--CO-ROUTINE c
237*67f70beaSdrh  |  |  `--SCAN 3 CONSTANT ROWS
2388210233cSdrh  |  `--SCAN c
2398210233cSdrh  |--SCAN c1
2408210233cSdrh  |--SCAN c2
2418210233cSdrh  |--SCAN t1
242dee1cb30Sdrh  `--USE TEMP B-TREE FOR ORDER BY
243dee1cb30Sdrh}
244dee1cb30Sdrhdo_execsql_test 220 {
245dee1cb30Sdrh  DROP VIEW t2;
246dee1cb30Sdrh  CREATE VIEW t2(y) AS
247dee1cb30Sdrh    WITH c(z) AS MATERIALIZED (VALUES(4),(5),(6))
248dee1cb30Sdrh    SELECT c1.z+c2.z*100+t1.x*10000
249dee1cb30Sdrh      FROM t1,
250dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c1,
251dee1cb30Sdrh           (SELECT z FROM c LIMIT 5) AS c2;
252dee1cb30Sdrh  SELECT y FROM t2 ORDER BY y;
253dee1cb30Sdrh} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
254dee1cb30Sdrh
255*67f70beaSdrh# 2022-04-22: Do not allow flattening of a MATERIALIZED CTE into
256*67f70beaSdrh# an outer query.
257*67f70beaSdrh#
258*67f70beaSdrhreset_db
259*67f70beaSdrhdb null -
260*67f70beaSdrhdo_execsql_test 300 {
261*67f70beaSdrh  CREATE TABLE t2(a INT,b INT,d INT); INSERT INTO t2 VALUES(4,5,6),(7,8,9);
262*67f70beaSdrh  CREATE TABLE t3(a INT,b INT,e INT); INSERT INTO t3 VALUES(3,3,3),(8,8,8);
263*67f70beaSdrh} {}
264*67f70beaSdrhdo_execsql_test 310 {
265*67f70beaSdrh  WITH t23 AS MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
266*67f70beaSdrh  SELECT * FROM t23;
267*67f70beaSdrh} {
268*67f70beaSdrh  4 5 6 - -
269*67f70beaSdrh  7 8 9 8 8
270*67f70beaSdrh  - 3 - 3 3
271*67f70beaSdrh}
272*67f70beaSdrhdo_eqp_test 311 {
273*67f70beaSdrh  WITH t23 AS MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
274*67f70beaSdrh  SELECT * FROM t23;
275*67f70beaSdrh} {
276*67f70beaSdrh  QUERY PLAN
277*67f70beaSdrh  |--MATERIALIZE t23
278*67f70beaSdrh  |  |--SCAN t2
279*67f70beaSdrh  |  |--SCAN t3 LEFT-JOIN
280*67f70beaSdrh  |  `--RIGHT-JOIN t3
281*67f70beaSdrh  |     `--SCAN t3
282*67f70beaSdrh  `--SCAN t23
283*67f70beaSdrh}
284*67f70beaSdrhdo_execsql_test 320 {
285*67f70beaSdrh  WITH t23 AS NOT MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
286*67f70beaSdrh  SELECT * FROM t23;
287*67f70beaSdrh} {
288*67f70beaSdrh  4 5 6 - -
289*67f70beaSdrh  7 8 9 8 8
290*67f70beaSdrh  - 3 - 3 3
291*67f70beaSdrh}
292*67f70beaSdrhdo_eqp_test 321 {
293*67f70beaSdrh  WITH t23 AS NOT MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
294*67f70beaSdrh  SELECT * FROM t23;
295*67f70beaSdrh} {
296*67f70beaSdrh  QUERY PLAN
297*67f70beaSdrh  |--SCAN t2
298*67f70beaSdrh  |--SCAN t3 LEFT-JOIN
299*67f70beaSdrh  `--RIGHT-JOIN t3
300*67f70beaSdrh     `--SCAN t3
301*67f70beaSdrh}
302*67f70beaSdrhdo_execsql_test 330 {
303*67f70beaSdrh  WITH t23 AS (SELECT * FROM t2 FULL JOIN t3 USING(b))
304*67f70beaSdrh  SELECT * FROM t23;
305*67f70beaSdrh} {
306*67f70beaSdrh  4 5 6 - -
307*67f70beaSdrh  7 8 9 8 8
308*67f70beaSdrh  - 3 - 3 3
309*67f70beaSdrh}
310*67f70beaSdrhdo_eqp_test 331 {
311*67f70beaSdrh  WITH t23 AS (SELECT * FROM t2 FULL JOIN t3 USING(b))
312*67f70beaSdrh  SELECT * FROM t23;
313*67f70beaSdrh} {
314*67f70beaSdrh  QUERY PLAN
315*67f70beaSdrh  |--SCAN t2
316*67f70beaSdrh  |--SCAN t3 LEFT-JOIN
317*67f70beaSdrh  `--RIGHT-JOIN t3
318*67f70beaSdrh     `--SCAN t3
319*67f70beaSdrh}
320dee1cb30Sdrh
321dee1cb30Sdrh
322dee1cb30Sdrhfinish_test
323