extensions/sqlite/sqlite-source/trigger.c
changeset 1645 27307df4d711
parent 1203 633c25ce6405
     1.1 --- a/extensions/sqlite/sqlite-source/trigger.c	Sun Oct 28 05:06:12 2007 +0000
     1.2 +++ b/extensions/sqlite/sqlite-source/trigger.c	Sun Oct 28 05:48:06 2007 +0000
     1.3 @@ -21,13 +21,13 @@
     1.4      TriggerStep * pTmp = pTriggerStep;
     1.5      pTriggerStep = pTriggerStep->pNext;
     1.6  
     1.7 -    if( pTmp->target.dyn ) sqliteFree((char*)pTmp->target.z);
     1.8 +    if( pTmp->target.dyn ) sqlite3_free((char*)pTmp->target.z);
     1.9      sqlite3ExprDelete(pTmp->pWhere);
    1.10      sqlite3ExprListDelete(pTmp->pExprList);
    1.11      sqlite3SelectDelete(pTmp->pSelect);
    1.12      sqlite3IdListDelete(pTmp->pIdList);
    1.13  
    1.14 -    sqliteFree(pTmp);
    1.15 +    sqlite3_free(pTmp);
    1.16    }
    1.17  }
    1.18  
    1.19 @@ -83,7 +83,7 @@
    1.20    ** If sqlite3SrcListLookup() returns 0, indicating the table does not
    1.21    ** exist, the error is caught by the block below.
    1.22    */
    1.23 -  if( !pTableName || sqlite3MallocFailed() ){
    1.24 +  if( !pTableName || db->mallocFailed ){
    1.25      goto trigger_cleanup;
    1.26    }
    1.27    pTab = sqlite3SrcListLookup(pParse, pTableName);
    1.28 @@ -92,7 +92,7 @@
    1.29    }
    1.30  
    1.31    /* Ensure the table name matches database name and that the table exists */
    1.32 -  if( sqlite3MallocFailed() ) goto trigger_cleanup;
    1.33 +  if( db->mallocFailed ) goto trigger_cleanup;
    1.34    assert( pTableName->nSrc==1 );
    1.35    if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName) && 
    1.36        sqlite3FixSrcList(&sFix, pTableName) ){
    1.37 @@ -110,7 +110,7 @@
    1.38  
    1.39    /* Check that the trigger name is not reserved and that no trigger of the
    1.40    ** specified name exists */
    1.41 -  zName = sqlite3NameFromToken(pName);
    1.42 +  zName = sqlite3NameFromToken(db, pName);
    1.43    if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
    1.44      goto trigger_cleanup;
    1.45    }
    1.46 @@ -168,23 +168,23 @@
    1.47    }
    1.48  
    1.49    /* Build the Trigger object */
    1.50 -  pTrigger = (Trigger*)sqliteMalloc(sizeof(Trigger));
    1.51 +  pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger));
    1.52    if( pTrigger==0 ) goto trigger_cleanup;
    1.53    pTrigger->name = zName;
    1.54    zName = 0;
    1.55 -  pTrigger->table = sqliteStrDup(pTableName->a[0].zName);
    1.56 +  pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName);
    1.57    pTrigger->pSchema = db->aDb[iDb].pSchema;
    1.58    pTrigger->pTabSchema = pTab->pSchema;
    1.59    pTrigger->op = op;
    1.60    pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
    1.61 -  pTrigger->pWhen = sqlite3ExprDup(pWhen);
    1.62 -  pTrigger->pColumns = sqlite3IdListDup(pColumns);
    1.63 -  sqlite3TokenCopy(&pTrigger->nameToken,pName);
    1.64 +  pTrigger->pWhen = sqlite3ExprDup(db, pWhen);
    1.65 +  pTrigger->pColumns = sqlite3IdListDup(db, pColumns);
    1.66 +  sqlite3TokenCopy(db, &pTrigger->nameToken,pName);
    1.67    assert( pParse->pNewTrigger==0 );
    1.68    pParse->pNewTrigger = pTrigger;
    1.69  
    1.70  trigger_cleanup:
    1.71 -  sqliteFree(zName);
    1.72 +  sqlite3_free(zName);
    1.73    sqlite3SrcListDelete(pTableName);
    1.74    sqlite3IdListDelete(pColumns);
    1.75    sqlite3ExprDelete(pWhen);
    1.76 @@ -253,8 +253,9 @@
    1.77      sqlite3VdbeChangeP3(v, addr+6, (char*)pAll->z, pAll->n);
    1.78      sqlite3ChangeCookie(db, v, iDb);
    1.79      sqlite3VdbeAddOp(v, OP_Close, 0, 0);
    1.80 -    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, 
    1.81 -       sqlite3MPrintf("type='trigger' AND name='%q'", pTrig->name), P3_DYNAMIC);
    1.82 +    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, sqlite3MPrintf(
    1.83 +        db, "type='trigger' AND name='%q'", pTrig->name), P3_DYNAMIC
    1.84 +    );
    1.85    }
    1.86  
    1.87    if( db->init.busy ){
    1.88 @@ -264,7 +265,8 @@
    1.89      pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash, 
    1.90                       pTrig->name, strlen(pTrig->name), pTrig);
    1.91      if( pDel ){
    1.92 -      assert( sqlite3MallocFailed() && pDel==pTrig );
    1.93 +      assert( pDel==pTrig );
    1.94 +      db->mallocFailed = 1;
    1.95        goto triggerfinish_cleanup;
    1.96      }
    1.97      n = strlen(pTrig->table) + 1;
    1.98 @@ -284,35 +286,35 @@
    1.99  /*
   1.100  ** Make a copy of all components of the given trigger step.  This has
   1.101  ** the effect of copying all Expr.token.z values into memory obtained
   1.102 -** from sqliteMalloc().  As initially created, the Expr.token.z values
   1.103 +** from sqlite3_malloc().  As initially created, the Expr.token.z values
   1.104  ** all point to the input string that was fed to the parser.  But that
   1.105  ** string is ephemeral - it will go away as soon as the sqlite3_exec()
   1.106  ** call that started the parser exits.  This routine makes a persistent
   1.107  ** copy of all the Expr.token.z strings so that the TriggerStep structure
   1.108  ** will be valid even after the sqlite3_exec() call returns.
   1.109  */
   1.110 -static void sqlitePersistTriggerStep(TriggerStep *p){
   1.111 +static void sqlitePersistTriggerStep(sqlite3 *db, TriggerStep *p){
   1.112    if( p->target.z ){
   1.113 -    p->target.z = (u8*)sqliteStrNDup((char*)p->target.z, p->target.n);
   1.114 +    p->target.z = (u8*)sqlite3DbStrNDup(db, (char*)p->target.z, p->target.n);
   1.115      p->target.dyn = 1;
   1.116    }
   1.117    if( p->pSelect ){
   1.118 -    Select *pNew = sqlite3SelectDup(p->pSelect);
   1.119 +    Select *pNew = sqlite3SelectDup(db, p->pSelect);
   1.120      sqlite3SelectDelete(p->pSelect);
   1.121      p->pSelect = pNew;
   1.122    }
   1.123    if( p->pWhere ){
   1.124 -    Expr *pNew = sqlite3ExprDup(p->pWhere);
   1.125 +    Expr *pNew = sqlite3ExprDup(db, p->pWhere);
   1.126      sqlite3ExprDelete(p->pWhere);
   1.127      p->pWhere = pNew;
   1.128    }
   1.129    if( p->pExprList ){
   1.130 -    ExprList *pNew = sqlite3ExprListDup(p->pExprList);
   1.131 +    ExprList *pNew = sqlite3ExprListDup(db, p->pExprList);
   1.132      sqlite3ExprListDelete(p->pExprList);
   1.133      p->pExprList = pNew;
   1.134    }
   1.135    if( p->pIdList ){
   1.136 -    IdList *pNew = sqlite3IdListDup(p->pIdList);
   1.137 +    IdList *pNew = sqlite3IdListDup(db, p->pIdList);
   1.138      sqlite3IdListDelete(p->pIdList);
   1.139      p->pIdList = pNew;
   1.140    }
   1.141 @@ -325,8 +327,8 @@
   1.142  ** The parser calls this routine when it finds a SELECT statement in
   1.143  ** body of a TRIGGER.  
   1.144  */
   1.145 -TriggerStep *sqlite3TriggerSelectStep(Select *pSelect){
   1.146 -  TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep));
   1.147 +TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
   1.148 +  TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
   1.149    if( pTriggerStep==0 ) {
   1.150      sqlite3SelectDelete(pSelect);
   1.151      return 0;
   1.152 @@ -335,7 +337,7 @@
   1.153    pTriggerStep->op = TK_SELECT;
   1.154    pTriggerStep->pSelect = pSelect;
   1.155    pTriggerStep->orconf = OE_Default;
   1.156 -  sqlitePersistTriggerStep(pTriggerStep);
   1.157 +  sqlitePersistTriggerStep(db, pTriggerStep);
   1.158  
   1.159    return pTriggerStep;
   1.160  }
   1.161 @@ -348,17 +350,19 @@
   1.162  ** body of a trigger.
   1.163  */
   1.164  TriggerStep *sqlite3TriggerInsertStep(
   1.165 +  sqlite3 *db,        /* The database connection */
   1.166    Token *pTableName,  /* Name of the table into which we insert */
   1.167    IdList *pColumn,    /* List of columns in pTableName to insert into */
   1.168    ExprList *pEList,   /* The VALUE clause: a list of values to be inserted */
   1.169    Select *pSelect,    /* A SELECT statement that supplies values */
   1.170    int orconf          /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
   1.171  ){
   1.172 -  TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep));
   1.173 +  TriggerStep *pTriggerStep;
   1.174  
   1.175    assert(pEList == 0 || pSelect == 0);
   1.176 -  assert(pEList != 0 || pSelect != 0);
   1.177 +  assert(pEList != 0 || pSelect != 0 || db->mallocFailed);
   1.178  
   1.179 +  pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
   1.180    if( pTriggerStep ){
   1.181      pTriggerStep->op = TK_INSERT;
   1.182      pTriggerStep->pSelect = pSelect;
   1.183 @@ -366,11 +370,11 @@
   1.184      pTriggerStep->pIdList = pColumn;
   1.185      pTriggerStep->pExprList = pEList;
   1.186      pTriggerStep->orconf = orconf;
   1.187 -    sqlitePersistTriggerStep(pTriggerStep);
   1.188 +    sqlitePersistTriggerStep(db, pTriggerStep);
   1.189    }else{
   1.190      sqlite3IdListDelete(pColumn);
   1.191      sqlite3ExprListDelete(pEList);
   1.192 -    sqlite3SelectDup(pSelect);
   1.193 +    sqlite3SelectDelete(pSelect);
   1.194    }
   1.195  
   1.196    return pTriggerStep;
   1.197 @@ -382,12 +386,13 @@
   1.198  ** sees an UPDATE statement inside the body of a CREATE TRIGGER.
   1.199  */
   1.200  TriggerStep *sqlite3TriggerUpdateStep(
   1.201 +  sqlite3 *db,         /* The database connection */
   1.202    Token *pTableName,   /* Name of the table to be updated */
   1.203    ExprList *pEList,    /* The SET clause: list of column and new values */
   1.204    Expr *pWhere,        /* The WHERE clause */
   1.205    int orconf           /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
   1.206  ){
   1.207 -  TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep));
   1.208 +  TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
   1.209    if( pTriggerStep==0 ){
   1.210       sqlite3ExprListDelete(pEList);
   1.211       sqlite3ExprDelete(pWhere);
   1.212 @@ -399,7 +404,7 @@
   1.213    pTriggerStep->pExprList = pEList;
   1.214    pTriggerStep->pWhere = pWhere;
   1.215    pTriggerStep->orconf = orconf;
   1.216 -  sqlitePersistTriggerStep(pTriggerStep);
   1.217 +  sqlitePersistTriggerStep(db, pTriggerStep);
   1.218  
   1.219    return pTriggerStep;
   1.220  }
   1.221 @@ -409,8 +414,12 @@
   1.222  ** a pointer to that trigger step.  The parser calls this routine when it
   1.223  ** sees a DELETE statement inside the body of a CREATE TRIGGER.
   1.224  */
   1.225 -TriggerStep *sqlite3TriggerDeleteStep(Token *pTableName, Expr *pWhere){
   1.226 -  TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep));
   1.227 +TriggerStep *sqlite3TriggerDeleteStep(
   1.228 +  sqlite3 *db,            /* Database connection */
   1.229 +  Token *pTableName,      /* The table from which rows are deleted */
   1.230 +  Expr *pWhere            /* The WHERE clause */
   1.231 +){
   1.232 +  TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
   1.233    if( pTriggerStep==0 ){
   1.234      sqlite3ExprDelete(pWhere);
   1.235      return 0;
   1.236 @@ -420,7 +429,7 @@
   1.237    pTriggerStep->target  = *pTableName;
   1.238    pTriggerStep->pWhere = pWhere;
   1.239    pTriggerStep->orconf = OE_Default;
   1.240 -  sqlitePersistTriggerStep(pTriggerStep);
   1.241 +  sqlitePersistTriggerStep(db, pTriggerStep);
   1.242  
   1.243    return pTriggerStep;
   1.244  }
   1.245 @@ -431,12 +440,12 @@
   1.246  void sqlite3DeleteTrigger(Trigger *pTrigger){
   1.247    if( pTrigger==0 ) return;
   1.248    sqlite3DeleteTriggerStep(pTrigger->step_list);
   1.249 -  sqliteFree(pTrigger->name);
   1.250 -  sqliteFree(pTrigger->table);
   1.251 +  sqlite3_free(pTrigger->name);
   1.252 +  sqlite3_free(pTrigger->table);
   1.253    sqlite3ExprDelete(pTrigger->pWhen);
   1.254    sqlite3IdListDelete(pTrigger->pColumns);
   1.255 -  if( pTrigger->nameToken.dyn ) sqliteFree((char*)pTrigger->nameToken.z);
   1.256 -  sqliteFree(pTrigger);
   1.257 +  if( pTrigger->nameToken.dyn ) sqlite3_free((char*)pTrigger->nameToken.z);
   1.258 +  sqlite3_free(pTrigger);
   1.259  }
   1.260  
   1.261  /*
   1.262 @@ -455,7 +464,7 @@
   1.263    int nName;
   1.264    sqlite3 *db = pParse->db;
   1.265  
   1.266 -  if( sqlite3MallocFailed() ) goto drop_trigger_cleanup;
   1.267 +  if( db->mallocFailed ) goto drop_trigger_cleanup;
   1.268    if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
   1.269      goto drop_trigger_cleanup;
   1.270    }
   1.271 @@ -644,9 +653,9 @@
   1.272      assert( iDb<pParse->db->nDb );
   1.273      sDb.z = (u8*)pParse->db->aDb[iDb].zName;
   1.274      sDb.n = strlen((char*)sDb.z);
   1.275 -    pSrc = sqlite3SrcListAppend(0, &sDb, &pStep->target);
   1.276 +    pSrc = sqlite3SrcListAppend(pParse->db, 0, &sDb, &pStep->target);
   1.277    } else {
   1.278 -    pSrc = sqlite3SrcListAppend(0, &pStep->target, 0);
   1.279 +    pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0);
   1.280    }
   1.281    return pSrc;
   1.282  }
   1.283 @@ -663,6 +672,7 @@
   1.284    TriggerStep * pTriggerStep = pStepList;
   1.285    int orconf;
   1.286    Vdbe *v = pParse->pVdbe;
   1.287 +  sqlite3 *db = pParse->db;
   1.288  
   1.289    assert( pTriggerStep!=0 );
   1.290    assert( v!=0 );
   1.291 @@ -673,21 +683,21 @@
   1.292      pParse->trigStack->orconf = orconf;
   1.293      switch( pTriggerStep->op ){
   1.294        case TK_SELECT: {
   1.295 -	Select *ss = sqlite3SelectDup(pTriggerStep->pSelect);
   1.296 +        Select *ss = sqlite3SelectDup(db, pTriggerStep->pSelect);
   1.297          if( ss ){
   1.298            sqlite3SelectResolve(pParse, ss, 0);
   1.299            sqlite3Select(pParse, ss, SRT_Discard, 0, 0, 0, 0, 0);
   1.300            sqlite3SelectDelete(ss);
   1.301          }
   1.302 -	break;
   1.303 +        break;
   1.304        }
   1.305        case TK_UPDATE: {
   1.306          SrcList *pSrc;
   1.307          pSrc = targetSrcList(pParse, pTriggerStep);
   1.308          sqlite3VdbeAddOp(v, OP_ResetCount, 0, 0);
   1.309          sqlite3Update(pParse, pSrc,
   1.310 -		sqlite3ExprListDup(pTriggerStep->pExprList), 
   1.311 -		sqlite3ExprDup(pTriggerStep->pWhere), orconf);
   1.312 +                sqlite3ExprListDup(db, pTriggerStep->pExprList), 
   1.313 +                sqlite3ExprDup(db, pTriggerStep->pWhere), orconf);
   1.314          sqlite3VdbeAddOp(v, OP_ResetCount, 1, 0);
   1.315          break;
   1.316        }
   1.317 @@ -696,9 +706,9 @@
   1.318          pSrc = targetSrcList(pParse, pTriggerStep);
   1.319          sqlite3VdbeAddOp(v, OP_ResetCount, 0, 0);
   1.320          sqlite3Insert(pParse, pSrc,
   1.321 -          sqlite3ExprListDup(pTriggerStep->pExprList), 
   1.322 -          sqlite3SelectDup(pTriggerStep->pSelect), 
   1.323 -          sqlite3IdListDup(pTriggerStep->pIdList), orconf);
   1.324 +          sqlite3ExprListDup(db, pTriggerStep->pExprList), 
   1.325 +          sqlite3SelectDup(db, pTriggerStep->pSelect), 
   1.326 +          sqlite3IdListDup(db, pTriggerStep->pIdList), orconf);
   1.327          sqlite3VdbeAddOp(v, OP_ResetCount, 1, 0);
   1.328          break;
   1.329        }
   1.330 @@ -706,7 +716,8 @@
   1.331          SrcList *pSrc;
   1.332          sqlite3VdbeAddOp(v, OP_ResetCount, 0, 0);
   1.333          pSrc = targetSrcList(pParse, pTriggerStep);
   1.334 -        sqlite3DeleteFrom(pParse, pSrc, sqlite3ExprDup(pTriggerStep->pWhere));
   1.335 +        sqlite3DeleteFrom(pParse, pSrc, 
   1.336 +                          sqlite3ExprDup(db, pTriggerStep->pWhere));
   1.337          sqlite3VdbeAddOp(v, OP_ResetCount, 1, 0);
   1.338          break;
   1.339        }
   1.340 @@ -805,7 +816,7 @@
   1.341  
   1.342        /* code the WHEN clause */
   1.343        endTrigger = sqlite3VdbeMakeLabel(pParse->pVdbe);
   1.344 -      whenExpr = sqlite3ExprDup(p->pWhen);
   1.345 +      whenExpr = sqlite3ExprDup(pParse->db, p->pWhen);
   1.346        if( sqlite3ExprResolveNames(&sNC, whenExpr) ){
   1.347          pParse->trigStack = trigStackEntry.pNext;
   1.348          sqlite3ExprDelete(whenExpr);