]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
More bug fixes in btree.c. (CVS 1323)
authordrh <drh@noemail.net>
Sat, 8 May 2004 02:03:22 +0000 (02:03 +0000)
committerdrh <drh@noemail.net>
Sat, 8 May 2004 02:03:22 +0000 (02:03 +0000)
FossilOrigin-Name: 2d64cba38c0f5fffa18cb30c4c448278837de49d

manifest
manifest.uuid
src/btree.c
src/test3.c
test/btree.test

index dfe85bc7273357e184ecb9c9c9d7ae7b0bab63d4..fc3794b1ab65c56bcbd61875a453c24b18f90a0b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C More\sbug\sfixes\sin\sbtree.c.\s(CVS\s1322)
-D 2004-05-07T23:50:57
+C More\sbug\sfixes\sin\sbtree.c.\s(CVS\s1323)
+D 2004-05-08T02:03:23
 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -23,7 +23,7 @@ F sqlite.def fc4f5734786fe4743cfe2aa98eb2da4b089edb5f
 F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
 F src/attach.c b01db0d3211f673d8e670abf7eaad04591d40d14
 F src/auth.c 4fa3b05bd19445d1c474d6751c4a508d6ea0abe1
-F src/btree.c a5fafa6179c80ca422fea96b4553525648f5535e
+F src/btree.c 1ab8767ab7b2e591b632a6e28e10af97941f4f76
 F src/btree.h ba5d3bfadc3f46f86df525ac07274dc497af856a
 F src/btree_rb.c 99feb3ff835106d018a483a1ce403e5cf9c718bc
 F src/build.c 76fbca30081decd6615dee34b48c927ed5063752
@@ -54,7 +54,7 @@ F src/table.c d845cb101b5afc1f7fea083c99e3d2fa7998d895
 F src/tclsqlite.c 9fe6fc0c20820e9411dfea407635de9b9d3ae0e3
 F src/test1.c 9aa62b89d420e6763b5e7ae89a47f6cf87370477
 F src/test2.c 9d611c45e1b07039a2bd95f5ea73178362b23229
-F src/test3.c cec7eee9e64f95a3d2e4a3c242e081f560f98cf8
+F src/test3.c f0539fb9e605f5b3f8fb71e0c897931b8cff8aa3
 F src/test4.c 6e3e31acfaf21d66420fc35fda5b17dc0000cc8d
 F src/test5.c 3ff0565057b8d23e20092d5c6c0b7cb0d932c51e
 F src/tokenize.c 6676b946fd8825b67ab52140af4fdc57a70bda48
@@ -75,7 +75,7 @@ F test/auth.test 5c4d95cdaf539c0c236e20ce1f71a93e7dde9185
 F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81
 F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
 F test/bind.test 56a57043b42c4664ca705f6050e56717a8a6699a
-F test/btree.test c8a548edf00f46ceb5b9db8bd5c250e95b744c48
+F test/btree.test 54caf3f97934711dac9a47ac4119b033dd4caffa
 F test/btree2.test e3b81ec33dc2f89b3e6087436dfe605b870c9080
 F test/btree3.test e597fb59be2ac0ea69c62aaa2064e998e528b665
 F test/btree3rb.test 127efcf5cdfcc352054e7db12622b01cdd8b36ac
@@ -190,7 +190,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
 F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P d394b2b217d4d728f9eba397262bf9d36195719e
-R 04bebd7ff9ebbf1a875d441cf21d682e
+P a80939ef714ec884950b4a1f4f809ffa37fdfa59
+R 779830de46b9f26aa95cf36a64b9d819
 U drh
-Z ae2d2cf62d0e5010d2f2e28dfebc946c
+Z a42ee28f0c51193d2a98927224408150
index 16e52167235329ae5f0c4f9ea69365c096be2415..ca1c503d1b821cc75c35e103244d7d5c0318d467 100644 (file)
@@ -1 +1 @@
-a80939ef714ec884950b4a1f4f809ffa37fdfa59
\ No newline at end of file
+2d64cba38c0f5fffa18cb30c4c448278837de49d
\ No newline at end of file
index 100630179dd778e2803135b27595653da8bde93e..a54f7b9890648c9906051877986920fa77986993 100644 (file)
@@ -9,7 +9,7 @@
 **    May you share freely, never taking more than you give.
 **
 *************************************************************************
