]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix another test problem and some instances where an OOM may cause a segfault.
authordan <dan@noemail.net>
Mon, 31 Aug 2009 05:23:32 +0000 (05:23 +0000)
committerdan <dan@noemail.net>
Mon, 31 Aug 2009 05:23:32 +0000 (05:23 +0000)
FossilOrigin-Name: 31199db0f77cf4b32d5589a29abd9535b155164b

manifest
manifest.uuid
src/trigger.c
src/vdbeaux.c
test/attach3.test

index e1647bb87430bb64d13da8a55a8aae8982527d4c..5b2e27eec1aa4c06551e49bcab51493c5a222b4c 100644 (file)
--- 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
index 07dae6bc32a5d45b6bf50fc44dad0e509e1cb506..a7c65c718dc2cf6734e4906a59f1450e06ccd6e1 100644 (file)
@@ -1 +1 @@
-9eb91efda5241609ff18ff15ef5eaa0e86788eab
\ No newline at end of file
+31199db0f77cf4b32d5589a29abd9535b155164b
\ No newline at end of file
index 4b3e4fd571cebd896a3dd04397cfd2a7c651fd1c..7093cbc7fdc878b463da23a0a37883ff01a36ebb 100644 (file)
@@ -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;
index d3e0d9cd967a2f83e9c6cf7bd384606ef5f00af8..23acfef29be3e3a16bc7e0b6bfcc0cc0f5b7d924 100644 (file)
@@ -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);
index cb31143c3f0689118041a55dcfcf0a302568a9fa..2a37d74c91ae870caaafbc3a0fb2bb5e9012f3de 100644 (file)
@@ -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);