Annotation of embedaddon/sqlite3/src/trigger.c, revision 1.1

1.1     ! misho       1: /*
        !             2: **
        !             3: ** The author disclaims copyright to this source code.  In place of
        !             4: ** a legal notice, here is a blessing:
        !             5: **
        !             6: **    May you do good and not evil.
        !             7: **    May you find forgiveness for yourself and forgive others.
        !             8: **    May you share freely, never taking more than you give.
        !             9: **
        !            10: *************************************************************************
        !            11: ** This file contains the implementation for TRIGGERs
        !            12: */
        !            13: #include "sqliteInt.h"
        !            14: 
        !            15: #ifndef SQLITE_OMIT_TRIGGER
        !            16: /*
        !            17: ** Delete a linked list of TriggerStep structures.
        !            18: */
        !            19: void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerStep){
        !            20:   while( pTriggerStep ){
        !            21:     TriggerStep * pTmp = pTriggerStep;
        !            22:     pTriggerStep = pTriggerStep->pNext;
        !            23: 
        !            24:     sqlite3ExprDelete(db, pTmp->pWhere);
        !            25:     sqlite3ExprListDelete(db, pTmp->pExprList);
        !            26:     sqlite3SelectDelete(db, pTmp->pSelect);
        !            27:     sqlite3IdListDelete(db, pTmp->pIdList);
        !            28: 
        !            29:     sqlite3DbFree(db, pTmp);
        !            30:   }
        !            31: }
        !            32: 
        !            33: /*
        !            34: ** Given table pTab, return a list of all the triggers attached to 
        !            35: ** the table. The list is connected by Trigger.pNext pointers.
        !            36: **
        !            37: ** All of the triggers on pTab that are in the same database as pTab
        !            38: ** are already attached to pTab->pTrigger.  But there might be additional
        !            39: ** triggers on pTab in the TEMP schema.  This routine prepends all
        !            40: ** TEMP triggers on pTab to the beginning of the pTab->pTrigger list
        !            41: ** and returns the combined list.
        !            42: **
        !            43: ** To state it another way:  This routine returns a list of all triggers
        !            44: ** that fire off of pTab.  The list will include any TEMP triggers on
        !            45: ** pTab as well as the triggers lised in pTab->pTrigger.
        !            46: */
        !            47: Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
        !            48:   Schema * const pTmpSchema = pParse->db->aDb[1].pSchema;
        !            49:   Trigger *pList = 0;                  /* List of triggers to return */
        !            50: 
        !            51:   if( pParse->disableTriggers ){
        !            52:     return 0;
        !            53:   }
        !            54: 
        !            55:   if( pTmpSchema!=pTab->pSchema ){
        !            56:     HashElem *p;
        !            57:     assert( sqlite3SchemaMutexHeld(pParse->db, 0, pTmpSchema) );
        !            58:     for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){
        !            59:       Trigger *pTrig = (Trigger *)sqliteHashData(p);
        !            60:       if( pTrig->pTabSchema==pTab->pSchema
        !            61:        && 0==sqlite3StrICmp(pTrig->table, pTab->zName) 
        !            62:       ){
        !            63:         pTrig->pNext = (pList ? pList : pTab->pTrigger);
        !            64:         pList = pTrig;
        !            65:       }
        !            66:     }
        !            67:   }
        !            68: 
        !            69:   return (pList ? pList : pTab->pTrigger);
        !            70: }
        !            71: 
        !            72: /*
        !            73: ** This is called by the parser when it sees a CREATE TRIGGER statement
        !            74: ** up to the point of the BEGIN before the trigger actions.  A Trigger
        !            75: ** structure is generated based on the information available and stored
        !            76: ** in pParse->pNewTrigger.  After the trigger actions have been parsed, the
        !            77: ** sqlite3FinishTrigger() function is called to complete the trigger
        !            78: ** construction process.
        !            79: */
        !            80: void sqlite3BeginTrigger(
        !            81:   Parse *pParse,      /* The parse context of the CREATE TRIGGER statement */
        !            82:   Token *pName1,      /* The name of the trigger */
        !            83:   Token *pName2,      /* The name of the trigger */
        !            84:   int tr_tm,          /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */
        !            85:   int op,             /* One of TK_INSERT, TK_UPDATE, TK_DELETE */
        !            86:   IdList *pColumns,   /* column list if this is an UPDATE OF trigger */
        !            87:   SrcList *pTableName,/* The name of the table/view the trigger applies to */
        !            88:   Expr *pWhen,        /* WHEN clause */
        !            89:   int isTemp,         /* True if the TEMPORARY keyword is present */
        !            90:   int noErr           /* Suppress errors if the trigger already exists */
        !            91: ){
        !            92:   Trigger *pTrigger = 0;  /* The new trigger */
        !            93:   Table *pTab;            /* Table that the trigger fires off of */
        !            94:   char *zName = 0;        /* Name of the trigger */
        !            95:   sqlite3 *db = pParse->db;  /* The database connection */
        !            96:   int iDb;                /* The database to store the trigger in */
        !            97:   Token *pName;           /* The unqualified db name */
        !            98:   DbFixer sFix;           /* State vector for the DB fixer */
        !            99:   int iTabDb;             /* Index of the database holding pTab */
        !           100: 
        !           101:   assert( pName1!=0 );   /* pName1->z might be NULL, but not pName1 itself */
        !           102:   assert( pName2!=0 );
        !           103:   assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE );
        !           104:   assert( op>0 && op<0xff );
        !           105:   if( isTemp ){
        !           106:     /* If TEMP was specified, then the trigger name may not be qualified. */
        !           107:     if( pName2->n>0 ){
        !           108:       sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name");
        !           109:       goto trigger_cleanup;
        !           110:     }
        !           111:     iDb = 1;
        !           112:     pName = pName1;
        !           113:   }else{
        !           114:     /* Figure out the db that the the trigger will be created in */
        !           115:     iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
        !           116:     if( iDb<0 ){
        !           117:       goto trigger_cleanup;
        !           118:     }
        !           119:   }
        !           120:   if( !pTableName || db->mallocFailed ){
        !           121:     goto trigger_cleanup;
        !           122:   }
        !           123: 
        !           124:   /* A long-standing parser bug is that this syntax was allowed:
        !           125:   **
        !           126:   **    CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab ....
        !           127:   **                                                 ^^^^^^^^
        !           128:   **
        !           129:   ** To maintain backwards compatibility, ignore the database
        !           130:   ** name on pTableName if we are reparsing our of SQLITE_MASTER.
        !           131:   */
        !           132:   if( db->init.busy && iDb!=1 ){
        !           133:     sqlite3DbFree(db, pTableName->a[0].zDatabase);
        !           134:     pTableName->a[0].zDatabase = 0;
        !           135:   }
        !           136: 
        !           137:   /* If the trigger name was unqualified, and the table is a temp table,
        !           138:   ** then set iDb to 1 to create the trigger in the temporary database.
        !           139:   ** If sqlite3SrcListLookup() returns 0, indicating the table does not
        !           140:   ** exist, the error is caught by the block below.
        !           141:   */
        !           142:   pTab = sqlite3SrcListLookup(pParse, pTableName);
        !           143:   if( db->init.busy==0 && pName2->n==0 && pTab
        !           144:         && pTab->pSchema==db->aDb[1].pSchema ){
        !           145:     iDb = 1;
        !           146:   }
        !           147: 
        !           148:   /* Ensure the table name matches database name and that the table exists */
        !           149:   if( db->mallocFailed ) goto trigger_cleanup;
        !           150:   assert( pTableName->nSrc==1 );
        !           151:   if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName) && 
        !           152:       sqlite3FixSrcList(&sFix, pTableName) ){
        !           153:     goto trigger_cleanup;
        !           154:   }
        !           155:   pTab = sqlite3SrcListLookup(pParse, pTableName);
        !           156:   if( !pTab ){
        !           157:     /* The table does not exist. */
        !           158:     if( db->init.iDb==1 ){
        !           159:       /* Ticket #3810.
        !           160:       ** Normally, whenever a table is dropped, all associated triggers are
        !           161:       ** dropped too.  But if a TEMP trigger is created on a non-TEMP table
        !           162:       ** and the table is dropped by a different database connection, the
        !           163:       ** trigger is not visible to the database connection that does the
        !           164:       ** drop so the trigger cannot be dropped.  This results in an
        !           165:       ** "orphaned trigger" - a trigger whose associated table is missing.
        !           166:       */
        !           167:       db->init.orphanTrigger = 1;
        !           168:     }
        !           169:     goto trigger_cleanup;
        !           170:   }
        !           171:   if( IsVirtual(pTab) ){
        !           172:     sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables");
        !           173:     goto trigger_cleanup;
        !           174:   }
        !           175: 
        !           176:   /* Check that the trigger name is not reserved and that no trigger of the
        !           177:   ** specified name exists */
        !           178:   zName = sqlite3NameFromToken(db, pName);
        !           179:   if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
        !           180:     goto trigger_cleanup;
        !           181:   }
        !           182:   assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
        !           183:   if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),
        !           184:                       zName, sqlite3Strlen30(zName)) ){
        !           185:     if( !noErr ){
        !           186:       sqlite3ErrorMsg(pParse, "trigger %T already exists", pName);
        !           187:     }else{
        !           188:       assert( !db->init.busy );
        !           189:       sqlite3CodeVerifySchema(pParse, iDb);
        !           190:     }
        !           191:     goto trigger_cleanup;
        !           192:   }
        !           193: 
        !           194:   /* Do not create a trigger on a system table */
        !           195:   if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
        !           196:     sqlite3ErrorMsg(pParse, "cannot create trigger on system table");
        !           197:     pParse->nErr++;
        !           198:     goto trigger_cleanup;
        !           199:   }
        !           200: 
        !           201:   /* INSTEAD of triggers are only for views and views only support INSTEAD
        !           202:   ** of triggers.
        !           203:   */
        !           204:   if( pTab->pSelect && tr_tm!=TK_INSTEAD ){
        !           205:     sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", 
        !           206:         (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0);
        !           207:     goto trigger_cleanup;
        !           208:   }
        !           209:   if( !pTab->pSelect && tr_tm==TK_INSTEAD ){
        !           210:     sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF"
        !           211:         " trigger on table: %S", pTableName, 0);
        !           212:     goto trigger_cleanup;
        !           213:   }
        !           214:   iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
        !           215: 
        !           216: #ifndef SQLITE_OMIT_AUTHORIZATION
        !           217:   {
        !           218:     int code = SQLITE_CREATE_TRIGGER;
        !           219:     const char *zDb = db->aDb[iTabDb].zName;
        !           220:     const char *zDbTrig = isTemp ? db->aDb[1].zName : zDb;
        !           221:     if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER;
        !           222:     if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){
        !           223:       goto trigger_cleanup;
        !           224:     }
        !           225:     if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){
        !           226:       goto trigger_cleanup;
        !           227:     }
        !           228:   }
        !           229: #endif
        !           230: 
        !           231:   /* INSTEAD OF triggers can only appear on views and BEFORE triggers
        !           232:   ** cannot appear on views.  So we might as well translate every
        !           233:   ** INSTEAD OF trigger into a BEFORE trigger.  It simplifies code
        !           234:   ** elsewhere.
        !           235:   */
        !           236:   if (tr_tm == TK_INSTEAD){
        !           237:     tr_tm = TK_BEFORE;
        !           238:   }
        !           239: 
        !           240:   /* Build the Trigger object */
        !           241:   pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger));
        !           242:   if( pTrigger==0 ) goto trigger_cleanup;
        !           243:   pTrigger->zName = zName;
        !           244:   zName = 0;
        !           245:   pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName);
        !           246:   pTrigger->pSchema = db->aDb[iDb].pSchema;
        !           247:   pTrigger->pTabSchema = pTab->pSchema;
        !           248:   pTrigger->op = (u8)op;
        !           249:   pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
        !           250:   pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
        !           251:   pTrigger->pColumns = sqlite3IdListDup(db, pColumns);
        !           252:   assert( pParse->pNewTrigger==0 );
        !           253:   pParse->pNewTrigger = pTrigger;
        !           254: 
        !           255: trigger_cleanup:
        !           256:   sqlite3DbFree(db, zName);
        !           257:   sqlite3SrcListDelete(db, pTableName);
        !           258:   sqlite3IdListDelete(db, pColumns);
        !           259:   sqlite3ExprDelete(db, pWhen);
        !           260:   if( !pParse->pNewTrigger ){
        !           261:     sqlite3DeleteTrigger(db, pTrigger);
        !           262:   }else{
        !           263:     assert( pParse->pNewTrigger==pTrigger );
        !           264:   }
        !           265: }
        !           266: 
        !           267: /*
        !           268: ** This routine is called after all of the trigger actions have been parsed
        !           269: ** in order to complete the process of building the trigger.
        !           270: */
        !           271: void sqlite3FinishTrigger(
        !           272:   Parse *pParse,          /* Parser context */
        !           273:   TriggerStep *pStepList, /* The triggered program */
        !           274:   Token *pAll             /* Token that describes the complete CREATE TRIGGER */
        !           275: ){
        !           276:   Trigger *pTrig = pParse->pNewTrigger;   /* Trigger being finished */
        !           277:   char *zName;                            /* Name of trigger */
        !           278:   sqlite3 *db = pParse->db;               /* The database */
        !           279:   DbFixer sFix;                           /* Fixer object */
        !           280:   int iDb;                                /* Database containing the trigger */
        !           281:   Token nameToken;                        /* Trigger name for error reporting */
        !           282: 
        !           283:   pParse->pNewTrigger = 0;
        !           284:   if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup;
        !           285:   zName = pTrig->zName;
        !           286:   iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
        !           287:   pTrig->step_list = pStepList;
        !           288:   while( pStepList ){
        !           289:     pStepList->pTrig = pTrig;
        !           290:     pStepList = pStepList->pNext;
        !           291:   }
        !           292:   nameToken.z = pTrig->zName;
        !           293:   nameToken.n = sqlite3Strlen30(nameToken.z);
        !           294:   if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken) 
        !           295:           && sqlite3FixTriggerStep(&sFix, pTrig->step_list) ){
        !           296:     goto triggerfinish_cleanup;
        !           297:   }
        !           298: 
        !           299:   /* if we are not initializing,
        !           300:   ** build the sqlite_master entry
        !           301:   */
        !           302:   if( !db->init.busy ){
        !           303:     Vdbe *v;
        !           304:     char *z;
        !           305: 
        !           306:     /* Make an entry in the sqlite_master table */
        !           307:     v = sqlite3GetVdbe(pParse);
        !           308:     if( v==0 ) goto triggerfinish_cleanup;
        !           309:     sqlite3BeginWriteOperation(pParse, 0, iDb);
        !           310:     z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);
        !           311:     sqlite3NestedParse(pParse,
        !           312:        "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
        !           313:        db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName,
        !           314:        pTrig->table, z);
        !           315:     sqlite3DbFree(db, z);
        !           316:     sqlite3ChangeCookie(pParse, iDb);
        !           317:     sqlite3VdbeAddParseSchemaOp(v, iDb,
        !           318:         sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName));
        !           319:   }
        !           320: 
        !           321:   if( db->init.busy ){
        !           322:     Trigger *pLink = pTrig;
        !           323:     Hash *pHash = &db->aDb[iDb].pSchema->trigHash;
        !           324:     assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
        !           325:     pTrig = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), pTrig);
        !           326:     if( pTrig ){
        !           327:       db->mallocFailed = 1;
        !           328:     }else if( pLink->pSchema==pLink->pTabSchema ){
        !           329:       Table *pTab;
        !           330:       int n = sqlite3Strlen30(pLink->table);
        !           331:       pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table, n);
        !           332:       assert( pTab!=0 );
        !           333:       pLink->pNext = pTab->pTrigger;
        !           334:       pTab->pTrigger = pLink;
        !           335:     }
        !           336:   }
        !           337: 
        !           338: triggerfinish_cleanup:
        !           339:   sqlite3DeleteTrigger(db, pTrig);
        !           340:   assert( !pParse->pNewTrigger );
        !           341:   sqlite3DeleteTriggerStep(db, pStepList);
        !           342: }
        !           343: 
        !           344: /*
        !           345: ** Turn a SELECT statement (that the pSelect parameter points to) into
        !           346: ** a trigger step.  Return a pointer to a TriggerStep structure.
        !           347: **
        !           348: ** The parser calls this routine when it finds a SELECT statement in
        !           349: ** body of a TRIGGER.  
        !           350: */
        !           351: TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
        !           352:   TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
        !           353:   if( pTriggerStep==0 ) {
        !           354:     sqlite3SelectDelete(db, pSelect);
        !           355:     return 0;
        !           356:   }
        !           357:   pTriggerStep->op = TK_SELECT;
        !           358:   pTriggerStep->pSelect = pSelect;
        !           359:   pTriggerStep->orconf = OE_Default;
        !           360:   return pTriggerStep;
        !           361: }
        !           362: 
        !           363: /*
        !           364: ** Allocate space to hold a new trigger step.  The allocated space
        !           365: ** holds both the TriggerStep object and the TriggerStep.target.z string.
        !           366: **
        !           367: ** If an OOM error occurs, NULL is returned and db->mallocFailed is set.
        !           368: */
        !           369: static TriggerStep *triggerStepAllocate(
        !           370:   sqlite3 *db,                /* Database connection */
        !           371:   u8 op,                      /* Trigger opcode */
        !           372:   Token *pName                /* The target name */
        !           373: ){
        !           374:   TriggerStep *pTriggerStep;
        !           375: 
        !           376:   pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n);
        !           377:   if( pTriggerStep ){
        !           378:     char *z = (char*)&pTriggerStep[1];
        !           379:     memcpy(z, pName->z, pName->n);
        !           380:     pTriggerStep->target.z = z;
        !           381:     pTriggerStep->target.n = pName->n;
        !           382:     pTriggerStep->op = op;
        !           383:   }
        !           384:   return pTriggerStep;
        !           385: }
        !           386: 
        !           387: /*
        !           388: ** Build a trigger step out of an INSERT statement.  Return a pointer
        !           389: ** to the new trigger step.
        !           390: **
        !           391: ** The parser calls this routine when it sees an INSERT inside the
        !           392: ** body of a trigger.
        !           393: */
        !           394: TriggerStep *sqlite3TriggerInsertStep(
        !           395:   sqlite3 *db,        /* The database connection */
        !           396:   Token *pTableName,  /* Name of the table into which we insert */
        !           397:   IdList *pColumn,    /* List of columns in pTableName to insert into */
        !           398:   ExprList *pEList,   /* The VALUE clause: a list of values to be inserted */
        !           399:   Select *pSelect,    /* A SELECT statement that supplies values */
        !           400:   u8 orconf           /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
        !           401: ){
        !           402:   TriggerStep *pTriggerStep;
        !           403: 
        !           404:   assert(pEList == 0 || pSelect == 0);
        !           405:   assert(pEList != 0 || pSelect != 0 || db->mallocFailed);
        !           406: 
        !           407:   pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName);
        !           408:   if( pTriggerStep ){
        !           409:     pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
        !           410:     pTriggerStep->pIdList = pColumn;
        !           411:     pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
        !           412:     pTriggerStep->orconf = orconf;
        !           413:   }else{
        !           414:     sqlite3IdListDelete(db, pColumn);
        !           415:   }
        !           416:   sqlite3ExprListDelete(db, pEList);
        !           417:   sqlite3SelectDelete(db, pSelect);
        !           418: 
        !           419:   return pTriggerStep;
        !           420: }
        !           421: 
        !           422: /*
        !           423: ** Construct a trigger step that implements an UPDATE statement and return
        !           424: ** a pointer to that trigger step.  The parser calls this routine when it
        !           425: ** sees an UPDATE statement inside the body of a CREATE TRIGGER.
        !           426: */
        !           427: TriggerStep *sqlite3TriggerUpdateStep(
        !           428:   sqlite3 *db,         /* The database connection */
        !           429:   Token *pTableName,   /* Name of the table to be updated */
        !           430:   ExprList *pEList,    /* The SET clause: list of column and new values */
        !           431:   Expr *pWhere,        /* The WHERE clause */
        !           432:   u8 orconf            /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
        !           433: ){
        !           434:   TriggerStep *pTriggerStep;
        !           435: 
        !           436:   pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName);
        !           437:   if( pTriggerStep ){
        !           438:     pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
        !           439:     pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
        !           440:     pTriggerStep->orconf = orconf;
        !           441:   }
        !           442:   sqlite3ExprListDelete(db, pEList);
        !           443:   sqlite3ExprDelete(db, pWhere);
        !           444:   return pTriggerStep;
        !           445: }
        !           446: 
        !           447: /*
        !           448: ** Construct a trigger step that implements a DELETE statement and return
        !           449: ** a pointer to that trigger step.  The parser calls this routine when it
        !           450: ** sees a DELETE statement inside the body of a CREATE TRIGGER.
        !           451: */
        !           452: TriggerStep *sqlite3TriggerDeleteStep(
        !           453:   sqlite3 *db,            /* Database connection */
        !           454:   Token *pTableName,      /* The table from which rows are deleted */
        !           455:   Expr *pWhere            /* The WHERE clause */
        !           456: ){
        !           457:   TriggerStep *pTriggerStep;
        !           458: 
        !           459:   pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName);
        !           460:   if( pTriggerStep ){
        !           461:     pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
        !           462:     pTriggerStep->orconf = OE_Default;
        !           463:   }
        !           464:   sqlite3ExprDelete(db, pWhere);
        !           465:   return pTriggerStep;
        !           466: }
        !           467: 
        !           468: /* 
        !           469: ** Recursively delete a Trigger structure
        !           470: */
        !           471: void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){
        !           472:   if( pTrigger==0 ) return;
        !           473:   sqlite3DeleteTriggerStep(db, pTrigger->step_list);
        !           474:   sqlite3DbFree(db, pTrigger->zName);
        !           475:   sqlite3DbFree(db, pTrigger->table);
        !           476:   sqlite3ExprDelete(db, pTrigger->pWhen);
        !           477:   sqlite3IdListDelete(db, pTrigger->pColumns);
        !           478:   sqlite3DbFree(db, pTrigger);
        !           479: }
        !           480: 
        !           481: /*
        !           482: ** This function is called to drop a trigger from the database schema. 
        !           483: **
        !           484: ** This may be called directly from the parser and therefore identifies
        !           485: ** the trigger by name.  The sqlite3DropTriggerPtr() routine does the
        !           486: ** same job as this routine except it takes a pointer to the trigger
        !           487: ** instead of the trigger name.
        !           488: **/
        !           489: void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){
        !           490:   Trigger *pTrigger = 0;
        !           491:   int i;
        !           492:   const char *zDb;
        !           493:   const char *zName;
        !           494:   int nName;
        !           495:   sqlite3 *db = pParse->db;
        !           496: 
        !           497:   if( db->mallocFailed ) goto drop_trigger_cleanup;
        !           498:   if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
        !           499:     goto drop_trigger_cleanup;
        !           500:   }
        !           501: 
        !           502:   assert( pName->nSrc==1 );
        !           503:   zDb = pName->a[0].zDatabase;
        !           504:   zName = pName->a[0].zName;
        !           505:   nName = sqlite3Strlen30(zName);
        !           506:   assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
        !           507:   for(i=OMIT_TEMPDB; i<db->nDb; i++){
        !           508:     int j = (i<2) ? i^1 : i;  /* Search TEMP before MAIN */
        !           509:     if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue;
        !           510:     assert( sqlite3SchemaMutexHeld(db, j, 0) );
        !           511:     pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName, nName);
        !           512:     if( pTrigger ) break;
        !           513:   }
        !           514:   if( !pTrigger ){
        !           515:     if( !noErr ){
        !           516:       sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0);
        !           517:     }else{
        !           518:       sqlite3CodeVerifyNamedSchema(pParse, zDb);
        !           519:     }
        !           520:     pParse->checkSchema = 1;
        !           521:     goto drop_trigger_cleanup;
        !           522:   }
        !           523:   sqlite3DropTriggerPtr(pParse, pTrigger);
        !           524: 
        !           525: drop_trigger_cleanup:
        !           526:   sqlite3SrcListDelete(db, pName);
        !           527: }
        !           528: 
        !           529: /*
        !           530: ** Return a pointer to the Table structure for the table that a trigger
        !           531: ** is set on.
        !           532: */
        !           533: static Table *tableOfTrigger(Trigger *pTrigger){
        !           534:   int n = sqlite3Strlen30(pTrigger->table);
        !           535:   return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table, n);
        !           536: }
        !           537: 
        !           538: 
        !           539: /*
        !           540: ** Drop a trigger given a pointer to that trigger. 
        !           541: */
        !           542: void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
        !           543:   Table   *pTable;
        !           544:   Vdbe *v;
        !           545:   sqlite3 *db = pParse->db;
        !           546:   int iDb;
        !           547: 
        !           548:   iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema);
        !           549:   assert( iDb>=0 && iDb<db->nDb );
        !           550:   pTable = tableOfTrigger(pTrigger);
        !           551:   assert( pTable );
        !           552:   assert( pTable->pSchema==pTrigger->pSchema || iDb==1 );
        !           553: #ifndef SQLITE_OMIT_AUTHORIZATION
        !           554:   {
        !           555:     int code = SQLITE_DROP_TRIGGER;
        !           556:     const char *zDb = db->aDb[iDb].zName;
        !           557:     const char *zTab = SCHEMA_TABLE(iDb);
        !           558:     if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER;
        !           559:     if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) ||
        !           560:       sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
        !           561:       return;
        !           562:     }
        !           563:   }
        !           564: #endif
        !           565: 
        !           566:   /* Generate code to destroy the database record of the trigger.
        !           567:   */
        !           568:   assert( pTable!=0 );
        !           569:   if( (v = sqlite3GetVdbe(pParse))!=0 ){
        !           570:     int base;
        !           571:     static const VdbeOpList dropTrigger[] = {
        !           572:       { OP_Rewind,     0, ADDR(9),  0},
        !           573:       { OP_String8,    0, 1,        0}, /* 1 */
        !           574:       { OP_Column,     0, 1,        2},
        !           575:       { OP_Ne,         2, ADDR(8),  1},
        !           576:       { OP_String8,    0, 1,        0}, /* 4: "trigger" */
        !           577:       { OP_Column,     0, 0,        2},
        !           578:       { OP_Ne,         2, ADDR(8),  1},
        !           579:       { OP_Delete,     0, 0,        0},
        !           580:       { OP_Next,       0, ADDR(1),  0}, /* 8 */
        !           581:     };
        !           582: 
        !           583:     sqlite3BeginWriteOperation(pParse, 0, iDb);
        !           584:     sqlite3OpenMasterTable(pParse, iDb);
        !           585:     base = sqlite3VdbeAddOpList(v,  ArraySize(dropTrigger), dropTrigger);
        !           586:     sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT);
        !           587:     sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC);
        !           588:     sqlite3ChangeCookie(pParse, iDb);
        !           589:     sqlite3VdbeAddOp2(v, OP_Close, 0, 0);
        !           590:     sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0);
        !           591:     if( pParse->nMem<3 ){
        !           592:       pParse->nMem = 3;
        !           593:     }
        !           594:   }
        !           595: }
        !           596: 
        !           597: /*
        !           598: ** Remove a trigger from the hash tables of the sqlite* pointer.
        !           599: */
        !           600: void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){
        !           601:   Trigger *pTrigger;
        !           602:   Hash *pHash;
        !           603: 
        !           604:   assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
        !           605:   pHash = &(db->aDb[iDb].pSchema->trigHash);
        !           606:   pTrigger = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), 0);
        !           607:   if( ALWAYS(pTrigger) ){
        !           608:     if( pTrigger->pSchema==pTrigger->pTabSchema ){
        !           609:       Table *pTab = tableOfTrigger(pTrigger);
        !           610:       Trigger **pp;
        !           611:       for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext));
        !           612:       *pp = (*pp)->pNext;
        !           613:     }
        !           614:     sqlite3DeleteTrigger(db, pTrigger);
        !           615:     db->flags |= SQLITE_InternChanges;
        !           616:   }
        !           617: }
        !           618: 
        !           619: /*
        !           620: ** pEList is the SET clause of an UPDATE statement.  Each entry
        !           621: ** in pEList is of the format <id>=<expr>.  If any of the entries
        !           622: ** in pEList have an <id> which matches an identifier in pIdList,
        !           623: ** then return TRUE.  If pIdList==NULL, then it is considered a
        !           624: ** wildcard that matches anything.  Likewise if pEList==NULL then
        !           625: ** it matches anything so always return true.  Return false only
        !           626: ** if there is no match.
        !           627: */
        !           628: static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){
        !           629:   int e;
        !           630:   if( pIdList==0 || NEVER(pEList==0) ) return 1;
        !           631:   for(e=0; e<pEList->nExpr; e++){
        !           632:     if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1;
        !           633:   }
        !           634:   return 0; 
        !           635: }
        !           636: 
        !           637: /*
        !           638: ** Return a list of all triggers on table pTab if there exists at least
        !           639: ** one trigger that must be fired when an operation of type 'op' is 
        !           640: ** performed on the table, and, if that operation is an UPDATE, if at
        !           641: ** least one of the columns in pChanges is being modified.
        !           642: */
        !           643: Trigger *sqlite3TriggersExist(
        !           644:   Parse *pParse,          /* Parse context */
        !           645:   Table *pTab,            /* The table the contains the triggers */
        !           646:   int op,                 /* one of TK_DELETE, TK_INSERT, TK_UPDATE */
        !           647:   ExprList *pChanges,     /* Columns that change in an UPDATE statement */
        !           648:   int *pMask              /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
        !           649: ){
        !           650:   int mask = 0;
        !           651:   Trigger *pList = 0;
        !           652:   Trigger *p;
        !           653: 
        !           654:   if( (pParse->db->flags & SQLITE_EnableTrigger)!=0 ){
        !           655:     pList = sqlite3TriggerList(pParse, pTab);
        !           656:   }
        !           657:   assert( pList==0 || IsVirtual(pTab)==0 );
        !           658:   for(p=pList; p; p=p->pNext){
        !           659:     if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
        !           660:       mask |= p->tr_tm;
        !           661:     }
        !           662:   }
        !           663:   if( pMask ){
        !           664:     *pMask = mask;
        !           665:   }
        !           666:   return (mask ? pList : 0);
        !           667: }
        !           668: 
        !           669: /*
        !           670: ** Convert the pStep->target token into a SrcList and return a pointer
        !           671: ** to that SrcList.
        !           672: **
        !           673: ** This routine adds a specific database name, if needed, to the target when
        !           674: ** forming the SrcList.  This prevents a trigger in one database from
        !           675: ** referring to a target in another database.  An exception is when the
        !           676: ** trigger is in TEMP in which case it can refer to any other database it
        !           677: ** wants.
        !           678: */
        !           679: static SrcList *targetSrcList(
        !           680:   Parse *pParse,       /* The parsing context */
        !           681:   TriggerStep *pStep   /* The trigger containing the target token */
        !           682: ){
        !           683:   int iDb;             /* Index of the database to use */
        !           684:   SrcList *pSrc;       /* SrcList to be returned */
        !           685: 
        !           686:   pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0);
        !           687:   if( pSrc ){
        !           688:     assert( pSrc->nSrc>0 );
        !           689:     assert( pSrc->a!=0 );
        !           690:     iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema);
        !           691:     if( iDb==0 || iDb>=2 ){
        !           692:       sqlite3 *db = pParse->db;
        !           693:       assert( iDb<pParse->db->nDb );
        !           694:       pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName);
        !           695:     }
        !           696:   }
        !           697:   return pSrc;
        !           698: }
        !           699: 
        !           700: /*
        !           701: ** Generate VDBE code for the statements inside the body of a single 
        !           702: ** trigger.
        !           703: */
        !           704: static int codeTriggerProgram(
        !           705:   Parse *pParse,            /* The parser context */
        !           706:   TriggerStep *pStepList,   /* List of statements inside the trigger body */
        !           707:   int orconf                /* Conflict algorithm. (OE_Abort, etc) */  
        !           708: ){
        !           709:   TriggerStep *pStep;
        !           710:   Vdbe *v = pParse->pVdbe;
        !           711:   sqlite3 *db = pParse->db;
        !           712: 
        !           713:   assert( pParse->pTriggerTab && pParse->pToplevel );
        !           714:   assert( pStepList );
        !           715:   assert( v!=0 );
        !           716:   for(pStep=pStepList; pStep; pStep=pStep->pNext){
        !           717:     /* Figure out the ON CONFLICT policy that will be used for this step
        !           718:     ** of the trigger program. If the statement that caused this trigger
        !           719:     ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use
        !           720:     ** the ON CONFLICT policy that was specified as part of the trigger
        !           721:     ** step statement. Example:
        !           722:     **
        !           723:     **   CREATE TRIGGER AFTER INSERT ON t1 BEGIN;
        !           724:     **     INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);
        !           725:     **   END;
        !           726:     **
        !           727:     **   INSERT INTO t1 ... ;            -- insert into t2 uses REPLACE policy
        !           728:     **   INSERT OR IGNORE INTO t1 ... ;  -- insert into t2 uses IGNORE policy
        !           729:     */
        !           730:     pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;
        !           731: 
        !           732:     switch( pStep->op ){
        !           733:       case TK_UPDATE: {
        !           734:         sqlite3Update(pParse, 
        !           735:           targetSrcList(pParse, pStep),
        !           736:           sqlite3ExprListDup(db, pStep->pExprList, 0), 
        !           737:           sqlite3ExprDup(db, pStep->pWhere, 0), 
        !           738:           pParse->eOrconf
        !           739:         );
        !           740:         break;
        !           741:       }
        !           742:       case TK_INSERT: {
        !           743:         sqlite3Insert(pParse, 
        !           744:           targetSrcList(pParse, pStep),
        !           745:           sqlite3ExprListDup(db, pStep->pExprList, 0), 
        !           746:           sqlite3SelectDup(db, pStep->pSelect, 0), 
        !           747:           sqlite3IdListDup(db, pStep->pIdList), 
        !           748:           pParse->eOrconf
        !           749:         );
        !           750:         break;
        !           751:       }
        !           752:       case TK_DELETE: {
        !           753:         sqlite3DeleteFrom(pParse, 
        !           754:           targetSrcList(pParse, pStep),
        !           755:           sqlite3ExprDup(db, pStep->pWhere, 0)
        !           756:         );
        !           757:         break;
        !           758:       }
        !           759:       default: assert( pStep->op==TK_SELECT ); {
        !           760:         SelectDest sDest;
        !           761:         Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0);
        !           762:         sqlite3SelectDestInit(&sDest, SRT_Discard, 0);
        !           763:         sqlite3Select(pParse, pSelect, &sDest);
        !           764:         sqlite3SelectDelete(db, pSelect);
        !           765:         break;
        !           766:       }
        !           767:     } 
        !           768:     if( pStep->op!=TK_SELECT ){
        !           769:       sqlite3VdbeAddOp0(v, OP_ResetCount);
        !           770:     }
        !           771:   }
        !           772: 
        !           773:   return 0;
        !           774: }
        !           775: 
        !           776: #ifdef SQLITE_DEBUG
        !           777: /*
        !           778: ** This function is used to add VdbeComment() annotations to a VDBE
        !           779: ** program. It is not used in production code, only for debugging.
        !           780: */
        !           781: static const char *onErrorText(int onError){
        !           782:   switch( onError ){
        !           783:     case OE_Abort:    return "abort";
        !           784:     case OE_Rollback: return "rollback";
        !           785:     case OE_Fail:     return "fail";
        !           786:     case OE_Replace:  return "replace";
        !           787:     case OE_Ignore:   return "ignore";
        !           788:     case OE_Default:  return "default";
        !           789:   }
        !           790:   return "n/a";
        !           791: }
        !           792: #endif
        !           793: 
        !           794: /*
        !           795: ** Parse context structure pFrom has just been used to create a sub-vdbe
        !           796: ** (trigger program). If an error has occurred, transfer error information
        !           797: ** from pFrom to pTo.
        !           798: */
        !           799: static void transferParseError(Parse *pTo, Parse *pFrom){
        !           800:   assert( pFrom->zErrMsg==0 || pFrom->nErr );
        !           801:   assert( pTo->zErrMsg==0 || pTo->nErr );
        !           802:   if( pTo->nErr==0 ){
        !           803:     pTo->zErrMsg = pFrom->zErrMsg;
        !           804:     pTo->nErr = pFrom->nErr;
        !           805:   }else{
        !           806:     sqlite3DbFree(pFrom->db, pFrom->zErrMsg);
        !           807:   }
        !           808: }
        !           809: 
        !           810: /*
        !           811: ** Create and populate a new TriggerPrg object with a sub-program 
        !           812: ** implementing trigger pTrigger with ON CONFLICT policy orconf.
        !           813: */
        !           814: static TriggerPrg *codeRowTrigger(
        !           815:   Parse *pParse,       /* Current parse context */
        !           816:   Trigger *pTrigger,   /* Trigger to code */
        !           817:   Table *pTab,         /* The table pTrigger is attached to */
        !           818:   int orconf           /* ON CONFLICT policy to code trigger program with */
        !           819: ){
        !           820:   Parse *pTop = sqlite3ParseToplevel(pParse);
        !           821:   sqlite3 *db = pParse->db;   /* Database handle */
        !           822:   TriggerPrg *pPrg;           /* Value to return */
        !           823:   Expr *pWhen = 0;            /* Duplicate of trigger WHEN expression */
        !           824:   Vdbe *v;                    /* Temporary VM */
        !           825:   NameContext sNC;            /* Name context for sub-vdbe */
        !           826:   SubProgram *pProgram = 0;   /* Sub-vdbe for trigger program */
        !           827:   Parse *pSubParse;           /* Parse context for sub-vdbe */
        !           828:   int iEndTrigger = 0;        /* Label to jump to if WHEN is false */
        !           829: 
        !           830:   assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
        !           831:   assert( pTop->pVdbe );
        !           832: 
        !           833:   /* Allocate the TriggerPrg and SubProgram objects. To ensure that they
        !           834:   ** are freed if an error occurs, link them into the Parse.pTriggerPrg 
        !           835:   ** list of the top-level Parse object sooner rather than later.  */
        !           836:   pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg));
        !           837:   if( !pPrg ) return 0;
        !           838:   pPrg->pNext = pTop->pTriggerPrg;
        !           839:   pTop->pTriggerPrg = pPrg;
        !           840:   pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram));
        !           841:   if( !pProgram ) return 0;
        !           842:   sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram);
        !           843:   pPrg->pTrigger = pTrigger;
        !           844:   pPrg->orconf = orconf;
        !           845:   pPrg->aColmask[0] = 0xffffffff;
        !           846:   pPrg->aColmask[1] = 0xffffffff;
        !           847: 
        !           848:   /* Allocate and populate a new Parse context to use for coding the 
        !           849:   ** trigger sub-program.  */
        !           850:   pSubParse = sqlite3StackAllocZero(db, sizeof(Parse));
        !           851:   if( !pSubParse ) return 0;
        !           852:   memset(&sNC, 0, sizeof(sNC));
        !           853:   sNC.pParse = pSubParse;
        !           854:   pSubParse->db = db;
        !           855:   pSubParse->pTriggerTab = pTab;
        !           856:   pSubParse->pToplevel = pTop;
        !           857:   pSubParse->zAuthContext = pTrigger->zName;
        !           858:   pSubParse->eTriggerOp = pTrigger->op;
        !           859:   pSubParse->nQueryLoop = pParse->nQueryLoop;
        !           860: 
        !           861:   v = sqlite3GetVdbe(pSubParse);
        !           862:   if( v ){
        !           863:     VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", 
        !           864:       pTrigger->zName, onErrorText(orconf),
        !           865:       (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"),
        !           866:         (pTrigger->op==TK_UPDATE ? "UPDATE" : ""),
        !           867:         (pTrigger->op==TK_INSERT ? "INSERT" : ""),
        !           868:         (pTrigger->op==TK_DELETE ? "DELETE" : ""),
        !           869:       pTab->zName
        !           870:     ));
        !           871: #ifndef SQLITE_OMIT_TRACE
        !           872:     sqlite3VdbeChangeP4(v, -1, 
        !           873:       sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
        !           874:     );
        !           875: #endif
        !           876: 
        !           877:     /* If one was specified, code the WHEN clause. If it evaluates to false
        !           878:     ** (or NULL) the sub-vdbe is immediately halted by jumping to the 
        !           879:     ** OP_Halt inserted at the end of the program.  */
        !           880:     if( pTrigger->pWhen ){
        !           881:       pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0);
        !           882:       if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) 
        !           883:        && db->mallocFailed==0 
        !           884:       ){
        !           885:         iEndTrigger = sqlite3VdbeMakeLabel(v);
        !           886:         sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
        !           887:       }
        !           888:       sqlite3ExprDelete(db, pWhen);
        !           889:     }
        !           890: 
        !           891:     /* Code the trigger program into the sub-vdbe. */
        !           892:     codeTriggerProgram(pSubParse, pTrigger->step_list, orconf);
        !           893: 
        !           894:     /* Insert an OP_Halt at the end of the sub-program. */
        !           895:     if( iEndTrigger ){
        !           896:       sqlite3VdbeResolveLabel(v, iEndTrigger);
        !           897:     }
        !           898:     sqlite3VdbeAddOp0(v, OP_Halt);
        !           899:     VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
        !           900: 
        !           901:     transferParseError(pParse, pSubParse);
        !           902:     if( db->mallocFailed==0 ){
        !           903:       pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
        !           904:     }
        !           905:     pProgram->nMem = pSubParse->nMem;
        !           906:     pProgram->nCsr = pSubParse->nTab;
        !           907:     pProgram->nOnce = pSubParse->nOnce;
        !           908:     pProgram->token = (void *)pTrigger;
        !           909:     pPrg->aColmask[0] = pSubParse->oldmask;
        !           910:     pPrg->aColmask[1] = pSubParse->newmask;
        !           911:     sqlite3VdbeDelete(v);
        !           912:   }
        !           913: 
        !           914:   assert( !pSubParse->pAinc       && !pSubParse->pZombieTab );
        !           915:   assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg );
        !           916:   sqlite3StackFree(db, pSubParse);
        !           917: 
        !           918:   return pPrg;
        !           919: }
        !           920:     
        !           921: /*
        !           922: ** Return a pointer to a TriggerPrg object containing the sub-program for
        !           923: ** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such
        !           924: ** TriggerPrg object exists, a new object is allocated and populated before
        !           925: ** being returned.
        !           926: */
        !           927: static TriggerPrg *getRowTrigger(
        !           928:   Parse *pParse,       /* Current parse context */
        !           929:   Trigger *pTrigger,   /* Trigger to code */
        !           930:   Table *pTab,         /* The table trigger pTrigger is attached to */
        !           931:   int orconf           /* ON CONFLICT algorithm. */
        !           932: ){
        !           933:   Parse *pRoot = sqlite3ParseToplevel(pParse);
        !           934:   TriggerPrg *pPrg;
        !           935: 
        !           936:   assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
        !           937: 
        !           938:   /* It may be that this trigger has already been coded (or is in the
        !           939:   ** process of being coded). If this is the case, then an entry with
        !           940:   ** a matching TriggerPrg.pTrigger field will be present somewhere
        !           941:   ** in the Parse.pTriggerPrg list. Search for such an entry.  */
        !           942:   for(pPrg=pRoot->pTriggerPrg; 
        !           943:       pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); 
        !           944:       pPrg=pPrg->pNext
        !           945:   );
        !           946: 
        !           947:   /* If an existing TriggerPrg could not be located, create a new one. */
        !           948:   if( !pPrg ){
        !           949:     pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf);
        !           950:   }
        !           951: 
        !           952:   return pPrg;
        !           953: }
        !           954: 
        !           955: /*
        !           956: ** Generate code for the trigger program associated with trigger p on 
        !           957: ** table pTab. The reg, orconf and ignoreJump parameters passed to this
        !           958: ** function are the same as those described in the header function for
        !           959: ** sqlite3CodeRowTrigger()
        !           960: */
        !           961: void sqlite3CodeRowTriggerDirect(
        !           962:   Parse *pParse,       /* Parse context */
        !           963:   Trigger *p,          /* Trigger to code */
        !           964:   Table *pTab,         /* The table to code triggers from */
        !           965:   int reg,             /* Reg array containing OLD.* and NEW.* values */
        !           966:   int orconf,          /* ON CONFLICT policy */
        !           967:   int ignoreJump       /* Instruction to jump to for RAISE(IGNORE) */
        !           968: ){
        !           969:   Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */
        !           970:   TriggerPrg *pPrg;
        !           971:   pPrg = getRowTrigger(pParse, p, pTab, orconf);
        !           972:   assert( pPrg || pParse->nErr || pParse->db->mallocFailed );
        !           973: 
        !           974:   /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program 
        !           975:   ** is a pointer to the sub-vdbe containing the trigger program.  */
        !           976:   if( pPrg ){
        !           977:     int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers));
        !           978: 
        !           979:     sqlite3VdbeAddOp3(v, OP_Program, reg, ignoreJump, ++pParse->nMem);
        !           980:     sqlite3VdbeChangeP4(v, -1, (const char *)pPrg->pProgram, P4_SUBPROGRAM);
        !           981:     VdbeComment(
        !           982:         (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf)));
        !           983: 
        !           984:     /* Set the P5 operand of the OP_Program instruction to non-zero if
        !           985:     ** recursive invocation of this trigger program is disallowed. Recursive
        !           986:     ** invocation is disallowed if (a) the sub-program is really a trigger,
        !           987:     ** not a foreign key action, and (b) the flag to enable recursive triggers
        !           988:     ** is clear.  */
        !           989:     sqlite3VdbeChangeP5(v, (u8)bRecursive);
        !           990:   }
        !           991: }
        !           992: 
        !           993: /*
        !           994: ** This is called to code the required FOR EACH ROW triggers for an operation
        !           995: ** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE)
        !           996: ** is given by the op paramater. The tr_tm parameter determines whether the
        !           997: ** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then
        !           998: ** parameter pChanges is passed the list of columns being modified.
        !           999: **
        !          1000: ** If there are no triggers that fire at the specified time for the specified
        !          1001: ** operation on pTab, this function is a no-op.
        !          1002: **
        !          1003: ** The reg argument is the address of the first in an array of registers 
        !          1004: ** that contain the values substituted for the new.* and old.* references
        !          1005: ** in the trigger program. If N is the number of columns in table pTab
        !          1006: ** (a copy of pTab->nCol), then registers are populated as follows:
        !          1007: **
        !          1008: **   Register       Contains
        !          1009: **   ------------------------------------------------------
        !          1010: **   reg+0          OLD.rowid
        !          1011: **   reg+1          OLD.* value of left-most column of pTab
        !          1012: **   ...            ...
        !          1013: **   reg+N          OLD.* value of right-most column of pTab
        !          1014: **   reg+N+1        NEW.rowid
        !          1015: **   reg+N+2        OLD.* value of left-most column of pTab
        !          1016: **   ...            ...
        !          1017: **   reg+N+N+1      NEW.* value of right-most column of pTab
        !          1018: **
        !          1019: ** For ON DELETE triggers, the registers containing the NEW.* values will
        !          1020: ** never be accessed by the trigger program, so they are not allocated or 
        !          1021: ** populated by the caller (there is no data to populate them with anyway). 
        !          1022: ** Similarly, for ON INSERT triggers the values stored in the OLD.* registers
        !          1023: ** are never accessed, and so are not allocated by the caller. So, for an
        !          1024: ** ON INSERT trigger, the value passed to this function as parameter reg
        !          1025: ** is not a readable register, although registers (reg+N) through 
        !          1026: ** (reg+N+N+1) are.
        !          1027: **
        !          1028: ** Parameter orconf is the default conflict resolution algorithm for the
        !          1029: ** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump
        !          1030: ** is the instruction that control should jump to if a trigger program
        !          1031: ** raises an IGNORE exception.
        !          1032: */
        !          1033: void sqlite3CodeRowTrigger(
        !          1034:   Parse *pParse,       /* Parse context */
        !          1035:   Trigger *pTrigger,   /* List of triggers on table pTab */
        !          1036:   int op,              /* One of TK_UPDATE, TK_INSERT, TK_DELETE */
        !          1037:   ExprList *pChanges,  /* Changes list for any UPDATE OF triggers */
        !          1038:   int tr_tm,           /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
        !          1039:   Table *pTab,         /* The table to code triggers from */
        !          1040:   int reg,             /* The first in an array of registers (see above) */
        !          1041:   int orconf,          /* ON CONFLICT policy */
        !          1042:   int ignoreJump       /* Instruction to jump to for RAISE(IGNORE) */
        !          1043: ){
        !          1044:   Trigger *p;          /* Used to iterate through pTrigger list */
        !          1045: 
        !          1046:   assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE );
        !          1047:   assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER );
        !          1048:   assert( (op==TK_UPDATE)==(pChanges!=0) );
        !          1049: 
        !          1050:   for(p=pTrigger; p; p=p->pNext){
        !          1051: 
        !          1052:     /* Sanity checking:  The schema for the trigger and for the table are
        !          1053:     ** always defined.  The trigger must be in the same schema as the table
        !          1054:     ** or else it must be a TEMP trigger. */
        !          1055:     assert( p->pSchema!=0 );
        !          1056:     assert( p->pTabSchema!=0 );
        !          1057:     assert( p->pSchema==p->pTabSchema 
        !          1058:          || p->pSchema==pParse->db->aDb[1].pSchema );
        !          1059: 
        !          1060:     /* Determine whether we should code this trigger */
        !          1061:     if( p->op==op 
        !          1062:      && p->tr_tm==tr_tm 
        !          1063:      && checkColumnOverlap(p->pColumns, pChanges)
        !          1064:     ){
        !          1065:       sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump);
        !          1066:     }
        !          1067:   }
        !          1068: }
        !          1069: 
        !          1070: /*
        !          1071: ** Triggers may access values stored in the old.* or new.* pseudo-table. 
        !          1072: ** This function returns a 32-bit bitmask indicating which columns of the 
        !          1073: ** old.* or new.* tables actually are used by triggers. This information 
        !          1074: ** may be used by the caller, for example, to avoid having to load the entire
        !          1075: ** old.* record into memory when executing an UPDATE or DELETE command.
        !          1076: **
        !          1077: ** Bit 0 of the returned mask is set if the left-most column of the
        !          1078: ** table may be accessed using an [old|new].<col> reference. Bit 1 is set if
        !          1079: ** the second leftmost column value is required, and so on. If there
        !          1080: ** are more than 32 columns in the table, and at least one of the columns
        !          1081: ** with an index greater than 32 may be accessed, 0xffffffff is returned.
        !          1082: **
        !          1083: ** It is not possible to determine if the old.rowid or new.rowid column is 
        !          1084: ** accessed by triggers. The caller must always assume that it is.
        !          1085: **
        !          1086: ** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned
        !          1087: ** applies to the old.* table. If 1, the new.* table.
        !          1088: **
        !          1089: ** Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE
        !          1090: ** and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only
        !          1091: ** included in the returned mask if the TRIGGER_BEFORE bit is set in the
        !          1092: ** tr_tm parameter. Similarly, values accessed by AFTER triggers are only
        !          1093: ** included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm.
        !          1094: */
        !          1095: u32 sqlite3TriggerColmask(
        !          1096:   Parse *pParse,       /* Parse context */
        !          1097:   Trigger *pTrigger,   /* List of triggers on table pTab */
        !          1098:   ExprList *pChanges,  /* Changes list for any UPDATE OF triggers */
        !          1099:   int isNew,           /* 1 for new.* ref mask, 0 for old.* ref mask */
        !          1100:   int tr_tm,           /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
        !          1101:   Table *pTab,         /* The table to code triggers from */
        !          1102:   int orconf           /* Default ON CONFLICT policy for trigger steps */
        !          1103: ){
        !          1104:   const int op = pChanges ? TK_UPDATE : TK_DELETE;
        !          1105:   u32 mask = 0;
        !          1106:   Trigger *p;
        !          1107: 
        !          1108:   assert( isNew==1 || isNew==0 );
        !          1109:   for(p=pTrigger; p; p=p->pNext){
        !          1110:     if( p->op==op && (tr_tm&p->tr_tm)
        !          1111:      && checkColumnOverlap(p->pColumns,pChanges)
        !          1112:     ){
        !          1113:       TriggerPrg *pPrg;
        !          1114:       pPrg = getRowTrigger(pParse, p, pTab, orconf);
        !          1115:       if( pPrg ){
        !          1116:         mask |= pPrg->aColmask[isNew];
        !          1117:       }
        !          1118:     }
        !          1119:   }
        !          1120: 
        !          1121:   return mask;
        !          1122: }
        !          1123: 
        !          1124: #endif /* !defined(SQLITE_OMIT_TRIGGER) */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>