1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-18 10:21:03 +03:00

Fix a bug in where.c where a non-temp register was being incorrectly deallocated. Ticket #3408. (CVS 5758)

FossilOrigin-Name: 59d2e89e2181c26b18eac68ccc80ea3018f70a5e
This commit is contained in:
danielk1977
2008-10-01 08:43:03 +00:00
parent f94a173a95
commit 2d60549926
4 changed files with 59 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
C Add\ssome\stestcase()\sand\sassert()\smacros\sto\sbtree.c\sto\said\swith\stesting\nrecent\schanges.\s(CVS\s5757) C Fix\sa\sbug\sin\swhere.c\swhere\sa\snon-temp\sregister\swas\sbeing\sincorrectly\sdeallocated.\sTicket\s#3408.\s(CVS\s5758)
D 2008-09-30T17:18:17 D 2008-10-01T08:43:03
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in e4ab842f9a64ef61d57093539a8aab76b12810db F Makefile.in e4ab842f9a64ef61d57093539a8aab76b12810db
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -199,7 +199,7 @@ F src/vdbefifo.c 20fda2a7c4c0bcee1b90eb7e545fefcdbf2e1de7
F src/vdbemem.c ead88713b852576e2a924bc4ae696964bfbaec0a F src/vdbemem.c ead88713b852576e2a924bc4ae696964bfbaec0a
F src/vtab.c 527c180e9c5fca417c9167d02af4b5039f892b4b F src/vtab.c 527c180e9c5fca417c9167d02af4b5039f892b4b
F src/walker.c 488c2660e13224ff70c0c82761118efb547f8f0d F src/walker.c 488c2660e13224ff70c0c82761118efb547f8f0d
F src/where.c a9958b26cc87ea1446fbe6d004a7959b8d5d75c1 F src/where.c 75b7f45bc02832445c244e2c6df4f7f5653148be
F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/alias.test c321c114a8a31a33e3cbda910fa39949f5d9dcb2 F test/alias.test c321c114a8a31a33e3cbda910fa39949f5d9dcb2
@@ -606,7 +606,7 @@ F test/vtabC.test 9f2d9eb84bf65e606d6616f20977c5a32a11f548
F test/vtab_alter.test 3a299749fee97ca3d53bd55717f536e4a2284856 F test/vtab_alter.test 3a299749fee97ca3d53bd55717f536e4a2284856
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
F test/vtab_shared.test c19b2555b807ef2ee014c882cdda5bc8d84fcf48 F test/vtab_shared.test c19b2555b807ef2ee014c882cdda5bc8d84fcf48
F test/where.test ea8e56f3c7b18fa4d250d32a08ffab44c0ff64ba F test/where.test 7dcfe573d4a5c6c4b7670271d02c006f2c7414b8
F test/where2.test 7012c0ad022a54430dd22c98288d3f4d6599dbcf F test/where2.test 7012c0ad022a54430dd22c98288d3f4d6599dbcf
F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94 F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94
F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
@@ -637,7 +637,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P 0f3c56330b43fb7c9dc43a444ca38bace9397ede P fb461b78dfc2501fafa8bce03da5487fdfdff959
R 5a3edf18f89485bee6c0db5078617fd9 R f17efdf67307b7c45c0bdb0de383022f
U drh U danielk1977
Z 6d8b0066d3b484307b936dd03d86c312 Z c0645d23ba10337cccb6560748424fb4

View File

@@ -1 +1 @@
fb461b78dfc2501fafa8bce03da5487fdfdff959 59d2e89e2181c26b18eac68ccc80ea3018f70a5e

View File

