Annotation of embedaddon/sqlite3/test/minmax2.test, revision 1.1
1.1 ! misho 1: # 2007 July 17
! 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 SELECT statements that contain
! 13: # aggregate min() and max() functions and which are handled as
! 14: # as a special case. This file makes sure that the min/max
! 15: # optimization works right in the presence of descending
! 16: # indices. Ticket #2514.
! 17: #
! 18: # $Id: minmax2.test,v 1.2 2008/01/05 17:39:30 danielk1977 Exp $
! 19:
! 20: set testdir [file dirname $argv0]
! 21: source $testdir/tester.tcl
! 22:
! 23: do_test minmax2-1.0 {
! 24: execsql {
! 25: PRAGMA legacy_file_format=0;
! 26: BEGIN;
! 27: CREATE TABLE t1(x, y);
! 28: INSERT INTO t1 VALUES(1,1);
! 29: INSERT INTO t1 VALUES(2,2);
! 30: INSERT INTO t1 VALUES(3,2);
! 31: INSERT INTO t1 VALUES(4,3);
! 32: INSERT INTO t1 VALUES(5,3);
! 33: INSERT INTO t1 VALUES(6,3);
! 34: INSERT INTO t1 VALUES(7,3);
! 35: INSERT INTO t1 VALUES(8,4);
! 36: INSERT INTO t1 VALUES(9,4);
! 37: INSERT INTO t1 VALUES(10,4);
! 38: INSERT INTO t1 VALUES(11,4);
! 39: INSERT INTO t1 VALUES(12,4);
! 40: INSERT INTO t1 VALUES(13,4);
! 41: INSERT INTO t1 VALUES(14,4);
! 42: INSERT INTO t1 VALUES(15,4);
! 43: INSERT INTO t1 VALUES(16,5);
! 44: INSERT INTO t1 VALUES(17,5);
! 45: INSERT INTO t1 VALUES(18,5);
! 46: INSERT INTO t1 VALUES(19,5);
! 47: INSERT INTO t1 VALUES(20,5);
! 48: COMMIT;
! 49: SELECT DISTINCT y FROM t1 ORDER BY y;
! 50: }
! 51: } {1 2 3 4 5}
! 52:
! 53: do_test minmax2-1.1 {
! 54: set sqlite_search_count 0
! 55: execsql {SELECT min(x) FROM t1}
! 56: } {1}
! 57: do_test minmax2-1.2 {
! 58: set sqlite_search_count
! 59: } {19}
! 60: do_test minmax2-1.3 {
! 61: set sqlite_search_count 0
! 62: execsql {SELECT max(x) FROM t1}
! 63: } {20}
! 64: do_test minmax2-1.4 {
! 65: set sqlite_search_count
! 66: } {19}
! 67: do_test minmax2-1.5 {
! 68: execsql {CREATE INDEX t1i1 ON t1(x DESC)}
! 69: set sqlite_search_count 0
! 70: execsql {SELECT min(x) FROM t1}
! 71: } {1}
! 72: do_test minmax2-1.6 {
! 73: set sqlite_search_count
! 74: } {1}
! 75: do_test minmax2-1.7 {
! 76: set sqlite_search_count 0
! 77: execsql {SELECT max(x) FROM t1}
! 78: } {20}
! 79: do_test minmax2-1.8 {
! 80: set sqlite_search_count
! 81: } {0}
! 82: do_test minmax2-1.9 {
! 83: set sqlite_search_count 0
! 84: execsql {SELECT max(y) FROM t1}
! 85: } {5}
! 86: do_test minmax2-1.10 {
! 87: set sqlite_search_count
! 88: } {19}
! 89:
! 90: do_test minmax2-2.0 {
! 91: execsql {
! 92: CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
! 93: INSERT INTO t2 SELECT * FROM t1;
! 94: }
! 95: set sqlite_search_count 0
! 96: execsql {SELECT min(a) FROM t2}
! 97: } {1}
! 98: do_test minmax2-2.1 {
! 99: set sqlite_search_count
! 100: } {0}
! 101: do_test minmax2-2.2 {
! 102: set sqlite_search_count 0
! 103: execsql {SELECT max(a) FROM t2}
! 104: } {20}
! 105: do_test minmax2-2.3 {
! 106: set sqlite_search_count
! 107: } {0}
! 108:
! 109: do_test minmax2-3.0 {
! 110: ifcapable subquery {
! 111: execsql {INSERT INTO t2 VALUES((SELECT max(a) FROM t2)+1,999)}
! 112: } else {
! 113: db function max_a_t2 {execsql {SELECT max(a) FROM t2}}
! 114: execsql {INSERT INTO t2 VALUES(max_a_t2()+1,999)}
! 115: }
! 116: set sqlite_search_count 0
! 117: execsql {SELECT max(a) FROM t2}
! 118: } {21}
! 119: do_test minmax2-3.1 {
! 120: set sqlite_search_count
! 121: } {0}
! 122: do_test minmax2-3.2 {
! 123: ifcapable subquery {
! 124: execsql {INSERT INTO t2 VALUES((SELECT max(a) FROM t2)+1,999)}
! 125: } else {
! 126: db function max_a_t2 {execsql {SELECT max(a) FROM t2}}
! 127: execsql {INSERT INTO t2 VALUES(max_a_t2()+1,999)}
! 128: }
! 129: set sqlite_search_count 0
! 130: ifcapable subquery {
! 131: execsql { SELECT b FROM t2 WHERE a=(SELECT max(a) FROM t2) }
! 132: } else {
! 133: execsql { SELECT b FROM t2 WHERE a=max_a_t2() }
! 134: }
! 135: } {999}
! 136: do_test minmax2-3.3 {
! 137: set sqlite_search_count
! 138: } {0}
! 139:
! 140: ifcapable {compound && subquery} {
! 141: do_test minmax2-4.1 {
! 142: execsql {
! 143: SELECT coalesce(min(x+0),-1), coalesce(max(x+0),-1) FROM
! 144: (SELECT * FROM t1 UNION SELECT NULL as 'x', NULL as 'y')
! 145: }
! 146: } {1 20}
! 147: do_test minmax2-4.2 {
! 148: execsql {
! 149: SELECT y, coalesce(sum(x),0) FROM
! 150: (SELECT null AS x, y+1 AS y FROM t1 UNION SELECT * FROM t1)
! 151: GROUP BY y ORDER BY y;
! 152: }
! 153: } {1 1 2 5 3 22 4 92 5 90 6 0}
! 154: do_test minmax2-4.3 {
! 155: execsql {
! 156: SELECT y, count(x), count(*) FROM
! 157: (SELECT null AS x, y+1 AS y FROM t1 UNION SELECT * FROM t1)
! 158: GROUP BY y ORDER BY y;
! 159: }
! 160: } {1 1 1 2 2 3 3 4 5 4 8 9 5 5 6 6 0 1}
! 161: } ;# ifcapable compound
! 162:
! 163: # Make sure the min(x) and max(x) optimizations work on empty tables
! 164: # including empty tables with indices. Ticket #296.
! 165: #
! 166: do_test minmax2-5.1 {
! 167: execsql {
! 168: CREATE TABLE t3(x INTEGER UNIQUE NOT NULL);
! 169: SELECT coalesce(min(x),999) FROM t3;
! 170: }
! 171: } {999}
! 172: do_test minmax2-5.2 {
! 173: execsql {
! 174: SELECT coalesce(min(rowid),999) FROM t3;
! 175: }
! 176: } {999}
! 177: do_test minmax2-5.3 {
! 178: execsql {
! 179: SELECT coalesce(max(x),999) FROM t3;
! 180: }
! 181: } {999}
! 182: do_test minmax2-5.4 {
! 183: execsql {
! 184: SELECT coalesce(max(rowid),999) FROM t3;
! 185: }
! 186: } {999}
! 187: do_test minmax2-5.5 {
! 188: execsql {
! 189: SELECT coalesce(max(rowid),999) FROM t3 WHERE rowid<25;
! 190: }
! 191: } {999}
! 192:
! 193: # Make sure the min(x) and max(x) optimizations work when there
! 194: # is a LIMIT clause. Ticket #396.
! 195: #
! 196: do_test minmax2-6.1 {
! 197: execsql {
! 198: SELECT min(a) FROM t2 LIMIT 1
! 199: }
! 200: } {1}
! 201: do_test minmax2-6.2 {
! 202: execsql {
! 203: SELECT max(a) FROM t2 LIMIT 3
! 204: }
! 205: } {22}
! 206: do_test minmax2-6.3 {
! 207: execsql {
! 208: SELECT min(a) FROM t2 LIMIT 0,100
! 209: }
! 210: } {1}
! 211: do_test minmax2-6.4 {
! 212: execsql {
! 213: SELECT max(a) FROM t2 LIMIT 1,100
! 214: }
! 215: } {}
! 216: do_test minmax2-6.5 {
! 217: execsql {
! 218: SELECT min(x) FROM t3 LIMIT 1
! 219: }
! 220: } {{}}
! 221: do_test minmax2-6.6 {
! 222: execsql {
! 223: SELECT max(x) FROM t3 LIMIT 0
! 224: }
! 225: } {}
! 226: do_test minmax2-6.7 {
! 227: execsql {
! 228: SELECT max(a) FROM t2 LIMIT 0
! 229: }
! 230: } {}
! 231:
! 232: # Make sure the max(x) and min(x) optimizations work for nested
! 233: # queries. Ticket #587.
! 234: #
! 235: do_test minmax2-7.1 {
! 236: execsql {
! 237: SELECT max(x) FROM t1;
! 238: }
! 239: } 20
! 240: ifcapable subquery {
! 241: do_test minmax2-7.2 {
! 242: execsql {
! 243: SELECT * FROM (SELECT max(x) FROM t1);
! 244: }
! 245: } 20
! 246: }
! 247: do_test minmax2-7.3 {
! 248: execsql {
! 249: SELECT min(x) FROM t1;
! 250: }
! 251: } 1
! 252: ifcapable subquery {
! 253: do_test minmax2-7.4 {
! 254: execsql {
! 255: SELECT * FROM (SELECT min(x) FROM t1);
! 256: }
! 257: } 1
! 258: }
! 259:
! 260: # Make sure min(x) and max(x) work correctly when the datatype is
! 261: # TEXT instead of NUMERIC. Ticket #623.
! 262: #
! 263: do_test minmax2-8.1 {
! 264: execsql {
! 265: CREATE TABLE t4(a TEXT);
! 266: INSERT INTO t4 VALUES('1234');
! 267: INSERT INTO t4 VALUES('234');
! 268: INSERT INTO t4 VALUES('34');
! 269: SELECT min(a), max(a) FROM t4;
! 270: }
! 271: } {1234 34}
! 272: do_test minmax2-8.2 {
! 273: execsql {
! 274: CREATE TABLE t5(a INTEGER);
! 275: INSERT INTO t5 VALUES('1234');
! 276: INSERT INTO t5 VALUES('234');
! 277: INSERT INTO t5 VALUES('34');
! 278: SELECT min(a), max(a) FROM t5;
! 279: }
! 280: } {34 1234}
! 281:
! 282: # Ticket #658: Test the min()/max() optimization when the FROM clause
! 283: # is a subquery.
! 284: #
! 285: ifcapable {compound && subquery} {
! 286: do_test minmax2-9.1 {
! 287: execsql {
! 288: SELECT max(rowid) FROM (
! 289: SELECT max(rowid) FROM t4 UNION SELECT max(rowid) FROM t5
! 290: )
! 291: }
! 292: } {1}
! 293: do_test minmax2-9.2 {
! 294: execsql {
! 295: SELECT max(rowid) FROM (
! 296: SELECT max(rowid) FROM t4 EXCEPT SELECT max(rowid) FROM t5
! 297: )
! 298: }
! 299: } {{}}
! 300: } ;# ifcapable compound&&subquery
! 301:
! 302: # If there is a NULL in an aggregate max() or min(), ignore it. An
! 303: # aggregate min() or max() will only return NULL if all values are NULL.
! 304: #
! 305: do_test minmax2-10.1 {
! 306: execsql {
! 307: CREATE TABLE t6(x);
! 308: INSERT INTO t6 VALUES(1);
! 309: INSERT INTO t6 VALUES(2);
! 310: INSERT INTO t6 VALUES(NULL);
! 311: SELECT coalesce(min(x),-1) FROM t6;
! 312: }
! 313: } {1}
! 314: do_test minmax2-10.2 {
! 315: execsql {
! 316: SELECT max(x) FROM t6;
! 317: }
! 318: } {2}
! 319: do_test minmax2-10.3 {
! 320: execsql {
! 321: CREATE INDEX i6 ON t6(x DESC);
! 322: SELECT coalesce(min(x),-1) FROM t6;
! 323: }
! 324: } {1}
! 325: do_test minmax2-10.4 {
! 326: execsql {
! 327: SELECT max(x) FROM t6;
! 328: }
! 329: } {2}
! 330: do_test minmax2-10.5 {
! 331: execsql {
! 332: DELETE FROM t6 WHERE x NOT NULL;
! 333: SELECT count(*) FROM t6;
! 334: }
! 335: } 1
! 336: do_test minmax2-10.6 {
! 337: execsql {
! 338: SELECT count(x) FROM t6;
! 339: }
! 340: } 0
! 341: ifcapable subquery {
! 342: do_test minmax2-10.7 {
! 343: execsql {
! 344: SELECT (SELECT min(x) FROM t6), (SELECT max(x) FROM t6);
! 345: }
! 346: } {{} {}}
! 347: }
! 348: do_test minmax2-10.8 {
! 349: execsql {
! 350: SELECT min(x), max(x) FROM t6;
! 351: }
! 352: } {{} {}}
! 353: do_test minmax2-10.9 {
! 354: execsql {
! 355: INSERT INTO t6 SELECT * FROM t6;
! 356: INSERT INTO t6 SELECT * FROM t6;
! 357: INSERT INTO t6 SELECT * FROM t6;
! 358: INSERT INTO t6 SELECT * FROM t6;
! 359: INSERT INTO t6 SELECT * FROM t6;
! 360: INSERT INTO t6 SELECT * FROM t6;
! 361: INSERT INTO t6 SELECT * FROM t6;
! 362: INSERT INTO t6 SELECT * FROM t6;
! 363: INSERT INTO t6 SELECT * FROM t6;
! 364: INSERT INTO t6 SELECT * FROM t6;
! 365: SELECT count(*) FROM t6;
! 366: }
! 367: } 1024
! 368: do_test minmax2-10.10 {
! 369: execsql {
! 370: SELECT count(x) FROM t6;
! 371: }
! 372: } 0
! 373: ifcapable subquery {
! 374: do_test minmax2-10.11 {
! 375: execsql {
! 376: SELECT (SELECT min(x) FROM t6), (SELECT max(x) FROM t6);
! 377: }
! 378: } {{} {}}
! 379: }
! 380: do_test minmax2-10.12 {
! 381: execsql {
! 382: SELECT min(x), max(x) FROM t6;
! 383: }
! 384: } {{} {}}
! 385:
! 386:
! 387: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>