]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Attempt to modify btree.c so that it assumes that calls to sqlite3PagerWrite()
authordrh <drh@noemail.net>
Sat, 12 Nov 2011 23:10:13 +0000 (23:10 +0000)
committerdrh <drh@noemail.net>
Sat, 12 Nov 2011 23:10:13 +0000 (23:10 +0000)
will reallocate the page buffer.  As there is not good way to test this
assumption yet, probably a few spots were missed.

FossilOrigin-Name: ceee03c79a55ea39866758aa76b78b10e5f4246d

manifest
manifest.uuid
src/btree.c

index 8d620e85e9c5bd7587b17c078a491277ae1b806b..f7e18824667c4668639f3e5034f057391b2d4a1b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Pull\sover\sall\sthe\slatest\schanges\sfrom\strunk.
-D 2011-11-11T14:12:36.001
+C Attempt\sto\smodify\sbtree.c\sso\sthat\sit\sassumes\sthat\scalls\sto\ssqlite3PagerWrite()\nwill\sreallocate\sthe\spage\sbuffer.\s\sAs\sthere\sis\snot\sgood\sway\sto\stest\sthis\nassumption\syet,\sprobably\sa\sfew\sspots\swere\smissed.
+D 2011-11-12T23:10:13.436
 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 2521a74f04cf288497af3b318fa3a31efb272ef6
+F src/btree.c 149cccf2134f555583d0825e47b17104aa06cb84
 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce
 F src/btreeInt.h ea863a819224d3e6845ad1e39954d41558b8cd8b
 F src/build.c 8af67a08a852ff4c63701963cb1ab7166f577814
@@ -974,7 +974,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 6bda711f93e753dd0be8d896a007b3f7b5064787 471cf0d8e7857110e525e029c2d535cb518dba6a
-R 50394ddf6c21b3d5be10b1579addf880
+P 1bbbf8574a820c5f787a937f02a8e2a91264ace0
+R 8fe5168196d72d713cb64bacae73a939
 U drh
-Z 183f0080d0ed04f08eff14296686e20c
+Z db5deb4d4c1ff85ac518999d30605134
index cee1bf94479e40260d9bd46bab539564eb7b9411..a6ee8619ebb4c4c56935d93d227a39435fd91b32 100644 (file)
@@ -1 +1 @@
-1bbbf8574a820c5f787a937f02a8e2a91264ace0
\ No newline at end of file
+ceee03c79a55ea39866758aa76b78b10e5f4246d
\ No newline at end of file
index a1b05e1f3ece74bc484b88c7a95c7a8b9959f1cd..43933fa27db32e350014b2a8ea769e1adc512f31 100644 (file)
@@ -1776,7 +1776,12 @@ int sqlite3BtreeOpen(
         sqlite3_free(p);
         return SQLITE_NOMEM;
       }
-      sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
+      rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
+      if( rc ){
+        sqlite3_free(zFullPathname);
+        sqlite3_free(p);
+        return rc;
+      }
 #if SQLITE_THREADSAFE
       mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
       sqlite3_mutex_enter(mutexOpen);
@@ -2477,9 +2482,9 @@ static int newDatabase(BtShared *pBt){
   }
   pP1 = pBt->pPage1;
   assert( pP1!=0 );
-  data = pP1->aData;
   rc = sqlite3PagerWrite(pP1->pDbPage);
   if( rc ) return rc;
+  data = pP1->aData;
   memcpy(data, zMagicHeader, sizeof(zMagicHeader));
   assert( sizeof(zMagicHeader)==16 );
   data[16] = (u8)((pBt->pageSize>>8)&0xff);
@@ -3777,38 +3782,6 @@ static int getOverflowPage(
   return (rc==SQLITE_DONE ? SQLITE_OK : rc);
 }
 
