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 721