1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

More bug fixes in btree.c. (CVS 1323)

FossilOrigin-Name: 2d64cba38c0f5fffa18cb30c4c448278837de49d
This commit is contained in:
drh
2004-05-08 02:03:22 +00:00
parent c39e000bbf
commit 9b17127705
5 changed files with 54 additions and 25 deletions

View File

@@ -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

View File

@@ -1 +1 @@
a80939ef714ec884950b4a1f4f809ffa37fdfa59
2d64cba38c0f5fffa18cb30c4c448278837de49d

View 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;
}

View 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;

View 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 {