📄 shared.test
字号:
} db1 } {}}ifcapable trigger { do_test shared-$av.5.1.4 { execsql { CREATE TRIGGER test1.trig1 AFTER INSERT ON t1 BEGIN INSERT INTO t1 VALUES(new.a, new.b); END; } db1 } {}}do_test shared-$av.5.1.5 { execsql { DROP INDEX i1; } db2} {}ifcapable view { do_test shared-$av.5.1.6 { execsql { DROP VIEW v1; } db2 } {}}ifcapable trigger { do_test shared-$av.5.1.7 { execsql { DROP TRIGGER trig1; } db2 } {}}do_test shared-$av.5.1.8 { execsql { DROP TABLE t1; } db2} {}ifcapable compound { do_test shared-$av.5.1.9 { execsql { SELECT * FROM sqlite_master UNION ALL SELECT * FROM test1.sqlite_master } db1 } {}}#--------------------------------------------------------------------------# Tests shared-6.* test that a query obtains all the read-locks it needs# before starting execution of the query. This means that there is no chance# some rows of data will be returned before a lock fails and SQLITE_LOCK# is returned.#do_test shared-$av.6.1.1 { execsql { CREATE TABLE t1(a, b); CREATE TABLE t2(a, b); INSERT INTO t1 VALUES(1, 2); INSERT INTO t2 VALUES(3, 4); } db1} {}ifcapable compound { do_test shared-$av.6.1.2 { execsql { SELECT * FROM t1 UNION ALL SELECT * FROM t2; } db2 } {1 2 3 4}}do_test shared-$av.6.1.3 { # Establish a write lock on table t2 via connection db2. Then make a # UNION all query using connection db1 that first accesses t1, followed # by t2. If the locks are grabbed at the start of the statement (as # they should be), no rows are returned. If (as was previously the case) # they are grabbed as the tables are accessed, the t1 rows will be # returned before the query fails. # execsql { BEGIN; INSERT INTO t2 VALUES(5, 6); } db2 set ret [list] catch { db1 eval {SELECT * FROM t1 UNION ALL SELECT * FROM t2} { lappend ret $a $b } } set ret} {}do_test shared-$av.6.1.4 { execsql { COMMIT; BEGIN; INSERT INTO t1 VALUES(7, 8); } db2 set ret [list] catch { db1 eval { SELECT (CASE WHEN a>4 THEN (SELECT a FROM t1) ELSE 0 END) AS d FROM t2; } { lappend ret $d } } set ret} {}catch {db1 close}catch {db2 close}foreach f [list test.db test2.db] { file delete -force $f ${f}-journal}#--------------------------------------------------------------------------# Tests shared-7.* test auto-vacuum does not invalidate cursors from# other shared-cache users when it reorganizes the database on # COMMIT.#do_test shared-$av.7.1 { # This test case sets up a test database in auto-vacuum mode consisting # of two tables, t1 and t2. Both have a single index. Table t1 is # populated first (so consists of pages toward the start of the db file), # t2 second (pages toward the end of the file). sqlite3 db test.db sqlite3 db2 test.db execsql { BEGIN; CREATE TABLE t1(a PRIMARY KEY, b); CREATE TABLE t2(a PRIMARY KEY, b); } set ::contents {} for {set i 0} {$i < 100} {incr i} { set a [string repeat "$i " 20] set b [string repeat "$i " 20] db eval { INSERT INTO t1 VALUES(:a, :b); } lappend ::contents [list [expr $i+1] $a $b] } execsql { INSERT INTO t2 SELECT * FROM t1; COMMIT; }} {}do_test shared-$av.7.2 { # This test case deletes the contents of table t1 (the one at the start of # the file) while many cursors are open on table t2 and it's index. All of # the non-root pages will be moved from the end to the start of the file # when the DELETE is committed - this test verifies that moving the pages # does not disturb the open cursors. # proc lockrow {db tbl oids body} { set ret [list] db eval "SELECT oid AS i, a, b FROM $tbl ORDER BY a" { if {$i==[lindex $oids 0]} { set noids [lrange $oids 1 end] if {[llength $noids]==0} { set subret [eval $body] } else { set subret [lockrow $db $tbl $noids $body] } } lappend ret [list $i $a $b] } return [linsert $subret 0 $ret] } proc locktblrows {db tbl body} { set oids [db eval "SELECT oid FROM $tbl"] lockrow $db $tbl $oids $body } set scans [locktblrows db t2 { execsql { DELETE FROM t1; } db2 }] set error 0 # Test that each SELECT query returned the expected contents of t2. foreach s $scans { if {[lsort -integer -index 0 $s]!=$::contents} { set error 1 } } set error} {0}catch {db close}catch {db2 close}unset -nocomplain contents#--------------------------------------------------------------------------# The following tests try to trick the shared-cache code into assuming# the wrong encoding for a database.#file delete -force test.db test.db-journalifcapable utf16 { do_test shared-$av.8.1.1 { sqlite3 db test.db execsql { PRAGMA encoding = 'UTF-16'; SELECT * FROM sqlite_master; } } {} do_test shared-$av.8.1.2 { string range [execsql {PRAGMA encoding;}] 0 end-2 } {UTF-16} do_test shared-$av.8.1.3 { sqlite3 db2 test.db execsql { PRAGMA encoding = 'UTF-8'; CREATE TABLE abc(a, b, c); } db2 } {} do_test shared-$av.8.1.4 { execsql { SELECT * FROM sqlite_master; } } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}" do_test shared-$av.8.1.5 { db2 close execsql { PRAGMA encoding; } } {UTF-8} file delete -force test2.db test2.db-journal do_test shared-$av.8.2.1 { execsql { ATTACH 'test2.db' AS aux; SELECT * FROM aux.sqlite_master; } } {} do_test shared-$av.8.2.2 { sqlite3 db2 test2.db execsql { PRAGMA encoding = 'UTF-16'; CREATE TABLE def(d, e, f); } db2 string range [execsql {PRAGMA encoding;} db2] 0 end-2 } {UTF-16} do_test shared-$av.8.2.3 { catchsql { SELECT * FROM aux.sqlite_master; } } {1 {attached databases must use the same text encoding as main database}}}catch {db close}catch {db2 close}file delete -force test.db test2.db#---------------------------------------------------------------------------# The following tests - shared-9.* - test interactions between TEMP triggers# and shared-schemas.#ifcapable trigger&&tempdb {do_test shared-$av.9.1 { sqlite3 db test.db sqlite3 db2 test.db execsql { CREATE TABLE abc(a, b, c); CREATE TABLE abc_mirror(a, b, c); CREATE TEMP TRIGGER BEFORE INSERT ON abc BEGIN INSERT INTO abc_mirror(a, b, c) VALUES(new.a, new.b, new.c); END; INSERT INTO abc VALUES(1, 2, 3); SELECT * FROM abc_mirror; }} {1 2 3}do_test shared-$av.9.2 { execsql { INSERT INTO abc VALUES(4, 5, 6); SELECT * FROM abc_mirror; } db2} {1 2 3}do_test shared-$av.9.3 { db close db2 close} {}} ; # End shared-9.*#---------------------------------------------------------------------------# The following tests - shared-10.* - test that the library behaves # correctly when a connection to a shared-cache is closed. #do_test shared-$av.10.1 { # Create a small sample database with two connections to it (db and db2). file delete -force test.db sqlite3 db test.db sqlite3 db2 test.db execsql { CREATE TABLE ab(a PRIMARY KEY, b); CREATE TABLE de(d PRIMARY KEY, e); INSERT INTO ab VALUES('Chiang Mai', 100000); INSERT INTO ab VALUES('Bangkok', 8000000); INSERT INTO de VALUES('Ubon', 120000); INSERT INTO de VALUES('Khon Kaen', 200000); }} {}do_test shared-$av.10.2 { # Open a read-transaction with the first connection, a write-transaction # with the second. execsql { BEGIN; SELECT * FROM ab; } execsql { BEGIN; INSERT INTO de VALUES('Pataya', 30000); } db2} {}do_test shared-$av.10.3 { # An external connection should be able to read the database, but not # prepare a write operation. if {$::tcl_platform(platform)=="unix"} { sqlite3 db3 ./test.db } else { sqlite3 db3 TEST.DB } execsql { SELECT * FROM ab; } db3 catchsql { BEGIN; INSERT INTO de VALUES('Pataya', 30000); } db3} {1 {database is locked}}do_test shared-$av.10.4 { # Close the connection with the write-transaction open db2 close} {}do_test shared-$av.10.5 { # Test that the db2 transaction has been automatically rolled back. # If it has not the ('Pataya', 30000) entry will still be in the table. execsql { SELECT * FROM de; }} {Ubon 120000 {Khon Kaen} 200000}do_test shared-$av.10.5 { # Closing db2 should have dropped the shared-cache back to a read-lock. # So db3 should be able to prepare a write... catchsql {INSERT INTO de VALUES('Pataya', 30000);} db3} {0 {}}do_test shared-$av.10.6 { # ... but not commit it. catchsql {COMMIT} db3} {1 {database is locked}}do_test shared-$av.10.7 { # Commit the (read-only) db transaction. Check via db3 to make sure the # contents of table "de" are still as they should be. execsql { COMMIT; } execsql { SELECT * FROM de; } db3} {Ubon 120000 {Khon Kaen} 200000 Pataya 30000}do_test shared-$av.10.9 { # Commit the external transaction. catchsql {COMMIT} db3} {0 {}}integrity_check shared-$av.10.10do_test shared-$av.10.11 { db close db3 close} {}do_test shared-$av.11.1 { file delete -force test.db sqlite3 db test.db sqlite3 db2 test.db execsql { CREATE TABLE abc(a, b, c); CREATE TABLE abc2(a, b, c); BEGIN; INSERT INTO abc VALUES(1, 2, 3); }} {}do_test shared-$av.11.2 { catchsql {BEGIN;} db2 catchsql {SELECT * FROM abc;} db2} {1 {database table is locked: abc}}do_test shared-$av.11.3 { catchsql {BEGIN} db2} {1 {cannot start a transaction within a transaction}}do_test shared-$av.11.4 { catchsql {SELECT * FROM abc2;} db2} {0 {}}do_test shared-$av.11.5 { catchsql {INSERT INTO abc2 VALUES(1, 2, 3);} db2} {1 {database is locked}}do_test shared-$av.11.6 { catchsql {SELECT * FROM abc2}} {0 {}}do_test shared-$av.11.6 { execsql { ROLLBACK; PRAGMA read_uncommitted = 1; } db2} {}do_test shared-$av.11.7 { execsql { INSERT INTO abc2 VALUES(4, 5, 6); INSERT INTO abc2 VALUES(7, 8, 9); }} {}do_test shared-$av.11.8 { set res [list] breakpoint db2 eval { SELECT abc.a as I, abc2.a as II FROM abc, abc2; } { execsql { DELETE FROM abc WHERE 1; } lappend res $I $II } set res} {1 4 {} 7}if {[llength [info command sqlite3_shared_cache_report]]==1} { do_test shared-$av.11.9 { sqlite3_shared_cache_report } [list [file normalize test.db] 2]}do_test shared-$av.11.11 { db close db2 close} {}}sqlite3_enable_shared_cache $::enable_shared_cachefinish_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -