From 7426f864ae2df7e20c90d7132b20b9707900fc51 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Aug 2008 21:07:26 +0000 Subject: [PATCH] All the page_size pragma to change the page size on a new :memory: database, but not a vacuumed :memory: database. Ticket #3335 (CVS 5617) FossilOrigin-Name: 226a9056783247679fcf442e10807a1f2707f463 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/pager.c | 13 +++++++++---- src/vacuum.c | 8 ++++++-- test/pagesize.test | 17 ++++++++++++++--- test/vacuum3.test | 18 +++++++++++++++++- 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 7ec632c3c2..54e367be32 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\ssome\svery\sexpensive\sasserts\sin\spcache.c\sthat\sare\stoo\sslow\sfor\sall.test.\s(CVS\s5616) -D 2008-08-26T19:08:00 +C All\sthe\spage_size\spragma\sto\schange\sthe\spage\ssize\son\sa\snew\s:memory:\sdatabase,\nbut\snot\sa\svacuumed\s:memory:\sdatabase.\s\sTicket\s#3335\s(CVS\s5617) +D 2008-08-26T21:07:27 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 689e14735f862a5553bceef206d8c13e29504e44 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -135,7 +135,7 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60 F src/os_os2.c e391fc95adc744bbdcefd4d11e3066998185a0a0 F src/os_unix.c 4665cef7639dd937893c3ea076f0e8a8f215bb32 F src/os_win.c aefe9ee26430678a19a058a874e4e2bd91398142 -F src/pager.c 9dfaca6cd443228326b1837fbb712b9cbde9a0e0 +F src/pager.c 66836244eac6b1a46e8c26e3dd3c143031bf28e5 F src/pager.h 3b9c138d2e744b9d6e61d4c2742301e3bf464864 F src/parse.y d0f76d2cb8d6883d5600dc20beb961a6022b94b8 F src/pcache.c 006714ad89db3c488526246e6ed6b130e457f01b @@ -185,7 +185,7 @@ F src/trigger.c 649940b5bf5838a33721fb72372e7c9d1faf56a9 F src/update.c f2cf6f00d542956bd49ba4b9815c2900d9225bf2 F src/utf.c c63e6f69082f85c19ab88d62dedaf91d71ac1a50 F src/util.c afe659ccc05d1f8af9e8631dabfec3ee3a7144af -F src/vacuum.c a5b10ae21ffbb73c79b7fa17e2ff40dc8ff33440 +F src/vacuum.c fd77433d0c26d3ff1eb96eab017a1787ac5aa642 F src/vdbe.c adcc179a31d71466b7b4f20ab77555e1e137bfe5 F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3 F src/vdbeInt.h b48c74d86a9fb62b707a3186ccca76bb32f1c6be @@ -444,7 +444,7 @@ F test/pager.test 1e1832795e9e07a359c959ffdddcf7275a88f54c F test/pager2.test 070983b89a308adaba525a2f9c1ba0592c72fa3d F test/pager3.test 2323bf27fd5bd887b580247e5bce500ceee994b4 F test/pageropt.test 3ee6578891baaca967f0bd349e4abfa736229e1a -F test/pagesize.test e0a8b3fe80f8b8e808d94a00734c7a18c76c407e +F test/pagesize.test 0d9ff3fedfce6e5ffe8fa7aca9b6d3433a2e843b F test/permutations.test cd043a0e8eb1487aa8486c5d9b75ad7a88128041 F test/pragma.test b55931bbd5dd543e56fd942dbf4b7439619b09a6 F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47 @@ -574,7 +574,7 @@ F test/update.test 8bc86fd7ef1a00014f76dc6a6a7c974df4aef172 F test/utf16align.test 7360e84472095518c56746f76b1f9d4dce99fb4d F test/vacuum.test 0bc75ee74ab9c69322d6563aa2287375697e630b F test/vacuum2.test e7c5f5bf5e1f2266ca668d420393820cf501fdfc -F test/vacuum3.test 54a7152f004fb1647702c2f7be9a7e7abfafd70e +F test/vacuum3.test f39ad1428347c5808cd2da7578c470f186a4d0ce F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test e265401afefa994cdf2fe4b6f286b1e87c2f9b9d F test/view.test 7fba28a47f76541f6aea9542f62f3412e3519bad @@ -624,7 +624,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 9e511e161bcb077450d31fca5dd20c2557f103b3 -R 1ce47647904dad33d524c97e4b2f240b -U danielk1977 -Z 36ed8c7bfd4a032646271d9bbcb5d47b +P 555dad900fad874099556d44c464ea9f64687ca0 +R 13266d9013275d3da810529c8b3c4107 +U drh +Z 5391d7f9c881bbaeba1d5a1fec437229 diff --git a/manifest.uuid b/manifest.uuid index 607e867da1..ec18d1d201 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -555dad900fad874099556d44c464ea9f64687ca0 \ No newline at end of file +226a9056783247679fcf442e10807a1f2707f463 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 69c3ee7c36..ec4a9be559 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.480 2008/08/26 18:05:48 danielk1977 Exp $ +** @(#) $Id: pager.c,v 1.481 2008/08/26 21:07:27 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -1945,7 +1945,8 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){ u16 pageSize = *pPageSize; assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); if( pageSize && pageSize!=pPager->pageSize - && !pPager->memDb && sqlite3PcacheRefCount(pPager->pPCache)==0 + && (pPager->memDb==0 || pPager->dbSize==0) + && sqlite3PcacheRefCount(pPager->pPCache)==0 ){ char *pNew = (char *)sqlite3PageMalloc(pageSize); if( !pNew ){ @@ -1953,7 +1954,7 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){ }else{ pager_reset(pPager); pPager->pageSize = pageSize; - setSectorSize(pPager); + if( !pPager->memDb ) setSectorSize(pPager); sqlite3PageFree(pPager->pTmpSpace); pPager->pTmpSpace = pNew; sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); @@ -3572,7 +3573,11 @@ static int pager_incr_changecounter(Pager *pPager, int isDirect){ */ int sqlite3PagerSync(Pager *pPager){ int rc; - rc = sqlite3OsSync(pPager->fd, pPager->sync_flags); + if( MEMDB ){ + rc = SQLITE_OK; + }else{ + rc = sqlite3OsSync(pPager->fd, pPager->sync_flags); + } return rc; } diff --git a/src/vacuum.c b/src/vacuum.c index e2fb42e84d..5157c97431 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.82 2008/08/23 16:17:56 danielk1977 Exp $ +** $Id: vacuum.c,v 1.83 2008/08/26 21:07:27 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" @@ -81,12 +81,14 @@ void sqlite3Vacuum(Parse *pParse){ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ + Pager *pMainPager; /* Pager for database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ char *zSql = 0; /* SQL statements */ int saved_flags; /* Saved value of the db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ Db *pDb = 0; /* Database to detach at end of vacuum */ + int isMemDb; /* True is vacuuming a :memory: database */ int nRes; /* Save the current value of the write-schema flag before setting it. */ @@ -101,6 +103,8 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ goto end_of_vacuum; } pMain = db->aDb[0].pBt; + pMainPager = sqlite3BtreePager(pMain); + isMemDb = sqlite3PagerFile(pMainPager)->pMethods==0; /* Attach the temporary database as 'vacuum_db'. The synchronous pragma ** can be set to 'off' for this file, as it is not recovered if a crash @@ -137,7 +141,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ #endif if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes) - || sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes)) || db->mallocFailed ){ rc = SQLITE_NOMEM; diff --git a/test/pagesize.test b/test/pagesize.test index a598b9f860..b676df9492 100644 --- a/test/pagesize.test +++ b/test/pagesize.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. # This file implements tests for the page_size PRAGMA. # -# $Id: pagesize.test,v 1.12 2007/04/06 21:42:22 drh Exp $ +# $Id: pagesize.test,v 1.13 2008/08/26 21:07:27 drh Exp $ set testdir [file dirname $argv0] @@ -79,12 +79,23 @@ foreach PGSZ {512 2048 4096 8192} { if {[info exists SQLITE_MAX_PAGE_SIZE] && $SQLITE_MAX_PAGE_SIZE<$PGSZ} continue ifcapable memorydb { - do_test pagesize-2.$PGSZ.0 { + do_test pagesize-2.$PGSZ.0.1 { db close sqlite3 db :memory: execsql "PRAGMA page_size=$PGSZ;" execsql {PRAGMA page_size} - } 1024 + } $PGSZ + do_test pagesize-2.$PGSZ.0.2 { + execsql {CREATE TABLE t1(x UNIQUE, y UNIQUE, z UNIQUE)} + execsql {PRAGMA page_size} + } $PGSZ + do_test pagesize-2.$PGSZ.0.3 { + execsql { + INSERT INTO t1 VALUES(1,2,3); + INSERT INTO t1 VALUES(2,3,4); + SELECT * FROM t1; + } + } {1 2 3 2 3 4} } do_test pagesize-2.$PGSZ.1 { db close diff --git a/test/vacuum3.test b/test/vacuum3.test index eac3f0b5d7..f6b75d7070 100644 --- a/test/vacuum3.test +++ b/test/vacuum3.test @@ -12,7 +12,7 @@ # focus of this file is changing the database page size using a # VACUUM statement. # -# $Id: vacuum3.test,v 1.8 2008/08/23 16:17:56 danielk1977 Exp $ +# $Id: vacuum3.test,v 1.9 2008/08/26 21:07:27 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -235,7 +235,23 @@ do_test vacuum3-4.6 { execsql { SELECT * FROM abc } db2 } {1 2 3 4 5 6} +# Unable to change the page-size of an in-memory using vacuum. db2 close +sqlite3 db2 :memory: +do_test vacuum3-5.1 { + db2 eval { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1234); + PRAGMA page_size=4096; + VACUUM; + SELECT * FROM t1; + } +} {1234} +do_test vacuum3-5.2 { + db2 eval { + PRAGMA page_size + } +} {1024} set create_database_sql { BEGIN;