Annotation of embedaddon/sqlite3/test/descidx1.test, revision 1.1
1.1 ! misho 1: # 2005 December 21
! 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 script is descending indices.
! 13: #
! 14: # $Id: descidx1.test,v 1.10 2008/03/19 00:21:31 drh Exp $
! 15: #
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: # Do not use a codec for tests in this file, as the database file is
! 21: # manipulated directly using tcl scripts (using the [hexio_write] command).
! 22: #
! 23: do_not_use_codec
! 24:
! 25: db eval {PRAGMA legacy_file_format=OFF}
! 26:
! 27: # This procedure sets the value of the file-format in file 'test.db'
! 28: # to $newval. Also, the schema cookie is incremented.
! 29: #
! 30: proc set_file_format {newval} {
! 31: hexio_write test.db 44 [hexio_render_int32 $newval]
! 32: set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
! 33: incr schemacookie
! 34: hexio_write test.db 40 [hexio_render_int32 $schemacookie]
! 35: return {}
! 36: }
! 37:
! 38: # This procedure returns the value of the file-format in file 'test.db'.
! 39: #
! 40: proc get_file_format {{fname test.db}} {
! 41: return [hexio_get_int [hexio_read $fname 44 4]]
! 42: }
! 43:
! 44:
! 45: # Verify that the file format starts as 4.
! 46: #
! 47: do_test descidx1-1.1 {
! 48: execsql {
! 49: CREATE TABLE t1(a,b);
! 50: CREATE INDEX i1 ON t1(b ASC);
! 51: }
! 52: get_file_format
! 53: } {4}
! 54: do_test descidx1-1.2 {
! 55: execsql {
! 56: CREATE INDEX i2 ON t1(a DESC);
! 57: }
! 58: get_file_format
! 59: } {4}
! 60:
! 61: # Put some information in the table and verify that the descending
! 62: # index actually works.
! 63: #
! 64: do_test descidx1-2.1 {
! 65: execsql {
! 66: INSERT INTO t1 VALUES(1,1);
! 67: INSERT INTO t1 VALUES(2,2);
! 68: INSERT INTO t1 SELECT a+2, a+2 FROM t1;
! 69: INSERT INTO t1 SELECT a+4, a+4 FROM t1;
! 70: SELECT b FROM t1 WHERE a>3 AND a<7;
! 71: }
! 72: } {6 5 4}
! 73: do_test descidx1-2.2 {
! 74: execsql {
! 75: SELECT a FROM t1 WHERE b>3 AND b<7;
! 76: }
! 77: } {4 5 6}
! 78: do_test descidx1-2.3 {
! 79: execsql {
! 80: SELECT b FROM t1 WHERE a>=3 AND a<7;
! 81: }
! 82: } {6 5 4 3}
! 83: do_test descidx1-2.4 {
! 84: execsql {
! 85: SELECT b FROM t1 WHERE a>3 AND a<=7;
! 86: }
! 87: } {7 6 5 4}
! 88: do_test descidx1-2.5 {
! 89: execsql {
! 90: SELECT b FROM t1 WHERE a>=3 AND a<=7;
! 91: }
! 92: } {7 6 5 4 3}
! 93: do_test descidx1-2.6 {
! 94: execsql {
! 95: SELECT a FROM t1 WHERE b>=3 AND b<=7;
! 96: }
! 97: } {3 4 5 6 7}
! 98:
! 99: # This procedure executes the SQL. Then it checks to see if the OP_Sort
! 100: # opcode was executed. If an OP_Sort did occur, then "sort" is appended
! 101: # to the result. If no OP_Sort happened, then "nosort" is appended.
! 102: #
! 103: # This procedure is used to check to make sure sorting is or is not
! 104: # occurring as expected.
! 105: #
! 106: proc cksort {sql} {
! 107: set ::sqlite_sort_count 0
! 108: set data [execsql $sql]
! 109: if {$::sqlite_sort_count} {set x sort} {set x nosort}
! 110: lappend data $x
! 111: return $data
! 112: }
! 113:
! 114: # Test sorting using a descending index.
! 115: #
! 116: do_test descidx1-3.1 {
! 117: cksort {SELECT a FROM t1 ORDER BY a}
! 118: } {1 2 3 4 5 6 7 8 nosort}
! 119: do_test descidx1-3.2 {
! 120: cksort {SELECT a FROM t1 ORDER BY a ASC}
! 121: } {1 2 3 4 5 6 7 8 nosort}
! 122: do_test descidx1-3.3 {
! 123: cksort {SELECT a FROM t1 ORDER BY a DESC}
! 124: } {8 7 6 5 4 3 2 1 nosort}
! 125: do_test descidx1-3.4 {
! 126: cksort {SELECT b FROM t1 ORDER BY a}
! 127: } {1 2 3 4 5 6 7 8 nosort}
! 128: do_test descidx1-3.5 {
! 129: cksort {SELECT b FROM t1 ORDER BY a ASC}
! 130: } {1 2 3 4 5 6 7 8 nosort}
! 131: do_test descidx1-3.6 {
! 132: cksort {SELECT b FROM t1 ORDER BY a DESC}
! 133: } {8 7 6 5 4 3 2 1 nosort}
! 134: do_test descidx1-3.7 {
! 135: cksort {SELECT a FROM t1 ORDER BY b}
! 136: } {1 2 3 4 5 6 7 8 nosort}
! 137: do_test descidx1-3.8 {
! 138: cksort {SELECT a FROM t1 ORDER BY b ASC}
! 139: } {1 2 3 4 5 6 7 8 nosort}
! 140: do_test descidx1-3.9 {
! 141: cksort {SELECT a FROM t1 ORDER BY b DESC}
! 142: } {8 7 6 5 4 3 2 1 nosort}
! 143: do_test descidx1-3.10 {
! 144: cksort {SELECT b FROM t1 ORDER BY b}
! 145: } {1 2 3 4 5 6 7 8 nosort}
! 146: do_test descidx1-3.11 {
! 147: cksort {SELECT b FROM t1 ORDER BY b ASC}
! 148: } {1 2 3 4 5 6 7 8 nosort}
! 149: do_test descidx1-3.12 {
! 150: cksort {SELECT b FROM t1 ORDER BY b DESC}
! 151: } {8 7 6 5 4 3 2 1 nosort}
! 152:
! 153: do_test descidx1-3.21 {
! 154: cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a}
! 155: } {4 5 6 7 nosort}
! 156: do_test descidx1-3.22 {
! 157: cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a ASC}
! 158: } {4 5 6 7 nosort}
! 159: do_test descidx1-3.23 {
! 160: cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a DESC}
! 161: } {7 6 5 4 nosort}
! 162: do_test descidx1-3.24 {
! 163: cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a}
! 164: } {4 5 6 7 nosort}
! 165: do_test descidx1-3.25 {
! 166: cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a ASC}
! 167: } {4 5 6 7 nosort}
! 168: do_test descidx1-3.26 {
! 169: cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a DESC}
! 170: } {7 6 5 4 nosort}
! 171:
! 172: # Create a table with indices that are descending on some terms and
! 173: # ascending on others.
! 174: #
! 175: ifcapable bloblit {
! 176: do_test descidx1-4.1 {
! 177: execsql {
! 178: CREATE TABLE t2(a INT, b TEXT, c BLOB, d REAL);
! 179: CREATE INDEX i3 ON t2(a ASC, b DESC, c ASC);
! 180: CREATE INDEX i4 ON t2(b DESC, a ASC, d DESC);
! 181: INSERT INTO t2 VALUES(1,'one',x'31',1.0);
! 182: INSERT INTO t2 VALUES(2,'two',x'3232',2.0);
! 183: INSERT INTO t2 VALUES(3,'three',x'333333',3.0);
! 184: INSERT INTO t2 VALUES(4,'four',x'34343434',4.0);
! 185: INSERT INTO t2 VALUES(5,'five',x'3535353535',5.0);
! 186: INSERT INTO t2 VALUES(6,'six',x'363636363636',6.0);
! 187: INSERT INTO t2 VALUES(2,'two',x'323232',2.1);
! 188: INSERT INTO t2 VALUES(2,'zwei',x'3232',2.2);
! 189: INSERT INTO t2 VALUES(2,NULL,NULL,2.3);
! 190: SELECT count(*) FROM t2;
! 191: }
! 192: } {9}
! 193: do_test descidx1-4.2 {
! 194: execsql {
! 195: SELECT d FROM t2 ORDER BY a;
! 196: }
! 197: } {1.0 2.2 2.0 2.1 2.3 3.0 4.0 5.0 6.0}
! 198: do_test descidx1-4.3 {
! 199: execsql {
! 200: SELECT d FROM t2 WHERE a>=2;
! 201: }
! 202: } {2.2 2.0 2.1 2.3 3.0 4.0 5.0 6.0}
! 203: do_test descidx1-4.4 {
! 204: execsql {
! 205: SELECT d FROM t2 WHERE a>2;
! 206: }
! 207: } {3.0 4.0 5.0 6.0}
! 208: do_test descidx1-4.5 {
! 209: execsql {
! 210: SELECT d FROM t2 WHERE a=2 AND b>'two';
! 211: }
! 212: } {2.2}
! 213: do_test descidx1-4.6 {
! 214: execsql {
! 215: SELECT d FROM t2 WHERE a=2 AND b>='two';
! 216: }
! 217: } {2.2 2.0 2.1}
! 218: do_test descidx1-4.7 {
! 219: execsql {
! 220: SELECT d FROM t2 WHERE a=2 AND b<'two';
! 221: }
! 222: } {}
! 223: do_test descidx1-4.8 {
! 224: execsql {
! 225: SELECT d FROM t2 WHERE a=2 AND b<='two';
! 226: }
! 227: } {2.0 2.1}
! 228: }
! 229:
! 230: do_test descidx1-5.1 {
! 231: execsql {
! 232: CREATE TABLE t3(a,b,c,d);
! 233: CREATE INDEX t3i1 ON t3(a DESC, b ASC, c DESC, d ASC);
! 234: INSERT INTO t3 VALUES(0,0,0,0);
! 235: INSERT INTO t3 VALUES(0,0,0,1);
! 236: INSERT INTO t3 VALUES(0,0,1,0);
! 237: INSERT INTO t3 VALUES(0,0,1,1);
! 238: INSERT INTO t3 VALUES(0,1,0,0);
! 239: INSERT INTO t3 VALUES(0,1,0,1);
! 240: INSERT INTO t3 VALUES(0,1,1,0);
! 241: INSERT INTO t3 VALUES(0,1,1,1);
! 242: INSERT INTO t3 VALUES(1,0,0,0);
! 243: INSERT INTO t3 VALUES(1,0,0,1);
! 244: INSERT INTO t3 VALUES(1,0,1,0);
! 245: INSERT INTO t3 VALUES(1,0,1,1);
! 246: INSERT INTO t3 VALUES(1,1,0,0);
! 247: INSERT INTO t3 VALUES(1,1,0,1);
! 248: INSERT INTO t3 VALUES(1,1,1,0);
! 249: INSERT INTO t3 VALUES(1,1,1,1);
! 250: SELECT count(*) FROM t3;
! 251: }
! 252: } {16}
! 253: do_test descidx1-5.2 {
! 254: cksort {
! 255: SELECT a||b||c||d FROM t3 ORDER BY a,b,c,d;
! 256: }
! 257: } {0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 sort}
! 258: do_test descidx1-5.3 {
! 259: cksort {
! 260: SELECT a||b||c||d FROM t3 ORDER BY a DESC, b ASC, c DESC, d ASC;
! 261: }
! 262: } {1010 1011 1000 1001 1110 1111 1100 1101 0010 0011 0000 0001 0110 0111 0100 0101 nosort}
! 263: do_test descidx1-5.4 {
! 264: cksort {
! 265: SELECT a||b||c||d FROM t3 ORDER BY a ASC, b DESC, c ASC, d DESC;
! 266: }
! 267: } {0101 0100 0111 0110 0001 0000 0011 0010 1101 1100 1111 1110 1001 1000 1011 1010 nosort}
! 268: do_test descidx1-5.5 {
! 269: cksort {
! 270: SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a DESC, b ASC, c DESC
! 271: }
! 272: } {101 100 111 110 001 000 011 010 nosort}
! 273: do_test descidx1-5.6 {
! 274: cksort {
! 275: SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b DESC, c ASC
! 276: }
! 277: } {010 011 000 001 110 111 100 101 nosort}
! 278: do_test descidx1-5.7 {
! 279: cksort {
! 280: SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b DESC, c DESC
! 281: }
! 282: } {011 010 001 000 111 110 101 100 sort}
! 283: do_test descidx1-5.8 {
! 284: cksort {
! 285: SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b ASC, c ASC
! 286: }
! 287: } {000 001 010 011 100 101 110 111 sort}
! 288: do_test descidx1-5.9 {
! 289: cksort {
! 290: SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a DESC, b DESC, c ASC
! 291: }
! 292: } {110 111 100 101 010 011 000 001 sort}
! 293:
! 294: # Test the legacy_file_format pragma here because we have access to
! 295: # the get_file_format command.
! 296: #
! 297: ifcapable legacyformat {
! 298: do_test descidx1-6.1 {
! 299: db close
! 300: forcedelete test.db test.db-journal
! 301: sqlite3 db test.db
! 302: execsql {PRAGMA legacy_file_format}
! 303: } {1}
! 304: } else {
! 305: do_test descidx1-6.1 {
! 306: db close
! 307: forcedelete test.db test.db-journal
! 308: sqlite3 db test.db
! 309: execsql {PRAGMA legacy_file_format}
! 310: } {0}
! 311: }
! 312: do_test descidx1-6.2 {
! 313: execsql {PRAGMA legacy_file_format=YES}
! 314: execsql {PRAGMA legacy_file_format}
! 315: } {1}
! 316: do_test descidx1-6.3 {
! 317: execsql {
! 318: CREATE TABLE t1(a,b,c);
! 319: }
! 320: get_file_format
! 321: } {1}
! 322: ifcapable vacuum {
! 323: # Verify that the file format is preserved across a vacuum.
! 324: do_test descidx1-6.3.1 {
! 325: execsql {VACUUM}
! 326: get_file_format
! 327: } {1}
! 328: }
! 329: do_test descidx1-6.4 {
! 330: db close
! 331: forcedelete test.db test.db-journal
! 332: sqlite3 db test.db
! 333: execsql {PRAGMA legacy_file_format=NO}
! 334: execsql {PRAGMA legacy_file_format}
! 335: } {0}
! 336: do_test descidx1-6.5 {
! 337: execsql {
! 338: CREATE TABLE t1(a,b,c);
! 339: CREATE INDEX i1 ON t1(a ASC, b DESC, c ASC);
! 340: INSERT INTO t1 VALUES(1,2,3);
! 341: INSERT INTO t1 VALUES(1,1,0);
! 342: INSERT INTO t1 VALUES(1,2,1);
! 343: INSERT INTO t1 VALUES(1,3,4);
! 344: }
! 345: get_file_format
! 346: } {4}
! 347: ifcapable vacuum {
! 348: # Verify that the file format is preserved across a vacuum.
! 349: do_test descidx1-6.6 {
! 350: execsql {VACUUM}
! 351: get_file_format
! 352: } {4}
! 353: do_test descidx1-6.7 {
! 354: execsql {
! 355: PRAGMA legacy_file_format=ON;
! 356: VACUUM;
! 357: }
! 358: get_file_format
! 359: } {4}
! 360: }
! 361:
! 362:
! 363:
! 364: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>