From: danielk1977 Date: Sat, 31 Jan 2009 14:54:06 +0000 (+0000) Subject: Avoid a segfault when running vacuum on an in-memory database. Ticket #3620. (CVS... X-Git-Tag: version-3.6.15~529 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64beba4338c465b1da9644c1df4f5d70b52073ba;p=thirdparty%2Fsqlite.git Avoid a segfault when running vacuum on an in-memory database. Ticket #3620. (CVS 6221) FossilOrigin-Name: 407830c6839a81fa0a1010940740df3011713a88 --- diff --git a/manifest b/manifest index 02548aebcc..ef0ec39e67 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sround-off\serror\swhen\smoving\sdates\sby\snegative\smodifier\samounts.\nTicket\s#3618.\s\sEnhance\sthe\s"NNN\syears"\smodifier\sto\saccept\sfractional\nyears.\s(CVS\s6220) -D 2009-01-30T17:27:44 +C Avoid\sa\ssegfault\swhen\srunning\svacuum\son\san\sin-memory\sdatabase.\sTicket\s#3620.\s(CVS\s6221) +D 2009-01-31T14:54:07 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 3871d308188cefcb7c5ab20da4c7b6aad023bc52 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -103,7 +103,7 @@ F src/attach.c 1c35f95da3c62d19de75b44cfefd12c81c1791b3 F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 F src/bitvec.c 44f7059ac1f874d364b34af31b9617e52223ba75 F src/btmutex.c 63c5cc4ad5715690767ffcb741e185d7bc35ec1a -F src/btree.c 606c67b1b544d2324a9e4ab365cedaa1f828c7f4 +F src/btree.c dfbbfc396fdd8cbc29754864a97c4df484b78870 F src/btree.h 07359623fa24748709dd61212a32364a6adc6b56 F src/btreeInt.h 44bcbfe387ba99a3a9f2527bd12fa1bb8bc574b3 F src/build.c c8bf5dcef4d5889bc57eecdb8b3dba178e5e06a8 @@ -142,8 +142,8 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60 F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5 F src/os_unix.c c74255cc1fcddc38fc3cc1dcf70c2325d3c2948e F src/os_win.c ec133f2a3c0da786995ea09ba67056af8f18cc2e -F src/pager.c 3a36360acb9caa54d4fdd6439454348eab3b4b5a -F src/pager.h 59e3b500a0f6a8d17ec61976535007b0de39b9a4 +F src/pager.c 72f4e7b3076584889ce6286cd15ff2d985325026 +F src/pager.h eccf5cdeebd79006ba7f9577dd30d8179b1430da F src/parse.y 4f4d16aee0d11f69fec2adb77dac88878043ed8d F src/pcache.c fcf7738c83c4d3e9d45836b2334c8a368cc41274 F src/pcache.h 9b927ccc5a538e31b4c3bc7eec4f976db42a1324 @@ -636,7 +636,7 @@ F test/types3.test a0f66bf12f80fad89493535474f7a6d16fa58150 F test/unique.test 0253c4227a5dc533e312202ce21ecfad18058d18 F test/update.test 8bc86fd7ef1a00014f76dc6a6a7c974df4aef172 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum.test 07eff517a871f08165251860438cf8bbd87d6ed4 +F test/vacuum.test 68e39b2228b4b772166debef4a82accf6ddd32f3 F test/vacuum2.test fd87eec0ed72c6cc0809f7867929e2895affed92 F test/vacuum3.test f39ad1428347c5808cd2da7578c470f186a4d0ce F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 @@ -693,7 +693,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P c5dca1146de72071ed2e5fdf6890f41682272587 -R 6a74041552de27456797035382a955bb -U drh -Z 4f589fc1347644d84b8da190a4ca5065 +P 86be908c5e77ba2b9ac98e394fa987b443d790f8 +R 338358bbac17f79c52e09eabfb9a08f6 +U danielk1977 +Z 69820336f312727069bd2180b04a2b93 diff --git a/manifest.uuid b/manifest.uuid index ea269c0d28..5e1149aa8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86be908c5e77ba2b9ac98e394fa987b443d790f8 \ No newline at end of file +407830c6839a81fa0a1010940740df3011713a88 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2bc33363e3..d48f20880d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.562 2009/01/28 20:21:17 drh Exp $ +** $Id: btree.c,v 1.563 2009/01/31 14:54:07 danielk1977 Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. @@ -7390,6 +7390,10 @@ static int btreeCopyFile(Btree *pTo, Btree *pFrom){ ** file APIs on the database file directly. */ pBtTo->db = pTo->db; + if( nFromPageSize==nToPageSize ){ + sqlite3PagerTruncateImage(pBtTo->pPager, nFromPage); + iNow = iSize; + } rc = sqlite3PagerCommitPhaseOne(pBtTo->pPager, 0, 1); if( iSizestate>=PAGER_RESERVED ); pPager->dbSize = nPage; } -#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ /* ** Shutdown the page cache. Free all memory and close all files. diff --git a/src/pager.h b/src/pager.h index b621112ec7..3d6e4bb85e 100644 --- a/src/pager.h +++ b/src/pager.h @@ -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.98 2009/01/24 11:30:43 drh Exp $ +** @(#) $Id: pager.h,v 1.99 2009/01/31 14:54:07 danielk1977 Exp $ */ #ifndef _PAGER_H_ @@ -136,10 +136,8 @@ const char *sqlite3PagerJournalname(Pager*); int sqlite3PagerNosync(Pager*); void *sqlite3PagerTempSpace(Pager*); -/* Functions used in auto-vacuum mode to truncate the database file. */ -#ifndef SQLITE_OMIT_AUTOVACUUM - void sqlite3PagerTruncateImage(Pager*,Pgno); -#endif +/* Functions used to truncate the database file. */ +void sqlite3PagerTruncateImage(Pager*,Pgno); /* Used by encryption extensions. */ #ifdef SQLITE_HAS_CODEC diff --git a/test/vacuum.test b/test/vacuum.test index 80423ae394..4b1cd5a3e6 100644 --- a/test/vacuum.test +++ b/test/vacuum.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the VACUUM statement. # -# $Id: vacuum.test,v 1.42 2009/01/22 23:04:47 drh Exp $ +# $Id: vacuum.test,v 1.43 2009/01/31 14:54:07 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -287,7 +287,14 @@ do_test vacuum-7.0 { CREATE TABLE t1(t); VACUUM; } db2 -} {} + execsql { + CREATE TABLE t2(t); + CREATE TABLE t3(t); + DROP TABLE t2; + VACUUM; + pragma integrity_check; + } db2 +} {ok} db2 close # Ticket #873. VACUUM a database that has ' in its name.