Fix another test problem and some instances where an OOM may cause a segfault.
FossilOrigin-Name: 31199db0f77cf4b32d5589a29abd9535b155164b
This commit is contained in:
parent
76d462ee78
commit
523a087b9e
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
||||
C Fixes\sfor\snew\striggers\sscheme.
|
||||
D 2009-08-30T11:42:52
|
||||
C Fix\sanother\stest\sproblem\sand\ssome\sinstances\swhere\san\sOOM\smay\scause\sa\ssegfault.
|
||||
D 2009-08-31T05:23:33
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in 73ddeec9dd10b85876c5c2ce1fdce627e1dcc7f8
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@ -199,7 +199,7 @@ F src/test_tclvar.c 9e42fa59d3d2f064b7ab8628e7ab2dc8a9fe93d4
|
||||
F src/test_thread.c b8a1ab7ca1a632f18e8a361880d5d65eeea08eac
|
||||
F src/test_wsd.c 3ae5101de6cbfda2720152ab659ea84079719241
|
||||
F src/tokenize.c af8a56e6a50c5042fc305bfa796275e9bf26ff2b
|
||||
F src/trigger.c 26e493efad371e521178d60d43fcf7878dbdd344
|
||||
F src/trigger.c 42c93d1c357395c10c0e3e864a639b20ef4082fb
|
||||
F src/update.c 574464e0049eb289ab863c583f84474b5b76cd39
|
||||
F src/utf.c 3ca2c9461b8e942c68da28bfccd448663f536a6f
|
||||
F src/util.c efb5f8e533d4beef545cf765cab5f7920b4c75f9
|
||||
@ -208,7 +208,7 @@ F src/vdbe.c 5e9d870ec390fbc329f11424b121681e8da5d75c
|
||||
F src/vdbe.h 080fe6bc1264438becb8bf9b9f3c84074c336b78
|
||||
F src/vdbeInt.h 1291908344bcbaa8cf47de86d7108cb92c3a71a3
|
||||
F src/vdbeapi.c 8d5013ab6104be757c208a70ffb191cc27d2b688
|
||||
F src/vdbeaux.c ea92afd36df2e7f3a47cff5ea41aa5489ea4c971
|
||||
F src/vdbeaux.c d8ca68164d20c5b65dfa713095febcb5d37d45b0
|
||||
F src/vdbeblob.c f93cb60ac388633ed3bde8a94ef161ad2dbfb689
|
||||
F src/vdbemem.c dc551981833756ea34a3e0b238f759479e7cf526
|
||||
F src/vtab.c 10df5c77cea34a49f2ad4e5de763f820d6223eb4
|
||||
@ -231,7 +231,7 @@ F test/async4.test aafa6328c559d3e4bb587de770cbdecfca06f0da
|
||||
F test/async5.test f3592d79c84d6e83a5f50d3fd500445f7d97dfdf
|
||||
F test/attach.test 1d1be27b9e4c654f9bb14d011a4a87753c0b197a
|
||||
F test/attach2.test a295d2d7061adcee5884ef4a93c7c96a82765437
|
||||
F test/attach3.test 512521ba94372dfd0efb07d04b2cdefc8c929e66
|
||||
F test/attach3.test ab28cc309888e2ac25795b52b2eee2214920b360
|
||||
F test/attachmalloc.test cf8cf17d183de357b1147a9baacbdfc85b940b61
|
||||
F test/auth.test 8e9a21d7321c9ad20d26f630acc02e15f2f2a3b6
|
||||
F test/auth2.test ee3ba272e2b975e913afc9b041ee75706e190005
|
||||
@ -747,7 +747,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
|
||||
P 9b9c19211593d5ff7b39254a29c284560a8bcedb
|
||||
R 10a0aa3fda7c1b8d215a3d925d83afe3
|
||||
P 9eb91efda5241609ff18ff15ef5eaa0e86788eab
|
||||
R 63b174d38f0bc479f8becc3f97b1ed05
|
||||
U dan
|
||||
Z fc25ca89c2c8570dc6970eb3da5d927f
|
||||
Z 2a154fc741e40d1c8378264e43f74ea7
|
||||
|
@ -1 +1 @@
|
||||
9eb91efda5241609ff18ff15ef5eaa0e86788eab
|
||||
31199db0f77cf4b32d5589a29abd9535b155164b
|
@ -843,7 +843,9 @@ static CodedTrigger *codeRowTrigger(
|
||||
/* Code the WHEN clause. If it evaluates to false (or NULL) the
|
||||
** sub-vdbe is immediately halted. */
|
||||
pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0);
|
||||
if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) ){
|
||||
if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
|
||||
&& db->mallocFailed==0
|
||||
){
|
||||
iEndTrigger = sqlite3VdbeMakeLabel(v);
|
||||
sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
|
||||
}
|
||||
@ -859,7 +861,9 @@ static CodedTrigger *codeRowTrigger(
|
||||
VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
|
||||
|
||||
transferParseError(pParse, pSubParse);
|
||||
pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pParse->nArg);
|
||||
if( db->mallocFailed==0 ){
|
||||
pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pParse->nArg);
|
||||
}
|
||||
pProgram->nMem = pSubParse->nMem;
|
||||
pProgram->nCsr = pSubParse->nTab;
|
||||
pProgram->token = (void *)pTrigger;
|
||||
|
@ -341,6 +341,7 @@ int sqlite3VdbeCurrentAddr(Vdbe *p){
|
||||
|
||||
VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){
|
||||
VdbeOp *aOp = p->aOp;
|
||||
assert( aOp && !p->db->mallocFailed );
|
||||
resolveP2Values(p, pnMaxArg);
|
||||
*pnOp = p->nOp;
|
||||
p->aOp = 0;
|
||||
@ -512,16 +513,18 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
|
||||
}
|
||||
|
||||
void sqlite3VdbeProgramDelete(sqlite3 *db, SubProgram *p, int freeop){
|
||||
assert( p->nRef>0 );
|
||||
if( freeop || p->nRef==1 ){
|
||||
Op *aOp = p->aOp;
|
||||
p->aOp = 0;
|
||||
vdbeFreeOpArray(db, aOp, p->nOp);
|
||||
p->nOp = 0;
|
||||
}
|
||||
p->nRef--;
|
||||
if( p->nRef==0 ){
|
||||
sqlite3DbFree(db, p);
|
||||
if( p ){
|
||||
assert( p->nRef>0 );
|
||||
if( freeop || p->nRef==1 ){
|
||||
Op *aOp = p->aOp;
|
||||
p->aOp = 0;
|
||||
vdbeFreeOpArray(db, aOp, p->nOp);
|
||||
p->nOp = 0;
|
||||
}
|
||||
p->nRef--;
|
||||
if( p->nRef==0 ){
|
||||
sqlite3DbFree(db, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1350,9 +1353,6 @@ int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){
|
||||
** open cursors.
|
||||
*/
|
||||
static void closeAllCursors(Vdbe *p){
|
||||
int i;
|
||||
/* if( p->apCsr==0 ) return; */
|
||||
|
||||
if( p->pFrame ){
|
||||
VdbeFrame *pFrame = p->pFrame;
|
||||
for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
|
||||
@ -1361,14 +1361,19 @@ static void closeAllCursors(Vdbe *p){
|
||||
p->pFrame = 0;
|
||||
p->nFrame = 0;
|
||||
|
||||
for(i=0; i<p->nCursor; i++){
|
||||
VdbeCursor *pC = p->apCsr[i];
|
||||
if( pC ){
|
||||
sqlite3VdbeFreeCursor(p, pC);
|
||||
p->apCsr[i] = 0;
|
||||
if( p->apCsr ){
|
||||
int i;
|
||||
for(i=0; i<p->nCursor; i++){
|
||||
VdbeCursor *pC = p->apCsr[i];
|
||||
if( pC ){
|
||||
sqlite3VdbeFreeCursor(p, pC);
|
||||
p->apCsr[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
releaseMemArray(&p->aMem[1], p->nMem);
|
||||
if( p->aMem ){
|
||||
releaseMemArray(&p->aMem[1], p->nMem);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1385,8 +1390,8 @@ static void Cleanup(Vdbe *p){
|
||||
/* Execute assert() statements to ensure that the Vdbe.apCsr[] and
|
||||
** Vdbe.aMem[] arrays have already been cleaned up. */
|
||||
int i;
|
||||
for(i=0; i<p->nCursor; i++){ assert( p->apCsr[i]==0 ); }
|
||||
for(i=1; i<=p->nMem; i++){ assert( p->aMem[i].flags==MEM_Null ); }
|
||||
for(i=0; i<p->nCursor; i++) assert( p->apCsr==0 || p->apCsr[i]==0 );
|
||||
for(i=1; i<=p->nMem; i++) assert( p->aMem==0 || p->aMem[i].flags==MEM_Null );
|
||||
#endif
|
||||
|
||||
sqlite3DbFree(db, p->zErrMsg);
|
||||
|
@ -23,6 +23,11 @@ ifcapable !attach {
|
||||
return
|
||||
}
|
||||
|
||||
# The tests in this file were written before SQLite supported recursive
|
||||
# trigger invocation, and some tests depend on that to pass. So disable
|
||||
# recursive triggers for this file.
|
||||
catchsql { pragma disable_recursive_triggers = 1 }
|
||||
|
||||
# Create tables t1 and t2 in the main database
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b);
|
||||
|
Loading…
x
Reference in New Issue
Block a user