github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/windowpushd.test (about) 1 # 2021 February 23 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 testing the push-down optimization when 13 # WHERE constraints are pushed down into a sub-query that uses 14 # window functions. 15 # 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 set testprefix windowpushd 20 21 do_execsql_test 1.0 { 22 CREATE TABLE t1(id INTEGER PRIMARY KEY, grp_id); 23 CREATE INDEX i1 ON t1(grp_id); 24 CREATE VIEW lll AS SELECT 25 row_number() OVER (PARTITION BY grp_id), 26 grp_id, id 27 FROM t1 28 } 29 30 do_execsql_test 1.1 { 31 INSERT INTO t1 VALUES 32 (1, 2), (2, 3), (3, 3), (4, 1), (5, 1), 33 (6, 1), (7, 1), (8, 1), (9, 3), (10, 3), 34 (11, 2), (12, 3), (13, 3), (14, 2), (15, 1), 35 (16, 2), (17, 1), (18, 2), (19, 3), (20, 2) 36 } 37 38 do_execsql_test 1.2 { 39 SELECT * FROM lll 40 } { 41 1 1 4 2 1 5 3 1 6 4 1 7 5 1 8 6 1 15 7 1 17 42 1 2 1 2 2 11 3 2 14 4 2 16 5 2 18 6 2 20 43 1 3 2 2 3 3 3 3 9 4 3 10 5 3 12 6 3 13 7 3 19 44 } 45 46 do_execsql_test 1.3 { 47 SELECT * FROM lll WHERE grp_id=2 48 } { 49 1 2 1 2 2 11 3 2 14 4 2 16 5 2 18 6 2 20 50 } 51 52 do_eqp_test 1.4 { 53 SELECT * FROM lll WHERE grp_id=2 54 } {SEARCH t1 USING COVERING INDEX i1 (grp_id=?)} 55 56 #------------------------------------------------------------------------- 57 reset_db 58 do_execsql_test 2.0 { 59 CREATE TABLE t1(a, b, c, d); 60 INSERT INTO t1 VALUES('A', 'C', 1, 0.1); 61 INSERT INTO t1 VALUES('A', 'D', 2, 0.2); 62 INSERT INTO t1 VALUES('A', 'E', 3, 0.3); 63 INSERT INTO t1 VALUES('A', 'C', 4, 0.4); 64 INSERT INTO t1 VALUES('B', 'D', 5, 0.5); 65 INSERT INTO t1 VALUES('B', 'E', 6, 0.6); 66 INSERT INTO t1 VALUES('B', 'C', 7, 0.7); 67 INSERT INTO t1 VALUES('B', 'D', 8, 0.8); 68 INSERT INTO t1 VALUES('C', 'E', 9, 0.9); 69 INSERT INTO t1 VALUES('C', 'C', 10, 1.0); 70 INSERT INTO t1 VALUES('C', 'D', 11, 1.1); 71 INSERT INTO t1 VALUES('C', 'E', 12, 1.2); 72 73 CREATE INDEX i1 ON t1(a); 74 CREATE INDEX i2 ON t1(b); 75 76 CREATE VIEW v1 AS SELECT a, c, max(c) OVER (PARTITION BY a) FROM t1; 77 78 CREATE VIEW v2 AS SELECT a, c, 79 max(c) OVER (PARTITION BY a), 80 row_number() OVER () 81 FROM t1; 82 83 CREATE VIEW v3 AS SELECT b, d, 84 max(d) OVER (PARTITION BY b), 85 row_number() OVER (PARTITION BY b) 86 FROM t1; 87 88 CREATE TABLE t2(x, y, z); 89 INSERT INTO t2 VALUES('W', 3, 1); 90 INSERT INTO t2 VALUES('W', 2, 2); 91 INSERT INTO t2 VALUES('X', 1, 4); 92 INSERT INTO t2 VALUES('X', 5, 7); 93 INSERT INTO t2 VALUES('Y', 1, 9); 94 INSERT INTO t2 VALUES('Y', 4, 2); 95 INSERT INTO t2 VALUES('Z', 3, 3); 96 INSERT INTO t2 VALUES('Z', 3, 4); 97 } 98 99 foreach tn {0 1} { 100 optimization_control db push-down $tn 101 102 do_execsql_test 2.$tn.1.1 { 103 SELECT * FROM v1; 104 } { 105 A 1 4 A 2 4 A 3 4 A 4 4 106 B 5 8 B 6 8 B 7 8 B 8 8 107 C 9 12 C 10 12 C 11 12 C 12 12 108 } 109 110 do_execsql_test 2.$tn.1.2 { 111 SELECT * FROM v1 WHERE a IN ('A', 'B'); 112 } { 113 A 1 4 A 2 4 A 3 4 A 4 4 114 B 5 8 B 6 8 B 7 8 B 8 8 115 } 116 117 do_execsql_test 2.$tn.1.3 { 118 SELECT * FROM v1 WHERE a IS 'C' 119 } { 120 C 9 12 C 10 12 C 11 12 C 12 12 121 } 122 123 if {$tn==1} { 124 do_eqp_test 2.$tn.1.4 { 125 SELECT * FROM v1 WHERE a IN ('A', 'B'); 126 } {USING INDEX i1 (a=?)} 127 128 do_eqp_test 2.$tn.1.5 { 129 SELECT * FROM v1 WHERE a = 'c' COLLATE nocase 130 } {USING INDEX i1} 131 } 132 133 do_execsql_test 2.$tn.2.1 { 134 SELECT * FROM v2; 135 } { 136 A 1 4 1 A 2 4 2 A 3 4 3 A 4 4 4 137 B 5 8 5 B 6 8 6 B 7 8 7 B 8 8 8 138 C 9 12 9 C 10 12 10 C 11 12 11 C 12 12 12 139 } 140 141 do_execsql_test 2.$tn.2.2 { 142 SELECT * FROM v2 WHERE a = 'C'; 143 } { 144 C 9 12 9 C 10 12 10 C 11 12 11 C 12 12 12 145 } 146 147 do_execsql_test 2.$tn.3.1 { SELECT * FROM v3; } { 148 C 0.1 1.0 1 C 0.4 1.0 2 C 0.7 1.0 3 C 1.0 1.0 4 149 D 0.2 1.1 1 D 0.5 1.1 2 D 0.8 1.1 3 D 1.1 1.1 4 150 E 0.3 1.2 1 E 0.6 1.2 2 E 0.9 1.2 3 E 1.2 1.2 4 151 } 152 153 do_execsql_test 2.$tn.3.2 { SELECT * FROM v3 WHERE b<'E' } { 154 C 0.1 1.0 1 C 0.4 1.0 2 C 0.7 1.0 3 C 1.0 1.0 4 155 D 0.2 1.1 1 D 0.5 1.1 2 D 0.8 1.1 3 D 1.1 1.1 4 156 } 157 158 if {$tn==1} { 159 do_eqp_test 2.$tn.3.3 { 160 SELECT * FROM v3 WHERE b='E' 161 } {SEARCH t1 USING INDEX i2 (b=?)} 162 do_eqp_test 2.$tn.3.4 { 163 SELECT * FROM v3 WHERE b>'C' 164 } {SEARCH t1 USING INDEX i2 (b>?)} 165 } 166 167 do_execsql_test 2.$tn.3.5 { SELECT * FROM v3 WHERE d<0.55; } { 168 C 0.1 1.0 1 C 0.4 1.0 2 169 D 0.2 1.1 1 D 0.5 1.1 2 170 E 0.3 1.2 1 171 } 172 if {$tn==1} { 173 do_eqp_test 2.$tn.3.6 { 174 SELECT * FROM v3 WHERE d<0.55 175 } {SCAN t1 USING INDEX i2} 176 } 177 178 do_execsql_test 2.$tn.4.1 { 179 SELECT * FROM ( 180 SELECT x, sum(y) AS s, max(z) AS m 181 FROM t2 GROUP BY x 182 ) 183 } { 184 W 5 2 185 X 6 7 186 Y 5 9 187 Z 6 4 188 } 189 190 do_execsql_test 2.$tn.4.1 { 191 SELECT * FROM ( 192 SELECT x, sum(y) AS s, max(z) AS m, 193 max( max(z) ) OVER (PARTITION BY sum(y) 194 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 195 ) 196 FROM t2 GROUP BY x 197 ) 198 } { 199 W 5 2 9 200 Y 5 9 9 201 X 6 7 7 202 Z 6 4 7 203 } 204 205 do_execsql_test 2.$tn.4.2 { 206 SELECT * FROM ( 207 SELECT x, sum(y) AS s, max(z) AS m, 208 max( max(z) ) OVER (PARTITION BY sum(y) 209 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 210 ) 211 FROM t2 GROUP BY x 212 ) WHERE s=6 213 } { 214 X 6 7 7 215 Z 6 4 7 216 } 217 218 do_execsql_test 2.$tn.4.3 { 219 SELECT * FROM ( 220 SELECT x, sum(y) AS s, max(z) AS m, 221 max( max(z) ) OVER (PARTITION BY sum(y) 222 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 223 ) 224 FROM t2 GROUP BY x 225 ) WHERE s<6 226 } { 227 W 5 2 9 228 Y 5 9 9 229 } 230 231 } 232 233 234 235 236 finish_test