github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/with6.test (about) 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 c 34 | `--SCAN 2 CONSTANT ROWS 35 |--SCAN c1 36 |--SCAN c2 37 `--SCAN 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 c 50 | `--SCAN 2 CONSTANT ROWS 51 |--SCAN c1 52 |--SCAN c2 53 `--SCAN 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 c 69 | `--SCAN 2 CONSTANT ROWS 70 |--SCAN c1 71 |--SCAN c2 72 `--SCAN 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 c1 91 | |--CO-ROUTINE c 92 | | `--SCAN 2 CONSTANT ROWS 93 | `--SCAN c 94 |--MATERIALIZE c2 95 | |--CO-ROUTINE c 96 | | `--SCAN 2 CONSTANT ROWS 97 | `--SCAN c 98 |--MATERIALIZE c3 99 | |--CO-ROUTINE c 100 | | `--SCAN 2 CONSTANT ROWS 101 | `--SCAN c 102 |--SCAN c1 103 |--SCAN c2 104 `--SCAN 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 c1 127 | |--MATERIALIZE c 128 | | `--SCAN 2 CONSTANT ROWS 129 | `--SCAN c 130 |--MATERIALIZE c2 131 | `--SCAN c 132 |--MATERIALIZE c3 133 | `--SCAN c 134 |--SCAN c1 135 |--SCAN c2 136 `--SCAN 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 c1 155 | |--MATERIALIZE c 156 | | `--SCAN 2 CONSTANT ROWS 157 | `--SCAN c 158 |--MATERIALIZE c2 159 | `--SCAN c 160 |--MATERIALIZE c3 161 | `--SCAN c 162 |--SCAN c1 163 |--SCAN c2 164 `--SCAN 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 c 179 | `--SCAN 2 CONSTANT ROWS 180 |--SCAN c2 181 `--CORRELATED SCALAR SUBQUERY xxxxxx 182 `--SCAN c 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 c 197 | `--SCAN 2 CONSTANT ROWS 198 |--SCAN c2 199 `--CORRELATED SCALAR SUBQUERY xxxxxx 200 |--CO-ROUTINE c 201 | `--SCAN 2 CONSTANT ROWS 202 `--SCAN c 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 c1 232 | |--MATERIALIZE c 233 | | `--SCAN 3 CONSTANT ROWS 234 | `--SCAN c 235 |--MATERIALIZE c2 236 | `--SCAN c 237 |--SCAN c1 238 |--SCAN c2 239 |--SCAN 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