dan | 903fdd4 | 2021-02-22 20:56:13 +0000 | [diff] [blame] | 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 |
drh | 8210233 | 2021-03-20 15:11:29 +0000 | [diff] [blame] | 54 | } {SEARCH t1 USING COVERING INDEX i1 (grp_id=?)} |
dan | 903fdd4 | 2021-02-22 20:56:13 +0000 | [diff] [blame] | 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; |
dan | 34a224a | 2021-02-23 15:36:06 +0000 | [diff] [blame] | 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); |
dan | 903fdd4 | 2021-02-22 20:56:13 +0000 | [diff] [blame] | 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' |
drh | 8210233 | 2021-03-20 15:11:29 +0000 | [diff] [blame] | 161 | } {SEARCH t1 USING INDEX i2 (b=?)} |
dan | 34a224a | 2021-02-23 15:36:06 +0000 | [diff] [blame] | 162 | do_eqp_test 2.$tn.3.4 { |
| 163 | SELECT * FROM v3 WHERE b>'C' |
drh | 8210233 | 2021-03-20 15:11:29 +0000 | [diff] [blame] | 164 | } {SEARCH t1 USING INDEX i2 (b>?)} |
dan | 601ec24 | 2021-02-23 15:53:22 +0000 | [diff] [blame] | 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 |
drh | 8210233 | 2021-03-20 15:11:29 +0000 | [diff] [blame] | 175 | } {SCAN t1 USING INDEX i2} |
dan | 34a224a | 2021-02-23 15:36:06 +0000 | [diff] [blame] | 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 |
dan | 903fdd4 | 2021-02-22 20:56:13 +0000 | [diff] [blame] | 229 | } |
| 230 | |
| 231 | } |
| 232 | |
| 233 | |
| 234 | |
| 235 | |
| 236 | finish_test |