When SQLite is configured to use in-memory temp files (either by setting SQLITE_TEMP_STORE during compilation or using the temp_store pragma at run time), store statement/savepoint journals in memory also. Ticket #3825. (CVS 6575)

FossilOrigin-Name: 38f8c5a14cd221af9e115a0fea689f2ff39e30e5
This commit is contained in:
danielk1977 2009-04-30 09:10:37 +00:00
parent 6c19747549
commit d829335e42
11 changed files with 121 additions and 63 deletions

View File

@ -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

View File

@ -1 +1 @@
f082bf36051fef92ddda0339777a00cd1f0ba988
38f8c5a14cd221af9e115a0fea689f2ff39e30e5

View 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);
}

View 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;

View 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;
}

View 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*);

View 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 *);
/*

View 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;

View 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}]
}

View 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;

View 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