Annotation of embedaddon/sqlite3/test/minmax3.test, revision 1.1.1.1

1.1       misho       1: # 2008 January 5
                      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: # $Id: minmax3.test,v 1.5 2008/07/12 14:52:20 drh Exp $
                     12: 
                     13: set testdir [file dirname $argv0]
                     14: source $testdir/tester.tcl
                     15: 
                     16: # Do not use a codec for tests in this file, as the database file is
                     17: # manipulated directly using tcl scripts (using the [hexio_write] command).
                     18: #
                     19: do_not_use_codec
                     20: 
                     21: # Do an SQL statement.  Append the search count to the end of the result.
                     22: #
                     23: proc count sql {
                     24:   set ::sqlite_search_count 0
                     25:   return [concat [execsql $sql] $::sqlite_search_count]
                     26: }
                     27: 
                     28: # This procedure sets the value of the file-format in file 'test.db'
                     29: # to $newval. Also, the schema cookie is incremented.
                     30: # 
                     31: proc set_file_format {newval} {
                     32:   hexio_write test.db 44 [hexio_render_int32 $newval]
                     33:   set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
                     34:   incr schemacookie
                     35:   hexio_write test.db 40 [hexio_render_int32 $schemacookie]
                     36:   return {}
                     37: }
                     38: 
                     39: do_test minmax3-1.0 {
                     40:   execsql {
                     41:     CREATE TABLE t1(x, y, z);
                     42:   }
                     43:   db close
                     44:   set_file_format 4
                     45:   sqlite3 db test.db
                     46:   execsql {
                     47:     BEGIN;
                     48:     INSERT INTO t1 VALUES('1', 'I',   'one');
                     49:     INSERT INTO t1 VALUES('2', 'IV',  'four');
                     50:     INSERT INTO t1 VALUES('2', NULL,  'three');
                     51:     INSERT INTO t1 VALUES('2', 'II',  'two');
                     52:     INSERT INTO t1 VALUES('2', 'V',   'five');
                     53:     INSERT INTO t1 VALUES('3', 'VI',  'six');
                     54:     COMMIT;
                     55:     PRAGMA automatic_index=OFF;
                     56:   }
                     57: } {}
                     58: do_test minmax3-1.1.1 {
                     59:   # Linear scan.
                     60:   count { SELECT max(y) FROM t1 WHERE x = '2'; }
                     61: } {V 5}
                     62: do_test minmax3-1.1.2 {
                     63:   # Index optimizes the WHERE x='2' constraint.
                     64:   execsql { CREATE INDEX i1 ON t1(x) }
                     65:   count   { SELECT max(y) FROM t1 WHERE x = '2'; }
                     66: } {V 9}
                     67: do_test minmax3-1.1.3 {
                     68:   # Index optimizes the WHERE x='2' constraint and the MAX(y).
                     69:   execsql { CREATE INDEX i2 ON t1(x,y) }
                     70:   count   { SELECT max(y) FROM t1 WHERE x = '2'; }
                     71: } {V 1}
                     72: do_test minmax3-1.1.4 {
                     73:   # Index optimizes the WHERE x='2' constraint and the MAX(y).
                     74:   execsql { DROP INDEX i2 ; CREATE INDEX i2 ON t1(x, y DESC) }
                     75:   count   { SELECT max(y) FROM t1 WHERE x = '2'; }
                     76: } {V 1}
                     77: do_test minmax3-1.1.5 {
                     78:   count   { SELECT max(y) FROM t1 WHERE x = '2' AND y != 'V'; }
                     79: } {IV 2}
                     80: do_test minmax3-1.1.6 {
                     81:   count   { SELECT max(y) FROM t1 WHERE x = '2' AND y < 'V'; }
                     82: } {IV 1}
                     83: do_test minmax3-1.1.6 {
                     84:   count   { SELECT max(y) FROM t1 WHERE x = '2' AND z != 'five'; }
                     85: } {IV 4}
                     86: 
                     87: do_test minmax3-1.2.1 {
                     88:   # Linear scan of t1.
                     89:   execsql { DROP INDEX i1 ; DROP INDEX i2 }
                     90:   count { SELECT min(y) FROM t1 WHERE x = '2'; }
                     91: } {II 5}
                     92: do_test minmax3-1.2.2 {
                     93:   # Index i1 optimizes the WHERE x='2' constraint.
                     94:   execsql { CREATE INDEX i1 ON t1(x) }
                     95:   count   { SELECT min(y) FROM t1 WHERE x = '2'; }
                     96: } {II 9}
                     97: do_test minmax3-1.2.3 {
                     98:   # Index i2 optimizes the WHERE x='2' constraint and the min(y).
                     99:   execsql { CREATE INDEX i2 ON t1(x,y) }
                    100:   count   { SELECT min(y) FROM t1 WHERE x = '2'; }
                    101: } {II 1}
                    102: do_test minmax3-1.2.4 {
                    103:   # Index optimizes the WHERE x='2' constraint and the MAX(y).
                    104:   execsql { DROP INDEX i2 ; CREATE INDEX i2 ON t1(x, y DESC) }
                    105:   count   { SELECT min(y) FROM t1 WHERE x = '2'; }
                    106: } {II 1}
                    107: 
                    108: do_test minmax3-1.3.1 {
                    109:   # Linear scan
                    110:   execsql { DROP INDEX i1 ; DROP INDEX i2 }
                    111:   count   { SELECT min(y) FROM t1; }
                    112: } {I 5}
                    113: do_test minmax3-1.3.2 {
                    114:   # Index i1 optimizes the min(y)
                    115:   execsql { CREATE INDEX i1 ON t1(y) }
                    116:   count   { SELECT min(y) FROM t1; }
                    117: } {I 1}
                    118: do_test minmax3-1.3.3 {
                    119:   # Index i1 optimizes the min(y)
                    120:   execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t1(y DESC) }
                    121:   count   { SELECT min(y) FROM t1; }
                    122: } {I 1}
                    123: 
                    124: do_test minmax3-1.4.1 {
                    125:   # Linear scan
                    126:   execsql { DROP INDEX i1 }
                    127:   count   { SELECT max(y) FROM t1; }
                    128: } {VI 5}
                    129: do_test minmax3-1.4.2 {
                    130:   # Index i1 optimizes the max(y)
                    131:   execsql { CREATE INDEX i1 ON t1(y) }
                    132:   count   { SELECT max(y) FROM t1; }
                    133: } {VI 0}
                    134: do_test minmax3-1.4.3 {
                    135:   # Index i1 optimizes the max(y)
                    136:   execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t1(y DESC) }
                    137:   execsql   { SELECT y from t1}
                    138:   count   { SELECT max(y) FROM t1; }
                    139: } {VI 0}
                    140: do_test minmax3-1.4.4 {
                    141:   execsql { DROP INDEX i1 }
                    142: } {}
                    143: 
                    144: do_test minmax3-2.1 {
                    145:   execsql {
                    146:     CREATE TABLE t2(a, b);
                    147:     CREATE INDEX i3 ON t2(a, b);
                    148:     INSERT INTO t2 VALUES(1, NULL);
                    149:     INSERT INTO t2 VALUES(1, 1);
                    150:     INSERT INTO t2 VALUES(1, 2);
                    151:     INSERT INTO t2 VALUES(1, 3);
                    152:     INSERT INTO t2 VALUES(2, NULL);
                    153:     INSERT INTO t2 VALUES(2, 1);
                    154:     INSERT INTO t2 VALUES(2, 2);
                    155:     INSERT INTO t2 VALUES(2, 3);
                    156:     INSERT INTO t2 VALUES(3, 1);
                    157:     INSERT INTO t2 VALUES(3, 2);
                    158:     INSERT INTO t2 VALUES(3, 3);
                    159:   }
                    160: } {}
                    161: do_test minmax3-2.2 {
                    162:   execsql { SELECT min(b) FROM t2 WHERE a = 1; }
                    163: } {1}
                    164: do_test minmax3-2.3 {
                    165:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>1; }
                    166: } {2}
                    167: do_test minmax3-2.4 {
                    168:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>-1; }
                    169: } {1}
                    170: do_test minmax3-2.5 {
                    171:   execsql { SELECT min(b) FROM t2 WHERE a = 1; }
                    172: } {1}
                    173: do_test minmax3-2.6 {
                    174:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<2; }
                    175: } {1}
                    176: do_test minmax3-2.7 {
                    177:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<1; }
                    178: } {{}}
                    179: do_test minmax3-2.8 {
                    180:   execsql { SELECT min(b) FROM t2 WHERE a = 3 AND b<1; }
                    181: } {{}}
                    182: 
                    183: do_test minmax3-3.1 {
                    184:   execsql {
                    185:     DROP TABLE t2;
                    186:     CREATE TABLE t2(a, b);
                    187:     CREATE INDEX i3 ON t2(a, b DESC);
                    188:     INSERT INTO t2 VALUES(1, NULL);
                    189:     INSERT INTO t2 VALUES(1, 1);
                    190:     INSERT INTO t2 VALUES(1, 2);
                    191:     INSERT INTO t2 VALUES(1, 3);
                    192:     INSERT INTO t2 VALUES(2, NULL);
                    193:     INSERT INTO t2 VALUES(2, 1);
                    194:     INSERT INTO t2 VALUES(2, 2);
                    195:     INSERT INTO t2 VALUES(2, 3);
                    196:     INSERT INTO t2 VALUES(3, 1);
                    197:     INSERT INTO t2 VALUES(3, 2);
                    198:     INSERT INTO t2 VALUES(3, 3);
                    199:   }
                    200: } {}
                    201: do_test minmax3-3.2 {
                    202:   execsql { SELECT min(b) FROM t2 WHERE a = 1; }
                    203: } {1}
                    204: do_test minmax3-3.3 {
                    205:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>1; }
                    206: } {2}
                    207: do_test minmax3-3.4 {
                    208:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>-1; }
                    209: } {1}
                    210: do_test minmax3-3.5 {
                    211:   execsql { SELECT min(b) FROM t2 WHERE a = 1; }
                    212: } {1}
                    213: do_test minmax3-3.6 {
                    214:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<2; }
                    215: } {1}
                    216: do_test minmax3-3.7 {
                    217:   execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<1; }
                    218: } {{}}
                    219: do_test minmax3-3.8 {
                    220:   execsql { SELECT min(b) FROM t2 WHERE a = 3 AND b<1; }
                    221: } {{}}
                    222: 
                    223: do_test minmax3-4.1 {
                    224:   execsql {
                    225:     CREATE TABLE t4(x);
                    226:     INSERT INTO t4 VALUES('abc');
                    227:     INSERT INTO t4 VALUES('BCD');
                    228:     SELECT max(x) FROM t4;
                    229:   }
                    230: } {abc}
                    231: do_test minmax3-4.2 {
                    232:   execsql {
                    233:     SELECT max(x COLLATE nocase) FROM t4;
                    234:   }
                    235: } {BCD}
                    236: do_test minmax3-4.3 {
                    237:   execsql {
                    238:     SELECT max(x), max(x COLLATE nocase) FROM t4;
                    239:   }
                    240: } {abc BCD}
                    241: do_test minmax3-4.4 {
                    242:   execsql {
                    243:     SELECT max(x COLLATE binary), max(x COLLATE nocase) FROM t4;
                    244:   }
                    245: } {abc BCD}
                    246: do_test minmax3-4.5 {
                    247:   execsql {
                    248:     SELECT max(x COLLATE nocase), max(x COLLATE rtrim) FROM t4;
                    249:   }
                    250: } {BCD abc}
                    251: do_test minmax3-4.6 {
                    252:   execsql {
                    253:     SELECT max(x COLLATE nocase), max(x) FROM t4;
                    254:   }
                    255: } {BCD abc}
                    256: do_test minmax3-4.10 {
                    257:   execsql {
                    258:     SELECT min(x) FROM t4;
                    259:   }
                    260: } {BCD}
                    261: do_test minmax3-4.11 {
                    262:   execsql {
                    263:     SELECT min(x COLLATE nocase) FROM t4;
                    264:   }
                    265: } {abc}
                    266: do_test minmax3-4.12 {
                    267:   execsql {
                    268:     SELECT min(x), min(x COLLATE nocase) FROM t4;
                    269:   }
                    270: } {BCD abc}
                    271: do_test minmax3-4.13 {
                    272:   execsql {
                    273:     SELECT min(x COLLATE binary), min(x COLLATE nocase) FROM t4;
                    274:   }
                    275: } {BCD abc}
                    276: do_test minmax3-4.14 {
                    277:   execsql {
                    278:     SELECT min(x COLLATE nocase), min(x COLLATE rtrim) FROM t4;
                    279:   }
                    280: } {abc BCD}
                    281: do_test minmax3-4.15 {
                    282:   execsql {
                    283:     SELECT min(x COLLATE nocase), min(x) FROM t4;
                    284:   }
                    285: } {abc BCD}
                    286: 
                    287: 
                    288: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>