From 19969d96ce107f6e9bbbd8af83288f151299b517 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Dec 2011 15:46:51 +0000 Subject: [PATCH 1/4] Add test for WAL mode to unixexcl.test. FossilOrigin-Name: 4d518bd4801c31bb1e4fb0329ad057e549035237 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/unixexcl.test | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4c700358b7..d896acd364 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scouple\sof\stest\scases\sto\saccount\sfor\sthe\smaster-journal\sname\srelated\schange\sin\s[cf3bccc2]. -D 2011-12-19T11:16:39.956 +C Add\stest\sfor\sWAL\smode\sto\sunixexcl.test. +D 2011-12-19T15:46:51.583 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -871,7 +871,7 @@ F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84 F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 083c7fff74695bcc27a71d75699deba3595bc9c2 -F test/unixexcl.test 9d80a54d86d2261f660758928959368ffc36151e +F test/unixexcl.test 892937c53d0c16e76631674e38a0fce052ae5e9c F test/unordered.test f53095cee37851bf30130fa1bf299a8845e837bb F test/update.test 8bc86fd7ef1a00014f76dc6a6a7c974df4aef172 F test/uri.test 0d289d32396bdbc491e9dc845f1a52e13f861e0b @@ -984,7 +984,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 44ca4d123385d759c11919865525c998c2e35bdb -R 84fa60a337903d6e9b8a452659d1b330 +P 21b76af6edd48f665cdd3af5f99d477f030c7668 +R e3e501a911a193a6cca08b5fc467fda0 U dan -Z ebf66ca7938806efd839391c15a281c8 +Z 8da8eb99ffcc8591296a31b08a15f7c3 diff --git a/manifest.uuid b/manifest.uuid index 9aef15622c..a8926d69a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21b76af6edd48f665cdd3af5f99d477f030c7668 \ No newline at end of file +4d518bd4801c31bb1e4fb0329ad057e549035237 \ No newline at end of file diff --git a/test/unixexcl.test b/test/unixexcl.test index 057ae0af14..207078acde 100644 --- a/test/unixexcl.test +++ b/test/unixexcl.test @@ -80,4 +80,48 @@ do_multiclient_test tn { } {0 {hello world}} } +do_multiclient_test tn { + do_test unixexcl-3.$tn.1 { + code1 { db close; sqlite3 db test.db -vfs unix-excl } + code2 { db2 close; sqlite3 db2 test.db -vfs unix-excl } + sql1 { + PRAGMA journal_mode = WAL; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + } + } {wal} + + if {$tn==1} { + do_test unixexcl-3.$tn.1.multiproc { + csql2 { SELECT * FROM t1; } + } {1 {database is locked}} + } else { + do_test unixexcl-3.$tn.1.singleproc { + sql2 { SELECT * FROM t1; } + } {1 2} + + do_test unixexcl-3.$tn.2 { + sql2 { + BEGIN; + SELECT * FROM t1; + } + } {1 2} + do_test unixexcl-3.$tn.3 { + sql1 { PRAGMA wal_checkpoint; INSERT INTO t1 VALUES(3, 4); } + } {0 5 5} + do_test unixexcl-3.$tn.4 { + sql2 { SELECT * FROM t1; } + } {1 2} + do_test unixexcl-3.$tn.5 { + sql1 { SELECT * FROM t1; } + } {1 2 3 4} + do_test unixexcl-3.$tn.6 { + sql2 { COMMIT; SELECT * FROM t1; } + } {1 2 3 4} + do_test unixexcl-3.$tn.7 { + sql1 { PRAGMA wal_checkpoint; } + } {0 7 7} + } +} + finish_test From 4120994fdf0b646fda4768b68dda16f0799fd0ff Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 20 Dec 2011 13:13:09 +0000 Subject: [PATCH 2/4] Assert that the isCommit parameter to sqlite3WalFrames() is zero if and only if the nTruncate parameter is zero. FossilOrigin-Name: 979daf92e09305665d943e197b93b81139197c5b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d896acd364..e6573ae9e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\sfor\sWAL\smode\sto\sunixexcl.test. -D 2011-12-19T15:46:51.583 +C Assert\sthat\sthe\sisCommit\sparameter\sto\ssqlite3WalFrames()\sis\szero\sif\sand\nonly\sif\sthe\snTruncate\sparameter\sis\szero. +D 2011-12-20T13:13:09.326 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/vdbemem.c 2fc78b3e0fabcc1eaa23cd79dd2e30e6dcfe1e56 F src/vdbesort.c 468d43c057063e54da4f1988b38b4f46d60e7790 F src/vdbetrace.c d6e50e04e1ec498150e519058f617d91b8f5c843 F src/vtab.c e9318d88feac85be8e27ee783ac8f5397933fc8a -F src/wal.c 89a60a8bf8daa805b819f97b2049a62ae5618707 +F src/wal.c 5525f049dffd47ee860bf4ffbb8da4ebef78637d F src/wal.h 42f8313f7aaf8913e2d1fdf7b47025c23491ea1d F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/where.c af623942514571895818b9b7ae11db95ae3b3d88 @@ -984,7 +984,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 21b76af6edd48f665cdd3af5f99d477f030c7668 -R e3e501a911a193a6cca08b5fc467fda0 -U dan -Z 8da8eb99ffcc8591296a31b08a15f7c3 +P 4d518bd4801c31bb1e4fb0329ad057e549035237 +R b6fa212f141f93e02b36860230812df1 +U drh +Z ec529eca7ddb3f43acff46ddca1c2443 diff --git a/manifest.uuid b/manifest.uuid index a8926d69a1..6ec54257b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d518bd4801c31bb1e4fb0329ad057e549035237 \ No newline at end of file +979daf92e09305665d943e197b93b81139197c5b \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 03c482554e..fa44b66d32 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2691,6 +2691,10 @@ int sqlite3WalFrames( assert( pList ); assert( pWal->writeLock ); + /* If this frame set completes a transaction, then nTruncate>0. If + ** nTruncate==0 then this frame set does not complete the transaction. */ + assert( (isCommit!=0)==(nTruncate!=0) ); + #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){} WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n", From 27d47fbe6e5d77798c88564ad6bbaf647702e149 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Dec 2011 17:00:16 +0000 Subject: [PATCH 3/4] Avoid 32-bit overflow when calculating the byte offset of an overflow page in SQLITE_DIRECT_OVERFLOW_READ code. Fix for [ac0ff496b7]. FossilOrigin-Name: c5256b59ad70104c1e181b9f49d1d712cf4cc9f6 --- manifest | 15 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- test/bigfile2.test | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 test/bigfile2.test diff --git a/manifest b/manifest index e6573ae9e2..4f3ee6af22 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Assert\sthat\sthe\sisCommit\sparameter\sto\ssqlite3WalFrames()\sis\szero\sif\sand\nonly\sif\sthe\snTruncate\sparameter\sis\szero. -D 2011-12-20T13:13:09.326 +C Avoid\s32-bit\soverflow\swhen\scalculating\sthe\sbyte\soffset\sof\san\soverflow\spage\sin\sSQLITE_DIRECT_OVERFLOW_READ\scode.\sFix\sfor\s[ac0ff496b7]. +D 2011-12-21T17:00:16.841 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -125,7 +125,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 4368158da74d4711888e03264105c5c527d76caf F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 80ea65224512884bb72976c93810d2dcaecc1353 +F src/btree.c 2fdde7d16c80bd4e8a0913038e766c4297818f6f F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce F src/btreeInt.h ea863a819224d3e6845ad1e39954d41558b8cd8b F src/build.c 8915bb6d72ead998f94c2756ea8d143c77709b70 @@ -297,6 +297,7 @@ F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/between.test 16b1776c6323faadb097a52d673e8e3d8be7d070 F test/bigfile.test a8ec8073a20207456dab01a29ad9cde42b0dd103 +F test/bigfile2.test f8e83eca9abef60692a34255a2ebcb96aff897fc F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 F test/bind.test 3c7b320969000c441a70952b0b15938fbb66237c F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 @@ -984,7 +985,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 4d518bd4801c31bb1e4fb0329ad057e549035237 -R b6fa212f141f93e02b36860230812df1 -U drh -Z ec529eca7ddb3f43acff46ddca1c2443 +P 979daf92e09305665d943e197b93b81139197c5b +R 3ca2d5c9a0922c80f51a136db15c2655 +U dan +Z 686f6e4400cb272609dcad0347caf0ec diff --git a/manifest.uuid b/manifest.uuid index 6ec54257b9..b8f0351d86 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -979daf92e09305665d943e197b93b81139197c5b \ No newline at end of file +c5256b59ad70104c1e181b9f49d1d712cf4cc9f6 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 713016e756..ad011608bf 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3979,7 +3979,7 @@ static int accessPayload( u8 aSave[4]; u8 *aWrite = &pBuf[-4]; memcpy(aSave, aWrite, 4); - rc = sqlite3OsRead(fd, aWrite, a+4, pBt->pageSize * (nextPage-1)); + rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); nextPage = get4byte(aWrite); memcpy(aWrite, aSave, 4); }else diff --git a/test/bigfile2.test b/test/bigfile2.test new file mode 100644 index 0000000000..9810d3a0f3 --- /dev/null +++ b/test/bigfile2.test @@ -0,0 +1,59 @@ +# 2011 December 20 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this script testing the ability of SQLite to handle database +# files larger than 4GB. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix bigfile2 + +# Create a small database. +# +do_execsql_test 1.1 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); +} + +# Pad the file out to 4GB in size. Then clear the file-size field in the +# db header. This will cause SQLite to assume that the first 4GB of pages +# are actually in use and new pages will be appended to the file. +# +db close +if {[catch {fake_big_file 4096 [pwd]/test.db} msg]} { + puts "**** Unable to create a file larger than 4096 MB. *****" + finish_test + return +} +hexio_write test.db 28 00000000 + +do_test 1.2 { + file size test.db +} [expr 14 + 4096 * (1<<20)] + +# Now insert a large row. The overflow pages will be located past the 4GB +# boundary. Then, after opening and closing the database, test that the row +# can be read back in. +# +set str [string repeat k 30000] +do_test 1.3 { + sqlite3 db test.db + execsql { INSERT INTO t1 VALUES(3, $str) } + db close + sqlite3 db test.db + db one { SELECT b FROM t1 WHERE a = 3 } +} $str + +db close +file delete test.db + +finish_test From 7c3210e641ac445048385ff0fe82096a2f4945d7 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Dec 2011 18:04:41 +0000 Subject: [PATCH 4/4] Fix other problems where 32-bit integer overflow may cause a problem. Two that require an improbably large sub-journal and two in test harness code. FossilOrigin-Name: c723e3e18a008922281d8d6e8e3aba07941eb173 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pager.c | 6 +++--- src/test_journal.c | 2 +- src/test_stat.c | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 4f3ee6af22..bbe5f09d73 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\s32-bit\soverflow\swhen\scalculating\sthe\sbyte\soffset\sof\san\soverflow\spage\sin\sSQLITE_DIRECT_OVERFLOW_READ\scode.\sFix\sfor\s[ac0ff496b7]. -D 2011-12-21T17:00:16.841 +C Fix\sother\sproblems\swhere\s32-bit\sinteger\soverflow\smay\scause\sa\sproblem.\sTwo\sthat\srequire\san\simprobably\slarge\ssub-journal\sand\stwo\sin\stest\sharness\scode. +D 2011-12-21T18:04:41.417 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -168,7 +168,7 @@ F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 F src/os_unix.c 7dc7df10331942b139032328449a3723e051979e F src/os_win.c 197d23ce8a0dff748e766e034bf95ff756dd3884 -F src/pager.c c7c32a1c279e0bbbde3578172985c41d4c5efc35 +F src/pager.c 523c64f6ca707e820d5cf10ed8371238ecac8333 F src/pager.h 5cd760857707529b403837d813d86b68938d6183 F src/parse.y fabb2e7047417d840e6fdb3ef0988a86849a08ba F src/pcache.c 1fdd77978c1525d1ca4b9ef48eb80abca710cb4c @@ -211,7 +211,7 @@ F src/test_hexio.c c4773049603151704a6ab25ac5e936b5109caf5a F src/test_init.c 3cbad7ce525aec925f8fda2192d576d47f0d478a F src/test_intarray.c d879bbf8e4ce085ab966d1f3c896a7c8b4f5fc99 F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 -F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff +F src/test_journal.c 2c06e4be6584d51b935dc8b353980a9388de62ef F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5 F src/test_multiplex.c 6e07b94e2fe430f7f4f0d7d67b5e58f504dea655 @@ -225,7 +225,7 @@ F src/test_quota.h 9ffa1d3ad6d0a6a24e8670ea64b909c717ec3358 F src/test_rtree.c 6d06306e29946dc36f528a3a2cdc3add794656f1 F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0 F src/test_server.c 2f99eb2837dfa06a4aacf24af24c6affdf66a84f -F src/test_stat.c 69de4361c7a69fc1136d31ab7144408cd00805c7 +F src/test_stat.c 80271ad7d776a79babe0e025bb3a1bfcd3a3cfb1 F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd F src/test_syscall.c a992d8c80ea91fbf21fb2dd570db40e77dd7e6ae F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa @@ -985,7 +985,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 979daf92e09305665d943e197b93b81139197c5b -R 3ca2d5c9a0922c80f51a136db15c2655 +P c5256b59ad70104c1e181b9f49d1d712cf4cc9f6 +R 67d063070f0e350ae5f59b7b697ace26 U dan -Z 686f6e4400cb272609dcad0347caf0ec +Z bef61bfcf61cf3a9e556e6b3194dc0ce diff --git a/manifest.uuid b/manifest.uuid index b8f0351d86..0d2903da39 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c5256b59ad70104c1e181b9f49d1d712cf4cc9f6 \ No newline at end of file +c723e3e18a008922281d8d6e8e3aba07941eb173 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 9db6ebd3f4..4f8473e735 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3267,13 +3267,13 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ */ if( pSavepoint ){ u32 ii; /* Loop counter */ - i64 offset = pSavepoint->iSubRec*(4+pPager->pageSize); + i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); if( pagerUseWal(pPager) ){ rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); } for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && iinSubRec; ii++){ - assert( offset==ii*(4+pPager->pageSize) ); + assert( offset==(i64)ii*(4+pPager->pageSize) ); rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); } assert( rc!=SQLITE_DONE ); @@ -4125,7 +4125,7 @@ static int subjournalPage(PgHdr *pPg){ ** write the journal record into the file. */ if( rc==SQLITE_OK ){ void *pData = pPg->pData; - i64 offset = pPager->nSubRec*(4+pPager->pageSize); + i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); char *pData2; CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); diff --git a/src/test_journal.c b/src/test_journal.c index 68869723b3..ef82070320 100644 --- a/src/test_journal.c +++ b/src/test_journal.c @@ -391,7 +391,7 @@ static int openTransaction(jt_file *pMain, jt_file *pJournal){ while( rc==SQLITE_OK && iTrunk>0 ){ u32 nLeaf; u32 iLeaf; - sqlite3_int64 iOff = (iTrunk-1)*pMain->nPagesize; + sqlite3_int64 iOff = (i64)(iTrunk-1)*pMain->nPagesize; rc = sqlite3OsRead(p, aData, pMain->nPagesize, iOff); nLeaf = decodeUint32(&aData[4]); for(iLeaf=0; rc==SQLITE_OK && iLeafszPage = sqlite3BtreeGetPageSize(pBt); - pCsr->iOffset = pCsr->szPage * (pCsr->iPageno - 1); + pCsr->iOffset = (i64)pCsr->szPage * (pCsr->iPageno - 1); /* If connected to a ZIPVFS backend, override the page size and ** offset with actual values obtained from ZIPVFS.