]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When SQLite is configured to use in-memory temp files (either by setting SQLITE_TEMP_...
authordanielk1977 <danielk1977@noemail.net>
Thu, 30 Apr 2009 09:10:37 +0000 (09:10 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 30 Apr 2009 09:10:37 +0000 (09:10 +0000)
FossilOrigin-Name: 38f8c5a14cd221af9e115a0fea689f2ff39e30e5

manifest
manifest.uuid
src/btree.c
src/main.c
src/pager.c
src/pager.h
src/sqliteInt.h
src/vdbe.c
test/conflict.test
test/exclusive.test
test/tempdb.test

index 3c290a81e7291aa022f339eb812631c88a44fd8b..d12a2c1f3b7990aacc1e0852cc7d67d850011e0c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\smemory\sleak\sintroduced\sin\sthe\sprevious\scheck-in.\s(CVS\s6574)
-D 2009-04-30T05:40:34
+C When\sSQLite\sis\sconfigured\sto\suse\sin-memory\stemp\sfiles\s(either\sby\ssetting\sSQLITE_TEMP_STORE\sduring\scompilation\sor\susing\sthe\stemp_store\spragma\sat\srun\stime),\sstore\sstatement/savepoint\sjournals\sin\smemory\salso.\sTicket\s#3825.\s(CVS\s6575)
+D 2009-04-30T09:10:38
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -106,7 +106,7 @@ F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627
 F src/backup.c 0082d0e5a63f04e88faee0dff0a7d63d3e92a78d
 F src/bitvec.c ef370407e03440b0852d05024fb016b14a471d3d
 F src/btmutex.c 9b899c0d8df3bd68f527b0afe03088321b696d3c
-F src/btree.c 4ac764ea85af796a9fd4875edf07e7f208008871
+F src/btree.c 2b89d1f578c417d68befd801a1291836c923bd1e
 F src/btree.h 99fcc7e8c4a1e35afe271bcb38de1a698dfc904e
 F src/btreeInt.h df64030d632f8c8ac217ed52e8b6b3eacacb33a5
 F src/build.c dca0ad77c88cb00f6a11cc080a4f3285672cfa37
@@ -125,7 +125,7 @@ F src/insert.c cdb0f64e53c3d84949b96d50090cc31646fc2857
 F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
 F src/legacy.c 2ad5b52df322d0f132f66817095e0e79c8942611
 F src/loadext.c 3f96631089fc4f3871a67f02f2e4fc7ea4d51edc
-F src/main.c e5249f662cd2bff88baeee5c5dda3b4364b91a51
+F src/main.c 468258773bfcd01ca637d23743188e97ab28f77f
 F src/malloc.c a1f0f8ae110abb8eb546e259ab0eaea7e0f9b588
 F src/mem0.c f2f84062d1f35814d6535c9f9e33de3bfb3b132c
 F src/mem1.c e6d5c23941288df8191b8a98c28e3f57771e2270
@@ -146,8 +146,8 @@ F src/os_common.h 8c61457df58f1a4bd5f5adc3e90e01b37bf7afbc
 F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5
 F src/os_unix.c 9ad9f45049a3c9eb0b0713b162ff0d7024ff7259
 F src/os_win.c 725c38a524d168ce280446ad8761d731bc516405
-F src/pager.c 1c41ddee47a9f6c5e3431faac071ef705fb736f9
-F src/pager.h 0c9f3520c00d8a3b8e792ca56c9a11b6b02b4b0f
+F src/pager.c 4c9c51dd73d778ba835a2f922b6c39b680a660d0
+F src/pager.h 73f481a308a873ccd626d97331c081db3b53e2e5
 F src/parse.y b7e4341b21736a90b952aa6bb663ec98529b778e
 F src/pcache.c 395f752a13574120bd7513a400ba02a265aaa76d
 F src/pcache.h 9b927ccc5a538e31b4c3bc7eec4f976db42a1324
@@ -162,7 +162,7 @@ F src/select.c 40748e8044b79d41ba04ce1014ae45434ed452d3
 F src/shell.c 0a11f831603f17fea20ca97133c0f64e716af4a7
 F src/sqlite.h.in 2b7667d7912abe14af4ab84e7c4ed022e734f7ba
 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
-F src/sqliteInt.h 61be3597d7dce6b3d360a7185c760c3e4e968a59
+F src/sqliteInt.h 004344b097e240b7c22a1755360b2c6ebd10c18c
 F src/sqliteLimit.h ffe93f5a0c4e7bd13e70cd7bf84cfb5c3465f45d
 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
 F src/table.c cc86ad3d6ad54df7c63a3e807b5783c90411a08d
@@ -203,7 +203,7 @@ F src/update.c 5062f0f042f67a4da0aff69949f145e2bc96e3cd
 F src/utf.c 9541d28f40441812c0b40f00334372a0542c00ff
 F src/util.c 828c552a22a1d5b650b8a5ea0009546715c45d93
 F src/vacuum.c 07121a727beeee88f27d704a00313ad6a7c9bef0
-F src/vdbe.c b7a27b4c3de1d2df80f3f9ee5a206c4af2abeb5a
+F src/vdbe.c 5fe07cce9f010cd052535463bd0348e8d513b448
 F src/vdbe.h 35a648bc3279a120da24f34d9a25213ec15daf8a
 F src/vdbeInt.h 8726f7b4e3b55c8acf6d304a5b5f727ac1b6c5ab
 F src/vdbeapi.c 86aa27a5f3493aaffb8ac051782aa3b22670d7ed
@@ -278,7 +278,7 @@ F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a
 F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6
 F test/colmeta.test 087c42997754b8c648819832241daf724f813322
 F test/colname.test 69fea30632d55862a012d3786c7d5fd1329f78db
-F test/conflict.test bb29b052c60a1f7eb6382be77902061d1f305318
+F test/conflict.test 0ed68b11f22721052d880ee80bd528a0e0828236
 F test/corrupt.test 5bcf7a986358123b8055dfa64b45fc2fb54dcaa9
 F test/corrupt2.test a571e30ea4e82318f319a24b6cc55935ce862079
 F test/corrupt3.test 263e8bb04e2728df832fddf6973cf54c91db0c32
@@ -317,7 +317,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
 F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398
 F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041
 F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3
-F test/exclusive.test cb991e44aa7cf744976143afce18586920f6696a
+F test/exclusive.test c5f55add88f172cee113801c5463e64d85a1fb28
 F test/exclusive2.test 6bdf254770a843c2933b54bee9ed239934f0a183
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
 F test/expr.test 80f3cf99f786ffbac19d2b0083673e7fc797030f
@@ -561,7 +561,7 @@ F test/sync.test ded6b39d8d8ca3c0c5518516c6371b3316d3e3a3
 F test/table.test e47c9323396976389a15fa0cd22ce3a405433186
 F test/tableapi.test 505031f15b18a750184d967d2c896cf88fcc969c
 F test/tclsqlite.test 8b1150d0486c4848c70d96422513a91c5342be0e
-F test/tempdb.test b88ac8a19823cf771d742bf61eef93ef337c06b1
+F test/tempdb.test 5f03555be35edc56d2e1a2b31aa9ca81c964ddc4
 F test/temptable.test 5d8ca46be28cc06c887c5a77df650843b7edbae1
 F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05
 F test/tester.tcl b22f925f3c6eea6283e29a81a7379091ca89ab40
@@ -725,7 +725,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P a6cb4002ada311b56fa2b7430b98b9a0fa698a01
-R 66a9f4fcfdc6b7afc02ad657124691ef
-U drh
-Z 1a309d6a333ba8af89e2e9af078bec90
+P f082bf36051fef92ddda0339777a00cd1f0ba988
+R 18faf906fa9b82f640353267c330ca5b
+U danielk1977
+Z 5e9ac0bdebbeb1ca8a2fe56ff9ec8057
index 3061f83c6d42c5cf5c422851098efe743f37e6ff..0e2a5f33afc736af4f60e9dbc19b0dba61b1cc4b 100644 (file)
@@ -1 +1 @@
-f082bf36051fef92ddda0339777a00cd1f0ba988
\ No newline at end of file
+38f8c5a14cd221af9e115a0fea689f2ff39e30e5
\ No newline at end of file
index a93b10f48464dd10fd7c152429802cd32aa39ee3..315991eb57e4a5d2e9d5d659ef08728b7db971db 100644 (file)
@@ -9,7 +9,7 @@
 **    May you share freely, never taking more than you give.
 **
 *************************************************************************
-** $Id: btree.c,v 1.600 2009/04/30 01:22:41 drh Exp $
+** $Id: btree.c,v 1.601 2009/04/30 09:10:38 danielk1977 Exp $
 **
 ** This file implements a external (disk-based) database using BTrees.
 ** See the header comment on "btreeInt.h" for additional information.
@@ -2213,7 +2213,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
       if( pBt->readOnly ){
         rc = SQLITE_READONLY;
       }else{
-        rc = sqlite3PagerBegin(pBt->pPager, wrflag>1);
+        rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db));
         if( rc==SQLITE_OK ){
           rc = newDatabase(pBt);
         }
index 555da89eb5114fb0b452eb02c6f5e973dc6c7fc6..1a0c2b0892fabef277a359c4b7e04ca9354c17a7 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.542 2009/04/28 15:35:39 danielk1977 Exp $
+** $Id: main.c,v 1.543 2009/04/30 09:10:38 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -1165,6 +1165,38 @@ void *sqlite3_rollback_hook(
   return pRet;
 }
 
+/*
+** This function returns true if main-memory should be used instead of
+** a temporary file for transient pager files and statement journals.
+** The value returned depends on the value of db->temp_store (runtime
+** parameter) and the compile time value of SQLITE_TEMP_STORE. The
+** following table describes the relationship between these two values
+** and this functions return value.
+**
+**   SQLITE_TEMP_STORE     db->temp_store     Location of temporary database
+**   -----------------     --------------     ------------------------------
+**   0                     any                file      (return 0)
+**   1                     1                  file      (return 0)
+**   1                     2                  memory    (return 1)
+**   1                     0                  file      (return 0)
+**   2                     1                  file      (return 0)
+**   2                     2                  memory    (return 1)
+**   2                     0                  memory    (return 1)
+**   3                     any                memory    (return 1)
+*/
+int sqlite3TempInMemory(sqlite3 *db){
+#if SQLITE_TEMP_STORE==1
+  return ( db->temp_store==2 );
+#endif
+#if SQLITE_TEMP_STORE==2
+  return ( db->temp_store!=1 );
+#endif
+#if SQLITE_TEMP_STORE==3
+  return 1;
+#endif
+  return 0;
+}
+
 /*
 ** This routine is called to create a connection to a database BTree
 ** driver.  If zFilename is the name of a file, then that file is
@@ -1175,20 +1207,8 @@ void *sqlite3_rollback_hook(
 ** soon as the connection is closed.
 **
 ** A virtual database can be either a disk file (that is automatically
-** deleted when the file is closed) or it an be held entirely in memory,
-** depending on the values of the SQLITE_TEMP_STORE compile-time macro and the
-** db->temp_store variable, according to the following chart:
-**
-**   SQLITE_TEMP_STORE     db->temp_store     Location of temporary database
-**   -----------------     --------------     ------------------------------
-**   0                     any                file
-**   1                     1                  file
-**   1                     2                  memory
-**   1                     0                  file
-**   2                     1                  file
-**   2                     2                  memory
-**   2                     0                  memory
-**   3                     any                memory
+** deleted when the file is closed) or it an be held entirely in memory.
+** The sqlite3TempInMemory() function is used to determine which.
 */
 int sqlite3BtreeFactory(
   const sqlite3 *db,        /* Main database when opening aux otherwise 0 */
@@ -1209,22 +1229,11 @@ int sqlite3BtreeFactory(
   if( db->flags & SQLITE_NoReadlock ){
     btFlags |= BTREE_NO_READLOCK;
   }
-  if( zFilename==0 ){
-#if SQLITE_TEMP_STORE==0
-    /* Do nothing */
-#endif
 #ifndef SQLITE_OMIT_MEMORYDB
-#if SQLITE_TEMP_STORE==1
-    if( db->temp_store==2 ) zFilename = ":memory:";
-#endif
-#if SQLITE_TEMP_STORE==2
-    if( db->temp_store!=1 ) zFilename = ":memory:";
-#endif
-#if SQLITE_TEMP_STORE==3
+  if( zFilename==0 && sqlite3TempInMemory(db) ){
     zFilename = ":memory:";
-#endif
-#endif /* SQLITE_OMIT_MEMORYDB */
   }
+#endif
 
   if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){
     vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;
index 001ed0844dc2880f902882f663b0acc49215acf3..4f2954064f64e05e3bc5d01b190a4f62a121ae8d 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.583 2009/04/28 05:27:20 danielk1977 Exp $
+** @(#) $Id: pager.c,v 1.584 2009/04/30 09:10:38 danielk1977 Exp $
 */
 #ifndef SQLITE_OMIT_DISKIO
 #include "sqliteInt.h"
@@ -229,6 +229,12 @@ struct PagerSavepoint {
 **   TODO: It might be easier to set this variable in writeJournalHdr()
 **   and writeMasterJournal() only. Change its meaning to "unsynced data
 **   has been written to the journal".
+**
+** subjInMemory
+**
+**   This is a boolean variable. If true, then any required sub-journal
+**   is opened as an in-memory journal file. If false, then in-memory
+**   sub-journals are only used for in-memory pager files.
 */
 struct Pager {
   sqlite3_vfs *pVfs;          /* OS functions to use for IO */
@@ -262,6 +268,7 @@ struct Pager {
   u8 setMaster;               /* True if a m-j name has been written to jrnl */
   u8 doNotSync;               /* Boolean. While true, do not spill the cache */
   u8 dbSizeValid;             /* Set when dbSize is correct */
+  u8 subjInMemory;            /* True to use in-memory sub-journals */
   Pgno dbSize;                /* Number of pages in the database */
   Pgno dbOrigSize;            /* dbSize before the current transaction */
   Pgno dbFileSize;            /* Number of pages in the database file */
@@ -3905,7 +3912,7 @@ void sqlite3PagerUnref(DbPage *pPg){
 static int openSubJournal(Pager *pPager){
   int rc = SQLITE_OK;
   if( isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ){
-    if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
+    if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
       sqlite3MemJournalOpen(pPager->sjfd);
     }else{
       rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
@@ -4024,10 +4031,19 @@ static int pager_open_journal(Pager *pPager){
 **
 ** If the journal file is opened (or if it is already open), then a
 ** journal-header is written to the start of it.
+**
+** If the subjInMemory argument is non-zero, then any sub-journal opened
+** within this transaction will be opened as an in-memory file. This
+** has no effect if the sub-journal is already opened (as it may be when
+** running in exclusive mode) or if the transaction does not require a
+** sub-journal. If the subjInMemory argument is zero, then any required
+** sub-journal is implemented in-memory if pPager is an in-memory database, 
+** or using a temporary file otherwise.
 */
-int sqlite3PagerBegin(Pager *pPager, int exFlag){
+int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
   int rc = SQLITE_OK;
   assert( pPager->state!=PAGER_UNLOCK );
+  pPager->subjInMemory = subjInMemory;
   if( pPager->state==PAGER_SHARED ){
     assert( pPager->pInJournal==0 );
     assert( !MEMDB && !pPager->tempFile );
@@ -4112,7 +4128,7 @@ static int pager_write(PgHdr *pPg){
     ** create it if it does not.
     */
     assert( pPager->state!=PAGER_UNLOCK );
-    rc = sqlite3PagerBegin(pPager, 0);
+    rc = sqlite3PagerBegin(pPager, 0, pPager->subjInMemory);
     if( rc!=SQLITE_OK ){
       return rc;
     }
index 011f91c403377d48eb6a0a7154821cd530a997f0..a0110f8595746cfea43c0a5853fcc54ac06d407e 100644 (file)
@@ -13,7 +13,7 @@
 ** subsystem.  The page cache subsystem reads and writes a file a page
 ** at a time and provides a journal for rollback.
 **
-** @(#) $Id: pager.h,v 1.100 2009/02/03 16:51:25 danielk1977 Exp $
+** @(#) $Id: pager.h,v 1.101 2009/04/30 09:10:38 danielk1977 Exp $
 */
 
 #ifndef _PAGER_H_
@@ -119,7 +119,7 @@ void *sqlite3PagerGetExtra(DbPage *);
 
 /* Functions used to manage pager transactions and savepoints. */
 int sqlite3PagerPagecount(Pager*, int*);
-int sqlite3PagerBegin(Pager*, int exFlag);
+int sqlite3PagerBegin(Pager*, int exFlag, int);
 int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int);
 int sqlite3PagerSync(Pager *pPager);
 int sqlite3PagerCommitPhaseTwo(Pager*);
index e2b451b42ef29c4876af97bd6ea5c2623166d811..758afafe20c09ba1c1180f0e3cf26997a9a0e492 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.862 2009/04/28 15:43:45 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.863 2009/04/30 09:10:38 danielk1977 Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -2765,6 +2765,8 @@ int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
 int sqlite3Reprepare(Vdbe*);
 void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
 CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
+int sqlite3TempInMemory(sqlite3 *);
+
 
 
 /*
index b2b3c57b5df70f53e8f25e32250c077937c1b2b1..f7bf172d623b3090fb9c10e44eaad6f867e6c544 100644 (file)
@@ -43,7 +43,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.839 2009/04/22 17:15:03 drh Exp $
+** $Id: vdbe.c,v 1.840 2009/04/30 09:10:38 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "vdbeInt.h"
@@ -2464,7 +2464,7 @@ case OP_Savepoint: {
           db->isTransactionSavepoint = 1;
         }else{
           db->nSavepoint++;
-       }
+        }
     
         /* Link the new savepoint into the database handle's list. */
         pNew->pNext = db->pSavepoint;
index 8eb25b1112b9f5e0a1f3d65ae71ac8070f014282..44390d20f2d53d7d65289941b647092cca7e6d11 100644 (file)
@@ -13,7 +13,7 @@
 # This file implements tests for the conflict resolution extension
 # to SQLite.
 #
-# $Id: conflict.test,v 1.31 2008/01/21 16:22:46 drh Exp $
+# $Id: conflict.test,v 1.32 2009/04/30 09:10:38 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -308,7 +308,7 @@ foreach {i conf1 cmd t0 t1 t2 t3 t4} {
 } {
   if {$t0} {set t1 {column a is not unique}}
   if {[info exists TEMP_STORE] && $TEMP_STORE>=2} {
-    set t3 $t4
+    set t3 0
   } else {
     set t3 [expr {$t3+$t4}]
   }
index de25a08848107626751ce218a4bae130273c54df..f4d70089b52cf21b62bb47267bc7155f341ab3a8 100644 (file)
@@ -12,7 +12,7 @@
 # of these tests is exclusive access mode (i.e. the thing activated by 
 # "PRAGMA locking_mode = EXCLUSIVE").
 #
-# $Id: exclusive.test,v 1.11 2008/12/22 11:43:36 danielk1977 Exp $
+# $Id: exclusive.test,v 1.12 2009/04/30 09:10:38 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -417,7 +417,7 @@ do_test exclusive-5.1 {
   # Three files are open: The db, journal and statement-journal.
   set sqlite_open_file_count
   expr $sqlite_open_file_count-$extrafds
-} {3}
+} [expr 3 - ($TEMP_STORE>=2)]
 do_test exclusive-5.2 {
   execsql {
     COMMIT;
@@ -435,7 +435,7 @@ do_test exclusive-5.3 {
   # Two files open: the db and journal.
   set sqlite_open_file_count
   expr $sqlite_open_file_count-$extrafds
-} {2}
+} [expr 3 - ($TEMP_STORE>=2)]
 do_test exclusive-5.4 {
   execsql {
     INSERT INTO abc SELECT a+10, b+10, c+10 FROM abc;
@@ -443,7 +443,7 @@ do_test exclusive-5.4 {
   # Three files are open: The db, journal and statement-journal.
   set sqlite_open_file_count
   expr $sqlite_open_file_count-$extrafds
-} {3}
+} [expr 3 - ($TEMP_STORE>=2)]
 do_test exclusive-5.5 {
   execsql {
     COMMIT;
@@ -451,7 +451,7 @@ do_test exclusive-5.5 {
   # Three files are still open: The db, journal and statement-journal.
   set sqlite_open_file_count
   expr $sqlite_open_file_count-$extrafds
-} {3}
+} [expr 3 - ($TEMP_STORE>=2)]
 do_test exclusive-5.6 {
   execsql {
     PRAGMA locking_mode = normal;
index 5e4663fe0a59f1790e646bd00743803757c15d67..405ba2da4c7e1e3a1f6c7916a79cd9fb9b8a9593 100644 (file)
@@ -12,7 +12,7 @@
 # The focus of this file is in making sure that rolling back
 # a statement journal works correctly.
 #
-# $Id: tempdb.test,v 1.1 2008/04/15 00:02:00 drh Exp $
+# $Id: tempdb.test,v 1.2 2009/04/30 09:10:38 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -52,4 +52,35 @@ do_test tempdb-1.2 {
   }
 } {}
 
+do_test tempdb-2.1 {
+  set default_in_memory [expr {$TEMP_STORE == 3}]
+  db close
+  sqlite3 db test.db
+} {}
+do_test tempdb-2.2 {
+  execsql {
+    CREATE TABLE t1 (a PRIMARY KEY, b, c);
+    CREATE TABLE t2 (a, b, c);
+    BEGIN;
+      INSERT INTO t1 VALUES(1, 2, 3);
+      INSERT INTO t1 VALUES(4, 5, 6);
+      INSERT INTO t2 SELECT * FROM t1;
+  }
+  catchsql { INSERT INTO t1 SELECT * FROM t2 }
+  set sqlite_open_file_count
+} [expr 2 + (0==$default_in_memory)]
+do_test tempdb-2.3 {
+  execsql {
+    PRAGMA temp_store = 'memory';
+    ROLLBACK;
+    BEGIN;
+      INSERT INTO t1 VALUES(1, 2, 3);
+      INSERT INTO t1 VALUES(4, 5, 6);
+      INSERT INTO t2 SELECT * FROM t1;
+  }
+  catchsql { INSERT INTO t1 SELECT * FROM t2 }
+  set sqlite_open_file_count
+} {2}
+
 finish_test
+