1903fdd48Sdan# 2021 February 23 2903fdd48Sdan# 3903fdd48Sdan# The author disclaims copyright to this source code. In place of 4903fdd48Sdan# a legal notice, here is a blessing: 5903fdd48Sdan# 6903fdd48Sdan# May you do good and not evil. 7903fdd48Sdan# May you find forgiveness for yourself and forgive others. 8903fdd48Sdan# May you share freely, never taking more than you give. 9903fdd48Sdan# 10903fdd48Sdan#*********************************************************************** 11903fdd48Sdan# This file implements regression tests for SQLite library. The 12903fdd48Sdan# focus of this file is testing the push-down optimization when 13903fdd48Sdan# WHERE constraints are pushed down into a sub-query that uses 14903fdd48Sdan# window functions. 15903fdd48Sdan# 16903fdd48Sdan 17903fdd48Sdanset testdir [file dirname $argv0] 18903fdd48Sdansource $testdir/tester.tcl 19903fdd48Sdanset testprefix windowpushd 20903fdd48Sdan 21903fdd48Sdando_execsql_test 1.0 { 22903fdd48Sdan CREATE TABLE t1(id INTEGER PRIMARY KEY, grp_id); 23903fdd48Sdan CREATE INDEX i1 ON t1(grp_id); 24903fdd48Sdan CREATE VIEW lll AS SELECT 25903fdd48Sdan row_number() OVER (PARTITION BY grp_id), 26903fdd48Sdan grp_id, id 27903fdd48Sdan FROM t1 28903fdd48Sdan} 29903fdd48Sdan 30903fdd48Sdando_execsql_test 1.1 { 31903fdd48Sdan INSERT INTO t1 VALUES 32903fdd48Sdan (1, 2), (2, 3), (3, 3), (4, 1), (5, 1), 33903fdd48Sdan (6, 1), (7, 1), (8, 1), (9, 3), (10, 3), 34903fdd48Sdan (11, 2), (12, 3), (13, 3), (14, 2), (15, 1), 35903fdd48Sdan (16, 2), (17, 1), (18, 2), (19, 3), (20, 2) 36903fdd48Sdan} 37903fdd48Sdan 38903fdd48Sdando_execsql_test 1.2 { 39903fdd48Sdan SELECT * FROM lll 40903fdd48Sdan} { 41903fdd48Sdan 1 1 4 2 1 5 3 1 6 4 1 7 5 1 8 6 1 15 7 1 17 42903fdd48Sdan 1 2 1 2 2 11 3 2 14 4 2 16 5 2 18 6 2 20 43903fdd48Sdan 1 3 2 2 3 3 3 3 9 4 3 10 5 3 12 6 3 13 7 3 19 44903fdd48Sdan} 45903fdd48Sdan 46903fdd48Sdando_execsql_test 1.3 { 47903fdd48Sdan SELECT * FROM lll WHERE grp_id=2 48903fdd48Sdan} { 49903fdd48Sdan 1 2 1 2 2 11 3 2 14 4 2 16 5 2 18 6 2 20 50903fdd48Sdan} 51903fdd48Sdan 52903fdd48Sdando_eqp_test 1.4 { 53903fdd48Sdan SELECT * FROM lll WHERE grp_id=2 54*8210233cSdrh} {SEARCH t1 USING COVERING INDEX i1 (grp_id=?)} 55903fdd48Sdan 56903fdd48Sdan#------------------------------------------------------------------------- 57903fdd48Sdanreset_db 58903fdd48Sdando_execsql_test 2.0 { 59903fdd48Sdan CREATE TABLE t1(a, b, c, d); 60903fdd48Sdan INSERT INTO t1 VALUES('A', 'C', 1, 0.1); 61903fdd48Sdan INSERT INTO t1 VALUES('A', 'D', 2, 0.2); 62903fdd48Sdan INSERT INTO t1 VALUES('A', 'E', 3, 0.3); 63903fdd48Sdan INSERT INTO t1 VALUES('A', 'C', 4, 0.4); 64903fdd48Sdan INSERT INTO t1 VALUES('B', 'D', 5, 0.5); 65903fdd48Sdan INSERT INTO t1 VALUES('B', 'E', 6, 0.6); 66903fdd48Sdan INSERT INTO t1 VALUES('B', 'C', 7, 0.7); 67903fdd48Sdan INSERT INTO t1 VALUES('B', 'D', 8, 0.8); 68903fdd48Sdan INSERT INTO t1 VALUES('C', 'E', 9, 0.9); 69903fdd48Sdan INSERT INTO t1 VALUES('C', 'C', 10, 1.0); 70903fdd48Sdan INSERT INTO t1 VALUES('C', 'D', 11, 1.1); 71903fdd48Sdan INSERT INTO t1 VALUES('C', 'E', 12, 1.2); 72903fdd48Sdan 73903fdd48Sdan CREATE INDEX i1 ON t1(a); 74903fdd48Sdan CREATE INDEX i2 ON t1(b); 75903fdd48Sdan 76903fdd48Sdan CREATE VIEW v1 AS SELECT a, c, max(c) OVER (PARTITION BY a) FROM t1; 77903fdd48Sdan 78903fdd48Sdan CREATE VIEW v2 AS SELECT a, c, 79903fdd48Sdan max(c) OVER (PARTITION BY a), 80903fdd48Sdan row_number() OVER () 81903fdd48Sdan FROM t1; 82903fdd48Sdan 83903fdd48Sdan CREATE VIEW v3 AS SELECT b, d, 84903fdd48Sdan max(d) OVER (PARTITION BY b), 85903fdd48Sdan row_number() OVER (PARTITION BY b) 86903fdd48Sdan FROM t1; 8734a224a1Sdan 8834a224a1Sdan CREATE TABLE t2(x, y, z); 8934a224a1Sdan INSERT INTO t2 VALUES('W', 3, 1); 9034a224a1Sdan INSERT INTO t2 VALUES('W', 2, 2); 9134a224a1Sdan INSERT INTO t2 VALUES('X', 1, 4); 9234a224a1Sdan INSERT INTO t2 VALUES('X', 5, 7); 9334a224a1Sdan INSERT INTO t2 VALUES('Y', 1, 9); 9434a224a1Sdan INSERT INTO t2 VALUES('Y', 4, 2); 9534a224a1Sdan INSERT INTO t2 VALUES('Z', 3, 3); 9634a224a1Sdan INSERT INTO t2 VALUES('Z', 3, 4); 97903fdd48Sdan} 98903fdd48Sdan 99903fdd48Sdanforeach tn {0 1} { 100903fdd48Sdan optimization_control db push-down $tn 101903fdd48Sdan 102903fdd48Sdan do_execsql_test 2.$tn.1.1 { 103903fdd48Sdan SELECT * FROM v1; 104903fdd48Sdan } { 105903fdd48Sdan A 1 4 A 2 4 A 3 4 A 4 4 106903fdd48Sdan B 5 8 B 6 8 B 7 8 B 8 8 107903fdd48Sdan C 9 12 C 10 12 C 11 12 C 12 12 108903fdd48Sdan } 109903fdd48Sdan 110903fdd48Sdan do_execsql_test 2.$tn.1.2 { 111903fdd48Sdan SELECT * FROM v1 WHERE a IN ('A', 'B'); 112903fdd48Sdan } { 113903fdd48Sdan A 1 4 A 2 4 A 3 4 A 4 4 114903fdd48Sdan B 5 8 B 6 8 B 7 8 B 8 8 115903fdd48Sdan } 116903fdd48Sdan 117903fdd48Sdan do_execsql_test 2.$tn.1.3 { 118903fdd48Sdan SELECT * FROM v1 WHERE a IS 'C' 119903fdd48Sdan } { 120903fdd48Sdan C 9 12 C 10 12 C 11 12 C 12 12 121903fdd48Sdan } 122903fdd48Sdan 123903fdd48Sdan if {$tn==1} { 124903fdd48Sdan do_eqp_test 2.$tn.1.4 { 125903fdd48Sdan SELECT * FROM v1 WHERE a IN ('A', 'B'); 126903fdd48Sdan } {USING INDEX i1 (a=?)} 127903fdd48Sdan 128903fdd48Sdan do_eqp_test 2.$tn.1.5 { 129903fdd48Sdan SELECT * FROM v1 WHERE a = 'c' COLLATE nocase 130903fdd48Sdan } {USING INDEX i1} 131903fdd48Sdan } 132903fdd48Sdan 133903fdd48Sdan do_execsql_test 2.$tn.2.1 { 134903fdd48Sdan SELECT * FROM v2; 135903fdd48Sdan } { 136903fdd48Sdan A 1 4 1 A 2 4 2 A 3 4 3 A 4 4 4 137903fdd48Sdan B 5 8 5 B 6 8 6 B 7 8 7 B 8 8 8 138903fdd48Sdan C 9 12 9 C 10 12 10 C 11 12 11 C 12 12 12 139903fdd48Sdan } 140903fdd48Sdan 141903fdd48Sdan do_execsql_test 2.$tn.2.2 { 142903fdd48Sdan SELECT * FROM v2 WHERE a = 'C'; 143903fdd48Sdan } { 144903fdd48Sdan C 9 12 9 C 10 12 10 C 11 12 11 C 12 12 12 145903fdd48Sdan } 146903fdd48Sdan 147903fdd48Sdan do_execsql_test 2.$tn.3.1 { SELECT * FROM v3; } { 148903fdd48Sdan C 0.1 1.0 1 C 0.4 1.0 2 C 0.7 1.0 3 C 1.0 1.0 4 149903fdd48Sdan D 0.2 1.1 1 D 0.5 1.1 2 D 0.8 1.1 3 D 1.1 1.1 4 150903fdd48Sdan E 0.3 1.2 1 E 0.6 1.2 2 E 0.9 1.2 3 E 1.2 1.2 4 151903fdd48Sdan } 152903fdd48Sdan 153903fdd48Sdan do_execsql_test 2.$tn.3.2 { SELECT * FROM v3 WHERE b<'E' } { 154903fdd48Sdan C 0.1 1.0 1 C 0.4 1.0 2 C 0.7 1.0 3 C 1.0 1.0 4 155903fdd48Sdan D 0.2 1.1 1 D 0.5 1.1 2 D 0.8 1.1 3 D 1.1 1.1 4 156903fdd48Sdan } 157903fdd48Sdan 158903fdd48Sdan if {$tn==1} { 159903fdd48Sdan do_eqp_test 2.$tn.3.3 { 160903fdd48Sdan SELECT * FROM v3 WHERE b='E' 161*8210233cSdrh } {SEARCH t1 USING INDEX i2 (b=?)} 16234a224a1Sdan do_eqp_test 2.$tn.3.4 { 16334a224a1Sdan SELECT * FROM v3 WHERE b>'C' 164*8210233cSdrh } {SEARCH t1 USING INDEX i2 (b>?)} 165601ec240Sdan } 166601ec240Sdan 167601ec240Sdan do_execsql_test 2.$tn.3.5 { SELECT * FROM v3 WHERE d<0.55; } { 168601ec240Sdan C 0.1 1.0 1 C 0.4 1.0 2 169601ec240Sdan D 0.2 1.1 1 D 0.5 1.1 2 170601ec240Sdan E 0.3 1.2 1 171601ec240Sdan } 172601ec240Sdan if {$tn==1} { 173601ec240Sdan do_eqp_test 2.$tn.3.6 { 174601ec240Sdan SELECT * FROM v3 WHERE d<0.55 175*8210233cSdrh } {SCAN t1 USING INDEX i2} 17634a224a1Sdan } 17734a224a1Sdan 17834a224a1Sdan do_execsql_test 2.$tn.4.1 { 17934a224a1Sdan SELECT * FROM ( 18034a224a1Sdan SELECT x, sum(y) AS s, max(z) AS m 18134a224a1Sdan FROM t2 GROUP BY x 18234a224a1Sdan ) 18334a224a1Sdan } { 18434a224a1Sdan W 5 2 18534a224a1Sdan X 6 7 18634a224a1Sdan Y 5 9 18734a224a1Sdan Z 6 4 18834a224a1Sdan } 18934a224a1Sdan 19034a224a1Sdan do_execsql_test 2.$tn.4.1 { 19134a224a1Sdan SELECT * FROM ( 19234a224a1Sdan SELECT x, sum(y) AS s, max(z) AS m, 19334a224a1Sdan max( max(z) ) OVER (PARTITION BY sum(y) 19434a224a1Sdan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 19534a224a1Sdan ) 19634a224a1Sdan FROM t2 GROUP BY x 19734a224a1Sdan ) 19834a224a1Sdan } { 19934a224a1Sdan W 5 2 9 20034a224a1Sdan Y 5 9 9 20134a224a1Sdan X 6 7 7 20234a224a1Sdan Z 6 4 7 20334a224a1Sdan } 20434a224a1Sdan 20534a224a1Sdan do_execsql_test 2.$tn.4.2 { 20634a224a1Sdan SELECT * FROM ( 20734a224a1Sdan SELECT x, sum(y) AS s, max(z) AS m, 20834a224a1Sdan max( max(z) ) OVER (PARTITION BY sum(y) 20934a224a1Sdan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 21034a224a1Sdan ) 21134a224a1Sdan FROM t2 GROUP BY x 21234a224a1Sdan ) WHERE s=6 21334a224a1Sdan } { 21434a224a1Sdan X 6 7 7 21534a224a1Sdan Z 6 4 7 21634a224a1Sdan } 21734a224a1Sdan 21834a224a1Sdan do_execsql_test 2.$tn.4.3 { 21934a224a1Sdan SELECT * FROM ( 22034a224a1Sdan SELECT x, sum(y) AS s, max(z) AS m, 22134a224a1Sdan max( max(z) ) OVER (PARTITION BY sum(y) 22234a224a1Sdan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 22334a224a1Sdan ) 22434a224a1Sdan FROM t2 GROUP BY x 22534a224a1Sdan ) WHERE s<6 22634a224a1Sdan } { 22734a224a1Sdan W 5 2 9 22834a224a1Sdan Y 5 9 9 229903fdd48Sdan } 230903fdd48Sdan 231903fdd48Sdan} 232903fdd48Sdan 233903fdd48Sdan 234903fdd48Sdan 235903fdd48Sdan 236903fdd48Sdanfinish_test 237