From 9b171277051d84f2ddb8b12a64a7a62b0be4d0e8 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 8 May 2004 02:03:22 +0000 Subject: [PATCH] More bug fixes in btree.c. (CVS 1323) FossilOrigin-Name: 2d64cba38c0f5fffa18cb30c4c448278837de49d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 20 +++++++++++++------- src/test3.c | 22 +++++++++++++++++++++- test/btree.test | 19 +++++++++++-------- 5 files changed, 54 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index dfe85bc727..fc3794b1ab 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 16e5216723..ca1c503d1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a80939ef714ec884950b4a1f4f809ffa37fdfa59 \ No newline at end of file +2d64cba38c0f5fffa18cb30c4c448278837de49d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 100630179d..a54f7b9890 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.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( closestaData[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; } diff --git a/src/test3.c b/src/test3.c index bc66659fcd..ee282b64ce 100644 --- a/src/test3.c +++ b/src/test3.c @@ -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; diff --git a/test/btree.test b/test/btree.test index 71326a53db..944c7c5e59 100644 --- a/test/btree.test +++ b/test/btree.test @@ -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 {