From: drh Date: Sat, 1 May 2010 00:59:37 +0000 (+0000) Subject: Do not allow journal_mode=WAL if the underlying VFS does not support xShmOpen. X-Git-Tag: version-3.7.2~455^2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d80b233850c12cd3b3e69bd797e7276a9bf6422f;p=thirdparty%2Fsqlite.git Do not allow journal_mode=WAL if the underlying VFS does not support xShmOpen. FossilOrigin-Name: d1fcccecdc8e9ac5d0d022914e51c545f4e1b04f --- diff --git a/manifest b/manifest index 8bd0968857..15a349d662 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Merge\sin\schanges\sfrom\sthe\strunk. -D 2010-04-30T22:28:06 +C Do\snot\sallow\sjournal_mode=WAL\sif\sthe\sunderlying\sVFS\sdoes\snot\ssupport\sxShmOpen. +D 2010-05-01T00:59:38 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in d83a0ffef3dcbfb08b410a6c6dd6c009ec9167fb F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -215,7 +215,7 @@ F src/update.c c0dc6b75ad28b76b619042d934f337b02acee208 F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685 F src/util.c 32aebf04c10e51ad3977a928b7416bed671b620b F src/vacuum.c 8e7d9a6fd076774bb6e211cad335c7337948a164 -F src/vdbe.c 21a96eeeb43dedd40072028db0b42e137296a81a +F src/vdbe.c 2a5ccf3a760498d16ff3869162d3422f165bfb1d F src/vdbe.h 471f6a3dcec4817ca33596fe7f6654d56c0e75f3 F src/vdbeInt.h 19ebc8c2a2e938340051ee65af3f377fb99102d1 F src/vdbeapi.c 85e448c7d1d6dde7226c721cd8da8f9b5286699d @@ -765,7 +765,7 @@ F test/wal.test 830fc2d723fc4c55ef5666141e3a54e0cedd87e5 F test/walbak.test f6fde9a5f59d0c697cb1f4af7876178c2f69a7ba F test/walcrash.test f022cee7eb7baa5fb898726120a6a4073dd831d1 F test/walhook.test 287a69d662939604f2e0452dace2cec8ef634d5e -F test/walmode.test 40119078da084e6a7403ba57485d5a86ee0e2646 +F test/walmode.test 999be0fbee266ed618de780a6dadfca662d0f763 F test/walslow.test 38076d5fad49e3678027be0f8110e6a32d531dc2 F test/walthread.test c9c3b5d19eeb4968254d93f61a7ccd6e8b63f554 F test/where.test de337a3fe0a459ec7c93db16a519657a90552330 @@ -811,14 +811,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 8660cda6f8ef43bd276897ef3b5fc2376b5684dc 946e06cd2a2cc209b0786b7e9d28c0746320d646 -R 34e37e2e07b357ad442391f6d6aea47a +P 76bf0eee1fd4003a3f1c39922f8f059611d41dd0 +R 9dfde34976e5276ea286640fcc12ec63 U drh -Z f36c3392b22f93b3ce95c9951a47e7e6 +Z 32ec43d929a1f569787f34775d6f160c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFL21l5oxKgR168RlERAqNRAJ906Wol3RyZLztZzmkcpokv0+CtRgCfbeMz -ohrTG6i1s6JqVvmqdQdSCDg= -=50x7 +iD4DBQFL23z+oxKgR168RlERAhO3AJ90Nf9l23uNBBZGi//1U+RT1mFhmQCWLU5N +/Vu6AuAN53A7nGU5H1J5Vg== +=7uDR -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 695f751f08..2ccd280d27 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76bf0eee1fd4003a3f1c39922f8f059611d41dd0 \ No newline at end of file +d1fcccecdc8e9ac5d0d022914e51c545f4e1b04f \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 60e72fadd2..c6a38c5ba6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5212,11 +5212,15 @@ case OP_Checkpoint: { ** ** Write a string containing the final journal-mode to register P2. */ -case OP_JournalMode: { +case OP_JournalMode: { /* out2-prerelease */ Btree *pBt; /* Btree to change journal mode of */ Pager *pPager; /* Pager associated with pBt */ - int eNew = pOp->p3; /* New journal mode */ + int eNew; /* New journal mode */ + int eOld; /* The old journal mode */ + const sqlite3_vfs *pVfs; /* The VFS of pPager */ + const char *zFilename; /* Name of database file for pPager */ + eNew = pOp->p3; assert( eNew==PAGER_JOURNALMODE_DELETE || eNew==PAGER_JOURNALMODE_TRUNCATE || eNew==PAGER_JOURNALMODE_PERSIST @@ -5230,15 +5234,21 @@ case OP_JournalMode: { pBt = db->aDb[pOp->p1].pBt; pPager = sqlite3BtreePager(pBt); + zFilename = sqlite3PagerFilename(pPager); + pVfs = sqlite3PagerVfs(pPager); - if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(pBt)) - && eNew==PAGER_JOURNALMODE_WAL + /* Do not allow a transition to journal_mode=WAL for a database + ** in temporary storage or if the VFS does not support xShmOpen. + */ + if( eNew==PAGER_JOURNALMODE_WAL + && (zFilename[0]==0 /* Temp file */ + || pVfs->iVersion<2 || pVfs->xShmOpen==0) /* No xShmOpen support */ ){ eNew = PAGER_JOURNALMODE_QUERY; } if( eNew!=PAGER_JOURNALMODE_QUERY ){ - int eOld = sqlite3PagerJournalMode(pPager, PAGER_JOURNALMODE_QUERY); + eOld = sqlite3PagerJournalMode(pPager, PAGER_JOURNALMODE_QUERY); if( (eNew!=eOld) && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL) ){ diff --git a/test/walmode.test b/test/walmode.test index 3af72d91c0..4df00a350a 100644 --- a/test/walmode.test +++ b/test/walmode.test @@ -153,6 +153,7 @@ do_test walmode-5.1.1 { sqlite3 db :memory: execsql { PRAGMA main.journal_mode } } {memory} +breakpoint do_test walmode-5.1.2 { execsql { PRAGMA main.journal_mode = wal } } {memory} @@ -205,13 +206,18 @@ do_test walmode-5.2.5 { } } {1 2 3 4 delete} +if {$TEMP_STORE>=2} { + set tempJrnlMode memory +} else { + set tempJrnlMode +} do_test walmode-5.3.1 { sqlite3 db test.db execsql { PRAGMA temp.journal_mode } -} {delete} +} $tempJrnlMode do_test walmode-5.3.2 { execsql { PRAGMA temp.journal_mode = wal } -} {delete} +} $tempJrnlMode do_test walmode-5.3.3 { execsql { BEGIN; @@ -221,17 +227,16 @@ do_test walmode-5.3.3 { SELECT * FROM t1; PRAGMA temp.journal_mode; } -} {1 2 delete} +} [list 1 2 $tempJrnlMode] do_test walmode-5.3.4 { execsql { PRAGMA temp.journal_mode = wal } -} {delete} +} $tempJrnlMode do_test walmode-5.3.5 { execsql { INSERT INTO t1 VALUES(3, 4); SELECT * FROM t1; PRAGMA temp.journal_mode; } -} {1 2 3 4 delete} +} [list 1 2 3 4 $tempJrnlMode] finish_test -