Index: third_party/sqlite/src/test/pragma.test |
diff --git a/third_party/sqlite/src/test/pragma.test b/third_party/sqlite/src/test/pragma.test |
index 4b4418299cb4c6874912032fe290d8c490c38908..539d867366bbae1bbfa0ac1e0ed0e329947f733d 100644 |
--- a/third_party/sqlite/src/test/pragma.test |
+++ b/third_party/sqlite/src/test/pragma.test |
@@ -16,6 +16,7 @@ |
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
+set testprefix pragma |
# Do not use a codec for tests in this file, as the database file is |
# manipulated directly using tcl scripts (using the [hexio_write] command). |
@@ -40,6 +41,9 @@ do_not_use_codec |
# pragma-15.*: Test that the value set using the cache_size pragma is not |
# reset when the schema is reloaded. |
# pragma-16.*: Test proxy locking |
+# pragma-20.*: Test data_store_directory. |
+# pragma-22.*: Test that "PRAGMA [db].integrity_check" respects the "db" |
+# directive - if it is present. |
# |
ifcapable !pragma { |
@@ -51,8 +55,8 @@ ifcapable !pragma { |
# that the "all.test" script does. |
# |
db close |
-file delete test.db test.db-journal |
-file delete test3.db test3.db-journal |
+delete_file test.db test.db-journal |
+delete_file test3.db test3.db-journal |
sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
@@ -99,7 +103,7 @@ do_test pragma-1.5 { |
PRAGMA default_cache_size; |
PRAGMA synchronous; |
} |
-} [list 4321 $DFLT_CACHE_SZ 0] |
+} [list -4321 $DFLT_CACHE_SZ 0] |
do_test pragma-1.6 { |
execsql { |
PRAGMA synchronous=ON; |
@@ -107,7 +111,7 @@ do_test pragma-1.6 { |
PRAGMA default_cache_size; |
PRAGMA synchronous; |
} |
-} [list 4321 $DFLT_CACHE_SZ 1] |
+} [list -4321 $DFLT_CACHE_SZ 1] |
do_test pragma-1.7 { |
db close |
sqlite3 db test.db |
@@ -221,8 +225,8 @@ do_test pragma-1.18 { |
# Test modifying the safety_level of an attached database. |
ifcapable pager_pragmas&&attach { |
do_test pragma-2.1 { |
- file delete -force test2.db |
- file delete -force test2.db-journal |
+ forcedelete test2.db |
+ forcedelete test2.db-journal |
execsql { |
ATTACH 'test2.db' AS aux; |
} |
@@ -255,7 +259,7 @@ ifcapable pager_pragmas&&attach { |
# |
do_test pragma-3.1 { |
db close |
- file delete -force test.db test.db-journal |
+ forcedelete test.db test.db-journal |
sqlite3 db test.db |
execsql { |
PRAGMA auto_vacuum=OFF; |
@@ -281,38 +285,38 @@ ifcapable attach { |
db close |
sqlite3 db test.db |
execsql {PRAGMA integrity_check} |
- } {{rowid 1 missing from index i2} {rowid 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}} |
do_test pragma-3.3 { |
execsql {PRAGMA integrity_check=1} |
- } {{rowid 1 missing from index i2}} |
+ } {{row 1 missing from index i2}} |
do_test pragma-3.4 { |
execsql { |
ATTACH DATABASE 'test.db' AS t2; |
PRAGMA integrity_check |
} |
- } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 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} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} |
do_test pragma-3.5 { |
execsql { |
PRAGMA integrity_check=4 |
} |
- } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2}} |
+ } {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2}} |
do_test pragma-3.6 { |
execsql { |
PRAGMA integrity_check=xyz |
} |
- } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 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} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} |
do_test pragma-3.7 { |
execsql { |
PRAGMA integrity_check=0 |
} |
- } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 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} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} |
# Add additional corruption by appending unused pages to the end of |
# the database file testerr.db |
# |
do_test pragma-3.8 { |
execsql {DETACH t2} |
- file delete -force testerr.db testerr.db-journal |
+ forcedelete testerr.db testerr.db-journal |
set out [open testerr.db w] |
fconfigure $out -translation binary |
set in [open test.db r] |
@@ -329,6 +333,9 @@ ifcapable attach { |
do_test pragma-3.8.1 { |
execsql {PRAGMA quick_check} |
} {ok} |
+ do_test pragma-3.8.2 { |
+ execsql {PRAGMA QUICK_CHECK} |
+ } {ok} |
do_test pragma-3.9 { |
execsql { |
ATTACH 'testerr.db' AS t2; |
@@ -337,7 +344,7 @@ ifcapable attach { |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}} |
+Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} |
do_test pragma-3.10 { |
execsql { |
PRAGMA integrity_check=1 |
@@ -351,7 +358,7 @@ Page 4 is never used}} |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2}} |
+Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2}} |
do_test pragma-3.12 { |
execsql { |
PRAGMA integrity_check=4 |
@@ -359,7 +366,7 @@ Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from inde |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2}} |
+Page 6 is never used} {row 1 missing from index i2}} |
do_test pragma-3.13 { |
execsql { |
PRAGMA integrity_check=3 |
@@ -383,10 +390,10 @@ Page 5 is never used}} |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** |
+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 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}} |
+Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}} |
do_test pragma-3.16 { |
execsql { |
PRAGMA integrity_check(10) |
@@ -394,10 +401,10 @@ Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from inde |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** |
+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 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2}} |
+Page 6 is never used} {row 1 missing from index i2}} |
do_test pragma-3.17 { |
execsql { |
PRAGMA integrity_check=8 |
@@ -405,7 +412,7 @@ Page 6 is never used} {rowid 1 missing from index i2}} |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 *** |
+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 *** |
Page 4 is never used |
Page 5 is never used}} |
do_test pragma-3.18 { |
@@ -415,16 +422,41 @@ Page 5 is never used}} |
} {{*** in database t2 *** |
Page 4 is never used |
Page 5 is never used |
-Page 6 is never used} {rowid 1 missing from index i2}} |
+Page 6 is never used} {row 1 missing from index i2}} |
} |
do_test pragma-3.19 { |
catch {db close} |
- file delete -force test.db test.db-journal |
+ forcedelete test.db test.db-journal |
sqlite3 db test.db |
db eval {PRAGMA integrity_check} |
} {ok} |
} |
-#exit |
+ |
+# Verify that PRAGMA integrity_check catches UNIQUE and NOT NULL |
+# constraint violations. |
+# |
+do_execsql_test pragma-3.20 { |
+ CREATE TABLE t1(a,b); |
+ CREATE INDEX t1a ON t1(a); |
+ INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(2,4),(NULL,5),(NULL,6); |
+ PRAGMA writable_schema=ON; |
+ UPDATE sqlite_master SET sql='CREATE UNIQUE INDEX t1a ON t1(a)' |
+ WHERE name='t1a'; |
+ UPDATE sqlite_master SET sql='CREATE TABLE t1(a NOT NULL,b)' |
+ WHERE name='t1'; |
+ PRAGMA writable_schema=OFF; |
+ ALTER TABLE t1 RENAME TO t1x; |
+ PRAGMA integrity_check; |
+} {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a} {NULL value in t1x.a}} |
+do_execsql_test pragma-3.21 { |
+ PRAGMA integrity_check(3); |
+} {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a}} |
+do_execsql_test pragma-3.22 { |
+ PRAGMA integrity_check(2); |
+} {{non-unique entry in index t1a} {NULL value in t1x.a}} |
+do_execsql_test pragma-3.21 { |
+ PRAGMA integrity_check(1); |
+} {{non-unique entry in index t1a}} |
# Test modifying the cache_size of an attached database. |
ifcapable pager_pragmas&&attach { |
@@ -527,12 +559,20 @@ do_test pragma-6.2.2 { |
b DEFAULT (5+3), |
c TEXT, |
d INTEGER DEFAULT NULL, |
- e TEXT DEFAULT '' |
+ e TEXT DEFAULT '', |
+ UNIQUE(b,c,d), |
+ PRIMARY KEY(e,b,c) |
); |
PRAGMA table_info(t5); |
} |
-} {0 a TEXT 0 CURRENT_TIMESTAMP 0 1 b {} 0 5+3 0 2 c TEXT 0 <<NULL>> 0 3 d INTEGER 0 NULL 0 4 e TEXT 0 '' 0} |
+} {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} |
db nullvalue {} |
+do_test pragma-6.2.3 { |
+ execsql { |
+ CREATE TABLE t2_3(a,b INTEGER PRIMARY KEY,c); |
+ pragma table_info(t2_3) |
+ } |
+} {0 a {} 0 {} 0 1 b INTEGER 0 {} 1 2 c {} 0 {} 0} |
ifcapable {foreignkey} { |
do_test pragma-6.3.1 { |
execsql { |
@@ -741,8 +781,8 @@ do_test pragma-8.1.10 { |
} SQLITE_SCHEMA |
# Make sure the schema-version can be manipulated in an attached database. |
-file delete -force test2.db |
-file delete -force test2.db-journal |
+forcedelete test2.db |
+forcedelete test2.db-journal |
ifcapable attach { |
do_test pragma-8.1.11 { |
execsql { |
@@ -921,6 +961,16 @@ proc check_temp_store {} { |
return "unknown" |
} |
+# Application_ID |
+# |
+do_test pragma-8.3.1 { |
+ execsql { |
+ PRAGMA application_id; |
+ } |
+} {0} |
+do_test pragma-8.3.2 { |
+ execsql {PRAGMA Application_ID(12345); PRAGMA application_id;} |
+} {12345} |
# Test temp_store and temp_store_directory pragmas |
# |
@@ -987,7 +1037,7 @@ do_test pragma-9.4 { |
} {} |
ifcapable wsd { |
do_test pragma-9.5 { |
- set pwd [string map {' ''} [file nativename [pwd]]] |
+ set pwd [string map {' ''} [file nativename [get_pwd]]] |
execsql " |
PRAGMA temp_store_directory='$pwd'; |
" |
@@ -996,7 +1046,7 @@ ifcapable wsd { |
execsql { |
PRAGMA temp_store_directory; |
} |
- } [list [file nativename [pwd]]] |
+ } [list [file nativename [get_pwd]]] |
do_test pragma-9.7 { |
catchsql { |
PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR'; |
@@ -1205,7 +1255,7 @@ do_test pragma-13.1 { |
ifcapable pager_pragmas { |
db close |
- file delete -force test.db |
+ forcedelete test.db |
sqlite3 db test.db |
do_test pragma-14.1 { |
@@ -1219,6 +1269,9 @@ ifcapable pager_pragmas { |
PRAGMA page_count; |
} |
} {2} |
+ do_test pragma-14.2uc { |
+ execsql {pragma PAGE_COUNT} |
+ } {2} |
do_test pragma-14.3 { |
execsql { |
@@ -1227,6 +1280,9 @@ ifcapable pager_pragmas { |
PRAGMA page_count; |
} |
} {3} |
+ do_test pragma-14.3uc { |
+ execsql {pragma PAGE_COUNT} |
+ } {3} |
do_test pragma-14.4 { |
set page_size [db one {pragma page_size}] |
@@ -1241,7 +1297,7 @@ ifcapable pager_pragmas { |
} {2} |
do_test pragma-14.6 { |
- file delete -force test2.db |
+ forcedelete test2.db |
sqlite3 db2 test2.db |
execsql { |
PRAGMA auto_vacuum = 0; |
@@ -1256,6 +1312,9 @@ ifcapable pager_pragmas { |
PRAGMA aux.page_count; |
} |
} {5} |
+ do_test pragma-14.6uc { |
+ execsql {pragma AUX.PAGE_COUNT} |
+ } {5} |
} |
# Test that the value set using the cache_size pragma is not reset when the |
@@ -1477,4 +1536,181 @@ foreach {temp_setting val} { |
} $val |
} |
+# The SQLITE_FCNTL_PRAGMA logic, with error handling. |
+# |
+db close |
+testvfs tvfs |
+sqlite3 db test.db -vfs tvfs |
+do_test pragma-19.1 { |
+ catchsql {PRAGMA error} |
+} {1 {SQL logic error or missing database}} |
+do_test pragma-19.2 { |
+ catchsql {PRAGMA error='This is the error message'} |
+} {1 {This is the error message}} |
+do_test pragma-19.3 { |
+ catchsql {PRAGMA error='7 This is the error message'} |
+} {1 {This is the error message}} |
+do_test pragma-19.4 { |
+ catchsql {PRAGMA error=7} |
+} {1 {out of memory}} |
+do_test pragma-19.5 { |
+ file tail [lindex [execsql {PRAGMA filename}] 0] |
+} {test.db} |
+ |
+if {$tcl_platform(platform)=="windows"} { |
+# Test data_store_directory pragma |
+# |
+db close |
+sqlite3 db test.db |
+file mkdir data_dir |
+do_test pragma-20.1 { |
+ catchsql {PRAGMA data_store_directory} |
+} {0 {}} |
+do_test pragma-20.2 { |
+ set pwd [string map {' ''} [file nativename [get_pwd]]] |
+ catchsql "PRAGMA data_store_directory='$pwd';" |
+} {0 {}} |
+do_test pragma-20.3 { |
+ catchsql {PRAGMA data_store_directory} |
+} [list 0 [list [file nativename [get_pwd]]]] |
+do_test pragma-20.4 { |
+ set pwd [string map {' ''} [file nativename \ |
+ [file join [get_pwd] data_dir]]] |
+ catchsql "PRAGMA data_store_directory='$pwd';" |
+} {0 {}} |
+do_test pragma-20.5 { |
+ sqlite3 db2 test2.db |
+ catchsql "PRAGMA database_list;" db2 |
+} [list 0 [list 0 main [file nativename \ |
+ [file join [get_pwd] data_dir test2.db]]]] |
+catch {db2 close} |
+do_test pragma-20.6 { |
+ sqlite3 db2 [file join [get_pwd] test2.db] |
+ catchsql "PRAGMA database_list;" db2 |
+} [list 0 [list 0 main [file nativename \ |
+ [file join [get_pwd] test2.db]]]] |
+catch {db2 close} |
+do_test pragma-20.7 { |
+ catchsql "PRAGMA data_store_directory='';" |
+} {0 {}} |
+do_test pragma-20.8 { |
+ catchsql {PRAGMA data_store_directory} |
+} {0 {}} |
+ |
+forcedelete data_dir |
+} ;# endif windows |
+ |
+database_may_be_corrupt |
+ |
+do_test 21.1 { |
+ # Create a corrupt database in testerr.db. And a non-corrupt at test.db. |
+ # |
+ db close |
+ forcedelete test.db |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA page_size = 1024; |
+ PRAGMA auto_vacuum = 0; |
+ CREATE TABLE t1(a PRIMARY KEY, b); |
+ INSERT INTO t1 VALUES(1, 1); |
+ } |
+ for {set i 0} {$i < 10} {incr i} { |
+ execsql { INSERT INTO t1 SELECT a + (1 << $i), b + (1 << $i) FROM t1 } |
+ } |
+ db close |
+ forcecopy test.db testerr.db |
+ hexio_write testerr.db 15000 [string repeat 55 100] |
+} {100} |
+ |
+set mainerr {*** in database main *** |
+Multiple uses for byte 672 of page 15} |
+set auxerr {*** in database aux *** |
+Multiple uses for byte 672 of page 15} |
+ |
+set mainerr {/{\*\*\* in database main \*\*\* |
+Multiple uses for byte 672 of page 15}.*/} |
+set auxerr {/{\*\*\* in database aux \*\*\* |
+Multiple uses for byte 672 of page 15}.*/} |
+ |
+do_test 22.2 { |
+ catch { db close } |
+ sqlite3 db testerr.db |
+ execsql { PRAGMA integrity_check } |
+} $mainerr |
+ |
+do_test 22.3.1 { |
+ catch { db close } |
+ sqlite3 db test.db |
+ execsql { |
+ ATTACH 'testerr.db' AS 'aux'; |
+ PRAGMA integrity_check; |
+ } |
+} $auxerr |
+do_test 22.3.2 { |
+ execsql { PRAGMA main.integrity_check; } |
+} {ok} |
+do_test 22.3.3 { |
+ execsql { PRAGMA aux.integrity_check; } |
+} $auxerr |
+ |
+do_test 22.4.1 { |
+ catch { db close } |
+ sqlite3 db testerr.db |
+ execsql { |
+ ATTACH 'test.db' AS 'aux'; |
+ PRAGMA integrity_check; |
+ } |
+} $mainerr |
+do_test 22.4.2 { |
+ execsql { PRAGMA main.integrity_check; } |
+} $mainerr |
+do_test 22.4.3 { |
+ execsql { PRAGMA aux.integrity_check; } |
+} {ok} |
+ |
+db close |
+forcedelete test.db test.db-wal test.db-journal |
+sqlite3 db test.db |
+sqlite3 db2 test.db |
+do_test 23.1 { |
+ db eval { |
+ CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d); |
+ CREATE INDEX i1 ON t1(b,c); |
+ CREATE INDEX i2 ON t1(c,d); |
+ CREATE TABLE t2(x INTEGER REFERENCES t1); |
+ } |
+ db2 eval {SELECT name FROM sqlite_master} |
+} {t1 i1 i2 t2} |
+do_test 23.2 { |
+ db eval { |
+ DROP INDEX i2; |
+ CREATE INDEX i2 ON t1(c,d,b); |
+ } |
+ db2 eval {PRAGMA index_info(i2)} |
+} {0 2 c 1 3 d 2 1 b} |
+do_test 23.3 { |
+ db eval { |
+ CREATE INDEX i3 ON t1(d,b,c); |
+ } |
+ db2 eval {PRAGMA index_list(t1)} |
+} {0 i3 0 1 i2 0 2 i1 0} |
+do_test 23.4 { |
+ db eval { |
+ ALTER TABLE t1 ADD COLUMN e; |
+ } |
+ db2 eval { |
+ PRAGMA table_info(t1); |
+ } |
+} {/4 e {} 0 {} 0/} |
+do_test 23.5 { |
+ db eval { |
+ DROP TABLE t2; |
+ CREATE TABLE t2(x, y INTEGER REFERENCES t1); |
+ } |
+ db2 eval { |
+ PRAGMA foreign_key_list(t2); |
+ } |
+} {0 0 t1 y {} {NO ACTION} {NO ACTION} NONE} |
+ |
+database_never_corrupt |
finish_test |