blob: 775fee86bec1b1b1b39fc993fbf75cdc81bffea0 [file] [log] [blame]
drh94a6d992012-02-02 18:42:09 +00001# 2012 February 02
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#
12# Test for queries of the form:
13#
14# SELECT p, max(q) FROM t1;
15#
16# Demonstration that the value returned for p is on the same row as
17# the maximum q.
18#
19
20set testdir [file dirname $argv0]
21source $testdir/tester.tcl
danddd74212019-08-02 18:43:59 +000022set testprefix minmax4
drh94a6d992012-02-02 18:42:09 +000023
dan2f56da32012-02-13 10:00:35 +000024ifcapable !compound {
25 finish_test
26 return
27}
28
drh94a6d992012-02-02 18:42:09 +000029do_test minmax4-1.1 {
30 db eval {
31 CREATE TABLE t1(p,q);
32 SELECT p, max(q) FROM t1;
33 }
34} {{} {}}
35do_test minmax4-1.2 {
36 db eval {
37 SELECT p, min(q) FROM t1;
38 }
39} {{} {}}
40do_test minmax4-1.3 {
41 db eval {
42 INSERT INTO t1 VALUES(1,2);
43 SELECT p, max(q) FROM t1;
44 }
45} {1 2}
46do_test minmax4-1.4 {
47 db eval {
48 SELECT p, min(q) FROM t1;
49 }
50} {1 2}
51do_test minmax4-1.5 {
52 db eval {
53 INSERT INTO t1 VALUES(3,4);
54 SELECT p, max(q) FROM t1;
55 }
56} {3 4}
57do_test minmax4-1.6 {
58 db eval {
59 SELECT p, min(q) FROM t1;
drh9588ad92014-09-15 14:46:02 +000060 SELECT p FROM (SELECT p, min(q) FROM t1);
drh94a6d992012-02-02 18:42:09 +000061 }
drh9588ad92014-09-15 14:46:02 +000062} {1 2 1}
drh94a6d992012-02-02 18:42:09 +000063do_test minmax4-1.7 {
64 db eval {
65 INSERT INTO t1 VALUES(5,0);
66 SELECT p, max(q) FROM t1;
drh9588ad92014-09-15 14:46:02 +000067 SELECT p FROM (SELECT max(q), p FROM t1);
drh94a6d992012-02-02 18:42:09 +000068 }
drh9588ad92014-09-15 14:46:02 +000069} {3 4 3}
drh94a6d992012-02-02 18:42:09 +000070do_test minmax4-1.8 {
71 db eval {
72 SELECT p, min(q) FROM t1;
73 }
74} {5 0}
75do_test minmax4-1.9 {
76 db eval {
77 INSERT INTO t1 VALUES(6,1);
78 SELECT p, max(q) FROM t1;
drh9588ad92014-09-15 14:46:02 +000079 SELECT p FROM (SELECT max(q), p FROM t1);
drh94a6d992012-02-02 18:42:09 +000080 }
drh9588ad92014-09-15 14:46:02 +000081} {3 4 3}
drh94a6d992012-02-02 18:42:09 +000082do_test minmax4-1.10 {
83 db eval {
84 SELECT p, min(q) FROM t1;
85 }
86} {5 0}
87do_test minmax4-1.11 {
88 db eval {
89 INSERT INTO t1 VALUES(7,NULL);
90 SELECT p, max(q) FROM t1;
91 }
92} {3 4}
93do_test minmax4-1.12 {
94 db eval {
95 SELECT p, min(q) FROM t1;
96 }
97} {5 0}
98do_test minmax4-1.13 {
99 db eval {
100 DELETE FROM t1 WHERE q IS NOT NULL;
101 SELECT p, max(q) FROM t1;
102 }
103} {7 {}}
104do_test minmax4-1.14 {
105 db eval {
106 SELECT p, min(q) FROM t1;
107 }
108} {7 {}}
109
110do_test minmax4-2.1 {
111 db eval {
112 CREATE TABLE t2(a,b,c);
113 INSERT INTO t2 VALUES
114 (1,null,2),
115 (1,2,3),
116 (1,1,4),
117 (2,3,5);
118 SELECT a, max(b), c FROM t2 GROUP BY a ORDER BY a;
119 }
120} {1 2 3 2 3 5}
121do_test minmax4-2.2 {
122 db eval {
123 SELECT a, min(b), c FROM t2 GROUP BY a ORDER BY a;
124 }
125} {1 1 4 2 3 5}
126do_test minmax4-2.3 {
127 db eval {
128 SELECT a, min(b), avg(b), count(b), c FROM t2 GROUP BY a ORDER BY a DESC;
129 }
130} {2 3 3.0 1 5 1 1 1.5 2 4}
131do_test minmax4-2.4 {
132 db eval {
133 SELECT a, min(b), max(b), c FROM t2 GROUP BY a ORDER BY a;
134 }
135} {1 1 2 3 2 3 3 5}
136do_test minmax4-2.5 {
137 db eval {
138 SELECT a, max(b), min(b), c FROM t2 GROUP BY a ORDER BY a;
139 }
140} {1 2 1 4 2 3 3 5}
141do_test minmax4-2.6 {
142 db eval {
143 SELECT a, max(b), b, max(c), c FROM t2 GROUP BY a ORDER BY a;
144 }
145} {1 2 1 4 4 2 3 3 5 5}
146do_test minmax4-2.7 {
147 db eval {
148 SELECT a, min(b), b, min(c), c FROM t2 GROUP BY a ORDER BY a;
149 }
150} {1 1 {} 2 2 2 3 3 5 5}
151
danddd74212019-08-02 18:43:59 +0000152#-------------------------------------------------------------------------
153foreach {tn sql} {
154 1 { CREATE INDEX i1 ON t1(a) }
155 2 { CREATE INDEX i1 ON t1(a DESC) }
156 3 { }
157} {
158 reset_db
159 do_execsql_test 3.$tn.0 {
160 CREATE TABLE t1(a, b);
161 INSERT INTO t1 VALUES(NULL, 1);
162 }
163 execsql $sql
164 do_execsql_test 3.$tn.1 {
165 SELECT min(a), b FROM t1;
166 } {{} 1}
167 do_execsql_test 3.$tn.2 {
168 SELECT min(a), b FROM t1 WHERE a<50;
169 } {{} {}}
170 do_execsql_test 3.$tn.3 {
171 INSERT INTO t1 VALUES(2, 2);
172 }
173 do_execsql_test 3.$tn.4 {
174 SELECT min(a), b FROM t1;
175 } {2 2}
176 do_execsql_test 3.$tn.5 {
177 SELECT min(a), b FROM t1 WHERE a<50;
178 } {2 2}
179}
drh94a6d992012-02-02 18:42:09 +0000180
dan192418b2019-08-03 16:37:40 +0000181#-------------------------------------------------------------------------
182reset_db
183do_execsql_test 4.0 {
184 CREATE TABLE t0 (c0, c1);
185 CREATE INDEX i0 ON t0(c1, c1 + 1 DESC);
186 INSERT INTO t0(c0) VALUES (1);
187}
188do_execsql_test 4.1 {
189 SELECT MIN(t0.c1), t0.c0 FROM t0 WHERE t0.c1 ISNULL;
190} {{} 1}
191
192#-------------------------------------------------------------------------
193reset_db
194do_execsql_test 5.0 {
195 CREATE TABLE t1 (a, b);
196 INSERT INTO t1 VALUES(123, NULL);
197 CREATE INDEX i1 ON t1(a, b DESC);
198}
199do_execsql_test 5.1 {
200 SELECT MIN(a) FROM t1 WHERE a=123;
201} {123}
202
dan83283692019-08-17 18:16:59 +0000203#-------------------------------------------------------------------------
204# Tests for ticket f8a7060ece.
205#
206reset_db
207do_execsql_test 6.1.0 {
208 CREATE TABLE t1(a, b, c);
209 INSERT INTO t1 VALUES(NULL, 1, 'x');
210 CREATE INDEX i1 ON t1(a);
211}
212do_execsql_test 6.1.1 {
213 SELECT min(a), b, c FROM t1 WHERE c='x';
214} {{} 1 x}
215do_execsql_test 6.1.2 {
216 INSERT INTO t1 VALUES(1, 2, 'y');
217} {}
218do_execsql_test 6.1.3 {
219 SELECT min(a), b, c FROM t1 WHERE c='x';
220} {{} 1 x}
221
222do_execsql_test 6.2.0 {
223 CREATE TABLE t0(c0 UNIQUE, c1);
224 INSERT INTO t0(c1) VALUES (0);
225 INSERT INTO t0(c0) VALUES (0);
226 CREATE VIEW v0(c0, c1) AS
227 SELECT t0.c1, t0.c0 FROM t0 WHERE CAST(t0.rowid AS INT) = 1;
228}
229do_execsql_test 6.2.1 {
230 SELECT c0, c1 FROM v0;
231} {0 {}}
232do_execsql_test 6.2.2 {
233 SELECT v0.c0, MIN(v0.c1) FROM v0;
234} {0 {}}
235
drh94a6d992012-02-02 18:42:09 +0000236finish_test