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