mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix a bug in DELETE that might cause a segfault when deleting more
than 40940 rows of data all at once. (CVS 2620) FossilOrigin-Name: 7c599bae33ba4eb10fc486ae3dab76330ce69936
This commit is contained in:
13
manifest
13
manifest
@ -1,5 +1,5 @@
|
|||||||
C Version\s3.2.4\s(CVS\s2619)
|
C Fix\sa\sbug\sin\sDELETE\sthat\smight\scause\sa\ssegfault\swhen\sdeleting\smore\nthan\s40940\srows\sof\sdata\sall\sat\sonce.\s(CVS\s2620)
|
||||||
D 2005-08-24T11:14:47
|
D 2005-08-24T16:13:52
|
||||||
F Makefile.in b109ddb46a5550d0732dcd6caca01c123f6d5cdd
|
F Makefile.in b109ddb46a5550d0732dcd6caca01c123f6d5cdd
|
||||||
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
|
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
|
||||||
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
||||||
@ -85,7 +85,7 @@ F src/vdbe.h 3b29a9af6c7a64ed692bef1fc5f61338f40d2f67
|
|||||||
F src/vdbeInt.h 9be9a6c43d38124bd03cc5cf05715605b1789fd9
|
F src/vdbeInt.h 9be9a6c43d38124bd03cc5cf05715605b1789fd9
|
||||||
F src/vdbeapi.c 7790e9f8da2dde29510a196d1e41ff53da7eb8a8
|
F src/vdbeapi.c 7790e9f8da2dde29510a196d1e41ff53da7eb8a8
|
||||||
F src/vdbeaux.c 874624698fad54a59c6a0bcccea9d5aaa8655ab6
|
F src/vdbeaux.c 874624698fad54a59c6a0bcccea9d5aaa8655ab6
|
||||||
F src/vdbefifo.c b8805850afe13b43f1de78d58088cb5d66f88e1e
|
F src/vdbefifo.c 9efb94c8c3f4c979ebd0028219483f88e57584f5
|
||||||
F src/vdbemem.c 4732fd4d1a75dc38549493d7f9a81d02bf7c59b5
|
F src/vdbemem.c 4732fd4d1a75dc38549493d7f9a81d02bf7c59b5
|
||||||
F src/where.c 485041aa51fb33f43b346e018f7c01422847f364
|
F src/where.c 485041aa51fb33f43b346e018f7c01422847f364
|
||||||
F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
|
F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
|
||||||
@ -138,6 +138,7 @@ F test/date.test 30ca15e608a45d868fd419c901795382efe27020
|
|||||||
F test/default.test 252298e42a680146b1dd64f563b95bdf088d94fb
|
F test/default.test 252298e42a680146b1dd64f563b95bdf088d94fb
|
||||||
F test/delete.test 33e1670049364fc3604217a6c2eda042a47115ab
|
F test/delete.test 33e1670049364fc3604217a6c2eda042a47115ab
|
||||||
F test/delete2.test e382b6a97787197eb8b93dd4ccd37797c3725ea3
|
F test/delete2.test e382b6a97787197eb8b93dd4ccd37797c3725ea3
|
||||||
|
F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab
|
||||||
F test/diskfull.test ba27afd587af1216f92d2bb00132cbc0e39354fc
|
F test/diskfull.test ba27afd587af1216f92d2bb00132cbc0e39354fc
|
||||||
F test/enc.test 7a03417a1051fe8bc6c7641cf4c8c3f7e0066d52
|
F test/enc.test 7a03417a1051fe8bc6c7641cf4c8c3f7e0066d52
|
||||||
F test/enc2.test d1ab077b84f4d3099246915422b1ab6b81481e0a
|
F test/enc2.test d1ab077b84f4d3099246915422b1ab6b81481e0a
|
||||||
@ -297,7 +298,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955
|
|||||||
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
||||||
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
|
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
|
||||||
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
|
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
|
||||||
P 139a28d231875e72538fd6842168c458441ad1d0
|
P 8cef2c1ae728970a38d794f9903115da5d0fcd55
|
||||||
R 2f6c9b894551e0a3c64b6097033bd8f9
|
R a70653770f548ef58ecb2d4303ec79dd
|
||||||
U drh
|
U drh
|
||||||
Z fbfbdff77016e0ef0591035e80b41a64
|
Z 4fc4e011eef56b244e6411516a20c5a0
|
||||||
|
@ -1 +1 @@
|
|||||||
8cef2c1ae728970a38d794f9903115da5d0fcd55
|
7c599bae33ba4eb10fc486ae3dab76330ce69936
|
@ -21,6 +21,9 @@
|
|||||||
*/
|
*/
|
||||||
static FifoPage *allocatePage(int nEntry){
|
static FifoPage *allocatePage(int nEntry){
|
||||||
FifoPage *pPage;
|
FifoPage *pPage;
|
||||||
|
if( nEntry>32767 ){
|
||||||
|
nEntry = 32767;
|
||||||
|
}
|
||||||
pPage = sqliteMallocRaw( sizeof(FifoPage) + sizeof(i64)*(nEntry-1) );
|
pPage = sqliteMallocRaw( sizeof(FifoPage) + sizeof(i64)*(nEntry-1) );
|
||||||
if( pPage ){
|
if( pPage ){
|
||||||
pPage->nSlot = nEntry;
|
pPage->nSlot = nEntry;
|
||||||
@ -77,7 +80,9 @@ int sqlite3VdbeFifoPop(Fifo *pFifo, i64 *pVal){
|
|||||||
pPage = pFifo->pFirst;
|
pPage = pFifo->pFirst;
|
||||||
assert( pPage!=0 );
|
assert( pPage!=0 );
|
||||||
assert( pPage->iWrite>pPage->iRead );
|
assert( pPage->iWrite>pPage->iRead );
|
||||||
|
assert( pPage->iWrite<=pPage->nSlot );
|
||||||
assert( pPage->iRead<pPage->nSlot );
|
assert( pPage->iRead<pPage->nSlot );
|
||||||
|
assert( pPage->iRead>=0 );
|
||||||
*pVal = pPage->aSlot[pPage->iRead++];
|
*pVal = pPage->aSlot[pPage->iRead++];
|
||||||
pFifo->nEntry--;
|
pFifo->nEntry--;
|
||||||
if( pPage->iRead>=pPage->iWrite ){
|
if( pPage->iRead>=pPage->iWrite ){
|
||||||
|
57
test/delete3.test
Normal file
57
test/delete3.test
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# 2005 August 24
|
||||||
|
#
|
||||||
|
# The author disclaims copyright to this source code. In place of
|
||||||
|
# a legal notice, here is a blessing:
|
||||||
|
#
|
||||||
|
# May you do good and not evil.
|
||||||
|
# May you find forgiveness for yourself and forgive others.
|
||||||
|
# May you share freely, never taking more than you give.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
# This file implements regression tests for SQLite library. The
|
||||||
|
# focus of this script is a test of the DELETE command where a
|
||||||
|
# large number of rows are deleted.
|
||||||
|
#
|
||||||
|
|
||||||
|
set testdir [file dirname $argv0]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
|
||||||
|
# Create a table that contains a large number of rows.
|
||||||
|
#
|
||||||
|
do_test delete3-1.1 {
|
||||||
|
execsql {
|
||||||
|
CREATE TABLE t1(x integer primary key);
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
INSERT INTO t1 VALUES(2);
|
||||||
|
INSERT INTO t1 SELECT x+2 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+4 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+8 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+16 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+32 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+64 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+128 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+256 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+512 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+1024 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+2048 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+4096 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+8192 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+16384 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+32768 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+65536 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+131072 FROM t1;
|
||||||
|
INSERT INTO t1 SELECT x+262144 FROM t1;
|
||||||
|
COMMIT;
|
||||||
|
SELECT count(*) FROM t1;
|
||||||
|
}
|
||||||
|
} {524288}
|
||||||
|
do_test delete3-1.2 {
|
||||||
|
execsql {
|
||||||
|
DELETE FROM t1 WHERE x%2==0;
|
||||||
|
SELECT count(*) FROM t1;
|
||||||
|
}
|
||||||
|
} {262144}
|
||||||
|
integrity_check delete3-1.3
|
||||||
|
|
||||||
|
finish_test
|
Reference in New Issue
Block a user