-/*
-** Copy data from a buffer to a page, or from a page to a buffer.
-**
-** pPayload is a pointer to data stored on database page pDbPage.
-** If argument eOp is false, then nByte bytes of data are copied
-** from pPayload to the buffer pointed at by pBuf. If eOp is true,
-** then sqlite3PagerWrite() is called on pDbPage and nByte bytes
-** of data are copied from the buffer pBuf to pPayload.
-**
-** SQLITE_OK is returned on success, otherwise an error code.
-*/
-static int copyPayload(
-  void *pPayload,           /* Pointer to page data */
-  void *pBuf,               /* Pointer to buffer */
-  int nByte,                /* Number of bytes to copy */
-  int eOp,                  /* 0 -> copy from page, 1 -> copy to page */
-  DbPage *pDbPage           /* Page containing pPayload */
-){
-  if( eOp ){
-    /* Copy data from buffer to page (a write operation) */
-    int rc = sqlite3PagerWrite(pDbPage);
-    if( rc!=SQLITE_OK ){
-      return rc;
-    }
-    memcpy(pPayload, pBuf, nByte);
-  }else{
-    /* Copy data from page to buffer (a read operation) */
-    memcpy(pBuf, pPayload, nByte);
-  }
-  return SQLITE_OK;
-}
-
 /*
 ** This function is used to read or overwrite payload information
 ** for the entry that the pCur cursor is pointing to. If the eOp
@@ -3856,6 +3829,7 @@ static int accessPayload(
   assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
   assert( cursorHoldsMutex(pCur) );
 
+
   getCellInfo(pCur);
   aPayload = pCur->info.pCell + pCur->info.nHeader;
   nKey = (pPage->intKey ? 0 : (int)pCur->info.nKey);
@@ -3873,7 +3847,14 @@ static int accessPayload(
     if( a+offset>pCur->info.nLocal ){
       a = pCur->info.nLocal - offset;
     }
-    rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage);
+    if( eOp ){
+      if( (rc = sqlite3PagerWrite(pPage->pDbPage))!=SQLITE_OK ) return rc;
+      getCellInfo(pCur);
+      aPayload = pCur->info.pCell + pCur->info.nHeader;
+      memcpy(aPayload+offset, pBuf, a);
+    }else{
+      memcpy(pBuf, aPayload+offset, a);
+    }
     offset = 0;
     pBuf += a;
     amt -= a;
@@ -3984,9 +3965,17 @@ static int accessPayload(
           DbPage *pDbPage;
           rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage);
           if( rc==SQLITE_OK ){
+            if( eOp && (rc = sqlite3PagerWrite(pDbPage))!=SQLITE_OK ){
+              sqlite3PagerUnref(pDbPage);
+              return rc;
+            }
             aPayload = sqlite3PagerGetData(pDbPage);
             nextPage = get4byte(aPayload);
-            rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage);
+            if( eOp ){
+              memcpy(&aPayload[offset+4], pBuf, a);
+            }else{
+              memcpy(pBuf, &aPayload[offset+4], a);
+            }
             sqlite3PagerUnref(pDbPage);
             offset = 0;
           }
@@ -7385,16 +7374,14 @@ void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){
 */
 int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){
   BtShared *pBt = p->pBt;
-  unsigned char *pP1;
   int rc;
   assert( idx>=1 && idx<=15 );
   sqlite3BtreeEnter(p);
   assert( p->inTrans==TRANS_WRITE );
   assert( pBt->pPage1!=0 );
-  pP1 = pBt->pPage1->aData;
   rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
   if( rc==SQLITE_OK ){
-    put4byte(&pP1[36 + idx*4], iMeta);
+    put4byte(&pBt->pPage1->aData[36 + idx*4], iMeta);
 #ifndef SQLITE_OMIT_AUTOVACUUM
     if( idx==BTREE_INCR_VACUUM ){
       assert( pBt->autoVacuum || iMeta==0 );
@@ -8223,6 +8210,7 @@ int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
       if( rc==SQLITE_OK ){
         rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
         if( rc==SQLITE_OK ){
+          aData = pBt->pPage1->aData;
           aData[18] = (u8)iVersion;
           aData[19] = (u8)iVersion;
         }