Skip to content

Commit 447bbf4

Browse files
author
D. Richard Hipp
committed
Add a few simple test cases for MATERIALIZED and NOT MATERIALIZED.
1 parent b209246 commit 447bbf4

File tree

1 file changed

+255
-0
lines changed

1 file changed

+255
-0
lines changed

test/with6.test

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
# 2021-02-22
2+
#
3+
# The author disclaims copyright to this source code. In place of
4+
# a legal notice, here is a blessing:
5+
#
6+
# May you do good and not evil.
7+
# May you find forgiveness for yourself and forgive others.
8+
# May you share freely, never taking more than you give.
9+
#
10+
#***********************************************************************
11+
# This file implements regression tests for SQLite library. The
12+
# focus of this file is the MATERIALIZED hint to common table expressions
13+
#
14+
15+
set testdir [file dirname $argv0]
16+
source $testdir/tester.tcl
17+
set ::testprefix with6
18+
19+
ifcapable {!cte} {
20+
finish_test
21+
return
22+
}
23+
24+
do_execsql_test 100 {
25+
WITH c(x) AS (VALUES(0),(1))
26+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
27+
} {000 001 010 011 100 101 110 111}
28+
do_eqp_test 101 {
29+
WITH c(x) AS (VALUES(0),(1))
30+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
31+
} {
32+
QUERY PLAN
33+
|--MATERIALIZE xxxxxx
34+
| `--SCAN 2 CONSTANT ROWS
35+
|--SCAN SUBQUERY xxxxxx AS c1
36+
|--SCAN SUBQUERY xxxxxx AS c2
37+
`--SCAN SUBQUERY xxxxxx AS c3
38+
}
39+
40+
do_execsql_test 110 {
41+
WITH c(x) AS MATERIALIZED (VALUES(0),(1))
42+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
43+
} {000 001 010 011 100 101 110 111}
44+
do_eqp_test 111 {
45+
WITH c(x) AS MATERIALIZED (VALUES(0),(1))
46+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
47+
} {
48+
QUERY PLAN
49+
|--MATERIALIZE xxxxxx
50+
| `--SCAN 2 CONSTANT ROWS
51+
|--SCAN SUBQUERY xxxxxx AS c1
52+
|--SCAN SUBQUERY xxxxxx AS c2
53+
`--SCAN SUBQUERY xxxxxx AS c3
54+
}
55+
56+
# Even though the CTE is not materialized, the self-join optimization
57+
# kicks in and does the materialization for us.
58+
#
59+
do_execsql_test 120 {
60+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
61+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
62+
} {000 001 010 011 100 101 110 111}
63+
do_eqp_test 121 {
64+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
65+
SELECT c1.x||c2.x||c3.x FROM c c1, c c2, c c3;
66+
} {
67+
QUERY PLAN
68+
|--MATERIALIZE xxxxxx
69+
| `--SCAN 2 CONSTANT ROWS
70+
|--SCAN SUBQUERY xxxxxx AS c1
71+
|--SCAN SUBQUERY xxxxxx AS c2
72+
`--SCAN SUBQUERY xxxxxx AS c3
73+
}
74+
75+
do_execsql_test 130 {
76+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
77+
SELECT c1.x||c2.x||c3.x
78+
FROM (SELECT x FROM c LIMIT 5) AS c1,
79+
(SELECT x FROM c LIMIT 5) AS c2,
80+
(SELECT x FROM c LIMIT 5) AS c3;
81+
} {000 001 010 011 100 101 110 111}
82+
do_eqp_test 131 {
83+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
84+
SELECT c1.x||c2.x||c3.x
85+
FROM (SELECT x FROM c LIMIT 5) AS c1,
86+
(SELECT x FROM c LIMIT 5) AS c2,
87+
(SELECT x FROM c LIMIT 5) AS c3;
88+
} {
89+
QUERY PLAN
90+
|--MATERIALIZE xxxxxx
91+
| |--CO-ROUTINE xxxxxx
92+
| | `--SCAN 2 CONSTANT ROWS
93+
| `--SCAN SUBQUERY xxxxxx
94+
|--MATERIALIZE xxxxxx
95+
| |--CO-ROUTINE xxxxxx
96+
| | `--SCAN 2 CONSTANT ROWS
97+
| `--SCAN SUBQUERY xxxxxx
98+
|--MATERIALIZE xxxxxx
99+
| |--CO-ROUTINE xxxxxx
100+
| | `--SCAN 2 CONSTANT ROWS
101+
| `--SCAN SUBQUERY xxxxxx
102+
|--SCAN SUBQUERY xxxxxx AS c1
103+
|--SCAN SUBQUERY xxxxxx AS c2
104+
`--SCAN SUBQUERY xxxxxx AS c3
105+
}
106+
107+
# The (SELECT x FROM c LIMIT N) subqueries get materialized once each.
108+
# Show multiple materializations are shown. But there is only one
109+
# materialization for c, shown by the "SCAN 2 CONSTANT ROWS" line.
110+
#
111+
do_execsql_test 140 {
112+
WITH c(x) AS MATERIALIZED (VALUES(0),(1))
113+
SELECT c1.x||c2.x||c3.x
114+
FROM (SELECT x FROM c LIMIT 5) AS c1,
115+
(SELECT x FROM c LIMIT 6) AS c2,
116+
(SELECT x FROM c LIMIT 7) AS c3;
117+
} {000 001 010 011 100 101 110 111}
118+
do_eqp_test 141 {
119+
WITH c(x) AS MATERIALIZED (VALUES(0),(1))
120+
SELECT c1.x||c2.x||c3.x
121+
FROM (SELECT x FROM c LIMIT 5) AS c1,
122+
(SELECT x FROM c LIMIT 6) AS c2,
123+
(SELECT x FROM c LIMIT 7) AS c3;
124+
} {
125+
QUERY PLAN
126+
|--MATERIALIZE xxxxxx
127+
| |--MATERIALIZE xxxxxx
128+
| | `--SCAN 2 CONSTANT ROWS
129+
| `--SCAN SUBQUERY xxxxxx
130+
|--MATERIALIZE xxxxxx
131+
| `--SCAN SUBQUERY xxxxxx
132+
|--MATERIALIZE xxxxxx
133+
| `--SCAN SUBQUERY xxxxxx
134+
|--SCAN SUBQUERY xxxxxx AS c1
135+
|--SCAN SUBQUERY xxxxxx AS c2
136+
`--SCAN SUBQUERY xxxxxx AS c3
137+
}
138+
139+
do_execsql_test 150 {
140+
WITH c(x) AS (VALUES(0),(1))
141+
SELECT c1.x||c2.x||c3.x
142+
FROM (SELECT x FROM c LIMIT 5) AS c1,
143+
(SELECT x FROM c LIMIT 6) AS c2,
144+
(SELECT x FROM c LIMIT 7) AS c3;
145+
} {000 001 010 011 100 101 110 111}
146+
do_eqp_test 151 {
147+
WITH c(x) AS (VALUES(0),(1))
148+
SELECT c1.x||c2.x||c3.x
149+
FROM (SELECT x FROM c LIMIT 5) AS c1,
150+
(SELECT x FROM c LIMIT 6) AS c2,
151+
(SELECT x FROM c LIMIT 7) AS c3;
152+
} {
153+
QUERY PLAN
154+
|--MATERIALIZE xxxxxx
155+
| |--MATERIALIZE xxxxxx
156+
| | `--SCAN 2 CONSTANT ROWS
157+
| `--SCAN SUBQUERY xxxxxx
158+
|--MATERIALIZE xxxxxx
159+
| `--SCAN SUBQUERY xxxxxx
160+
|--MATERIALIZE xxxxxx
161+
| `--SCAN SUBQUERY xxxxxx
162+
|--SCAN SUBQUERY xxxxxx AS c1
163+
|--SCAN SUBQUERY xxxxxx AS c2
164+
`--SCAN SUBQUERY xxxxxx AS c3
165+
}
166+
167+
do_execsql_test 160 {
168+
WITH c(x) AS (VALUES(0),(1))
169+
SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
170+
FROM c AS c2 WHERE c2.x<10;
171+
} {100 301}
172+
do_eqp_test 161 {
173+
WITH c(x) AS (VALUES(0),(1))
174+
SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
175+
FROM c AS c2 WHERE c2.x<10;
176+
} {
177+
QUERY PLAN
178+
|--MATERIALIZE xxxxxx
179+
| `--SCAN 2 CONSTANT ROWS
180+
|--SCAN SUBQUERY xxxxxx AS c2
181+
`--CORRELATED SCALAR SUBQUERY xxxxxx
182+
`--SCAN SUBQUERY xxxxxx
183+
}
184+
185+
do_execsql_test 170 {
186+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
187+
SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
188+
FROM c AS c2 WHERE c2.x<10;
189+
} {100 301}
190+
do_eqp_test 171 {
191+
WITH c(x) AS NOT MATERIALIZED (VALUES(0),(1))
192+
SELECT c2.x + 100*(SELECT sum(x+1) FROM c WHERE c.x<=c2.x)
193+
FROM c AS c2 WHERE c2.x<10;
194+
} {
195+
QUERY PLAN
196+
|--CO-ROUTINE xxxxxx
197+
| `--SCAN 2 CONSTANT ROWS
198+
|--SCAN SUBQUERY xxxxxx AS c2
199+
`--CORRELATED SCALAR SUBQUERY xxxxxx
200+
|--CO-ROUTINE xxxxxx
201+
| `--SCAN 2 CONSTANT ROWS
202+
`--SCAN SUBQUERY xxxxxx
203+
}
204+
205+
206+
do_execsql_test 200 {
207+
CREATE TABLE t1(x);
208+
INSERT INTO t1(x) VALUES(4);
209+
CREATE VIEW t2(y) AS
210+
WITH c(z) AS (VALUES(4),(5),(6))
211+
SELECT c1.z+c2.z*100+t1.x*10000
212+
FROM t1,
213+
(SELECT z FROM c LIMIT 5) AS c1,
214+
(SELECT z FROM c LIMIT 5) AS c2;
215+
SELECT y FROM t2 ORDER BY y;
216+
} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
217+
do_execsql_test 210 {
218+
DROP VIEW t2;
219+
CREATE VIEW t2(y) AS
220+
WITH c(z) AS NOT MATERIALIZED (VALUES(4),(5),(6))
221+
SELECT c1.z+c2.z*100+t1.x*10000
222+
FROM t1,
223+
(SELECT z FROM c LIMIT 5) AS c1,
224+
(SELECT z FROM c LIMIT 5) AS c2;
225+
SELECT y FROM t2 ORDER BY y;
226+
} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
227+
do_eqp_test 211 {
228+
SELECT y FROM t2 ORDER BY y;
229+
} {
230+
QUERY PLAN
231+
|--MATERIALIZE xxxxxx
232+
| |--MATERIALIZE xxxxxx
233+
| | `--SCAN 3 CONSTANT ROWS
234+
| `--SCAN SUBQUERY xxxxxx
235+
|--MATERIALIZE xxxxxx
236+
| `--SCAN SUBQUERY xxxxxx
237+
|--SCAN SUBQUERY xxxxxx AS c1
238+
|--SCAN SUBQUERY xxxxxx AS c2
239+
|--SCAN TABLE t1
240+
`--USE TEMP B-TREE FOR ORDER BY
241+
}
242+
do_execsql_test 220 {
243+
DROP VIEW t2;
244+
CREATE VIEW t2(y) AS
245+
WITH c(z) AS MATERIALIZED (VALUES(4),(5),(6))
246+
SELECT c1.z+c2.z*100+t1.x*10000
247+
FROM t1,
248+
(SELECT z FROM c LIMIT 5) AS c1,
249+
(SELECT z FROM c LIMIT 5) AS c2;
250+
SELECT y FROM t2 ORDER BY y;
251+
} {40404 40405 40406 40504 40505 40506 40604 40605 40606}
252+
253+
254+
255+
finish_test

0 commit comments

Comments
 (0)