modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/pragma.test (about) 1 # 2002 March 6 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. 12 # 13 # This file implements tests for the PRAGMA command. 14 # 15 # $Id: pragma.test,v 1.73 2009/01/12 14:01:45 danielk1977 Exp $ 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 set testprefix pragma 20 21 # Do not use a codec for tests in this file, as the database file is 22 # manipulated directly using tcl scripts (using the [hexio_write] command). 23 # 24 do_not_use_codec 25 26 # Test organization: 27 # 28 # pragma-1.*: Test cache_size, default_cache_size and synchronous on main db. 29 # pragma-2.*: Test synchronous on attached db. 30 # pragma-3.*: Test detection of table/index inconsistency by integrity_check. 31 # pragma-4.*: Test cache_size and default_cache_size on attached db. 32 # pragma-5.*: Test that pragma synchronous may not be used inside of a 33 # transaction. 34 # pragma-6.*: Test schema-query pragmas. 35 # pragma-7.*: Miscellaneous tests. 36 # pragma-8.*: Test user_version and schema_version pragmas. 37 # pragma-9.*: Test temp_store and temp_store_directory. 38 # pragma-10.*: Test the count_changes pragma in the presence of triggers. 39 # pragma-11.*: Test the collation_list pragma. 40 # pragma-14.*: Test the page_count pragma. 41 # pragma-15.*: Test that the value set using the cache_size pragma is not 42 # reset when the schema is reloaded. 43 # pragma-16.*: Test proxy locking 44 # pragma-20.*: Test data_store_directory. 45 # pragma-22.*: Test that "PRAGMA [db].integrity_check" respects the "db" 46 # directive - if it is present. 47 # 48 49 ifcapable !pragma { 50 finish_test 51 return 52 } 53 54 # Capture the output of a pragma in a TEMP table. 55 # 56 proc capture_pragma {db tabname sql} { 57 $db eval "DROP TABLE IF EXISTS temp.$tabname" 58 set once 1 59 $db eval $sql x { 60 if {$once} { 61 set once 0 62 set ins "INSERT INTO $tabname VALUES" 63 set crtab "CREATE TEMP TABLE $tabname " 64 set sep "(" 65 foreach col $x(*) { 66 append ins ${sep}\$x($col) 67 append crtab ${sep}\"$col\" 68 set sep , 69 } 70 append ins ) 71 append crtab ) 72 $db eval $crtab 73 } 74 $db eval $ins 75 } 76 } 77 78 # Delete the preexisting database to avoid the special setup 79 # that the "all.test" script does. 80 # 81 db close 82 delete_file test.db test.db-journal 83 delete_file test3.db test3.db-journal 84 sqlite3 db test.db; set DB [sqlite3_connection_pointer db] 85 86 # EVIDENCE-OF: R-13861-56665 PRAGMA schema.cache_size; PRAGMA 87 # schema.cache_size = pages; PRAGMA schema.cache_size = -kibibytes; 88 # Query or change the suggested maximum number of database disk pages 89 # that SQLite will hold in memory at once per open database file. 90 # 91 ifcapable pager_pragmas { 92 set DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}] 93 set TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}] 94 do_test pragma-1.1 { 95 execsql { 96 PRAGMA cache_size; 97 PRAGMA default_cache_size; 98 PRAGMA synchronous; 99 } 100 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2] 101 do_test pragma-1.2 { 102 # EVIDENCE-OF: R-42059-47211 If the argument N is positive then the 103 # suggested cache size is set to N. 104 execsql { 105 PRAGMA synchronous=OFF; 106 PRAGMA cache_size=1234; 107 PRAGMA cache_size; 108 PRAGMA default_cache_size; 109 PRAGMA synchronous; 110 } 111 } [list 1234 $DFLT_CACHE_SZ 0] 112 do_test pragma-1.3 { 113 db close 114 sqlite3 db test.db 115 execsql { 116 PRAGMA cache_size; 117 PRAGMA default_cache_size; 118 PRAGMA synchronous; 119 } 120 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2] 121 do_test pragma-1.4 { 122 execsql { 123 PRAGMA synchronous=OFF; 124 PRAGMA cache_size; 125 PRAGMA default_cache_size; 126 PRAGMA synchronous; 127 } 128 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 0] 129 do_test pragma-1.5 { 130 execsql { 131 PRAGMA cache_size=-4321; 132 PRAGMA cache_size; 133 PRAGMA default_cache_size; 134 PRAGMA synchronous; 135 } 136 } [list -4321 $DFLT_CACHE_SZ 0] 137 do_test pragma-1.6 { 138 execsql { 139 PRAGMA synchronous=ON; 140 PRAGMA cache_size; 141 PRAGMA default_cache_size; 142 PRAGMA synchronous; 143 } 144 } [list -4321 $DFLT_CACHE_SZ 1] 145 do_test pragma-1.7 { 146 db close 147 sqlite3 db test.db 148 execsql { 149 PRAGMA cache_size; 150 PRAGMA default_cache_size; 151 PRAGMA synchronous; 152 } 153 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2] 154 do_test pragma-1.8 { 155 execsql { 156 PRAGMA default_cache_size=-123; 157 PRAGMA cache_size; 158 PRAGMA default_cache_size; 159 PRAGMA synchronous; 160 } 161 } {123 123 2} 162 do_test pragma-1.9.1 { 163 db close 164 sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db] 165 execsql { 166 PRAGMA cache_size; 167 PRAGMA default_cache_size; 168 PRAGMA synchronous; 169 } 170 } {123 123 2} 171 ifcapable vacuum { 172 do_test pragma-1.9.2 { 173 execsql { 174 VACUUM; 175 PRAGMA cache_size; 176 PRAGMA default_cache_size; 177 PRAGMA synchronous; 178 } 179 } {123 123 2} 180 } 181 do_test pragma-1.10 { 182 execsql { 183 PRAGMA synchronous=NORMAL; 184 PRAGMA cache_size; 185 PRAGMA default_cache_size; 186 PRAGMA synchronous; 187 } 188 } {123 123 1} 189 do_test pragma-1.11.1 { 190 execsql { 191 PRAGMA synchronous=EXTRA; 192 PRAGMA cache_size; 193 PRAGMA default_cache_size; 194 PRAGMA synchronous; 195 } 196 } {123 123 3} 197 do_test pragma-1.11.2 { 198 execsql { 199 PRAGMA synchronous=FULL; 200 PRAGMA cache_size; 201 PRAGMA default_cache_size; 202 PRAGMA synchronous; 203 } 204 } {123 123 2} 205 do_test pragma-1.12 { 206 db close 207 sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db] 208 execsql { 209 PRAGMA cache_size; 210 PRAGMA default_cache_size; 211 PRAGMA synchronous; 212 } 213 } {123 123 2} 214 215 # Make sure the pragma handler understands numeric values in addition 216 # to keywords like "off" and "full". 217 # 218 do_test pragma-1.13 { 219 execsql { 220 PRAGMA synchronous=0; 221 PRAGMA synchronous; 222 } 223 } {0} 224 do_test pragma-1.14 { 225 execsql { 226 PRAGMA synchronous=2; 227 PRAGMA synchronous; 228 } 229 } {2} 230 do_test pragma-1.14.1 { 231 execsql { 232 PRAGMA synchronous=4; 233 PRAGMA synchronous; 234 } 235 } {4} 236 do_test pragma-1.14.2 { 237 execsql { 238 PRAGMA synchronous=3; 239 PRAGMA synchronous; 240 } 241 } {3} 242 do_test pragma-1.14.3 { 243 execsql { 244 PRAGMA synchronous=8; 245 PRAGMA synchronous; 246 } 247 } {0} 248 do_test pragma-1.14.4 { 249 execsql { 250 PRAGMA synchronous=10; 251 PRAGMA synchronous; 252 } 253 } {2} 254 } ;# ifcapable pager_pragmas 255 256 # Test turning "flag" pragmas on and off. 257 # 258 ifcapable debug { 259 # Pragma "vdbe_listing" is only available if compiled with SQLITE_DEBUG 260 # 261 do_test pragma-1.15 { 262 execsql { 263 PRAGMA vdbe_listing=YES; 264 PRAGMA vdbe_listing; 265 } 266 } {1} 267 do_test pragma-1.16 { 268 execsql { 269 PRAGMA vdbe_listing=NO; 270 PRAGMA vdbe_listing; 271 } 272 } {0} 273 } 274 275 do_test pragma-1.17 { 276 execsql { 277 PRAGMA parser_trace=ON; 278 PRAGMA parser_trace=OFF; 279 } 280 } {} 281 do_test pragma-1.18 { 282 execsql { 283 PRAGMA bogus = -1234; -- Parsing of negative values 284 } 285 } {} 286 287 # Test modifying the safety_level of an attached database. 288 ifcapable pager_pragmas&&attach { 289 do_test pragma-2.1 { 290 forcedelete test2.db 291 forcedelete test2.db-journal 292 execsql { 293 ATTACH 'test2.db' AS aux; 294 } 295 } {} 296 do_test pragma-2.2 { 297 execsql { 298 pragma aux.synchronous; 299 } 300 } {2} 301 do_test pragma-2.3 { 302 execsql { 303 pragma aux.synchronous = OFF; 304 pragma aux.synchronous; 305 pragma synchronous; 306 } 307 } {0 2} 308 do_test pragma-2.4 { 309 execsql { 310 pragma aux.synchronous = ON; 311 pragma synchronous; 312 pragma aux.synchronous; 313 } 314 } {2 1} 315 } ;# ifcapable pager_pragmas 316 317 # Construct a corrupted index and make sure the integrity_check 318 # pragma finds it. 319 # 320 # These tests won't work if the database is encrypted 321 # 322 do_test pragma-3.1 { 323 db close 324 forcedelete test.db test.db-journal 325 sqlite3 db test.db 326 execsql { 327 PRAGMA auto_vacuum=OFF; 328 BEGIN; 329 CREATE TABLE t2(a,b,c); 330 CREATE INDEX i2 ON t2(a); 331 INSERT INTO t2 VALUES(11,2,3); 332 INSERT INTO t2 VALUES(22,3,4); 333 COMMIT; 334 SELECT rowid, * from t2; 335 } 336 } {1 11 2 3 2 22 3 4} 337 ifcapable attach { 338 if {![sqlite3 -has-codec] && $sqlite_options(integrityck)} { 339 do_test pragma-3.2 { 340 db eval {SELECT rootpage FROM sqlite_master WHERE name='i2'} break 341 set pgsz [db eval {PRAGMA page_size}] 342 # overwrite the header on the rootpage of the index in order to 343 # make the index appear to be empty. 344 # 345 set offset [expr {$pgsz*($rootpage-1)}] 346 hexio_write test.db $offset 0a00000000040000000000 347 db close 348 sqlite3 db test.db 349 execsql {PRAGMA integrity_check} 350 } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 351 do_test pragma-3.3 { 352 execsql {PRAGMA integrity_check=1} 353 } {{row 1 missing from index i2}} 354 do_test pragma-3.4 { 355 execsql { 356 ATTACH DATABASE 'test.db' AS t2; 357 PRAGMA integrity_check 358 } 359 } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 360 do_test pragma-3.5 { 361 execsql { 362 PRAGMA integrity_check=4 363 } 364 } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2}} 365 do_test pragma-3.6 { 366 execsql { 367 PRAGMA integrity_check=xyz 368 } 369 } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 370 do_test pragma-3.7 { 371 execsql { 372 PRAGMA integrity_check=0 373 } 374 } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 375 376 # Add additional corruption by appending unused pages to the end of 377 # the database file testerr.db 378 # 379 do_test pragma-3.8 { 380 execsql {DETACH t2} 381 forcedelete testerr.db testerr.db-journal 382 set out [open testerr.db w] 383 fconfigure $out -translation binary 384 set in [open test.db r] 385 fconfigure $in -translation binary 386 puts -nonewline $out [read $in] 387 seek $in 0 388 puts -nonewline $out [read $in] 389 close $in 390 close $out 391 hexio_write testerr.db 28 00000000 392 execsql {REINDEX t2} 393 execsql {PRAGMA integrity_check} 394 } {ok} 395 do_test pragma-3.8.1 { 396 execsql {PRAGMA quick_check} 397 } {ok} 398 do_test pragma-3.8.2 { 399 execsql {PRAGMA QUICK_CHECK} 400 } {ok} 401 do_test pragma-3.9 { 402 execsql { 403 ATTACH 'testerr.db' AS t2; 404 PRAGMA integrity_check 405 } 406 } {{*** in database t2 *** 407 Page 4 is never used 408 Page 5 is never used 409 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 410 do_test pragma-3.10 { 411 execsql { 412 PRAGMA integrity_check=1 413 } 414 } {{*** in database t2 *** 415 Page 4 is never used}} 416 do_test pragma-3.11 { 417 execsql { 418 PRAGMA integrity_check=5 419 } 420 } {{*** in database t2 *** 421 Page 4 is never used 422 Page 5 is never used 423 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2}} 424 do_test pragma-3.12 { 425 execsql { 426 PRAGMA integrity_check=4 427 } 428 } {{*** in database t2 *** 429 Page 4 is never used 430 Page 5 is never used 431 Page 6 is never used} {row 1 missing from index i2}} 432 do_test pragma-3.13 { 433 execsql { 434 PRAGMA integrity_check=3 435 } 436 } {{*** in database t2 *** 437 Page 4 is never used 438 Page 5 is never used 439 Page 6 is never used}} 440 do_test pragma-3.14 { 441 execsql { 442 PRAGMA integrity_check(2) 443 } 444 } {{*** in database t2 *** 445 Page 4 is never used 446 Page 5 is never used}} 447 do_test pragma-3.15 { 448 execsql { 449 ATTACH 'testerr.db' AS t3; 450 PRAGMA integrity_check 451 } 452 } {{*** in database t2 *** 453 Page 4 is never used 454 Page 5 is never used 455 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** 456 Page 4 is never used 457 Page 5 is never used 458 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} 459 do_test pragma-3.16 { 460 execsql { 461 PRAGMA integrity_check(10) 462 } 463 } {{*** in database t2 *** 464 Page 4 is never used 465 Page 5 is never used 466 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** 467 Page 4 is never used 468 Page 5 is never used 469 Page 6 is never used} {row 1 missing from index i2}} 470 do_test pragma-3.17 { 471 execsql { 472 PRAGMA integrity_check=8 473 } 474 } {{*** in database t2 *** 475 Page 4 is never used 476 Page 5 is never used 477 Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** 478 Page 4 is never used 479 Page 5 is never used}} 480 do_test pragma-3.18 { 481 execsql { 482 PRAGMA integrity_check=4 483 } 484 } {{*** in database t2 *** 485 Page 4 is never used 486 Page 5 is never used 487 Page 6 is never used} {row 1 missing from index i2}} 488 } 489 do_test pragma-3.19 { 490 catch {db close} 491 forcedelete test.db test.db-journal 492 sqlite3 db test.db 493 db eval {PRAGMA integrity_check} 494 } {ok} 495 } 496 497 # Verify that PRAGMA integrity_check catches UNIQUE and NOT NULL 498 # constraint violations. 499 # 500 do_execsql_test pragma-3.20 { 501 CREATE TABLE t1(a,b); 502 CREATE INDEX t1a ON t1(a); 503 INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(2,4),(NULL,5),(NULL,6); 504 PRAGMA writable_schema=ON; 505 UPDATE sqlite_master SET sql='CREATE UNIQUE INDEX t1a ON t1(a)' 506 WHERE name='t1a'; 507 UPDATE sqlite_master SET sql='CREATE TABLE t1(a NOT NULL,b)' 508 WHERE name='t1'; 509 PRAGMA writable_schema=OFF; 510 ALTER TABLE t1 RENAME TO t1x; 511 PRAGMA integrity_check; 512 } {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a} {NULL value in t1x.a}} 513 do_execsql_test pragma-3.21 { 514 PRAGMA integrity_check(3); 515 } {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a}} 516 do_execsql_test pragma-3.22 { 517 PRAGMA integrity_check(2); 518 } {{non-unique entry in index t1a} {NULL value in t1x.a}} 519 do_execsql_test pragma-3.23 { 520 PRAGMA integrity_check(1); 521 } {{non-unique entry in index t1a}} 522 523 # PRAGMA integrity check (or more specifically the sqlite3BtreeCount() 524 # interface) used to leave index cursors in an inconsistent state 525 # which could result in an assertion fault in sqlite3BtreeKey() 526 # called from saveCursorPosition() if content is removed from the 527 # index while the integrity_check is still running. This test verifies 528 # that problem has been fixed. 529 # 530 do_test pragma-3.30 { 531 db close 532 delete_file test.db 533 sqlite3 db test.db 534 db eval { 535 CREATE TABLE t1(a,b,c); 536 WITH RECURSIVE 537 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<100) 538 INSERT INTO t1(a,b,c) SELECT i, printf('xyz%08x',i), 2000-i FROM c; 539 CREATE INDEX t1a ON t1(a); 540 CREATE INDEX t1bc ON t1(b,c); 541 } 542 db eval {PRAGMA integrity_check} { 543 db eval {DELETE FROM t1} 544 } 545 } {} 546 547 # Test modifying the cache_size of an attached database. 548 ifcapable pager_pragmas&&attach { 549 do_test pragma-4.1 { 550 execsql { 551 ATTACH 'test2.db' AS aux; 552 pragma aux.cache_size; 553 pragma aux.default_cache_size; 554 } 555 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ] 556 do_test pragma-4.2 { 557 execsql { 558 pragma aux.cache_size = 50; 559 pragma aux.cache_size; 560 pragma aux.default_cache_size; 561 } 562 } [list 50 $DFLT_CACHE_SZ] 563 do_test pragma-4.3 { 564 execsql { 565 pragma aux.default_cache_size = 456; 566 pragma aux.cache_size; 567 pragma aux.default_cache_size; 568 } 569 } {456 456} 570 do_test pragma-4.4 { 571 execsql { 572 pragma cache_size; 573 pragma default_cache_size; 574 } 575 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ] 576 do_test pragma-4.5 { 577 execsql { 578 DETACH aux; 579 ATTACH 'test3.db' AS aux; 580 pragma aux.cache_size; 581 pragma aux.default_cache_size; 582 } 583 } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ] 584 do_test pragma-4.6 { 585 execsql { 586 DETACH aux; 587 ATTACH 'test2.db' AS aux; 588 pragma aux.cache_size; 589 pragma aux.default_cache_size; 590 } 591 } {456 456} 592 } ;# ifcapable pager_pragmas 593 594 # Test that modifying the sync-level in the middle of a transaction is 595 # disallowed. 596 ifcapable pager_pragmas { 597 do_test pragma-5.0 { 598 execsql { 599 pragma synchronous; 600 } 601 } {2} 602 do_test pragma-5.1 { 603 catchsql { 604 BEGIN; 605 pragma synchronous = OFF; 606 } 607 } {1 {Safety level may not be changed inside a transaction}} 608 do_test pragma-5.2 { 609 execsql { 610 pragma synchronous; 611 } 612 } {2} 613 catchsql {COMMIT;} 614 } ;# ifcapable pager_pragmas 615 616 # Test schema-query pragmas 617 # 618 ifcapable schema_pragmas { 619 ifcapable tempdb&&attach { 620 do_test pragma-6.1 { 621 set res {} 622 execsql {SELECT * FROM sqlite_temp_master} 623 foreach {idx name file} [execsql {pragma database_list}] { 624 lappend res $idx $name 625 } 626 set res 627 } {0 main 1 temp 2 aux} 628 } 629 do_test pragma-6.2 { 630 execsql { 631 CREATE TABLE t2(a TYPE_X, b [TYPE_Y], c "TYPE_Z"); 632 pragma table_info(t2) 633 } 634 } {0 a TYPE_X 0 {} 0 1 b TYPE_Y 0 {} 0 2 c TYPE_Z 0 {} 0} 635 do_test pragma-6.2.1 { 636 execsql { 637 pragma table_info; 638 } 639 } {} 640 db nullvalue <<NULL>> 641 do_test pragma-6.2.2 { 642 execsql { 643 CREATE TABLE t5( 644 a TEXT DEFAULT CURRENT_TIMESTAMP, 645 b DEFAULT (5+3), 646 c TEXT, 647 d INTEGER DEFAULT NULL, 648 e TEXT DEFAULT '', 649 UNIQUE(b,c,d), 650 PRIMARY KEY(e,b,c) 651 ); 652 PRAGMA table_info(t5); 653 } 654 } {0 a TEXT 0 CURRENT_TIMESTAMP 0 1 b {} 0 5+3 2 2 c TEXT 0 <<NULL>> 3 3 d INTEGER 0 NULL 0 4 e TEXT 0 '' 1} 655 db nullvalue {} 656 do_test pragma-6.2.3 { 657 execsql { 658 CREATE TABLE t2_3(a,b INTEGER PRIMARY KEY,c); 659 pragma table_info(t2_3) 660 } 661 } {0 a {} 0 {} 0 1 b INTEGER 0 {} 1 2 c {} 0 {} 0} 662 ifcapable {foreignkey} { 663 do_test pragma-6.3.1 { 664 execsql { 665 CREATE TABLE t3(a int references t2(b), b UNIQUE); 666 pragma foreign_key_list(t3); 667 } 668 } {0 0 t2 a b {NO ACTION} {NO ACTION} NONE} 669 do_test pragma-6.3.2 { 670 execsql { 671 pragma foreign_key_list; 672 } 673 } {} 674 do_test pragma-6.3.3 { 675 execsql { 676 pragma foreign_key_list(t3_bogus); 677 } 678 } {} 679 do_test pragma-6.3.4 { 680 execsql { 681 pragma foreign_key_list(t5); 682 } 683 } {} 684 do_test pragma-6.4 { 685 capture_pragma db out { 686 pragma index_list(t3); 687 } 688 db eval {SELECT seq, "name", "unique" FROM out ORDER BY seq} 689 } {0 sqlite_autoindex_t3_1 1} 690 } 691 ifcapable {!foreignkey} { 692 execsql {CREATE TABLE t3(a,b UNIQUE)} 693 } 694 do_test pragma-6.5.1 { 695 execsql { 696 CREATE INDEX t3i1 ON t3(a,b); 697 } 698 capture_pragma db out { 699 pragma index_info(t3i1); 700 } 701 db eval {SELECT seqno, cid, name FROM out ORDER BY seqno} 702 } {0 0 a 1 1 b} 703 704 # EVIDENCE-OF: R-23114-21695 The auxiliary index-columns are not shown 705 # by the index_info pragma, but they are listed by the index_xinfo 706 # pragma. 707 # 708 do_test pragma-6.5.1b { 709 capture_pragma db out {PRAGMA index_xinfo(t3i1)} 710 db eval {SELECT seqno, cid, name FROM out ORDER BY seqno} 711 } {0 0 a 1 1 b 2 -1 {}} 712 713 714 # EVIDENCE-OF: R-29448-60346 PRAGMA schema.index_info(index-name); This 715 # pragma returns one row for each key column in the named index. 716 # 717 # (The first column of output from PRAGMA index_info is...) 718 # EVIDENCE-OF: R-34186-52914 The rank of the column within the index. (0 719 # means left-most.) 720 # 721 # (The second column of output from PRAGMA index_info is...) 722 # EVIDENCE-OF: R-65019-08383 The rank of the column within the table 723 # being indexed. 724 # 725 # (The third column of output from PRAGMA index_info is...) 726 # EVIDENCE-OF: R-09773-34266 The name of the column being indexed. 727 # 728 do_execsql_test pragma-6.5.1c { 729 CREATE INDEX t3i2 ON t3(b,a); 730 PRAGMA index_info='t3i2'; 731 DROP INDEX t3i2; 732 } {0 1 b 1 0 a} 733 734 do_test pragma-6.5.2 { 735 execsql { 736 pragma index_info(t3i1_bogus); 737 } 738 } {} 739 740 ifcapable tempdb { 741 # Test for ticket #3320. When a temp table of the same name exists, make 742 # sure the schema of the main table can still be queried using 743 # "pragma table_info": 744 do_test pragma-6.6.1 { 745 execsql { 746 CREATE TABLE trial(col_main); 747 CREATE TEMP TABLE trial(col_temp); 748 } 749 } {} 750 do_test pragma-6.6.2 { 751 execsql { 752 PRAGMA table_info(trial); 753 } 754 } {0 col_temp {} 0 {} 0} 755 do_test pragma-6.6.3 { 756 execsql { 757 PRAGMA temp.table_info(trial); 758 } 759 } {0 col_temp {} 0 {} 0} 760 do_test pragma-6.6.4 { 761 execsql { 762 PRAGMA main.table_info(trial); 763 } 764 } {0 col_main {} 0 {} 0} 765 } 766 767 do_test pragma-6.7 { 768 execsql { 769 CREATE TABLE test_table( 770 one INT NOT NULL DEFAULT -1, 771 two text, 772 three VARCHAR(45, 65) DEFAULT 'abcde', 773 four REAL DEFAULT X'abcdef', 774 five DEFAULT CURRENT_TIME 775 ); 776 } 777 capture_pragma db out {PRAGMA table_info(test_table)} 778 db eval {SELECT cid, "name", type, "notnull", dflt_value, pk FROM out 779 ORDER BY cid} 780 } [concat \ 781 {0 one INT 1 -1 0} \ 782 {1 two text 0 {} 0} \ 783 {2 three {VARCHAR(45, 65)} 0 'abcde' 0} \ 784 {3 four REAL 0 X'abcdef' 0} \ 785 {4 five {} 0 CURRENT_TIME 0} \ 786 ] 787 do_test pragma-6.8 { 788 execsql { 789 CREATE TABLE t68(a,b,c,PRIMARY KEY(a,b,a,c)); 790 PRAGMA table_info(t68); 791 } 792 } [concat \ 793 {0 a {} 0 {} 1} \ 794 {1 b {} 0 {} 2} \ 795 {2 c {} 0 {} 4} \ 796 ] 797 } ;# ifcapable schema_pragmas 798 # Miscellaneous tests 799 # 800 ifcapable schema_pragmas { 801 # EVIDENCE-OF: R-64103-17776 PRAGMA schema.index_list(table-name); This 802 # pragma returns one row for each index associated with the given table. 803 # 804 do_test pragma-7.1.1 { 805 # Make sure a pragma knows to read the schema if it needs to 806 db close 807 sqlite3 db test.db 808 capture_pragma db out "PRAGMA index_list(t3)" 809 db eval {SELECT name, "origin" FROM out ORDER BY name DESC} 810 } {t3i1 c sqlite_autoindex_t3_1 u} 811 do_test pragma-7.1.2 { 812 execsql { 813 pragma index_list(t3_bogus); 814 } 815 } {} 816 } ;# ifcapable schema_pragmas 817 ifcapable {utf16} { 818 if {[permutation] == ""} { 819 do_test pragma-7.2 { 820 db close 821 sqlite3 db test.db 822 catchsql { 823 pragma encoding=bogus; 824 } 825 } {1 {unsupported encoding: bogus}} 826 } 827 } 828 ifcapable tempdb { 829 do_test pragma-7.3 { 830 db close 831 sqlite3 db test.db 832 execsql { 833 pragma lock_status; 834 } 835 } {main unlocked temp closed} 836 } else { 837 do_test pragma-7.3 { 838 db close 839 sqlite3 db test.db 840 execsql { 841 pragma lock_status; 842 } 843 } {main unlocked} 844 } 845 846 847 #---------------------------------------------------------------------- 848 # Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA 849 # user_version" statements. 850 # 851 # pragma-8.1: PRAGMA schema_version 852 # pragma-8.2: PRAGMA user_version 853 # 854 855 ifcapable schema_version { 856 857 # First check that we can set the schema version and then retrieve the 858 # same value. 859 do_test pragma-8.1.1 { 860 execsql { 861 PRAGMA schema_version = 105; 862 } 863 } {} 864 do_test pragma-8.1.2 { 865 execsql2 { 866 PRAGMA schema_version; 867 } 868 } {schema_version 105} 869 do_test pragma-8.1.3 { 870 execsql { 871 PRAGMA schema_version = 106; 872 } 873 } {} 874 do_test pragma-8.1.4 { 875 execsql { 876 PRAGMA schema_version; 877 } 878 } 106 879 880 # Check that creating a table modifies the schema-version (this is really 881 # to verify that the value being read is in fact the schema version). 882 do_test pragma-8.1.5 { 883 execsql { 884 CREATE TABLE t4(a, b, c); 885 INSERT INTO t4 VALUES(1, 2, 3); 886 SELECT * FROM t4; 887 } 888 } {1 2 3} 889 do_test pragma-8.1.6 { 890 execsql { 891 PRAGMA schema_version; 892 } 893 } 107 894 895 # Now open a second connection to the database. Ensure that changing the 896 # schema-version using the first connection forces the second connection 897 # to reload the schema. This has to be done using the C-API test functions, 898 # because the TCL API accounts for SCHEMA_ERROR and retries the query. 899 do_test pragma-8.1.7 { 900 sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2] 901 execsql { 902 SELECT * FROM t4; 903 } db2 904 } {1 2 3} 905 do_test pragma-8.1.8 { 906 execsql { 907 PRAGMA schema_version = 108; 908 } 909 } {} 910 do_test pragma-8.1.9 { 911 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY] 912 sqlite3_step $::STMT 913 } SQLITE_ERROR 914 do_test pragma-8.1.10 { 915 sqlite3_finalize $::STMT 916 } SQLITE_SCHEMA 917 918 # Make sure the schema-version can be manipulated in an attached database. 919 forcedelete test2.db 920 forcedelete test2.db-journal 921 ifcapable attach { 922 do_test pragma-8.1.11 { 923 execsql { 924 ATTACH 'test2.db' AS aux; 925 CREATE TABLE aux.t1(a, b, c); 926 PRAGMA aux.schema_version = 205; 927 } 928 } {} 929 do_test pragma-8.1.12 { 930 execsql { 931 PRAGMA aux.schema_version; 932 } 933 } 205 934 } 935 do_test pragma-8.1.13 { 936 execsql { 937 PRAGMA schema_version; 938 } 939 } 108 940 941 # And check that modifying the schema-version in an attached database 942 # forces the second connection to reload the schema. 943 ifcapable attach { 944 do_test pragma-8.1.14 { 945 sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2] 946 execsql { 947 ATTACH 'test2.db' AS aux; 948 SELECT * FROM aux.t1; 949 } db2 950 } {} 951 do_test pragma-8.1.15 { 952 execsql { 953 PRAGMA aux.schema_version = 206; 954 } 955 } {} 956 do_test pragma-8.1.16 { 957 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY] 958 sqlite3_step $::STMT 959 } SQLITE_ERROR 960 do_test pragma-8.1.17 { 961 sqlite3_finalize $::STMT 962 } SQLITE_SCHEMA 963 do_test pragma-8.1.18 { 964 db2 close 965 } {} 966 } 967 968 # Now test that the user-version can be read and written (and that we aren't 969 # accidentally manipulating the schema-version instead). 970 do_test pragma-8.2.1 { 971 execsql2 { 972 PRAGMA user_version; 973 } 974 } {user_version 0} 975 do_test pragma-8.2.2 { 976 execsql { 977 PRAGMA user_version = 2; 978 } 979 } {} 980 do_test pragma-8.2.3.1 { 981 execsql2 { 982 PRAGMA user_version; 983 } 984 } {user_version 2} 985 do_test pragma-8.2.3.2 { 986 db close 987 sqlite3 db test.db 988 execsql { 989 PRAGMA user_version; 990 } 991 } {2} 992 do_test pragma-8.2.4.1 { 993 execsql { 994 PRAGMA schema_version; 995 } 996 } {108} 997 ifcapable vacuum { 998 do_test pragma-8.2.4.2 { 999 execsql { 1000 VACUUM; 1001 PRAGMA user_version; 1002 } 1003 } {2} 1004 do_test pragma-8.2.4.3 { 1005 execsql { 1006 PRAGMA schema_version; 1007 } 1008 } {109} 1009 } 1010 1011 ifcapable attach { 1012 db eval {ATTACH 'test2.db' AS aux} 1013 1014 # Check that the user-version in the auxilary database can be manipulated ( 1015 # and that we aren't accidentally manipulating the same in the main db). 1016 do_test pragma-8.2.5 { 1017 execsql { 1018 PRAGMA aux.user_version; 1019 } 1020 } {0} 1021 do_test pragma-8.2.6 { 1022 execsql { 1023 PRAGMA aux.user_version = 3; 1024 } 1025 } {} 1026 do_test pragma-8.2.7 { 1027 execsql { 1028 PRAGMA aux.user_version; 1029 } 1030 } {3} 1031 do_test pragma-8.2.8 { 1032 execsql { 1033 PRAGMA main.user_version; 1034 } 1035 } {2} 1036 1037 # Now check that a ROLLBACK resets the user-version if it has been modified 1038 # within a transaction. 1039 do_test pragma-8.2.9 { 1040 execsql { 1041 BEGIN; 1042 PRAGMA aux.user_version = 10; 1043 PRAGMA user_version = 11; 1044 } 1045 } {} 1046 do_test pragma-8.2.10 { 1047 execsql { 1048 PRAGMA aux.user_version; 1049 } 1050 } {10} 1051 do_test pragma-8.2.11 { 1052 execsql { 1053 PRAGMA main.user_version; 1054 } 1055 } {11} 1056 do_test pragma-8.2.12 { 1057 execsql { 1058 ROLLBACK; 1059 PRAGMA aux.user_version; 1060 } 1061 } {3} 1062 do_test pragma-8.2.13 { 1063 execsql { 1064 PRAGMA main.user_version; 1065 } 1066 } {2} 1067 } 1068 1069 # Try a negative value for the user-version 1070 do_test pragma-8.2.14 { 1071 execsql { 1072 PRAGMA user_version = -450; 1073 } 1074 } {} 1075 do_test pragma-8.2.15 { 1076 execsql { 1077 PRAGMA user_version; 1078 } 1079 } {-450} 1080 } ; # ifcapable schema_version 1081 1082 # Check to see if TEMP_STORE is memory or disk. Return strings 1083 # "memory" or "disk" as appropriate. 1084 # 1085 proc check_temp_store {} { 1086 db eval { 1087 PRAGMA temp.cache_size = 1; 1088 CREATE TEMP TABLE IF NOT EXISTS a(b); 1089 DELETE FROM a; 1090 INSERT INTO a VALUES(randomblob(1000)); 1091 INSERT INTO a SELECT * FROM a; 1092 INSERT INTO a SELECT * FROM a; 1093 INSERT INTO a SELECT * FROM a; 1094 INSERT INTO a SELECT * FROM a; 1095 INSERT INTO a SELECT * FROM a; 1096 INSERT INTO a SELECT * FROM a; 1097 INSERT INTO a SELECT * FROM a; 1098 INSERT INTO a SELECT * FROM a; 1099 } 1100 db eval {PRAGMA database_list} { 1101 if {$name=="temp"} { 1102 set bt [btree_from_db db 1] 1103 if {[btree_ismemdb $bt]} { 1104 return "memory" 1105 } 1106 return "disk" 1107 } 1108 } 1109 return "unknown" 1110 } 1111 1112 # Application_ID 1113 # 1114 do_test pragma-8.3.1 { 1115 execsql { 1116 PRAGMA application_id; 1117 } 1118 } {0} 1119 do_test pragma-8.3.2 { 1120 execsql {PRAGMA Application_ID(12345); PRAGMA application_id;} 1121 } {12345} 1122 1123 # Test temp_store and temp_store_directory pragmas 1124 # 1125 ifcapable pager_pragmas { 1126 do_test pragma-9.1 { 1127 db close 1128 sqlite3 db test.db 1129 execsql { 1130 PRAGMA temp_store; 1131 } 1132 } {0} 1133 if {$TEMP_STORE<=1} { 1134 do_test pragma-9.1.1 { 1135 check_temp_store 1136 } {disk} 1137 } else { 1138 do_test pragma-9.1.1 { 1139 check_temp_store 1140 } {memory} 1141 } 1142 1143 do_test pragma-9.2 { 1144 db close 1145 sqlite3 db test.db 1146 execsql { 1147 PRAGMA temp_store=file; 1148 PRAGMA temp_store; 1149 } 1150 } {1} 1151 if {$TEMP_STORE==3} { 1152 # When TEMP_STORE is 3, always use memory regardless of pragma settings. 1153 do_test pragma-9.2.1 { 1154 check_temp_store 1155 } {memory} 1156 } else { 1157 do_test pragma-9.2.1 { 1158 check_temp_store 1159 } {disk} 1160 } 1161 1162 do_test pragma-9.3 { 1163 db close 1164 sqlite3 db test.db 1165 execsql { 1166 PRAGMA temp_store=memory; 1167 PRAGMA temp_store; 1168 } 1169 } {2} 1170 if {$TEMP_STORE==0} { 1171 # When TEMP_STORE is 0, always use the disk regardless of pragma settings. 1172 do_test pragma-9.3.1 { 1173 check_temp_store 1174 } {disk} 1175 } else { 1176 do_test pragma-9.3.1 { 1177 check_temp_store 1178 } {memory} 1179 } 1180 1181 do_test pragma-9.4 { 1182 execsql { 1183 PRAGMA temp_store_directory; 1184 } 1185 } {} 1186 ifcapable wsd { 1187 do_test pragma-9.5 { 1188 set pwd [string map {' ''} [file nativename [get_pwd]]] 1189 execsql " 1190 PRAGMA temp_store_directory='$pwd'; 1191 " 1192 } {} 1193 do_test pragma-9.6 { 1194 execsql { 1195 PRAGMA temp_store_directory; 1196 } 1197 } [list [file nativename [get_pwd]]] 1198 do_test pragma-9.7 { 1199 catchsql { 1200 PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR'; 1201 } 1202 } {1 {not a writable directory}} 1203 do_test pragma-9.8 { 1204 execsql { 1205 PRAGMA temp_store_directory=''; 1206 } 1207 } {} 1208 if {![info exists TEMP_STORE] || $TEMP_STORE<=1} { 1209 ifcapable tempdb { 1210 do_test pragma-9.9 { 1211 execsql { 1212 PRAGMA temp_store_directory; 1213 PRAGMA temp_store=FILE; 1214 CREATE TEMP TABLE temp_store_directory_test(a integer); 1215 INSERT INTO temp_store_directory_test values (2); 1216 SELECT * FROM temp_store_directory_test; 1217 } 1218 } {2} 1219 do_test pragma-9.10 { 1220 catchsql " 1221 PRAGMA temp_store_directory='$pwd'; 1222 SELECT * FROM temp_store_directory_test; 1223 " 1224 } {1 {no such table: temp_store_directory_test}} 1225 } 1226 } 1227 } 1228 do_test pragma-9.11 { 1229 execsql { 1230 PRAGMA temp_store = 0; 1231 PRAGMA temp_store; 1232 } 1233 } {0} 1234 do_test pragma-9.12 { 1235 execsql { 1236 PRAGMA temp_store = 1; 1237 PRAGMA temp_store; 1238 } 1239 } {1} 1240 do_test pragma-9.13 { 1241 execsql { 1242 PRAGMA temp_store = 2; 1243 PRAGMA temp_store; 1244 } 1245 } {2} 1246 do_test pragma-9.14 { 1247 execsql { 1248 PRAGMA temp_store = 3; 1249 PRAGMA temp_store; 1250 } 1251 } {0} 1252 do_test pragma-9.15 { 1253 catchsql { 1254 BEGIN EXCLUSIVE; 1255 CREATE TEMP TABLE temp_table(t); 1256 INSERT INTO temp_table VALUES('valuable data'); 1257 PRAGMA temp_store = 1; 1258 } 1259 } {1 {temporary storage cannot be changed from within a transaction}} 1260 do_test pragma-9.16 { 1261 execsql { 1262 SELECT * FROM temp_table; 1263 COMMIT; 1264 } 1265 } {{valuable data}} 1266 1267 do_test pragma-9.17 { 1268 execsql { 1269 INSERT INTO temp_table VALUES('valuable data II'); 1270 SELECT * FROM temp_table; 1271 } 1272 } {{valuable data} {valuable data II}} 1273 1274 do_test pragma-9.18 { 1275 set rc [catch { 1276 db eval {SELECT t FROM temp_table} { 1277 execsql {pragma temp_store = 1} 1278 } 1279 } msg] 1280 list $rc $msg 1281 } {1 {temporary storage cannot be changed from within a transaction}} 1282 1283 } ;# ifcapable pager_pragmas 1284 1285 ifcapable trigger { 1286 1287 do_test pragma-10.0 { 1288 catchsql { 1289 DROP TABLE main.t1; 1290 } 1291 execsql { 1292 PRAGMA count_changes = 1; 1293 1294 CREATE TABLE t1(a PRIMARY KEY); 1295 CREATE TABLE t1_mirror(a); 1296 CREATE TABLE t1_mirror2(a); 1297 CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN 1298 INSERT INTO t1_mirror VALUES(new.a); 1299 END; 1300 CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN 1301 INSERT INTO t1_mirror2 VALUES(new.a); 1302 END; 1303 CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN 1304 UPDATE t1_mirror SET a = new.a WHERE a = old.a; 1305 END; 1306 CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN 1307 UPDATE t1_mirror2 SET a = new.a WHERE a = old.a; 1308 END; 1309 CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN 1310 DELETE FROM t1_mirror WHERE a = old.a; 1311 END; 1312 CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN 1313 DELETE FROM t1_mirror2 WHERE a = old.a; 1314 END; 1315 } 1316 } {} 1317 1318 do_test pragma-10.1 { 1319 execsql { 1320 INSERT INTO t1 VALUES(randstr(10,10)); 1321 } 1322 } {1} 1323 do_test pragma-10.2 { 1324 execsql { 1325 UPDATE t1 SET a = randstr(10,10); 1326 } 1327 } {1} 1328 do_test pragma-10.3 { 1329 execsql { 1330 DELETE FROM t1; 1331 } 1332 } {1} 1333 1334 } ;# ifcapable trigger 1335 1336 ifcapable schema_pragmas { 1337 do_test pragma-11.1 { 1338 execsql2 { 1339 pragma collation_list; 1340 } 1341 } {seq 0 name RTRIM seq 1 name NOCASE seq 2 name BINARY} 1342 do_test pragma-11.2 { 1343 db collate New_Collation blah... 1344 execsql { 1345 pragma collation_list; 1346 } 1347 } {0 New_Collation 1 RTRIM 2 NOCASE 3 BINARY} 1348 } 1349 1350 ifcapable schema_pragmas&&tempdb { 1351 do_test pragma-12.1 { 1352 sqlite3 db2 test.db 1353 execsql { 1354 PRAGMA temp.table_info('abc'); 1355 } db2 1356 } {} 1357 db2 close 1358 1359 do_test pragma-12.2 { 1360 sqlite3 db2 test.db 1361 execsql { 1362 PRAGMA temp.default_cache_size = 200; 1363 PRAGMA temp.default_cache_size; 1364 } db2 1365 } {200} 1366 db2 close 1367 1368 do_test pragma-12.3 { 1369 sqlite3 db2 test.db 1370 execsql { 1371 PRAGMA temp.cache_size = 400; 1372 PRAGMA temp.cache_size; 1373 } db2 1374 } {400} 1375 db2 close 1376 } 1377 1378 ifcapable bloblit { 1379 1380 do_test pragma-13.1 { 1381 execsql { 1382 DROP TABLE IF EXISTS t4; 1383 PRAGMA vdbe_trace=on; 1384 PRAGMA vdbe_listing=on; 1385 PRAGMA sql_trace=on; 1386 CREATE TABLE t4(a INTEGER PRIMARY KEY,b); 1387 INSERT INTO t4(b) VALUES(x'0123456789abcdef0123456789abcdef0123456789'); 1388 INSERT INTO t4(b) VALUES(randstr(30,30)); 1389 INSERT INTO t4(b) VALUES(1.23456); 1390 INSERT INTO t4(b) VALUES(NULL); 1391 INSERT INTO t4(b) VALUES(0); 1392 INSERT INTO t4(b) SELECT b||b||b||b FROM t4; 1393 SELECT * FROM t4; 1394 } 1395 execsql { 1396 PRAGMA vdbe_trace=off; 1397 PRAGMA vdbe_listing=off; 1398 PRAGMA sql_trace=off; 1399 } 1400 } {} 1401 1402 } ;# ifcapable bloblit 1403 1404 ifcapable pager_pragmas { 1405 db close 1406 forcedelete test.db 1407 sqlite3 db test.db 1408 1409 # EVIDENCE-OF: R-15672-33611 PRAGMA schema.page_count; Return the total 1410 # number of pages in the database file. 1411 # 1412 do_test pragma-14.1 { 1413 execsql { pragma auto_vacuum = 0 } 1414 execsql { pragma page_count; pragma main.page_count } 1415 } {0 0} 1416 1417 do_test pragma-14.2 { 1418 execsql { 1419 CREATE TABLE abc(a, b, c); 1420 PRAGMA page_count; 1421 PRAGMA main.page_count; 1422 PRAGMA temp.page_count; 1423 } 1424 } {2 2 0} 1425 do_test pragma-14.2uc { 1426 execsql {pragma PAGE_COUNT} 1427 } {2} 1428 1429 do_test pragma-14.3 { 1430 execsql { 1431 BEGIN; 1432 CREATE TABLE def(a, b, c); 1433 PRAGMA page_count; 1434 } 1435 } {3} 1436 do_test pragma-14.3uc { 1437 execsql {pragma PAGE_COUNT} 1438 } {3} 1439 1440 do_test pragma-14.4 { 1441 set page_size [db one {pragma page_size}] 1442 expr [file size test.db] / $page_size 1443 } {2} 1444 1445 do_test pragma-14.5 { 1446 execsql { 1447 ROLLBACK; 1448 PRAGMA page_count; 1449 } 1450 } {2} 1451 1452 do_test pragma-14.6 { 1453 forcedelete test2.db 1454 sqlite3 db2 test2.db 1455 execsql { 1456 PRAGMA auto_vacuum = 0; 1457 CREATE TABLE t1(a, b, c); 1458 CREATE TABLE t2(a, b, c); 1459 CREATE TABLE t3(a, b, c); 1460 CREATE TABLE t4(a, b, c); 1461 } db2 1462 db2 close 1463 execsql { 1464 ATTACH 'test2.db' AS aux; 1465 PRAGMA aux.page_count; 1466 } 1467 } {5} 1468 do_test pragma-14.6uc { 1469 execsql {pragma AUX.PAGE_COUNT} 1470 } {5} 1471 } 1472 1473 # Test that the value set using the cache_size pragma is not reset when the 1474 # schema is reloaded. 1475 # 1476 ifcapable pager_pragmas { 1477 db close 1478 sqlite3 db test.db 1479 do_test pragma-15.1 { 1480 execsql { 1481 PRAGMA cache_size=59; 1482 PRAGMA cache_size; 1483 } 1484 } {59} 1485 do_test pragma-15.2 { 1486 sqlite3 db2 test.db 1487 execsql { 1488 CREATE TABLE newtable(a, b, c); 1489 } db2 1490 db2 close 1491 } {} 1492 do_test pragma-15.3 { 1493 # Evaluating this statement will cause the schema to be reloaded (because 1494 # the schema was changed by another connection in pragma-15.2). At one 1495 # point there was a bug that reset the cache_size to its default value 1496 # when this happened. 1497 execsql { SELECT * FROM sqlite_master } 1498 execsql { PRAGMA cache_size } 1499 } {59} 1500 } 1501 1502 # Reset the sqlite3_temp_directory variable for the next run of tests: 1503 sqlite3 dbX :memory: 1504 dbX eval {PRAGMA temp_store_directory = ""} 1505 dbX close 1506 1507 ifcapable lock_proxy_pragmas&&prefer_proxy_locking { 1508 set sqlite_hostid_num 1 1509 1510 set using_proxy 0 1511 foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] { 1512 set using_proxy $value 1513 } 1514 1515 # Test the lock_proxy_file pragmas. 1516 # 1517 db close 1518 set env(SQLITE_FORCE_PROXY_LOCKING) "0" 1519 1520 sqlite3 db test.db 1521 do_test pragma-16.1 { 1522 execsql { 1523 PRAGMA lock_proxy_file="mylittleproxy"; 1524 select * from sqlite_master; 1525 } 1526 execsql { 1527 PRAGMA lock_proxy_file; 1528 } 1529 } {mylittleproxy} 1530 1531 do_test pragma-16.2 { 1532 sqlite3 db2 test.db 1533 execsql { 1534 PRAGMA lock_proxy_file="mylittleproxy"; 1535 } db2 1536 } {} 1537 1538 db2 close 1539 do_test pragma-16.2.1 { 1540 sqlite3 db2 test.db 1541 execsql { 1542 PRAGMA lock_proxy_file=":auto:"; 1543 select * from sqlite_master; 1544 } db2 1545 execsql { 1546 PRAGMA lock_proxy_file; 1547 } db2 1548 } {mylittleproxy} 1549 1550 db2 close 1551 do_test pragma-16.3 { 1552 sqlite3 db2 test.db 1553 execsql { 1554 PRAGMA lock_proxy_file="myotherproxy"; 1555 } db2 1556 catchsql { 1557 select * from sqlite_master; 1558 } db2 1559 } {1 {database is locked}} 1560 1561 do_test pragma-16.4 { 1562 db2 close 1563 db close 1564 sqlite3 db2 test.db 1565 execsql { 1566 PRAGMA lock_proxy_file="myoriginalproxy"; 1567 PRAGMA lock_proxy_file="myotherproxy"; 1568 PRAGMA lock_proxy_file; 1569 } db2 1570 } {myotherproxy} 1571 1572 db2 close 1573 set env(SQLITE_FORCE_PROXY_LOCKING) "1" 1574 do_test pragma-16.5 { 1575 sqlite3 db2 test.db 1576 execsql { 1577 PRAGMA lock_proxy_file=":auto:"; 1578 PRAGMA lock_proxy_file; 1579 } db2 1580 } {myotherproxy} 1581 1582 do_test pragma-16.6 { 1583 db2 close 1584 sqlite3 db2 test2.db 1585 set lockpath [execsql { 1586 PRAGMA lock_proxy_file=":auto:"; 1587 PRAGMA lock_proxy_file; 1588 } db2] 1589 string match "*test2.db:auto:" $lockpath 1590 } {1} 1591 1592 set sqlite_hostid_num 2 1593 do_test pragma-16.7 { 1594 list [catch { 1595 sqlite3 db test2.db 1596 execsql { 1597 PRAGMA lock_proxy_file=":auto:"; 1598 select * from sqlite_master; 1599 } 1600 } msg] $msg 1601 } {1 {database is locked}} 1602 db close 1603 1604 do_test pragma-16.8 { 1605 list [catch { 1606 sqlite3 db test2.db 1607 execsql { select * from sqlite_master } 1608 } msg] $msg 1609 } {1 {database is locked}} 1610 1611 db2 close 1612 do_test pragma-16.8.1 { 1613 execsql { 1614 PRAGMA lock_proxy_file="yetanotherproxy"; 1615 PRAGMA lock_proxy_file; 1616 } 1617 } {yetanotherproxy} 1618 do_test pragma-16.8.2 { 1619 execsql { 1620 create table mine(x); 1621 } 1622 } {} 1623 1624 db close 1625 do_test pragma-16.9 { 1626 sqlite3 db proxytest.db 1627 set lockpath2 [execsql { 1628 PRAGMA lock_proxy_file=":auto:"; 1629 PRAGMA lock_proxy_file; 1630 } db] 1631 string match "*proxytest.db:auto:" $lockpath2 1632 } {1} 1633 1634 set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy 1635 set sqlite_hostid_num 0 1636 } 1637 1638 # Parsing of auto_vacuum settings. 1639 # 1640 foreach {autovac_setting val} { 1641 0 0 1642 1 1 1643 2 2 1644 3 0 1645 -1 0 1646 none 0 1647 NONE 0 1648 NoNe 0 1649 full 1 1650 FULL 1 1651 incremental 2 1652 INCREMENTAL 2 1653 -1234 0 1654 1234 0 1655 } { 1656 do_test pragma-17.1.$autovac_setting { 1657 catch {db close} 1658 sqlite3 db :memory: 1659 execsql " 1660 PRAGMA auto_vacuum=$::autovac_setting; 1661 PRAGMA auto_vacuum; 1662 " 1663 } $val 1664 } 1665 1666 # Parsing of temp_store settings. 1667 # 1668 foreach {temp_setting val} { 1669 0 0 1670 1 1 1671 2 2 1672 3 0 1673 -1 0 1674 file 1 1675 FILE 1 1676 fIlE 1 1677 memory 2 1678 MEMORY 2 1679 MeMoRy 2 1680 } { 1681 do_test pragma-18.1.$temp_setting { 1682 catch {db close} 1683 sqlite3 db :memory: 1684 execsql " 1685 PRAGMA temp_store=$::temp_setting; 1686 PRAGMA temp_store=$::temp_setting; 1687 PRAGMA temp_store; 1688 " 1689 } $val 1690 } 1691 1692 # The SQLITE_FCNTL_PRAGMA logic, with error handling. 1693 # 1694 db close 1695 testvfs tvfs 1696 sqlite3 db test.db -vfs tvfs 1697 do_test pragma-19.1 { 1698 catchsql {PRAGMA error} 1699 } {1 {SQL logic error}} 1700 do_test pragma-19.2 { 1701 catchsql {PRAGMA error='This is the error message'} 1702 } {1 {This is the error message}} 1703 do_test pragma-19.3 { 1704 catchsql {PRAGMA error='7 This is the error message'} 1705 } {1 {This is the error message}} 1706 do_test pragma-19.4 { 1707 catchsql {PRAGMA error=7} 1708 } {1 {out of memory}} 1709 do_test pragma-19.5 { 1710 file tail [lindex [execsql {PRAGMA filename}] 0] 1711 } {test.db} 1712 1713 if {$tcl_platform(platform)=="windows"} { 1714 # Test data_store_directory pragma 1715 # 1716 db close 1717 sqlite3 db test.db 1718 file mkdir data_dir 1719 do_test pragma-20.1 { 1720 catchsql {PRAGMA data_store_directory} 1721 } {0 {}} 1722 do_test pragma-20.2 { 1723 set pwd [string map {' ''} [file nativename [get_pwd]]] 1724 catchsql "PRAGMA data_store_directory='$pwd';" 1725 } {0 {}} 1726 do_test pragma-20.3 { 1727 catchsql {PRAGMA data_store_directory} 1728 } [list 0 [list [file nativename [get_pwd]]]] 1729 do_test pragma-20.4 { 1730 set pwd [string map {' ''} [file nativename \ 1731 [file join [get_pwd] data_dir]]] 1732 catchsql "PRAGMA data_store_directory='$pwd';" 1733 } {0 {}} 1734 do_test pragma-20.5 { 1735 sqlite3 db2 test2.db 1736 catchsql "PRAGMA database_list;" db2 1737 } [list 0 [list 0 main [file nativename \ 1738 [file join [get_pwd] data_dir test2.db]]]] 1739 catch {db2 close} 1740 do_test pragma-20.6 { 1741 sqlite3 db2 [file join [get_pwd] test2.db] 1742 catchsql "PRAGMA database_list;" db2 1743 } [list 0 [list 0 main [file nativename \ 1744 [file join [get_pwd] test2.db]]]] 1745 catch {db2 close} 1746 do_test pragma-20.7 { 1747 catchsql "PRAGMA data_store_directory='';" 1748 } {0 {}} 1749 do_test pragma-20.8 { 1750 catchsql {PRAGMA data_store_directory} 1751 } {0 {}} 1752 1753 forcedelete data_dir 1754 } ;# endif windows 1755 1756 database_may_be_corrupt 1757 if {![nonzero_reserved_bytes]} { 1758 1759 do_test 21.1 { 1760 # Create a corrupt database in testerr.db. And a non-corrupt at test.db. 1761 # 1762 db close 1763 forcedelete test.db 1764 sqlite3 db test.db 1765 execsql { 1766 PRAGMA page_size = 1024; 1767 PRAGMA auto_vacuum = 0; 1768 CREATE TABLE t1(a PRIMARY KEY, b); 1769 INSERT INTO t1 VALUES(1, 1); 1770 } 1771 for {set i 0} {$i < 10} {incr i} { 1772 execsql { INSERT INTO t1 SELECT a + (1 << $i), b + (1 << $i) FROM t1 } 1773 } 1774 db close 1775 forcecopy test.db testerr.db 1776 hexio_write testerr.db 15000 [string repeat 55 100] 1777 } {100} 1778 1779 set mainerr {*** in database main *** 1780 Multiple uses for byte 672 of page 15} 1781 set auxerr {*** in database aux *** 1782 Multiple uses for byte 672 of page 15} 1783 1784 set mainerr {/{\*\*\* in database main \*\*\* 1785 Multiple uses for byte 672 of page 15}.*/} 1786 set auxerr {/{\*\*\* in database aux \*\*\* 1787 Multiple uses for byte 672 of page 15}.*/} 1788 1789 do_test 22.2 { 1790 catch { db close } 1791 sqlite3 db testerr.db 1792 execsql { PRAGMA integrity_check } 1793 } $mainerr 1794 1795 do_test 22.3.1 { 1796 catch { db close } 1797 sqlite3 db test.db 1798 execsql { 1799 ATTACH 'testerr.db' AS 'aux'; 1800 PRAGMA integrity_check; 1801 } 1802 } $auxerr 1803 do_test 22.3.2 { 1804 execsql { PRAGMA main.integrity_check; } 1805 } {ok} 1806 do_test 22.3.3 { 1807 execsql { PRAGMA aux.integrity_check; } 1808 } $auxerr 1809 1810 do_test 22.4.1 { 1811 catch { db close } 1812 sqlite3 db testerr.db 1813 execsql { 1814 ATTACH 'test.db' AS 'aux'; 1815 PRAGMA integrity_check; 1816 } 1817 } $mainerr 1818 do_test 22.4.2 { 1819 execsql { PRAGMA main.integrity_check; } 1820 } $mainerr 1821 do_test 22.4.3 { 1822 execsql { PRAGMA aux.integrity_check; } 1823 } {ok} 1824 } 1825 1826 db close 1827 forcedelete test.db test.db-wal test.db-journal 1828 sqlite3 db test.db 1829 sqlite3 db2 test.db 1830 do_test 23.1 { 1831 db eval { 1832 CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d); 1833 CREATE INDEX i1 ON t1(b,c); 1834 CREATE INDEX i2 ON t1(c,d); 1835 CREATE INDEX i2x ON t1(d COLLATE nocase, c DESC); 1836 CREATE TABLE t2(x INTEGER REFERENCES t1); 1837 } 1838 db2 eval {SELECT name FROM sqlite_master} 1839 } {t1 i1 i2 i2x t2} 1840 do_test 23.2a { 1841 db eval { 1842 DROP INDEX i2; 1843 CREATE INDEX i2 ON t1(c,d,b); 1844 } 1845 capture_pragma db2 out {PRAGMA index_info(i2)} 1846 db2 eval {SELECT cid, name, '|' FROM out ORDER BY seqno} 1847 } {2 c | 3 d | 1 b |} 1848 1849 # EVIDENCE-OF: R-56143-29319 PRAGMA schema.index_xinfo(index-name); This 1850 # pragma returns information about every column in an index. 1851 # 1852 # EVIDENCE-OF: R-45970-35618 Unlike this index_info pragma, this pragma 1853 # returns information about every column in the index, not just the key 1854 # columns. 1855 # 1856 do_test 23.2b { 1857 capture_pragma db2 out {PRAGMA index_xinfo(i2)} 1858 db2 eval {SELECT cid, name, "desc", coll, "key", '|' FROM out ORDER BY seqno} 1859 } {2 c 0 BINARY 1 | 3 d 0 BINARY 1 | 1 b 0 BINARY 1 | -1 {} 0 BINARY 0 |} 1860 1861 # (The first column of output from PRAGMA index_xinfo is...) 1862 # EVIDENCE-OF: R-00197-14279 The rank of the column within the index. (0 1863 # means left-most. Key columns come before auxiliary columns.) 1864 # 1865 # (The second column of output from PRAGMA index_xinfo is...) 1866 # EVIDENCE-OF: R-40889-06838 The rank of the column within the table 1867 # being indexed, or -1 if the index-column is the rowid of the table 1868 # being indexed. 1869 # 1870 # (The third column of output from PRAGMA index_xinfo is...) 1871 # EVIDENCE-OF: R-22751-28901 The name of the column being indexed, or 1872 # NULL if the index-column is the rowid of the table being indexed. 1873 # 1874 # (The fourth column of output from PRAGMA index_xinfo is...) 1875 # EVIDENCE-OF: R-11847-09179 1 if the index-column is sorted in reverse 1876 # (DESC) order by the index and 0 otherwise. 1877 # 1878 # (The fifth column of output from PRAGMA index_xinfo is...) 1879 # EVIDENCE-OF: R-15313-19540 The name for the collating sequence used to 1880 # compare values in the index-column. 1881 # 1882 # (The sixth column of output from PRAGMA index_xinfo is...) 1883 # EVIDENCE-OF: R-14310-64553 1 if the index-column is a key column and 0 1884 # if the index-column is an auxiliary column. 1885 # 1886 do_test 23.2c { 1887 db2 eval {PRAGMA index_xinfo(i2)} 1888 } {0 2 c 0 BINARY 1 1 3 d 0 BINARY 1 2 1 b 0 BINARY 1 3 -1 {} 0 BINARY 0} 1889 do_test 23.2d { 1890 db2 eval {PRAGMA index_xinfo(i2x)} 1891 } {0 3 d 0 nocase 1 1 2 c 1 BINARY 1 2 -1 {} 0 BINARY 0} 1892 1893 # EVIDENCE-OF: R-64103-17776 PRAGMA schema.index_list(table-name); This 1894 # pragma returns one row for each index associated with the given table. 1895 # 1896 # (The first column of output from PRAGMA index_list is...) 1897 # EVIDENCE-OF: R-02753-24748 A sequence number assigned to each index 1898 # for internal tracking purposes. 1899 # 1900 # (The second column of output from PRAGMA index_list is...) 1901 # EVIDENCE-OF: R-35496-03635 The name of the index. 1902 # 1903 # (The third column of output from PRAGMA index_list is...) 1904 # EVIDENCE-OF: R-57301-64506 "1" if the index is UNIQUE and "0" if not. 1905 # 1906 # (The fourth column of output from PRAGMA index_list is...) 1907 # EVIDENCE-OF: R-36609-39554 "c" if the index was created by a CREATE 1908 # INDEX statement, "u" if the index was created by a UNIQUE constraint, 1909 # or "pk" if the index was created by a PRIMARY KEY constraint. 1910 # 1911 do_test 23.3 { 1912 db eval { 1913 CREATE INDEX i3 ON t1(d,b,c); 1914 } 1915 capture_pragma db2 out {PRAGMA index_list(t1)} 1916 db2 eval {SELECT seq, name, "unique", origin, '|' FROM out ORDER BY seq} 1917 } {0 i3 0 c | 1 i2 0 c | 2 i2x 0 c | 3 i1 0 c |} 1918 do_test 23.4 { 1919 db eval { 1920 ALTER TABLE t1 ADD COLUMN e; 1921 } 1922 db2 eval { 1923 PRAGMA table_info(t1); 1924 } 1925 } {/4 e {} 0 {} 0/} 1926 do_test 23.5 { 1927 db eval { 1928 DROP TABLE t2; 1929 CREATE TABLE t2(x, y INTEGER REFERENCES t1); 1930 } 1931 db2 eval { 1932 PRAGMA foreign_key_list(t2); 1933 } 1934 } {0 0 t1 y {} {NO ACTION} {NO ACTION} NONE} 1935 db2 close 1936 1937 ifcapable !has_codec { 1938 reset_db 1939 do_execsql_test 24.0 { 1940 PRAGMA page_size = 1024; 1941 CREATE TABLE t1(a, b, c); 1942 CREATE INDEX i1 ON t1(b); 1943 INSERT INTO t1 VALUES('a', 'b', 'c'); 1944 PRAGMA integrity_check; 1945 } {ok} 1946 1947 set r [db one {SELECT rootpage FROM sqlite_master WHERE name = 't1'}] 1948 db close 1949 hexio_write test.db [expr $r*1024 - 16] 000000000000000701040f0f1f616263 1950 1951 sqlite3 db test.db 1952 do_catchsql_test 24.1 { 1953 SELECT * FROM t1; 1954 } {1 {database disk image is malformed}} 1955 do_catchsql_test 24.2 { 1956 PRAGMA integrity_check; 1957 } {0 {{database disk image is malformed}}} 1958 } 1959 database_never_corrupt 1960 finish_test