141113b64Sdan# 2016 March 3 241113b64Sdan# 341113b64Sdan# The author disclaims copyright to this source code. In place of 441113b64Sdan# a legal notice, here is a blessing: 541113b64Sdan# 641113b64Sdan# May you do good and not evil. 741113b64Sdan# May you find forgiveness for yourself and forgive others. 841113b64Sdan# May you share freely, never taking more than you give. 941113b64Sdan# 1041113b64Sdan#*********************************************************************** 11*cf2ad7aeSdan# 12*cf2ad7aeSdan# TESTRUNNER: slow 13*cf2ad7aeSdan# 1441113b64Sdan 1541113b64Sdanset testdir [file dirname $argv0] 1641113b64Sdansource $testdir/tester.tcl 1741113b64Sdanset testprefix temptable2 1841113b64Sdan 1941113b64Sdando_execsql_test 1.1 { 2041113b64Sdan CREATE TEMP TABLE t1(a, b); 2141113b64Sdan CREATE INDEX i1 ON t1(a, b); 2241113b64Sdan} 2341113b64Sdan 2441113b64Sdando_execsql_test 1.2 { 2541113b64Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100000 ) 2641113b64Sdan INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM X; 2741113b64Sdan} {} 2841113b64Sdan 2941113b64Sdando_execsql_test 1.3 { 3041113b64Sdan PRAGMA temp.integrity_check; 3141113b64Sdan} {ok} 3241113b64Sdan 3341113b64Sdan#------------------------------------------------------------------------- 3441113b64Sdan# 3541113b64Sdanreset_db 3641113b64Sdando_execsql_test 2.1 { 3741113b64Sdan CREATE TEMP TABLE t2(a, b); 3841113b64Sdan INSERT INTO t2 VALUES(1, 2); 3941113b64Sdan} {} 4041113b64Sdan 4141113b64Sdando_execsql_test 2.2 { 4241113b64Sdan BEGIN; 4341113b64Sdan INSERT INTO t2 VALUES(3, 4); 4441113b64Sdan SELECT * FROM t2; 4541113b64Sdan} {1 2 3 4} 4641113b64Sdan 4741113b64Sdando_execsql_test 2.3 { 4841113b64Sdan ROLLBACK; 4941113b64Sdan SELECT * FROM t2; 5041113b64Sdan} {1 2} 5141113b64Sdan 5241113b64Sdan#------------------------------------------------------------------------- 5341113b64Sdan# 5441113b64Sdanreset_db 5541113b64Sdando_execsql_test 3.1.1 { 5641113b64Sdan PRAGMA main.cache_size = 10; 5741113b64Sdan PRAGMA temp.cache_size = 10; 5841113b64Sdan 5941113b64Sdan CREATE TEMP TABLE t1(a, b); 6041113b64Sdan CREATE INDEX i1 ON t1(a, b); 6141113b64Sdan 6241113b64Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 ) 6341113b64Sdan INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; 6441113b64Sdan 6541113b64Sdan SELECT count(*) FROM t1; 6641113b64Sdan} {1000} 6741113b64Sdando_execsql_test 3.1.2 { 6841113b64Sdan BEGIN; 6941113b64Sdan UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0; 7041113b64Sdan ROLLBACK; 7141113b64Sdan} 7241113b64Sdando_execsql_test 3.1.3 { 7341113b64Sdan SELECT count(*) FROM t1; 7441113b64Sdan} {1000} 7541113b64Sdando_execsql_test 3.1.4 { PRAGMA temp.integrity_check } {ok} 7641113b64Sdan 7741113b64Sdando_execsql_test 3.2.1 { 7841113b64Sdan BEGIN; 7941113b64Sdan UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0; 8041113b64Sdan SAVEPOINT abc; 8141113b64Sdan UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==1; 8241113b64Sdan ROLLBACK TO abc; 8341113b64Sdan UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==2; 8441113b64Sdan COMMIT; 8541113b64Sdan} 8641113b64Sdando_execsql_test 3.2.2 { PRAGMA temp.integrity_check } {ok} 8741113b64Sdan 8841113b64Sdan#------------------------------------------------------------------------- 8941113b64Sdan# 9041113b64Sdanreset_db 9141113b64Sdando_execsql_test 4.1.1 { 9241113b64Sdan PRAGMA main.cache_size = 10; 9341113b64Sdan PRAGMA temp.cache_size = 10; 9441113b64Sdan 9541113b64Sdan CREATE TEMP TABLE t1(a, b); 9641113b64Sdan CREATE INDEX i1 ON t1(a, b); 9741113b64Sdan 9841113b64Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<10 ) 9941113b64Sdan INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; 10041113b64Sdan 10141113b64Sdan SELECT count(*) FROM t1; 10241113b64Sdan PRAGMA temp.page_count; 10341113b64Sdan} {10 9} 10441113b64Sdan 10541113b64Sdando_execsql_test 4.1.2 { 10641113b64Sdan BEGIN; 10741113b64Sdan UPDATE t1 SET b=randomblob(100); 10841113b64Sdan ROLLBACK; 10941113b64Sdan} 11041113b64Sdan 11141113b64Sdando_execsql_test 4.1.3 { 11241113b64Sdan CREATE TEMP TABLE t2(a, b); 11341113b64Sdan CREATE INDEX i2 ON t2(a, b); 11441113b64Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) 11541113b64Sdan INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; 11641113b64Sdan 11741113b64Sdan SELECT count(*) FROM t2; 11841113b64Sdan SELECT count(*) FROM t1; 1199131ab93Sdan} {500 10} 1209131ab93Sdan 1219131ab93Sdando_test 4.1.4 { 1229131ab93Sdan set n [db one { PRAGMA temp.page_count }] 1239131ab93Sdan expr ($n >280 && $n < 300) 1249131ab93Sdan} 1 12541113b64Sdan 12641113b64Sdando_execsql_test 4.1.4 { PRAGMA temp.integrity_check } {ok} 12741113b64Sdan 12841113b64Sdan#------------------------------------------------------------------------- 12941113b64Sdan# 13041113b64Sdanreset_db 13141113b64Sdando_execsql_test 5.1.1 { 13241113b64Sdan PRAGMA main.cache_size = 10; 13341113b64Sdan PRAGMA temp.cache_size = 10; 13441113b64Sdan 13541113b64Sdan CREATE TEMP TABLE t2(a, b); 13641113b64Sdan CREATE INDEX i2 ON t2(a, b); 13741113b64Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) 13841113b64Sdan INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; 13941113b64Sdan 14041113b64Sdan CREATE TEMP TABLE t1(a, b); 14141113b64Sdan CREATE INDEX i1 ON t1(a, b); 14241113b64Sdan INSERT INTO t1 VALUES(1, 2); 1439131ab93Sdan} 14441113b64Sdan 1454a030c64Sdan# Test that the temp database is now much bigger than the configured 1464a030c64Sdan# cache size (10 pages). 1479131ab93Sdando_test 5.1.2 { 1489131ab93Sdan set n [db one { PRAGMA temp.page_count }] 1494a030c64Sdan expr ($n > 270 && $n < 290) 1509131ab93Sdan} {1} 15141113b64Sdan 1529131ab93Sdando_execsql_test 5.1.3 { 15341113b64Sdan BEGIN; 15441113b64Sdan UPDATE t1 SET a=2; 15541113b64Sdan UPDATE t2 SET a=randomblob(100); 15641113b64Sdan SELECT count(*) FROM t1; 15741113b64Sdan ROLLBACK; 15841113b64Sdan} {1} 15941113b64Sdan 1609131ab93Sdando_execsql_test 5.1.4 { 16141113b64Sdan UPDATE t2 SET a=randomblob(100); 16241113b64Sdan 16341113b64Sdan SELECT * FROM t1; 16441113b64Sdan} {1 2} 16541113b64Sdan 1669131ab93Sdando_execsql_test 5.1.5 { PRAGMA temp.integrity_check } {ok} 16741113b64Sdan 168d87efd72Sdan#------------------------------------------------------------------------- 169d87efd72Sdan# Test this: 170d87efd72Sdan# 171d87efd72Sdan# 1. Page is DIRTY at the start of a transaction. 172d87efd72Sdan# 2. Page is written out as part of the transaction. 173d87efd72Sdan# 3. Page is then read back in. 174d87efd72Sdan# 4. Transaction is rolled back. Is the page now clean or dirty? 175d87efd72Sdan# 176d87efd72Sdan# This actually does work. Step 4 marks the page as clean. But it also 177d87efd72Sdan# writes to the database file itself. So marking it clean is correct - 178d87efd72Sdan# the page does match the contents of the db file. 179d87efd72Sdan# 180d87efd72Sdanreset_db 181d87efd72Sdan 182d87efd72Sdando_execsql_test 6.1 { 183d87efd72Sdan PRAGMA main.cache_size = 10; 184d87efd72Sdan PRAGMA temp.cache_size = 10; 185d87efd72Sdan 186d87efd72Sdan CREATE TEMP TABLE t1(x); 187d87efd72Sdan INSERT INTO t1 VALUES('one'); 188d87efd72Sdan 189d87efd72Sdan CREATE TEMP TABLE t2(a, b); 190d87efd72Sdan CREATE INDEX i2 ON t2(a, b); 191d87efd72Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) 192d87efd72Sdan INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x; 193d87efd72Sdan} 194d87efd72Sdan 195d87efd72Sdando_execsql_test 6.2 { 196d87efd72Sdan UPDATE t1 SET x='two'; -- step 1 197d87efd72Sdan BEGIN; 198d87efd72Sdan UPDATE t2 SET a=randomblob(100); -- step 2 199d87efd72Sdan SELECT * FROM t1; -- step 3 200d87efd72Sdan ROLLBACK; -- step 4 201d87efd72Sdan 202d87efd72Sdan SELECT count(*) FROM t2; 203d87efd72Sdan SELECT * FROM t1; 204d87efd72Sdan} {two 500 two} 205d87efd72Sdan 206d87efd72Sdan#------------------------------------------------------------------------- 2079131ab93Sdan# 208d87efd72Sdanreset_db 209d87efd72Sdansqlite3 db "" 210d87efd72Sdando_execsql_test 7.1 { 211d87efd72Sdan PRAGMA auto_vacuum=INCREMENTAL; 212d87efd72Sdan CREATE TABLE t1(x); 213d87efd72Sdan INSERT INTO t1 VALUES(zeroblob(900)); 214d87efd72Sdan INSERT INTO t1 VALUES(zeroblob(900)); 215d87efd72Sdan INSERT INTO t1 SELECT x FROM t1; 216d87efd72Sdan INSERT INTO t1 SELECT x FROM t1; 217d87efd72Sdan INSERT INTO t1 SELECT x FROM t1; 218d87efd72Sdan INSERT INTO t1 SELECT x FROM t1; 219d87efd72Sdan BEGIN; 220d87efd72Sdan DELETE FROM t1 WHERE rowid%2; 221d87efd72Sdan PRAGMA incremental_vacuum(4); 222d87efd72Sdan ROLLBACK; 223d87efd72Sdan PRAGMA integrity_check; 224d87efd72Sdan} {ok} 225d87efd72Sdan 2269131ab93Sdan#------------------------------------------------------------------------- 2279131ab93Sdan# Try changing the page size using a backup operation when pages are 2289131ab93Sdan# stored in main-memory only. 2299131ab93Sdan# 2309131ab93Sdanreset_db 2319131ab93Sdando_execsql_test 8.1 { 23245164826Sdan PRAGMA auto_vacuum = OFF; 2339131ab93Sdan CREATE TABLE t2(a, b); 2349131ab93Sdan CREATE INDEX i2 ON t2(a, b); 2359131ab93Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<20 ) 23639f98c52Sdan INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2; 2379131ab93Sdan PRAGMA page_count; 2389131ab93Sdan} {13} 2399131ab93Sdan 2409131ab93Sdando_test 8.2 { 2419131ab93Sdan sqlite3 tmp "" 2429131ab93Sdan execsql { 24345164826Sdan PRAGMA auto_vacuum = OFF; 2449131ab93Sdan PRAGMA page_size = 8192; 2459131ab93Sdan CREATE TABLE t1(a, b); 2469131ab93Sdan CREATE INDEX i1 ON t1(a, b); 2479131ab93Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100 ) 24839f98c52Sdan INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2; 2499131ab93Sdan PRAGMA page_count; 2509131ab93Sdan } tmp 2519131ab93Sdan} {10} 2529131ab93Sdan 2539131ab93Sdando_test 8.3 { 2549131ab93Sdan sqlite3_backup B tmp main db main 2559131ab93Sdan B step 5 2569131ab93Sdan B finish 2579131ab93Sdan} {SQLITE_READONLY} 2589131ab93Sdan 2599131ab93Sdando_test 8.4 { 2609131ab93Sdan execsql { 2619131ab93Sdan SELECT count(*) FROM t1; 2629131ab93Sdan PRAGMA integrity_check; 2639131ab93Sdan PRAGMA page_size; 2649131ab93Sdan } tmp 2659131ab93Sdan} {100 ok 8192} 2669131ab93Sdan 2679131ab93Sdando_test 8.5 { 2689131ab93Sdan tmp eval { UPDATE t1 SET a=randomblob(100) } 2699131ab93Sdan} {} 2709131ab93Sdan 2719131ab93Sdando_test 8.6 { 2729131ab93Sdan sqlite3_backup B tmp main db main 2739131ab93Sdan B step 1000 2749131ab93Sdan B finish 2759131ab93Sdan} {SQLITE_READONLY} 2769131ab93Sdan 2779131ab93Sdantmp close 2789131ab93Sdan 279b9f11f93Sdan#------------------------------------------------------------------------- 280b9f11f93Sdan# Try inserts and deletes with a large db in auto-vacuum mode. Check 281b9f11f93Sdan# 282b5a2592aSdanforeach {tn mode} { 283b5a2592aSdan 1 delete 284b5a2592aSdan 2 wal 285b5a2592aSdan} { 286b9f11f93Sdan reset_db 2870e55da2eSdan sqlite3 db "" 288b5a2592aSdan do_execsql_test 9.$tn.1.1 { 289b9f11f93Sdan PRAGMA cache_size = 15; 290b5a2592aSdan PRAGMA auto_vacuum = 1; 291b5a2592aSdan } 2924a030c64Sdan execsql "PRAGMA journal_mode = $mode" 293b5a2592aSdan 2944a030c64Sdan do_execsql_test 9.$tn.1.2 { 295b9f11f93Sdan CREATE TABLE tx(a, b); 296b9f11f93Sdan CREATE INDEX i1 ON tx(a); 297b9f11f93Sdan CREATE INDEX i2 ON tx(b); 298b9f11f93Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 ) 299b9f11f93Sdan INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x; 300b9f11f93Sdan } 301b5a2592aSdan 302b9f11f93Sdan for {set i 2} {$i<20} {incr i} { 303b5a2592aSdan do_execsql_test 9.$tn.$i.1 { DELETE FROM tx WHERE (random()%3)==0 } 304b9f11f93Sdan 305b5a2592aSdan do_execsql_test 9.$tn.$i.2 { PRAGMA integrity_check } ok 306b9f11f93Sdan 307b5a2592aSdan do_execsql_test 9.$tn.$i.3 { 308b9f11f93Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<400 ) 309b9f11f93Sdan INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x; 310b9f11f93Sdan } 311b9f11f93Sdan 312b5a2592aSdan do_execsql_test 9.$tn.$i.4 { PRAGMA integrity_check } ok 313b9f11f93Sdan 314b5a2592aSdan do_execsql_test 9.$tn.$i.5 { 315b9f11f93Sdan BEGIN; 316b9f11f93Sdan DELETE FROM tx WHERE (random()%3)==0; 317b9f11f93Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) 318b9f11f93Sdan INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x; 319b9f11f93Sdan COMMIT; 320b9f11f93Sdan } 321b9f11f93Sdan 322b5a2592aSdan do_execsql_test 9.$tn.$i.6 { PRAGMA integrity_check } ok 323b5a2592aSdan } 324b9f11f93Sdan} 325b9f11f93Sdan 3262d36f065Sdan#------------------------------------------------------------------------- 3272d36f065Sdan# When using mmap mode with a temp file, SQLite must search the cache 3282d36f065Sdan# before using a mapped page even when there is no write transaction 3292d36f065Sdan# open. For a temp file, the on-disk version may not be up to date. 3302d36f065Sdan# 3312d36f065Sdansqlite3 db "" 3322d36f065Sdando_execsql_test 10.0 { 3332d36f065Sdan PRAGMA cache_size = 50; 3342d36f065Sdan PRAGMA page_size = 1024; 3352d36f065Sdan CREATE TABLE t1(a, b, PRIMARY KEY(a)) WITHOUT ROWID; 3362d36f065Sdan CREATE INDEX i1 ON t1(a); 3372d36f065Sdan CREATE TABLE t2(x, y); 3382d36f065Sdan INSERT INTO t2 VALUES(1, 2); 3392d36f065Sdan} 3402d36f065Sdan 3412d36f065Sdando_execsql_test 10.1 { 3422d36f065Sdan BEGIN; 3432d36f065Sdan WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 ) 3442d36f065Sdan INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x; 3452d36f065Sdan COMMIT; 3462d36f065Sdan INSERT INTO t2 VALUES(3, 4); 3472d36f065Sdan} 3482d36f065Sdan 349b1c6995cSdrhifcapable mmap { 35022f60b84Sdan if {[permutation]!="journaltest" && $::TEMP_STORE<2} { 3514a030c64Sdan # The journaltest permutation does not support mmap, so this part of 3524a030c64Sdan # the test is omitted. 3534a030c64Sdan do_execsql_test 10.2 { PRAGMA mmap_size = 512000 } 512000 3544a030c64Sdan } 355b1c6995cSdrh} 3564a030c64Sdan 3574a030c64Sdando_execsql_test 10.3 { SELECT * FROM t2 } {1 2 3 4} 3584a030c64Sdando_execsql_test 10.4 { PRAGMA integrity_check } ok 3592d36f065Sdan 36041113b64Sdanfinish_test 361