| Index: third_party/sqlite/src/test/temptable2.test
|
| diff --git a/third_party/sqlite/src/test/temptable2.test b/third_party/sqlite/src/test/temptable2.test
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ffa69b6150037c093a3f1072698cf9aaaa8a2393
|
| --- /dev/null
|
| +++ b/third_party/sqlite/src/test/temptable2.test
|
| @@ -0,0 +1,357 @@
|
| +# 2016 March 3
|
| +#
|
| +# The author disclaims copyright to this source code. In place of
|
| +# a legal notice, here is a blessing:
|
| +#
|
| +# May you do good and not evil.
|
| +# May you find forgiveness for yourself and forgive others.
|
| +# May you share freely, never taking more than you give.
|
| +#
|
| +#***********************************************************************
|
| +
|
| +set testdir [file dirname $argv0]
|
| +source $testdir/tester.tcl
|
| +set testprefix temptable2
|
| +
|
| +do_execsql_test 1.1 {
|
| + CREATE TEMP TABLE t1(a, b);
|
| + CREATE INDEX i1 ON t1(a, b);
|
| +}
|
| +
|
| +do_execsql_test 1.2 {
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100000 )
|
| + INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM X;
|
| +} {}
|
| +
|
| +do_execsql_test 1.3 {
|
| + PRAGMA temp.integrity_check;
|
| +} {ok}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +reset_db
|
| +do_execsql_test 2.1 {
|
| + CREATE TEMP TABLE t2(a, b);
|
| + INSERT INTO t2 VALUES(1, 2);
|
| +} {}
|
| +
|
| +do_execsql_test 2.2 {
|
| + BEGIN;
|
| + INSERT INTO t2 VALUES(3, 4);
|
| + SELECT * FROM t2;
|
| +} {1 2 3 4}
|
| +
|
| +do_execsql_test 2.3 {
|
| + ROLLBACK;
|
| + SELECT * FROM t2;
|
| +} {1 2}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +reset_db
|
| +do_execsql_test 3.1.1 {
|
| + PRAGMA main.cache_size = 10;
|
| + PRAGMA temp.cache_size = 10;
|
| +
|
| + CREATE TEMP TABLE t1(a, b);
|
| + CREATE INDEX i1 ON t1(a, b);
|
| +
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )
|
| + INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
|
| +
|
| + SELECT count(*) FROM t1;
|
| +} {1000}
|
| +do_execsql_test 3.1.2 {
|
| + BEGIN;
|
| + UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;
|
| + ROLLBACK;
|
| +}
|
| +do_execsql_test 3.1.3 {
|
| + SELECT count(*) FROM t1;
|
| +} {1000}
|
| +do_execsql_test 3.1.4 { PRAGMA temp.integrity_check } {ok}
|
| +
|
| +do_execsql_test 3.2.1 {
|
| + BEGIN;
|
| + UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;
|
| + SAVEPOINT abc;
|
| + UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==1;
|
| + ROLLBACK TO abc;
|
| + UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==2;
|
| + COMMIT;
|
| +}
|
| +do_execsql_test 3.2.2 { PRAGMA temp.integrity_check } {ok}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +reset_db
|
| +do_execsql_test 4.1.1 {
|
| + PRAGMA main.cache_size = 10;
|
| + PRAGMA temp.cache_size = 10;
|
| +
|
| + CREATE TEMP TABLE t1(a, b);
|
| + CREATE INDEX i1 ON t1(a, b);
|
| +
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<10 )
|
| + INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
|
| +
|
| + SELECT count(*) FROM t1;
|
| + PRAGMA temp.page_count;
|
| +} {10 9}
|
| +
|
| +do_execsql_test 4.1.2 {
|
| + BEGIN;
|
| + UPDATE t1 SET b=randomblob(100);
|
| + ROLLBACK;
|
| +}
|
| +
|
| +do_execsql_test 4.1.3 {
|
| + CREATE TEMP TABLE t2(a, b);
|
| + CREATE INDEX i2 ON t2(a, b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
|
| + INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
|
| +
|
| + SELECT count(*) FROM t2;
|
| + SELECT count(*) FROM t1;
|
| +} {500 10}
|
| +
|
| +do_test 4.1.4 {
|
| + set n [db one { PRAGMA temp.page_count }]
|
| + expr ($n >280 && $n < 300)
|
| +} 1
|
| +
|
| +do_execsql_test 4.1.4 { PRAGMA temp.integrity_check } {ok}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +reset_db
|
| +do_execsql_test 5.1.1 {
|
| + PRAGMA main.cache_size = 10;
|
| + PRAGMA temp.cache_size = 10;
|
| +
|
| + CREATE TEMP TABLE t2(a, b);
|
| + CREATE INDEX i2 ON t2(a, b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
|
| + INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
|
| +
|
| + CREATE TEMP TABLE t1(a, b);
|
| + CREATE INDEX i1 ON t1(a, b);
|
| + INSERT INTO t1 VALUES(1, 2);
|
| +}
|
| +
|
| +# Test that the temp database is now much bigger than the configured
|
| +# cache size (10 pages).
|
| +do_test 5.1.2 {
|
| + set n [db one { PRAGMA temp.page_count }]
|
| + expr ($n > 270 && $n < 290)
|
| +} {1}
|
| +
|
| +do_execsql_test 5.1.3 {
|
| + BEGIN;
|
| + UPDATE t1 SET a=2;
|
| + UPDATE t2 SET a=randomblob(100);
|
| + SELECT count(*) FROM t1;
|
| + ROLLBACK;
|
| +} {1}
|
| +
|
| +do_execsql_test 5.1.4 {
|
| + UPDATE t2 SET a=randomblob(100);
|
| +
|
| + SELECT * FROM t1;
|
| +} {1 2}
|
| +
|
| +do_execsql_test 5.1.5 { PRAGMA temp.integrity_check } {ok}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# Test this:
|
| +#
|
| +# 1. Page is DIRTY at the start of a transaction.
|
| +# 2. Page is written out as part of the transaction.
|
| +# 3. Page is then read back in.
|
| +# 4. Transaction is rolled back. Is the page now clean or dirty?
|
| +#
|
| +# This actually does work. Step 4 marks the page as clean. But it also
|
| +# writes to the database file itself. So marking it clean is correct -
|
| +# the page does match the contents of the db file.
|
| +#
|
| +reset_db
|
| +
|
| +do_execsql_test 6.1 {
|
| + PRAGMA main.cache_size = 10;
|
| + PRAGMA temp.cache_size = 10;
|
| +
|
| + CREATE TEMP TABLE t1(x);
|
| + INSERT INTO t1 VALUES('one');
|
| +
|
| + CREATE TEMP TABLE t2(a, b);
|
| + CREATE INDEX i2 ON t2(a, b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
|
| + INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;
|
| +}
|
| +
|
| +do_execsql_test 6.2 {
|
| + UPDATE t1 SET x='two'; -- step 1
|
| + BEGIN;
|
| + UPDATE t2 SET a=randomblob(100); -- step 2
|
| + SELECT * FROM t1; -- step 3
|
| + ROLLBACK; -- step 4
|
| +
|
| + SELECT count(*) FROM t2;
|
| + SELECT * FROM t1;
|
| +} {two 500 two}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +reset_db
|
| +sqlite3 db ""
|
| +do_execsql_test 7.1 {
|
| + PRAGMA auto_vacuum=INCREMENTAL;
|
| + CREATE TABLE t1(x);
|
| + INSERT INTO t1 VALUES(zeroblob(900));
|
| + INSERT INTO t1 VALUES(zeroblob(900));
|
| + INSERT INTO t1 SELECT x FROM t1;
|
| + INSERT INTO t1 SELECT x FROM t1;
|
| + INSERT INTO t1 SELECT x FROM t1;
|
| + INSERT INTO t1 SELECT x FROM t1;
|
| + BEGIN;
|
| + DELETE FROM t1 WHERE rowid%2;
|
| + PRAGMA incremental_vacuum(4);
|
| + ROLLBACK;
|
| + PRAGMA integrity_check;
|
| +} {ok}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# Try changing the page size using a backup operation when pages are
|
| +# stored in main-memory only.
|
| +#
|
| +reset_db
|
| +do_execsql_test 8.1 {
|
| + PRAGMA auto_vacuum = OFF;
|
| + CREATE TABLE t2(a, b);
|
| + CREATE INDEX i2 ON t2(a, b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<20 )
|
| + INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2;
|
| + PRAGMA page_count;
|
| +} {13}
|
| +
|
| +do_test 8.2 {
|
| + sqlite3 tmp ""
|
| + execsql {
|
| + PRAGMA auto_vacuum = OFF;
|
| + PRAGMA page_size = 8192;
|
| + CREATE TABLE t1(a, b);
|
| + CREATE INDEX i1 ON t1(a, b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100 )
|
| + INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2;
|
| + PRAGMA page_count;
|
| + } tmp
|
| +} {10}
|
| +
|
| +do_test 8.3 {
|
| + sqlite3_backup B tmp main db main
|
| + B step 5
|
| + B finish
|
| +} {SQLITE_READONLY}
|
| +
|
| +do_test 8.4 {
|
| + execsql {
|
| + SELECT count(*) FROM t1;
|
| + PRAGMA integrity_check;
|
| + PRAGMA page_size;
|
| + } tmp
|
| +} {100 ok 8192}
|
| +
|
| +do_test 8.5 {
|
| + tmp eval { UPDATE t1 SET a=randomblob(100) }
|
| +} {}
|
| +
|
| +do_test 8.6 {
|
| + sqlite3_backup B tmp main db main
|
| + B step 1000
|
| + B finish
|
| +} {SQLITE_READONLY}
|
| +
|
| +tmp close
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# Try inserts and deletes with a large db in auto-vacuum mode. Check
|
| +#
|
| +foreach {tn mode} {
|
| + 1 delete
|
| + 2 wal
|
| +} {
|
| + reset_db
|
| + sqlite3 db ""
|
| + do_execsql_test 9.$tn.1.1 {
|
| + PRAGMA cache_size = 15;
|
| + PRAGMA auto_vacuum = 1;
|
| + }
|
| + execsql "PRAGMA journal_mode = $mode"
|
| +
|
| + do_execsql_test 9.$tn.1.2 {
|
| + CREATE TABLE tx(a, b);
|
| + CREATE INDEX i1 ON tx(a);
|
| + CREATE INDEX i2 ON tx(b);
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )
|
| + INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
|
| + }
|
| +
|
| + for {set i 2} {$i<20} {incr i} {
|
| + do_execsql_test 9.$tn.$i.1 { DELETE FROM tx WHERE (random()%3)==0 }
|
| +
|
| + do_execsql_test 9.$tn.$i.2 { PRAGMA integrity_check } ok
|
| +
|
| + do_execsql_test 9.$tn.$i.3 {
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<400 )
|
| + INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
|
| + }
|
| +
|
| + do_execsql_test 9.$tn.$i.4 { PRAGMA integrity_check } ok
|
| +
|
| + do_execsql_test 9.$tn.$i.5 {
|
| + BEGIN;
|
| + DELETE FROM tx WHERE (random()%3)==0;
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
|
| + INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;
|
| + COMMIT;
|
| + }
|
| +
|
| + do_execsql_test 9.$tn.$i.6 { PRAGMA integrity_check } ok
|
| + }
|
| +}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# When using mmap mode with a temp file, SQLite must search the cache
|
| +# before using a mapped page even when there is no write transaction
|
| +# open. For a temp file, the on-disk version may not be up to date.
|
| +#
|
| +sqlite3 db ""
|
| +do_execsql_test 10.0 {
|
| + PRAGMA cache_size = 50;
|
| + PRAGMA page_size = 1024;
|
| + CREATE TABLE t1(a, b, PRIMARY KEY(a)) WITHOUT ROWID;
|
| + CREATE INDEX i1 ON t1(a);
|
| + CREATE TABLE t2(x, y);
|
| + INSERT INTO t2 VALUES(1, 2);
|
| +}
|
| +
|
| +do_execsql_test 10.1 {
|
| + BEGIN;
|
| + WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )
|
| + INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
|
| + COMMIT;
|
| + INSERT INTO t2 VALUES(3, 4);
|
| +}
|
| +
|
| +ifcapable mmap {
|
| + if {[permutation]!="journaltest"} {
|
| + # The journaltest permutation does not support mmap, so this part of
|
| + # the test is omitted.
|
| + do_execsql_test 10.2 { PRAGMA mmap_size = 512000 } 512000
|
| + }
|
| +}
|
| +
|
| +do_execsql_test 10.3 { SELECT * FROM t2 } {1 2 3 4}
|
| +do_execsql_test 10.4 { PRAGMA integrity_check } ok
|
| +
|
| +finish_test
|
|
|