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