Annotation of embedaddon/sqlite3/test/index.test, revision 1.1
1.1 ! misho 1: # 2001 September 15
! 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 the CREATE INDEX statement.
! 13: #
! 14: # $Id: index.test,v 1.43 2008/01/16 18:20:42 danielk1977 Exp $
! 15:
! 16: set testdir [file dirname $argv0]
! 17: source $testdir/tester.tcl
! 18:
! 19: # Create a basic index and verify it is added to sqlite_master
! 20: #
! 21: do_test index-1.1 {
! 22: execsql {CREATE TABLE test1(f1 int, f2 int, f3 int)}
! 23: execsql {CREATE INDEX index1 ON test1(f1)}
! 24: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 25: } {index1 test1}
! 26: do_test index-1.1b {
! 27: execsql {SELECT name, sql, tbl_name, type FROM sqlite_master
! 28: WHERE name='index1'}
! 29: } {index1 {CREATE INDEX index1 ON test1(f1)} test1 index}
! 30: do_test index-1.1c {
! 31: db close
! 32: sqlite3 db test.db
! 33: execsql {SELECT name, sql, tbl_name, type FROM sqlite_master
! 34: WHERE name='index1'}
! 35: } {index1 {CREATE INDEX index1 ON test1(f1)} test1 index}
! 36: do_test index-1.1d {
! 37: db close
! 38: sqlite3 db test.db
! 39: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 40: } {index1 test1}
! 41:
! 42: # Verify that the index dies with the table
! 43: #
! 44: do_test index-1.2 {
! 45: execsql {DROP TABLE test1}
! 46: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 47: } {}
! 48:
! 49: # Try adding an index to a table that does not exist
! 50: #
! 51: do_test index-2.1 {
! 52: set v [catch {execsql {CREATE INDEX index1 ON test1(f1)}} msg]
! 53: lappend v $msg
! 54: } {1 {no such table: main.test1}}
! 55:
! 56: # Try adding an index on a column of a table where the table
! 57: # exists but the column does not.
! 58: #
! 59: do_test index-2.1 {
! 60: execsql {CREATE TABLE test1(f1 int, f2 int, f3 int)}
! 61: set v [catch {execsql {CREATE INDEX index1 ON test1(f4)}} msg]
! 62: lappend v $msg
! 63: } {1 {table test1 has no column named f4}}
! 64:
! 65: # Try an index with some columns that match and others that do now.
! 66: #
! 67: do_test index-2.2 {
! 68: set v [catch {execsql {CREATE INDEX index1 ON test1(f1, f2, f4, f3)}} msg]
! 69: execsql {DROP TABLE test1}
! 70: lappend v $msg
! 71: } {1 {table test1 has no column named f4}}
! 72:
! 73: # Try creating a bunch of indices on the same table
! 74: #
! 75: set r {}
! 76: for {set i 1} {$i<100} {incr i} {
! 77: lappend r [format index%02d $i]
! 78: }
! 79: do_test index-3.1 {
! 80: execsql {CREATE TABLE test1(f1 int, f2 int, f3 int, f4 int, f5 int)}
! 81: for {set i 1} {$i<100} {incr i} {
! 82: set sql "CREATE INDEX [format index%02d $i] ON test1(f[expr {($i%5)+1}])"
! 83: execsql $sql
! 84: }
! 85: execsql {SELECT name FROM sqlite_master
! 86: WHERE type='index' AND tbl_name='test1'
! 87: ORDER BY name}
! 88: } $r
! 89: integrity_check index-3.2.1
! 90: ifcapable {reindex} {
! 91: do_test index-3.2.2 {
! 92: execsql REINDEX
! 93: } {}
! 94: }
! 95: integrity_check index-3.2.3
! 96:
! 97:
! 98: # Verify that all the indices go away when we drop the table.
! 99: #
! 100: do_test index-3.3 {
! 101: execsql {DROP TABLE test1}
! 102: execsql {SELECT name FROM sqlite_master
! 103: WHERE type='index' AND tbl_name='test1'
! 104: ORDER BY name}
! 105: } {}
! 106:
! 107: # Create a table and insert values into that table. Then create
! 108: # an index on that table. Verify that we can select values
! 109: # from the table correctly using the index.
! 110: #
! 111: # Note that the index names "index9" and "indext" are chosen because
! 112: # they both have the same hash.
! 113: #
! 114: do_test index-4.1 {
! 115: execsql {CREATE TABLE test1(cnt int, power int)}
! 116: for {set i 1} {$i<20} {incr i} {
! 117: execsql "INSERT INTO test1 VALUES($i,[expr {1<<$i}])"
! 118: }
! 119: execsql {CREATE INDEX index9 ON test1(cnt)}
! 120: execsql {CREATE INDEX indext ON test1(power)}
! 121: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 122: } {index9 indext test1}
! 123: do_test index-4.2 {
! 124: execsql {SELECT cnt FROM test1 WHERE power=4}
! 125: } {2}
! 126: do_test index-4.3 {
! 127: execsql {SELECT cnt FROM test1 WHERE power=1024}
! 128: } {10}
! 129: do_test index-4.4 {
! 130: execsql {SELECT power FROM test1 WHERE cnt=6}
! 131: } {64}
! 132: do_test index-4.5 {
! 133: execsql {DROP INDEX indext}
! 134: execsql {SELECT power FROM test1 WHERE cnt=6}
! 135: } {64}
! 136: do_test index-4.6 {
! 137: execsql {SELECT cnt FROM test1 WHERE power=1024}
! 138: } {10}
! 139: do_test index-4.7 {
! 140: execsql {CREATE INDEX indext ON test1(cnt)}
! 141: execsql {SELECT power FROM test1 WHERE cnt=6}
! 142: } {64}
! 143: do_test index-4.8 {
! 144: execsql {SELECT cnt FROM test1 WHERE power=1024}
! 145: } {10}
! 146: do_test index-4.9 {
! 147: execsql {DROP INDEX index9}
! 148: execsql {SELECT power FROM test1 WHERE cnt=6}
! 149: } {64}
! 150: do_test index-4.10 {
! 151: execsql {SELECT cnt FROM test1 WHERE power=1024}
! 152: } {10}
! 153: do_test index-4.11 {
! 154: execsql {DROP INDEX indext}
! 155: execsql {SELECT power FROM test1 WHERE cnt=6}
! 156: } {64}
! 157: do_test index-4.12 {
! 158: execsql {SELECT cnt FROM test1 WHERE power=1024}
! 159: } {10}
! 160: do_test index-4.13 {
! 161: execsql {DROP TABLE test1}
! 162: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 163: } {}
! 164: integrity_check index-4.14
! 165:
! 166: # Do not allow indices to be added to sqlite_master
! 167: #
! 168: do_test index-5.1 {
! 169: set v [catch {execsql {CREATE INDEX index1 ON sqlite_master(name)}} msg]
! 170: lappend v $msg
! 171: } {1 {table sqlite_master may not be indexed}}
! 172: do_test index-5.2 {
! 173: execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
! 174: } {}
! 175:
! 176: # Do not allow indices with duplicate names to be added
! 177: #
! 178: do_test index-6.1 {
! 179: execsql {CREATE TABLE test1(f1 int, f2 int)}
! 180: execsql {CREATE TABLE test2(g1 real, g2 real)}
! 181: execsql {CREATE INDEX index1 ON test1(f1)}
! 182: set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg]
! 183: lappend v $msg
! 184: } {1 {index index1 already exists}}
! 185: do_test index-6.1.1 {
! 186: catchsql {CREATE INDEX [index1] ON test2(g1)}
! 187: } {1 {index index1 already exists}}
! 188: do_test index-6.1b {
! 189: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 190: } {index1 test1 test2}
! 191: do_test index-6.1c {
! 192: catchsql {CREATE INDEX IF NOT EXISTS index1 ON test1(f1)}
! 193: } {0 {}}
! 194: do_test index-6.2 {
! 195: set v [catch {execsql {CREATE INDEX test1 ON test2(g1)}} msg]
! 196: lappend v $msg
! 197: } {1 {there is already a table named test1}}
! 198: do_test index-6.2b {
! 199: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 200: } {index1 test1 test2}
! 201: do_test index-6.3 {
! 202: execsql {DROP TABLE test1}
! 203: execsql {DROP TABLE test2}
! 204: execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
! 205: } {}
! 206: do_test index-6.4 {
! 207: execsql {
! 208: CREATE TABLE test1(a,b);
! 209: CREATE INDEX index1 ON test1(a);
! 210: CREATE INDEX index2 ON test1(b);
! 211: CREATE INDEX index3 ON test1(a,b);
! 212: DROP TABLE test1;
! 213: SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name;
! 214: }
! 215: } {}
! 216: integrity_check index-6.5
! 217:
! 218:
! 219: # Create a primary key
! 220: #
! 221: do_test index-7.1 {
! 222: execsql {CREATE TABLE test1(f1 int, f2 int primary key)}
! 223: for {set i 1} {$i<20} {incr i} {
! 224: execsql "INSERT INTO test1 VALUES($i,[expr {1<<$i}])"
! 225: }
! 226: execsql {SELECT count(*) FROM test1}
! 227: } {19}
! 228: do_test index-7.2 {
! 229: execsql {SELECT f1 FROM test1 WHERE f2=65536}
! 230: } {16}
! 231: do_test index-7.3 {
! 232: execsql {
! 233: SELECT name FROM sqlite_master
! 234: WHERE type='index' AND tbl_name='test1'
! 235: }
! 236: } {sqlite_autoindex_test1_1}
! 237: do_test index-7.4 {
! 238: execsql {DROP table test1}
! 239: execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
! 240: } {}
! 241: integrity_check index-7.5
! 242:
! 243: # Make sure we cannot drop a non-existant index.
! 244: #
! 245: do_test index-8.1 {
! 246: set v [catch {execsql {DROP INDEX index1}} msg]
! 247: lappend v $msg
! 248: } {1 {no such index: index1}}
! 249:
! 250: # Make sure we don't actually create an index when the EXPLAIN keyword
! 251: # is used.
! 252: #
! 253: do_test index-9.1 {
! 254: execsql {CREATE TABLE tab1(a int)}
! 255: ifcapable {explain} {
! 256: execsql {EXPLAIN CREATE INDEX idx1 ON tab1(a)}
! 257: }
! 258: execsql {SELECT name FROM sqlite_master WHERE tbl_name='tab1'}
! 259: } {tab1}
! 260: do_test index-9.2 {
! 261: execsql {CREATE INDEX idx1 ON tab1(a)}
! 262: execsql {SELECT name FROM sqlite_master WHERE tbl_name='tab1' ORDER BY name}
! 263: } {idx1 tab1}
! 264: integrity_check index-9.3
! 265:
! 266: # Allow more than one entry with the same key.
! 267: #
! 268: do_test index-10.0 {
! 269: execsql {
! 270: CREATE TABLE t1(a int, b int);
! 271: CREATE INDEX i1 ON t1(a);
! 272: INSERT INTO t1 VALUES(1,2);
! 273: INSERT INTO t1 VALUES(2,4);
! 274: INSERT INTO t1 VALUES(3,8);
! 275: INSERT INTO t1 VALUES(1,12);
! 276: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 277: }
! 278: } {2 12}
! 279: do_test index-10.1 {
! 280: execsql {
! 281: SELECT b FROM t1 WHERE a=2 ORDER BY b;
! 282: }
! 283: } {4}
! 284: do_test index-10.2 {
! 285: execsql {
! 286: DELETE FROM t1 WHERE b=12;
! 287: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 288: }
! 289: } {2}
! 290: do_test index-10.3 {
! 291: execsql {
! 292: DELETE FROM t1 WHERE b=2;
! 293: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 294: }
! 295: } {}
! 296: do_test index-10.4 {
! 297: execsql {
! 298: DELETE FROM t1;
! 299: INSERT INTO t1 VALUES (1,1);
! 300: INSERT INTO t1 VALUES (1,2);
! 301: INSERT INTO t1 VALUES (1,3);
! 302: INSERT INTO t1 VALUES (1,4);
! 303: INSERT INTO t1 VALUES (1,5);
! 304: INSERT INTO t1 VALUES (1,6);
! 305: INSERT INTO t1 VALUES (1,7);
! 306: INSERT INTO t1 VALUES (1,8);
! 307: INSERT INTO t1 VALUES (1,9);
! 308: INSERT INTO t1 VALUES (2,0);
! 309: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 310: }
! 311: } {1 2 3 4 5 6 7 8 9}
! 312: do_test index-10.5 {
! 313: ifcapable subquery {
! 314: execsql { DELETE FROM t1 WHERE b IN (2, 4, 6, 8); }
! 315: } else {
! 316: execsql { DELETE FROM t1 WHERE b = 2 OR b = 4 OR b = 6 OR b = 8; }
! 317: }
! 318: execsql {
! 319: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 320: }
! 321: } {1 3 5 7 9}
! 322: do_test index-10.6 {
! 323: execsql {
! 324: DELETE FROM t1 WHERE b>2;
! 325: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 326: }
! 327: } {1}
! 328: do_test index-10.7 {
! 329: execsql {
! 330: DELETE FROM t1 WHERE b=1;
! 331: SELECT b FROM t1 WHERE a=1 ORDER BY b;
! 332: }
! 333: } {}
! 334: do_test index-10.8 {
! 335: execsql {
! 336: SELECT b FROM t1 ORDER BY b;
! 337: }
! 338: } {0}
! 339: integrity_check index-10.9
! 340:
! 341: # Automatically create an index when we specify a primary key.
! 342: #
! 343: do_test index-11.1 {
! 344: execsql {
! 345: CREATE TABLE t3(
! 346: a text,
! 347: b int,
! 348: c float,
! 349: PRIMARY KEY(b)
! 350: );
! 351: }
! 352: for {set i 1} {$i<=50} {incr i} {
! 353: execsql "INSERT INTO t3 VALUES('x${i}x',$i,0.$i)"
! 354: }
! 355: set sqlite_search_count 0
! 356: concat [execsql {SELECT c FROM t3 WHERE b==10}] $sqlite_search_count
! 357: } {0.1 2}
! 358: integrity_check index-11.2
! 359:
! 360:
! 361: # Numeric strings should compare as if they were numbers. So even if the
! 362: # strings are not character-by-character the same, if they represent the
! 363: # same number they should compare equal to one another. Verify that this
! 364: # is true in indices.
! 365: #
! 366: # Updated for sqlite3 v3: SQLite will now store these values as numbers
! 367: # (because the affinity of column a is NUMERIC) so the quirky
! 368: # representations are not retained. i.e. '+1.0' becomes '1'.
! 369: do_test index-12.1 {
! 370: execsql {
! 371: CREATE TABLE t4(a NUM,b);
! 372: INSERT INTO t4 VALUES('0.0',1);
! 373: INSERT INTO t4 VALUES('0.00',2);
! 374: INSERT INTO t4 VALUES('abc',3);
! 375: INSERT INTO t4 VALUES('-1.0',4);
! 376: INSERT INTO t4 VALUES('+1.0',5);
! 377: INSERT INTO t4 VALUES('0',6);
! 378: INSERT INTO t4 VALUES('00000',7);
! 379: SELECT a FROM t4 ORDER BY b;
! 380: }
! 381: } {0 0 abc -1 1 0 0}
! 382: do_test index-12.2 {
! 383: execsql {
! 384: SELECT a FROM t4 WHERE a==0 ORDER BY b
! 385: }
! 386: } {0 0 0 0}
! 387: do_test index-12.3 {
! 388: execsql {
! 389: SELECT a FROM t4 WHERE a<0.5 ORDER BY b
! 390: }
! 391: } {0 0 -1 0 0}
! 392: do_test index-12.4 {
! 393: execsql {
! 394: SELECT a FROM t4 WHERE a>-0.5 ORDER BY b
! 395: }
! 396: } {0 0 abc 1 0 0}
! 397: do_test index-12.5 {
! 398: execsql {
! 399: CREATE INDEX t4i1 ON t4(a);
! 400: SELECT a FROM t4 WHERE a==0 ORDER BY b
! 401: }
! 402: } {0 0 0 0}
! 403: do_test index-12.6 {
! 404: execsql {
! 405: SELECT a FROM t4 WHERE a<0.5 ORDER BY b
! 406: }
! 407: } {0 0 -1 0 0}
! 408: do_test index-12.7 {
! 409: execsql {
! 410: SELECT a FROM t4 WHERE a>-0.5 ORDER BY b
! 411: }
! 412: } {0 0 abc 1 0 0}
! 413: integrity_check index-12.8
! 414:
! 415: # Make sure we cannot drop an automatically created index.
! 416: #
! 417: do_test index-13.1 {
! 418: execsql {
! 419: CREATE TABLE t5(
! 420: a int UNIQUE,
! 421: b float PRIMARY KEY,
! 422: c varchar(10),
! 423: UNIQUE(a,c)
! 424: );
! 425: INSERT INTO t5 VALUES(1,2,3);
! 426: SELECT * FROM t5;
! 427: }
! 428: } {1 2.0 3}
! 429: do_test index-13.2 {
! 430: set ::idxlist [execsql {
! 431: SELECT name FROM sqlite_master WHERE type="index" AND tbl_name="t5";
! 432: }]
! 433: llength $::idxlist
! 434: } {3}
! 435: for {set i 0} {$i<[llength $::idxlist]} {incr i} {
! 436: do_test index-13.3.$i {
! 437: catchsql "
! 438: DROP INDEX '[lindex $::idxlist $i]';
! 439: "
! 440: } {1 {index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped}}
! 441: }
! 442: do_test index-13.4 {
! 443: execsql {
! 444: INSERT INTO t5 VALUES('a','b','c');
! 445: SELECT * FROM t5;
! 446: }
! 447: } {1 2.0 3 a b c}
! 448: integrity_check index-13.5
! 449:
! 450: # Check the sort order of data in an index.
! 451: #
! 452: do_test index-14.1 {
! 453: execsql {
! 454: CREATE TABLE t6(a,b,c);
! 455: CREATE INDEX t6i1 ON t6(a,b);
! 456: INSERT INTO t6 VALUES('','',1);
! 457: INSERT INTO t6 VALUES('',NULL,2);
! 458: INSERT INTO t6 VALUES(NULL,'',3);
! 459: INSERT INTO t6 VALUES('abc',123,4);
! 460: INSERT INTO t6 VALUES(123,'abc',5);
! 461: SELECT c FROM t6 ORDER BY a,b;
! 462: }
! 463: } {3 5 2 1 4}
! 464: do_test index-14.2 {
! 465: execsql {
! 466: SELECT c FROM t6 WHERE a='';
! 467: }
! 468: } {2 1}
! 469: do_test index-14.3 {
! 470: execsql {
! 471: SELECT c FROM t6 WHERE b='';
! 472: }
! 473: } {1 3}
! 474: do_test index-14.4 {
! 475: execsql {
! 476: SELECT c FROM t6 WHERE a>'';
! 477: }
! 478: } {4}
! 479: do_test index-14.5 {
! 480: execsql {
! 481: SELECT c FROM t6 WHERE a>='';
! 482: }
! 483: } {2 1 4}
! 484: do_test index-14.6 {
! 485: execsql {
! 486: SELECT c FROM t6 WHERE a>123;
! 487: }
! 488: } {2 1 4}
! 489: do_test index-14.7 {
! 490: execsql {
! 491: SELECT c FROM t6 WHERE a>=123;
! 492: }
! 493: } {5 2 1 4}
! 494: do_test index-14.8 {
! 495: execsql {
! 496: SELECT c FROM t6 WHERE a<'abc';
! 497: }
! 498: } {5 2 1}
! 499: do_test index-14.9 {
! 500: execsql {
! 501: SELECT c FROM t6 WHERE a<='abc';
! 502: }
! 503: } {5 2 1 4}
! 504: do_test index-14.10 {
! 505: execsql {
! 506: SELECT c FROM t6 WHERE a<='';
! 507: }
! 508: } {5 2 1}
! 509: do_test index-14.11 {
! 510: execsql {
! 511: SELECT c FROM t6 WHERE a<'';
! 512: }
! 513: } {5}
! 514: integrity_check index-14.12
! 515:
! 516: do_test index-15.1 {
! 517: execsql {
! 518: DELETE FROM t1;
! 519: SELECT * FROM t1;
! 520: }
! 521: } {}
! 522: do_test index-15.2 {
! 523: execsql {
! 524: INSERT INTO t1 VALUES('1.234e5',1);
! 525: INSERT INTO t1 VALUES('12.33e04',2);
! 526: INSERT INTO t1 VALUES('12.35E4',3);
! 527: INSERT INTO t1 VALUES('12.34e',4);
! 528: INSERT INTO t1 VALUES('12.32e+4',5);
! 529: INSERT INTO t1 VALUES('12.36E+04',6);
! 530: INSERT INTO t1 VALUES('12.36E+',7);
! 531: INSERT INTO t1 VALUES('+123.10000E+0003',8);
! 532: INSERT INTO t1 VALUES('+',9);
! 533: INSERT INTO t1 VALUES('+12347.E+02',10);
! 534: INSERT INTO t1 VALUES('+12347E+02',11);
! 535: INSERT INTO t1 VALUES('+.125E+04',12);
! 536: INSERT INTO t1 VALUES('-.125E+04',13);
! 537: INSERT INTO t1 VALUES('.125E+0',14);
! 538: INSERT INTO t1 VALUES('.125',15);
! 539: SELECT b FROM t1 ORDER BY a, b;
! 540: }
! 541: } {13 14 15 12 8 5 2 1 3 6 10 11 9 4 7}
! 542: do_test index-15.3 {
! 543: execsql {
! 544: SELECT b FROM t1 WHERE typeof(a) IN ('integer','real') ORDER BY b;
! 545: }
! 546: } {1 2 3 5 6 8 10 11 12 13 14 15}
! 547: integrity_check index-15.4
! 548:
! 549: # The following tests - index-16.* - test that when a table definition
! 550: # includes qualifications that specify the same constraint twice only a
! 551: # single index is generated to enforce the constraint.
! 552: #
! 553: # For example: "CREATE TABLE abc( x PRIMARY KEY, UNIQUE(x) );"
! 554: #
! 555: do_test index-16.1 {
! 556: execsql {
! 557: CREATE TABLE t7(c UNIQUE PRIMARY KEY);
! 558: SELECT count(*) FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 559: }
! 560: } {1}
! 561: do_test index-16.2 {
! 562: execsql {
! 563: DROP TABLE t7;
! 564: CREATE TABLE t7(c UNIQUE PRIMARY KEY);
! 565: SELECT count(*) FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 566: }
! 567: } {1}
! 568: do_test index-16.3 {
! 569: execsql {
! 570: DROP TABLE t7;
! 571: CREATE TABLE t7(c PRIMARY KEY, UNIQUE(c) );
! 572: SELECT count(*) FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 573: }
! 574: } {1}
! 575: do_test index-16.4 {
! 576: execsql {
! 577: DROP TABLE t7;
! 578: CREATE TABLE t7(c, d , UNIQUE(c, d), PRIMARY KEY(c, d) );
! 579: SELECT count(*) FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 580: }
! 581: } {1}
! 582: do_test index-16.5 {
! 583: execsql {
! 584: DROP TABLE t7;
! 585: CREATE TABLE t7(c, d , UNIQUE(c), PRIMARY KEY(c, d) );
! 586: SELECT count(*) FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 587: }
! 588: } {2}
! 589:
! 590: # Test that automatically create indices are named correctly. The current
! 591: # convention is: "sqlite_autoindex_<table name>_<integer>"
! 592: #
! 593: # Then check that it is an error to try to drop any automtically created
! 594: # indices.
! 595: do_test index-17.1 {
! 596: execsql {
! 597: DROP TABLE t7;
! 598: CREATE TABLE t7(c, d UNIQUE, UNIQUE(c), PRIMARY KEY(c, d) );
! 599: SELECT name FROM sqlite_master WHERE tbl_name = 't7' AND type = 'index';
! 600: }
! 601: } {sqlite_autoindex_t7_1 sqlite_autoindex_t7_2 sqlite_autoindex_t7_3}
! 602: do_test index-17.2 {
! 603: catchsql {
! 604: DROP INDEX sqlite_autoindex_t7_1;
! 605: }
! 606: } {1 {index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped}}
! 607: do_test index-17.3 {
! 608: catchsql {
! 609: DROP INDEX IF EXISTS sqlite_autoindex_t7_1;
! 610: }
! 611: } {1 {index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped}}
! 612: do_test index-17.4 {
! 613: catchsql {
! 614: DROP INDEX IF EXISTS no_such_index;
! 615: }
! 616: } {0 {}}
! 617:
! 618:
! 619: # The following tests ensure that it is not possible to explicitly name
! 620: # a schema object with a name beginning with "sqlite_". Granted that is a
! 621: # little outside the focus of this test scripts, but this has got to be
! 622: # tested somewhere.
! 623: do_test index-18.1 {
! 624: catchsql {
! 625: CREATE TABLE sqlite_t1(a, b, c);
! 626: }
! 627: } {1 {object name reserved for internal use: sqlite_t1}}
! 628: do_test index-18.2 {
! 629: catchsql {
! 630: CREATE INDEX sqlite_i1 ON t7(c);
! 631: }
! 632: } {1 {object name reserved for internal use: sqlite_i1}}
! 633: ifcapable view {
! 634: do_test index-18.3 {
! 635: catchsql {
! 636: CREATE VIEW sqlite_v1 AS SELECT * FROM t7;
! 637: }
! 638: } {1 {object name reserved for internal use: sqlite_v1}}
! 639: } ;# ifcapable view
! 640: ifcapable {trigger} {
! 641: do_test index-18.4 {
! 642: catchsql {
! 643: CREATE TRIGGER sqlite_tr1 BEFORE INSERT ON t7 BEGIN SELECT 1; END;
! 644: }
! 645: } {1 {object name reserved for internal use: sqlite_tr1}}
! 646: }
! 647: do_test index-18.5 {
! 648: execsql {
! 649: DROP TABLE t7;
! 650: }
! 651: } {}
! 652:
! 653: # These tests ensure that if multiple table definition constraints are
! 654: # implemented by a single indice, the correct ON CONFLICT policy applies.
! 655: ifcapable conflict {
! 656: do_test index-19.1 {
! 657: execsql {
! 658: CREATE TABLE t7(a UNIQUE PRIMARY KEY);
! 659: CREATE TABLE t8(a UNIQUE PRIMARY KEY ON CONFLICT ROLLBACK);
! 660: INSERT INTO t7 VALUES(1);
! 661: INSERT INTO t8 VALUES(1);
! 662: }
! 663: } {}
! 664: do_test index-19.2 {
! 665: catchsql {
! 666: BEGIN;
! 667: INSERT INTO t7 VALUES(1);
! 668: }
! 669: } {1 {column a is not unique}}
! 670: do_test index-19.3 {
! 671: catchsql {
! 672: BEGIN;
! 673: }
! 674: } {1 {cannot start a transaction within a transaction}}
! 675: do_test index-19.4 {
! 676: catchsql {
! 677: INSERT INTO t8 VALUES(1);
! 678: }
! 679: } {1 {column a is not unique}}
! 680: do_test index-19.5 {
! 681: catchsql {
! 682: BEGIN;
! 683: COMMIT;
! 684: }
! 685: } {0 {}}
! 686: do_test index-19.6 {
! 687: catchsql {
! 688: DROP TABLE t7;
! 689: DROP TABLE t8;
! 690: CREATE TABLE t7(
! 691: a PRIMARY KEY ON CONFLICT FAIL,
! 692: UNIQUE(a) ON CONFLICT IGNORE
! 693: );
! 694: }
! 695: } {1 {conflicting ON CONFLICT clauses specified}}
! 696: } ; # end of "ifcapable conflict" block
! 697:
! 698: ifcapable {reindex} {
! 699: do_test index-19.7 {
! 700: execsql REINDEX
! 701: } {}
! 702: }
! 703: integrity_check index-19.8
! 704:
! 705: # Drop index with a quoted name. Ticket #695.
! 706: #
! 707: do_test index-20.1 {
! 708: execsql {
! 709: CREATE INDEX "t6i2" ON t6(c);
! 710: DROP INDEX "t6i2";
! 711: }
! 712: } {}
! 713: do_test index-20.2 {
! 714: execsql {
! 715: DROP INDEX "t6i1";
! 716: }
! 717: } {}
! 718:
! 719:
! 720: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>