From 523a087b9ee7466c1223a9b3fa7b8c99d1d4c9fd Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 31 Aug 2009 05:23:32 +0000 Subject: [PATCH] Fix another test problem and some instances where an OOM may cause a segfault. FossilOrigin-Name: 31199db0f77cf4b32d5589a29abd9535b155164b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/trigger.c | 8 ++++++-- src/vdbeaux.c | 47 ++++++++++++++++++++++++++--------------------- test/attach3.test | 5 +++++ 5 files changed, 46 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index e1647bb874..5b2e27eec1 100644 --- a/manifest +++ b/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 diff --git a/manifest.uuid b/manifest.uuid index 07dae6bc32..a7c65c718d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9eb91efda5241609ff18ff15ef5eaa0e86788eab \ No newline at end of file +31199db0f77cf4b32d5589a29abd9535b155164b \ No newline at end of file diff --git a/src/trigger.c b/src/trigger.c index 4b3e4fd571..7093cbc7fd 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -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; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index d3e0d9cd96..23acfef29b 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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; inCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ - sqlite3VdbeFreeCursor(p, pC); - p->apCsr[i] = 0; + if( p->apCsr ){ + int i; + for(i=0; inCursor; 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; inCursor; i++){ assert( p->apCsr[i]==0 ); } - for(i=1; i<=p->nMem; i++){ assert( p->aMem[i].flags==MEM_Null ); } + for(i=0; inCursor; 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); diff --git a/test/attach3.test b/test/attach3.test index cb31143c3f..2a37d74c91 100644 --- a/test/attach3.test +++ b/test/attach3.test @@ -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);