xref: /sqlite-3.40.0/test/windowpushd.test (revision 8210233c)
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