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);