xref: /sqlite-3.40.0/test/temptable2.test (revision cf2ad7ae)
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