mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
More bug fixes in btree.c. (CVS 1323)
FossilOrigin-Name: 2d64cba38c0f5fffa18cb30c4c448278837de49d
This commit is contained in:
16
manifest
16
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
|
||||
|
@@ -1 +1 @@
|
||||
a80939ef714ec884950b4a1f4f809ffa37fdfa59
|
||||
2d64cba38c0f5fffa18cb30c4c448278837de49d
|
20
src/btree.c
20
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( 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;
|
||||
}
|
||||
|
||||
|
22
src/test3.c
22
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;
|
||||
|
||||
|
@@ -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]
|
||||
@@ -643,11 +643,12 @@ do_test btree-8.4.1 {
|
||||
do_test btree-8.5 {
|
||||
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 {
|
||||
|
Reference in New Issue
Block a user