-** $Id: btree.c,v 1.112 2004/05/07 23:50:57 drh Exp $
+** $Id: btree.c,v 1.113 2004/05/08 02:03:23 drh Exp $
 **
 ** This file implements a external (disk-based) database using BTrees.
 ** For a detailed discussion of BTrees, refer to
@@ -1451,7 +1451,7 @@ static int getPayload(
       if( a + offset > ovflSize ){
         a = ovflSize - offset;
       }
-      memcpy(pBuf, &aPayload[offset], a);
+      memcpy(pBuf, &aPayload[offset+4], a);
       offset = 0;
       amt -= a;
       pBuf += a;
@@ -2067,11 +2067,14 @@ static int allocatePage(Btree *pBt, MemPage **ppPage, Pgno *pPgno, Pgno nearby){
       }
       put4byte(&aData[4], n-1);
       *pPgno = get4byte(&aData[8+closest*4]);
-      memcpy(&aData[8+closest*4], &aData[4+closest*n], 4);
+      if( closest<k-1 ){
+        memcpy(&aData[8+closest*4], &aData[4+k*4], 4);
+      }
+      put4byte(&pTrunk->aData[4], k-1);
       rc = getPage(pBt, *pPgno, ppPage);
       releasePage(pTrunk);
       if( rc==SQLITE_OK ){
-        sqlite3pager_dont_rollback(*ppPage);
+        sqlite3pager_dont_rollback((*ppPage)->aData);
         rc = sqlite3pager_write((*ppPage)->aData);
       }
     }
