From ce4869f8930a93ade381f762a60c0d87c53b6dd6 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Apr 2009 20:16:58 +0000 Subject: [PATCH] Make sure the VACUUM statement locks down the page_size and auto_vacuum modes after it runs. Otherwise, pragmas might change these settings on a populated database, resulting in problems. (CVS 6442) FossilOrigin-Name: 85e6a4740d6db731c8c35a331031c346e9189c27 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/btree.c | 10 ++++++++-- src/btree.h | 4 ++-- src/pragma.c | 4 ++-- src/vacuum.c | 8 ++++---- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ae7a13e349..e2e88a957a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3_prepare()\sfamily\sof\sinterfaces\sso\sthat\sthey\szero\sthe\s*ppStmt\nvalue\seven\son\san\sSQLITE_MISUSE\sreturn.\s\sMake\sit\sclear\sin\sthe\sdocumentation\nthat\sthe\sppStmt\sparameter\scannot\sbe\szero.\s(CVS\s6441) -D 2009-04-02T18:32:27 +C Make\ssure\sthe\sVACUUM\sstatement\slocks\sdown\sthe\spage_size\sand\sauto_vacuum\nmodes\safter\sit\sruns.\s\sOtherwise,\spragmas\smight\schange\sthese\ssettings\son\na\spopulated\sdatabase,\sresulting\sin\sproblems.\s(CVS\s6442) +D 2009-04-02T20:16:59 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -103,8 +103,8 @@ F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 F src/backup.c 0082d0e5a63f04e88faee0dff0a7d63d3e92a78d F src/bitvec.c ef370407e03440b0852d05024fb016b14a471d3d F src/btmutex.c 341502bc496dc0840dcb00cde65680fb0e85c3ab -F src/btree.c 7d51b2ef5c09ebc05bce9a1a1f2f5b9e1b93d9e0 -F src/btree.h e302c5747494067cd4f5763000fbe7bca767d816 +F src/btree.c f4fdf5359f910dd9ac8d7bd92a67dae072b75f81 +F src/btree.h 8007018c1753944790c39610280894ab280210b8 F src/btreeInt.h df64030d632f8c8ac217ed52e8b6b3eacacb33a5 F src/build.c 72357fd75ef036d0afbf1756edab6d62c56fcf4b F src/callback.c 73016376d6848ba987709e8c9048d4f0e0776036 @@ -149,7 +149,7 @@ F src/parse.y b9ba0946a13e9f32a96044e64a3e8780269b08b0 F src/pcache.c 395f752a13574120bd7513a400ba02a265aaa76d F src/pcache.h 9b927ccc5a538e31b4c3bc7eec4f976db42a1324 F src/pcache1.c f587565f4ba0fd1772067eaa96814dce761b7a4c -F src/pragma.c 22ed04836aab8ce134c53be1ca896f3ad20fabdb +F src/pragma.c 32a967b5fc314ffed08a7778945592d536b64826 F src/prepare.c 0ad1ba3290e0626aa4e7589ed6ab6af2572875b0 F src/printf.c 9866a9a9c4a90f6d4147407f373df3fd5d5f9b6f F src/random.c 676b9d7ac820fe81e6fb2394ac8c10cff7f38628 @@ -199,7 +199,7 @@ F src/trigger.c 21f39db410cdc32166a94900ac1b3df98ea560e6 F src/update.c 8ededddcde6f7b6da981dd0429a5d34518a475b7 F src/utf.c 9541d28f40441812c0b40f00334372a0542c00ff F src/util.c 469d74f5bf09ed6398702c7da2ef8a34e979a1c1 -F src/vacuum.c 4929a585ef0fb1dfaf46302f8a9c4aa30c2d9cf5 +F src/vacuum.c 07121a727beeee88f27d704a00313ad6a7c9bef0 F src/vdbe.c 624922027b8b5fe203bd89e204aaed447e8b7ce7 F src/vdbe.h d70a68bee196ab228914a3902c79dbd24342a0f2 F src/vdbeInt.h 53a2f4696871712646c77351904576cca6ad9752 @@ -715,7 +715,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 8f1423445b29a5f52ed907de6db82128a96ebfe2 -R d66b51a142fefca07584ceedbb6d0a07 +P 23bf9f266559603e37b2703715eaf8ef5af6bb17 +R e0d218115c45629c5885d4b4b4658168 U drh -Z 86a6d740a23a4566ad36f5b8a9a6d901 +Z 1702788136b089e50c945192dcad3cc4 diff --git a/manifest.uuid b/manifest.uuid index 88f094362b..4ea73c6e41 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23bf9f266559603e37b2703715eaf8ef5af6bb17 \ No newline at end of file +85e6a4740d6db731c8c35a331031c346e9189c27 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 09412080f3..b922b5f3cc 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.588 2009/04/02 18:28:08 danielk1977 Exp $ +** $Id: btree.c,v 1.589 2009/04/02 20:16:59 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. @@ -1757,6 +1757,8 @@ int sqlite3BtreeSyncDisabled(Btree *p){ #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) /* ** Change the default pages size and the number of reserved bytes per page. +** Or, if the page size has already been fixed, return SQLITE_READONLY +** without changing anything. ** ** The page size must be a power of 2 between 512 and 65536. If the page ** size supplied does not meet this constraint then the page size is not @@ -1769,8 +1771,11 @@ int sqlite3BtreeSyncDisabled(Btree *p){ ** ** If parameter nReserve is less than zero, then the number of reserved ** bytes per page is left unchanged. +** +** If the iFix!=0 then the pageSizeFixed flag is set so that the page size +** and autovacuum mode can no longer be changed. */ -int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){ +int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; BtShared *pBt = p->pBt; assert( nReserve>=-1 && nReserve<=255 ); @@ -1792,6 +1797,7 @@ int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){ rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); } pBt->usableSize = pBt->pageSize - (u16)nReserve; + if( iFix ) pBt->pageSizeFixed = 1; sqlite3BtreeLeave(p); return rc; } diff --git a/src/btree.h b/src/btree.h index 283e556016..c12bee8b53 100644 --- a/src/btree.h +++ b/src/btree.h @@ -13,7 +13,7 @@ ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. ** -** @(#) $Id: btree.h,v 1.111 2009/03/18 10:33:01 danielk1977 Exp $ +** @(#) $Id: btree.h,v 1.112 2009/04/02 20:16:59 drh Exp $ */ #ifndef _BTREE_H_ #define _BTREE_H_ @@ -80,7 +80,7 @@ int sqlite3BtreeClose(Btree*); int sqlite3BtreeSetCacheSize(Btree*,int); int sqlite3BtreeSetSafetyLevel(Btree*,int,int); int sqlite3BtreeSyncDisabled(Btree*); -int sqlite3BtreeSetPageSize(Btree*,int,int); +int sqlite3BtreeSetPageSize(Btree*,int,int,int); int sqlite3BtreeGetPageSize(Btree*); int sqlite3BtreeMaxPageCount(Btree*,int); int sqlite3BtreeGetReserve(Btree*); diff --git a/src/pragma.c b/src/pragma.c index 496558e7a9..e6677d33ba 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -11,7 +11,7 @@ ************************************************************************* ** This file contains code used to implement the PRAGMA command. ** -** $Id: pragma.c,v 1.204 2009/02/23 16:52:08 drh Exp $ +** $Id: pragma.c,v 1.205 2009/04/02 20:16:59 drh Exp $ */ #include "sqliteInt.h" @@ -369,7 +369,7 @@ void sqlite3Pragma( ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = atoi(zRight); - if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1) ){ + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ db->mallocFailed = 1; } } diff --git a/src/vacuum.c b/src/vacuum.c index c6227303d2..acea8611c8 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -14,7 +14,7 @@ ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** -** $Id: vacuum.c,v 1.86 2009/02/03 16:51:25 danielk1977 Exp $ +** $Id: vacuum.c,v 1.87 2009/04/02 20:16:59 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" @@ -140,8 +140,8 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ } #endif - if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes) - || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes)) + if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) || db->mallocFailed ){ rc = SQLITE_NOMEM; @@ -268,7 +268,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ } if( rc==SQLITE_OK ){ - rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes); + rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1); } end_of_vacuum: -- 2.47.2