]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the balance_nonroot() routine, protect the values in aPgno[] array from
authordrh <drh@noemail.net>
Fri, 31 Oct 2014 00:05:23 +0000 (00:05 +0000)
committerdrh <drh@noemail.net>
Fri, 31 Oct 2014 00:05:23 +0000 (00:05 +0000)
change during the page sort, so that aPgno[] can be used to avoid unnecessary
pointer-map updates for auto_vacuum databases.

FossilOrigin-Name: 69c3924fe834a78d4a8d86833626bf5f68e33a3a

manifest
manifest.uuid
src/btree.c

index 98a273f2e03dfce12fcccb51d5d8fff11b80ddb3..b3f68e980223986d27f503e372f99a7d2fd71c07 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improvements\sto\sthe\swording\sof\ssome\scomments.\s\sReinstate\san\sassert()\sthat\nis\sonly\strue\sfor\snon-corrupt\sdatabase\sfiles\sby\sadding\san\s"||\sCORRUPT_DB"\sterm.
-D 2014-10-30T23:14:56.756
+C In\sthe\sbalance_nonroot()\sroutine,\sprotect\sthe\svalues\sin\saPgno[]\sarray\sfrom\nchange\sduring\sthe\spage\ssort,\sso\sthat\saPgno[]\scan\sbe\sused\sto\savoid\sunnecessary\npointer-map\supdates\sfor\sauto_vacuum\sdatabases.
+D 2014-10-31T00:05:23.983
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -172,7 +172,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240
 F src/backup.c 7f841396adfd47507ff670a471162d2bfcda3136
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
-F src/btree.c 8f7ea96935c3b1db94439204965a6ec1392f7977
+F src/btree.c 88c87803b334807da3150245987139baacea4e6e
 F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
 F src/btreeInt.h 026d0129724e8f265fdc60d44ec240cf5a4e6179
 F src/build.c 67bb05b1077e0cdaccb2e36bfcbe7a5df9ed31e8
@@ -1209,7 +1209,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P c7d9aa3a1ce63e27ec94295601bc89fecf1e4977
-R 230a6673a34b4786200f7ae54e553a63
+P 67adb44838f98805f86aecca634d9a3b07370b9e
+R 882446b4b0e231e5d89ec5bd9f22a940
 U drh
-Z 52f8e66a5796212d2c4dbab1cb7cef14
+Z 021277b745352cb31d525498ae57f1ac
index fd375ba77a082343025d8113224ffbcad01cb9f2..03860ab39c243b42ea609ed74d27f79d63cb8e2d 100644 (file)
@@ -1 +1 @@
-67adb44838f98805f86aecca634d9a3b07370b9e
\ No newline at end of file
+69c3924fe834a78d4a8d86833626bf5f68e33a3a
\ No newline at end of file
index 2c3cbb4adc7a5acf7096118126fb2bdca451fb57..05dbd8cec70a70e73f25504b8f0f1a2c295e896b 100644 (file)
@@ -6533,6 +6533,7 @@ static int balance_nonroot(
   Pgno pgno;                   /* Temp var to store a page number in */
   u8 abDone[NB+2];             /* True after i'th new page is populated */
   Pgno aPgno[NB+2];            /* Page numbers of new pages before shuffling */
+  Pgno aPgOrder[NB+2];         /* Copy of aPgno[] used for sorting pages */
   u16 aPgFlags[NB+2];          /* flags field of new pages before shuffling */
 
   memset(abDone, 0, sizeof(abDone));
@@ -6859,7 +6860,7 @@ static int balance_nonroot(
   ** for large insertions and deletions.
   */
   for(i=0; i<nNew; i++){
-    aPgno[i] = apNew[i]->pgno;
+    aPgOrder[i] = aPgno[i] = apNew[i]->pgno;
     aPgFlags[i] = apNew[i]->pDbPage->flags;
     for(j=0; j<i; j++){
       if( aPgno[j]==aPgno[i] ){
@@ -6879,10 +6880,10 @@ static int balance_nonroot(
     int iBest = 0;                /* aPgno[] index of page number to use */
     Pgno pgno;                    /* Page number to use */
     for(j=1; j<nNew; j++){
-      if( aPgno[j]<aPgno[iBest] ) iBest = j;
+      if( aPgOrder[j]<aPgOrder[iBest] ) iBest = j;
     }
-    pgno = aPgno[iBest];
-    aPgno[iBest] = 0xffffffff;
+    pgno = aPgOrder[iBest];
+    aPgOrder[iBest] = 0xffffffff;
     if( iBest!=i ){
       if( iBest>i ){
         sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0);