@@ -2195,6 +2198,7 @@ static int fillInCell(
   int nSrc, n, rc;
   int spaceLeft;
   MemPage *pOvfl = 0;
+  MemPage *pToRelease = 0;
   unsigned char *pPrior;
   unsigned char *pPayload;
   Btree *pBt = pPage->pBt;
@@ -2238,10 +2242,13 @@ static int fillInCell(
     if( spaceLeft==0 ){
       rc =  allocatePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl);
       if( rc ){
+        releasePage(pToRelease);
         clearCell(pPage, pCell);
         return rc;
       }
       put4byte(pPrior, pgnoOvfl);
+      releasePage(pToRelease);
+      pToRelease = pOvfl;
       pPrior = pOvfl->aData;
       put4byte(pPrior, 0);
       pPayload = &pOvfl->aData[4];
@@ -2253,16 +2260,15 @@ static int fillInCell(
     memcpy(pPayload, pSrc, n);
     nPayload -= n;
     pPayload += n;
+    pSrc += n;
     nSrc -= n;
     spaceLeft -= n;
     if( nSrc==0 ){
       nSrc = nData;
       pSrc = pData;
     }
-    if( pOvfl && (spaceLeft==0 || nPayload==0) ){
-      releasePage(pOvfl);
-    }
   }
+  releasePage(pToRelease);
   return SQLITE_OK;
 }
 
index bc66659fcdb1f73c5ab8b905ebcd8b800f99c339..ee282b64ce4956310c767103294fbae663837dc7 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test3.c,v 1.28 2004/05/07 23:50:57 drh Exp $
+** $Id: test3.c,v 1.29 2004/05/08 02:03:23 drh Exp $
 */
 #include "sqliteInt.h"
 #include "pager.h"
@@ -1019,6 +1019,25 @@ static int btree_cursor_dump(
   return SQLITE_OK;
 }
 
+/*
+** The command is provided for the purpose of setting breakpoints.
+** in regression test scripts.
+**
+** By setting a GDB breakpoint on this procedure and executing the
+** btree_breakpoint command in a test script, we can stop GDB at
+** the point in the script where the btree_breakpoint command is
+** inserted.  This is useful for debugging.
+*/
+static int btree_breakpoint(
+  void *NotUsed,
+  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
+  int argc,              /* Number of arguments */
+  const char **argv      /* Text of each argument */
+){
+  return TCL_OK;
+}
+
+
 /*
 ** Register commands with the TCL interpreter.
 */
@@ -1057,6 +1076,7 @@ int Sqlitetest3_Init(Tcl_Interp *interp){
      { "btree_last",               (Tcl_CmdProc*)btree_last               },
      { "btree_cursor_dump",        (Tcl_CmdProc*)btree_cursor_dump        },
      { "btree_integrity_check",    (Tcl_CmdProc*)btree_integrity_check    },
+     { "btree_breakpoint",         (Tcl_CmdProc*)btree_breakpoint         },
   };
   int i;
 
index 71326a53db461de3719d839a937b677e1f80a7fe..944c7c5e59833a25d7ab41009c4954b907d9a54c 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this script is btree database backend
 #
-# $Id: btree.test,v 1.17 2004/05/07 23:50:58 drh Exp $
+# $Id: btree.test,v 1.18 2004/05/08 02:03:23 drh Exp $
 
 
 set testdir [file dirname $argv0]
@@ -641,13 +641,14 @@ do_test btree-8.4.1 {
   lindex [btree_get_meta $::b1] 0
 } [expr {int(([string length $::data]-238+1019)/1020)}]
 do_test btree-8.5 {
-  set data "*** This is an even longer key"
+  set data "*** This is an even longer key "
   while {[string length $data]<2000} {append data $data}
+  append data END
   set ::data $data
   btree_insert $::c1 2030 $data
 } {}
 do_test btree-8.6 {
-  btree_move_to 2030
+  btree_move_to $::c1 2030
   string length [btree_data $::c1]
 } [string length $::data]
 do_test btree-8.7 {
@@ -671,7 +672,7 @@ do_test btree-8.10 {
 } {}
 do_test btree-8.11 {
   lindex [btree_get_meta $::b1] 0
-} {}
+} {4}
 
 # Now check out keys on overflow pages.
 #
@@ -679,12 +680,13 @@ do_test btree-8.12 {
   set ::keyprefix "This is a long prefix to a key "
   while {[string length $::keyprefix]<256} {append ::keyprefix $::keyprefix}
   btree_close_cursor $::c1
-  btree_drop_table $::b1 2
+  btree_clear_table $::b1 2
   lindex [btree_get_meta $::b1] 0
 } {4}
 do_test btree-8.12.1 {
   set ::c1 [btree_cursor $::b1 2 1]
   btree_insert $::c1 ${::keyprefix}1 1
+  btree_first $::c1
   btree_data $::c1
 } {1}
 do_test btree-8.13 {
@@ -693,6 +695,7 @@ do_test btree-8.13 {
 do_test btree-8.14 {
   btree_insert $::c1 ${::keyprefix}2 2
   btree_insert $::c1 ${::keyprefix}3 3
+  btree_last $::c1
   btree_key $::c1
 } ${keyprefix}3
 do_test btree-8.15 {
@@ -732,7 +735,7 @@ do_test btree-8.23 {
   btree_drop_table $::b1 2
   set ::c1 [btree_cursor $::b1 2 1]
   lindex [btree_get_meta $::b1] 0
-} {4}
+} {5}
 do_test btree-8.24 {
   lindex [btree_pager_stats $::b1] 1
 } {2}
@@ -778,7 +781,7 @@ for {set i 1} {$i<=20} {incr i} {
 }
 do_test btree-9.4.1 {
   lindex [btree_pager_stats $::b1] 1
-} {3}
+} {2}
 
 # Check the page joining logic.
 #
@@ -816,7 +819,7 @@ do_test btree-9.7 {
 #
 do_test btree-10.1 {
   btree_begin_transaction $::b1
-  btree_drop_table $::b1 2
+  btree_clear_table $::b1 2
   lindex [btree_pager_stats $::b1] 1
 } {1}
 do_test btree-10.2 {