@@ -16,7 +16,7 @@
** so is applicable. Because this module is responsible for selecting ** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer". ** indices, you might also think of this module as the "query optimizer".
** **
** $Id: where.c,v 1.322 2008/09/06 14:19:11 danielk1977 Exp $ ** $Id: where.c,v 1.323 2008/10/01 08:43:03 danielk1977 Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -1784,9 +1784,7 @@ static int codeEqualityTerm(
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
int iReg; /* Register holding results */ int iReg; /* Register holding results */
if( iTarget<=0 ){ assert( iTarget>0 );
iReg = iTarget = sqlite3GetTempReg(pParse);
}
if( pX->op==TK_EQ ){ if( pX->op==TK_EQ ){
iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget);
}else if( pX->op==TK_ISNULL ){ }else if( pX->op==TK_ISNULL ){
@@ -2414,16 +2412,17 @@ WhereInfo *sqlite3WhereBegin(
** construct. ** construct.
*/ */
int r1; int r1;
int rtmp = sqlite3GetTempReg(pParse);
pTerm = findTerm(&wc, iCur, -1, notReady, WO_EQ|WO_IN, 0); pTerm = findTerm(&wc, iCur, -1, notReady, WO_EQ|WO_IN, 0);
assert( pTerm!=0 ); assert( pTerm!=0 );
assert( pTerm->pExpr!=0 ); assert( pTerm->pExpr!=0 );
assert( pTerm->leftCursor==iCur ); assert( pTerm->leftCursor==iCur );
assert( omitTable==0 ); assert( omitTable==0 );
r1 = codeEqualityTerm(pParse, pTerm, pLevel, 0); r1 = codeEqualityTerm(pParse, pTerm, pLevel, rtmp);
nxt = pLevel->nxt; nxt = pLevel->nxt;
sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, nxt); sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, nxt);
sqlite3VdbeAddOp3(v, OP_NotExists, iCur, nxt, r1); sqlite3VdbeAddOp3(v, OP_NotExists, iCur, nxt, r1);
sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, rtmp);
VdbeComment((v, "pk")); VdbeComment((v, "pk"));
pLevel->op = OP_Noop; pLevel->op = OP_Noop;
}else if( pLevel->flags & WHERE_ROWID_RANGE ){ }else if( pLevel->flags & WHERE_ROWID_RANGE ){

View File

@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing the use of indices in WHERE clases. # focus of this file is testing the use of indices in WHERE clases.
# #
# $Id: where.test,v 1.47 2008/09/01 15:52:11 drh Exp $ # $Id: where.test,v 1.48 2008/10/01 08:43:03 danielk1977 Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@@ -1155,6 +1155,50 @@ do_test where-15.1 {
} }
} {} } {}
# Ticket #3408.
#
# The branch of code in where.c that generated rowid lookups was
# incorrectly deallocating a constant register, meaning that if the
# vdbe code ran more than once, the second time around the constant
# value may have been clobbered by some other value.
#
do_test where-16.1 {
execsql {
CREATE TABLE a1(id INTEGER PRIMARY KEY, v);
CREATE TABLE a2(id INTEGER PRIMARY KEY, v);
INSERT INTO a1 VALUES(1, 'one');
INSERT INTO a1 VALUES(2, 'two');
INSERT INTO a2 VALUES(1, 'one');
INSERT INTO a2 VALUES(2, 'two');
}
} {}
do_test where-16.2 {
execsql {
SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one';
}
} {1 one 1 one 2 two 1 one}
# The actual problem reported in #3408.
do_test where-16.3 {
execsql {
CREATE TEMP TABLE foo(idx INTEGER);
INSERT INTO foo VALUES(1);
INSERT INTO foo VALUES(1);
INSERT INTO foo VALUES(1);
INSERT INTO foo VALUES(2);
INSERT INTO foo VALUES(2);
CREATE TEMP TABLE bar(stuff INTEGER);
INSERT INTO bar VALUES(100);
INSERT INTO bar VALUES(200);
INSERT INTO bar VALUES(300);
}
} {}
do_test where-16.4 {
execsql {
SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2;
}
} {2 2}
integrity_check {where-99.0} integrity_check {where-99.0}
finish_test finish_test