CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
temptable2.test361 linesDownload Raw Back to test
1# 2016 March 32#3# The author disclaims copyright to this source code.  In place of4# a legal notice, here is a blessing:5#6#    May you do good and not evil.7#    May you find forgiveness for yourself and forgive others.8#    May you share freely, never taking more than you give.9#10#***********************************************************************11#12# TESTRUNNER: slow13#14 15set testdir [file dirname $argv0]16source $testdir/tester.tcl17set testprefix temptable218 19do_execsql_test 1.1 {20  CREATE TEMP TABLE t1(a, b);21  CREATE INDEX i1 ON t1(a, b);22}23 24do_execsql_test 1.2 {25  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100000 )26  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM X;27} {}28 29do_execsql_test 1.3 {30  PRAGMA temp.integrity_check;31} {ok}32 33#-------------------------------------------------------------------------34#35reset_db36do_execsql_test 2.1 {37  CREATE TEMP TABLE t2(a, b);38  INSERT INTO t2 VALUES(1, 2);39} {}40 41do_execsql_test 2.2 {42  BEGIN;43    INSERT INTO t2 VALUES(3, 4);44    SELECT * FROM t2;45} {1 2 3 4}46 47do_execsql_test 2.3 {48  ROLLBACK;49  SELECT * FROM t2;50} {1 2}51 52#-------------------------------------------------------------------------53#54reset_db55do_execsql_test 3.1.1 {56  PRAGMA main.cache_size = 10;57  PRAGMA temp.cache_size = 10;58 59  CREATE TEMP TABLE t1(a, b);60  CREATE INDEX i1 ON t1(a, b);61 62  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )63  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;64 65  SELECT count(*) FROM t1;66} {1000}67do_execsql_test 3.1.2 {68  BEGIN;69    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;70  ROLLBACK;71}72do_execsql_test 3.1.3 {73  SELECT count(*) FROM t1;74} {1000}75do_execsql_test 3.1.4 { PRAGMA temp.integrity_check } {ok}76 77do_execsql_test 3.2.1 {78  BEGIN;79    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==0;80    SAVEPOINT abc;81      UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==1;82    ROLLBACK TO abc;83    UPDATE t1 SET b=randomblob(100) WHERE (rowid%10)==2;84  COMMIT;85}86do_execsql_test 3.2.2 { PRAGMA temp.integrity_check } {ok}87 88#-------------------------------------------------------------------------89#90reset_db91do_execsql_test 4.1.1 {92  PRAGMA main.cache_size = 10;93  PRAGMA temp.cache_size = 10;94 95  CREATE TEMP TABLE t1(a, b);96  CREATE INDEX i1 ON t1(a, b);97 98  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<10 )99  INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;100 101  SELECT count(*) FROM t1;102  PRAGMA temp.page_count;103} {10 9}104 105do_execsql_test 4.1.2 {106  BEGIN;107    UPDATE t1 SET b=randomblob(100);108  ROLLBACK;109}110 111do_execsql_test 4.1.3 {112  CREATE TEMP TABLE t2(a, b);113  CREATE INDEX i2 ON t2(a, b);114  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )115  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;116 117  SELECT count(*) FROM t2;118  SELECT count(*) FROM t1;119} {500 10}120 121do_test 4.1.4 {122  set n [db one { PRAGMA temp.page_count }]123  expr ($n >280 && $n < 300) 124} 1125 126do_execsql_test 4.1.4 { PRAGMA temp.integrity_check } {ok}127 128#-------------------------------------------------------------------------129#130reset_db131do_execsql_test 5.1.1 {132  PRAGMA main.cache_size = 10;133  PRAGMA temp.cache_size = 10;134 135  CREATE TEMP TABLE t2(a, b);136  CREATE INDEX i2 ON t2(a, b);137  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )138  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;139 140  CREATE TEMP TABLE t1(a, b);141  CREATE INDEX i1 ON t1(a, b);142  INSERT INTO t1 VALUES(1, 2);143}144 145# Test that the temp database is now much bigger than the configured146# cache size (10 pages).147do_test 5.1.2 {148  set n [db one { PRAGMA temp.page_count }]149  expr ($n > 270 && $n < 290)150} {1}151 152do_execsql_test 5.1.3 {153  BEGIN;154    UPDATE t1 SET a=2;155    UPDATE t2 SET a=randomblob(100);156    SELECT count(*) FROM t1;157  ROLLBACK;158} {1}159 160do_execsql_test 5.1.4 {161  UPDATE t2 SET a=randomblob(100);162 163  SELECT * FROM t1;164} {1 2}165 166do_execsql_test 5.1.5 { PRAGMA temp.integrity_check } {ok}167 168#-------------------------------------------------------------------------169# Test this:170#171#   1. Page is DIRTY at the start of a transaction.172#   2. Page is written out as part of the transaction.173#   3. Page is then read back in.174#   4. Transaction is rolled back. Is the page now clean or dirty?175#176# This actually does work. Step 4 marks the page as clean. But it also177# writes to the database file itself. So marking it clean is correct - 178# the page does match the contents of the db file.179#180reset_db181 182do_execsql_test 6.1 {183  PRAGMA main.cache_size = 10;184  PRAGMA temp.cache_size = 10;185 186  CREATE TEMP TABLE t1(x);187  INSERT INTO t1 VALUES('one');188 189  CREATE TEMP TABLE t2(a, b);190  CREATE INDEX i2 ON t2(a, b);191  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )192  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x;193}194 195do_execsql_test 6.2 {196  UPDATE t1 SET x='two';             -- step 1197  BEGIN;198    UPDATE t2 SET a=randomblob(100); -- step 2199    SELECT * FROM t1;                -- step 3200  ROLLBACK;                          -- step 4201 202  SELECT count(*) FROM t2;203  SELECT * FROM t1;204} {two 500 two}205 206#-------------------------------------------------------------------------207#208reset_db209sqlite3 db ""210do_execsql_test 7.1 {211  PRAGMA auto_vacuum=INCREMENTAL;212  CREATE TABLE t1(x);213  INSERT INTO t1 VALUES(zeroblob(900));214  INSERT INTO t1 VALUES(zeroblob(900));215  INSERT INTO t1 SELECT x FROM t1;216  INSERT INTO t1 SELECT x FROM t1;217  INSERT INTO t1 SELECT x FROM t1;218  INSERT INTO t1 SELECT x FROM t1;219  BEGIN;220  DELETE FROM t1 WHERE rowid%2;221  PRAGMA incremental_vacuum(4);222  ROLLBACK;223  PRAGMA integrity_check;224} {ok}225 226#-------------------------------------------------------------------------227# Try changing the page size using a backup operation when pages are228# stored in main-memory only.229#230reset_db231do_execsql_test 8.1 {232  PRAGMA auto_vacuum = OFF;233  CREATE TABLE t2(a, b);234  CREATE INDEX i2 ON t2(a, b);235  WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<20 )236  INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2;237  PRAGMA page_count;238} {13}239 240do_test 8.2 {241  sqlite3 tmp ""242  execsql {243    PRAGMA auto_vacuum = OFF;244    PRAGMA page_size = 8192;245    CREATE TABLE t1(a, b);246    CREATE INDEX i1 ON t1(a, b);247    WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100 )248    INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x ORDER BY 1, 2;249    PRAGMA page_count;250  } tmp251} {10}252 253do_test 8.3 {254  sqlite3_backup B tmp main db main255  B step 5256  B finish257} {SQLITE_READONLY}258 259do_test 8.4 {260  execsql {261    SELECT count(*) FROM t1;262    PRAGMA integrity_check;263    PRAGMA page_size;264  } tmp265} {100 ok 8192}266 267do_test 8.5 { 268  tmp eval { UPDATE t1 SET a=randomblob(100) }269} {}270 271do_test 8.6 {272  sqlite3_backup B tmp main db main273  B step 1000274  B finish275} {SQLITE_READONLY}276 277tmp close278 279#-------------------------------------------------------------------------280# Try inserts and deletes with a large db in auto-vacuum mode. Check281#282foreach {tn mode} {283  1 delete284  2 wal285} {286  reset_db287  sqlite3 db ""288  do_execsql_test 9.$tn.1.1 {289    PRAGMA cache_size = 15;290    PRAGMA auto_vacuum = 1;291  }292  execsql "PRAGMA journal_mode = $mode"293 294  do_execsql_test 9.$tn.1.2 {295    CREATE TABLE tx(a, b);296    CREATE INDEX i1 ON tx(a);297    CREATE INDEX i2 ON tx(b);298    WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 )299      INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;300  }301 302  for {set i 2} {$i<20} {incr i} {303    do_execsql_test 9.$tn.$i.1 { DELETE FROM tx WHERE (random()%3)==0 }304 305    do_execsql_test 9.$tn.$i.2 { PRAGMA integrity_check } ok306 307      do_execsql_test 9.$tn.$i.3 { 308        WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<400 )309          INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;310      }311 312    do_execsql_test 9.$tn.$i.4 { PRAGMA integrity_check } ok313 314    do_execsql_test 9.$tn.$i.5 { 315      BEGIN;316      DELETE FROM tx WHERE (random()%3)==0;317      WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )318        INSERT INTO tx SELECT randomblob(100), randomblob(100) FROM x;319      COMMIT;320    }321 322    do_execsql_test 9.$tn.$i.6 { PRAGMA integrity_check } ok323  }324}325 326#-------------------------------------------------------------------------327# When using mmap mode with a temp file, SQLite must search the cache 328# before using a mapped page even when there is no write transaction329# open. For a temp file, the on-disk version may not be up to date.330#331sqlite3 db ""332do_execsql_test 10.0 {333  PRAGMA cache_size = 50;334  PRAGMA page_size = 1024;335  CREATE TABLE t1(a, b, PRIMARY KEY(a)) WITHOUT ROWID;336  CREATE INDEX i1 ON t1(a);337  CREATE TABLE t2(x, y);338  INSERT INTO t2 VALUES(1, 2);339}340 341do_execsql_test 10.1 {342  BEGIN;343    WITH x(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<500 )344      INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;345  COMMIT;346  INSERT INTO t2 VALUES(3, 4);347}348 349ifcapable mmap {350  if {[permutation]!="journaltest" && $::TEMP_STORE<2} {351    # The journaltest permutation does not support mmap, so this part of352    # the test is omitted.353    do_execsql_test 10.2 { PRAGMA mmap_size = 512000 } 512000354  }355}356 357do_execsql_test 10.3 { SELECT * FROM t2 } {1 2 3 4}358do_execsql_test 10.4 { PRAGMA integrity_check } ok359 360finish_test361