aboutsummaryrefslogtreecommitdiff
path: root/src/trigger.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2002-06-25 01:09:11 +0000
committerdrh <drh@noemail.net>2002-06-25 01:09:11 +0000
commite0bc4048a057ba7826176b3daf3c8b8e3d3915ee (patch)
tree8b180567a6607da53b83851e71bce9103ddfdf46 /src/trigger.c
parent1cc093c2b5af24ccf32de4cf99917fc5e5f92bdb (diff)
downloadsqlite-e0bc4048a057ba7826176b3daf3c8b8e3d3915ee.tar.gz
sqlite-e0bc4048a057ba7826176b3daf3c8b8e3d3915ee.zip
Added support for the "sqlite_temp_master" table. Increased the version
number to 2.5.2. (CVS 640) FossilOrigin-Name: 9c1432bf7485258e485bd652e3acdaeabbfe8850
Diffstat (limited to 'src/trigger.c')
-rw-r--r--src/trigger.c91
1 files changed, 41 insertions, 50 deletions
diff --git a/src/trigger.c b/src/trigger.c
index 95e8fc9f8..53eff0c41 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -70,6 +70,12 @@ void sqliteCreateTrigger(
pParse->nErr++;
goto trigger_cleanup;
}
+ if( sqliteStrICmp(tab->zName, TEMP_MASTER_NAME)==0 ){
+ sqliteSetString(&pParse->zErrMsg, "cannot create trigger on system "
+ "table: " TEMP_MASTER_NAME, 0);
+ pParse->nErr++;
+ goto trigger_cleanup;
+ }
if( tab->pSelect && tr_tm != TK_INSTEAD ){
sqliteSetNString(&pParse->zErrMsg, "cannot create ", -1,
(tr_tm == TK_BEFORE)?"BEFORE":"AFTER", -1, " trigger on view: ", -1
@@ -100,7 +106,6 @@ void sqliteCreateTrigger(
nt->pColumns = pColumns;
nt->foreach = foreach;
nt->step_list = pStepList;
- nt->isCommit = 0;
offset = (int)(nt->strings - zData);
sqliteExprMoveStrings(nt->pWhen, offset);
@@ -119,20 +124,16 @@ void sqliteCreateTrigger(
/* if we are not initializing, and this trigger is not on a TEMP table,
** build the sqlite_master entry
*/
- if( !pParse->initFlag && !tab->isTemp ){
+ if( !pParse->initFlag ){
static VdbeOp insertTrig[] = {
- { OP_OpenWrite, 0, 2, MASTER_NAME},
{ OP_NewRecno, 0, 0, 0 },
{ OP_String, 0, 0, "trigger" },
- { OP_String, 0, 0, 0 }, /* 3: trigger name */
- { OP_String, 0, 0, 0 }, /* 4: table name */
+ { OP_String, 0, 0, 0 }, /* 2: trigger name */
+ { OP_String, 0, 0, 0 }, /* 3: table name */
{ OP_Integer, 0, 0, 0 },
- { OP_String, 0, 0, 0 }, /* 6: SQL */
+ { OP_String, 0, 0, 0 }, /* 5: SQL */
{ OP_MakeRecord, 5, 0, 0 },
{ OP_PutIntKey, 0, 0, 0 },
- { OP_Integer, 0, 0, 0 }, /* 9: Next cookie */
- { OP_SetCookie, 0, 0, 0 },
- { OP_Close, 0, 0, 0 },
};
int addr;
Vdbe *v;
@@ -141,12 +142,17 @@ void sqliteCreateTrigger(
v = sqliteGetVdbe(pParse);
if( v==0 ) goto trigger_cleanup;
sqliteBeginWriteOperation(pParse, 0);
+ sqliteOpenMasterTable(v, tab->isTemp);
addr = sqliteVdbeAddOpList(v, ArraySize(insertTrig), insertTrig);
- sqliteVdbeChangeP3(v, addr+3, nt->name, 0);
- sqliteVdbeChangeP3(v, addr+4, nt->table, 0);
- sqliteVdbeChangeP3(v, addr+6, nt->strings, 0);
- sqliteChangeCookie(pParse->db);
- sqliteVdbeChangeP1(v, addr+9, pParse->db->next_cookie);
+ sqliteVdbeChangeP3(v, addr, tab->isTemp ? TEMP_MASTER_NAME : MASTER_NAME,
+ P3_STATIC);
+ sqliteVdbeChangeP3(v, addr+2, nt->name, 0);
+ sqliteVdbeChangeP3(v, addr+3, nt->table, 0);
+ sqliteVdbeChangeP3(v, addr+5, nt->strings, 0);
+ if( !tab->isTemp ){
+ sqliteChangeCookie(pParse->db, v);
+ }
+ sqliteVdbeAddOp(v, OP_Close, 0, 0);
sqliteEndWriteOperation(pParse);
}
@@ -312,11 +318,11 @@ void sqliteDeleteTrigger(Trigger *pTrigger){
* table. This is so that the trigger can be restored into the database schema
* if the transaction is rolled back.
*/
-void sqliteDropTrigger(Parse *pParse, Token *pName, int nested)
-{
+void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){
char *zName;
Trigger *pTrigger;
Table *pTable;
+ Vdbe *v;
zName = sqliteStrNDup(pName->z, pName->n);
@@ -330,12 +336,9 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested)
}
/*
- * If this is not an "explain", do the following:
- * 1. Remove the trigger from its associated table structure
- * 2. Move the trigger from the trigHash hash to trigDrop
+ * If this is not an "explain", then delete the trigger structure.
*/
if( !pParse->explain ){
- /* 1 */
pTable = sqliteFindTable(pParse->db, pTrigger->table);
assert(pTable);
if( pTable->pTrigger == pTrigger ){
@@ -351,46 +354,34 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested)
}
assert(cc);
}
-
- /* 2 */
- sqliteHashInsert(&(pParse->db->trigHash), zName,
- pName->n + 1, NULL);
- sqliteHashInsert(&(pParse->db->trigDrop), pTrigger->name,
- pName->n + 1, pTrigger);
+ sqliteHashInsert(&(pParse->db->trigHash), zName, pName->n + 1, NULL);
+ sqliteDeleteTrigger(pTrigger);
}
- /* Unless this is a trigger on a TEMP TABLE, generate code to destroy the
- * database record of the trigger */
- if( !pTable->isTemp ){
+ /* Generate code to destroy the database record of the trigger.
+ */
+ if( pTable!=0 && !nested && (v = sqliteGetVdbe(pParse))!=0 ){
int base;
static VdbeOp dropTrigger[] = {
- { OP_OpenWrite, 0, 2, MASTER_NAME},
- { OP_Rewind, 0, ADDR(9), 0},
- { OP_String, 0, 0, 0}, /* 2 */
+ { OP_Rewind, 0, ADDR(8), 0},
+ { OP_String, 0, 0, 0}, /* 1 */
{ OP_MemStore, 1, 1, 0},
- { OP_MemLoad, 1, 0, 0}, /* 4 */
+ { OP_MemLoad, 1, 0, 0}, /* 3 */
{ OP_Column, 0, 1, 0},
- { OP_Ne, 0, ADDR(8), 0},
+ { OP_Ne, 0, ADDR(7), 0},
{ OP_Delete, 0, 0, 0},
- { OP_Next, 0, ADDR(4), 0}, /* 8 */
- { OP_Integer, 0, 0, 0}, /* 9 */
- { OP_SetCookie, 0, 0, 0},
- { OP_Close, 0, 0, 0},
+ { OP_Next, 0, ADDR(3), 0}, /* 7 */
};
- if( !nested ){
- sqliteBeginWriteOperation(pParse, 0);
- }
- base = sqliteVdbeAddOpList(pParse->pVdbe,
- ArraySize(dropTrigger), dropTrigger);
- sqliteVdbeChangeP3(pParse->pVdbe, base+2, zName, 0);
- if( !nested ){
- sqliteChangeCookie(pParse->db);
- }
- sqliteVdbeChangeP1(pParse->pVdbe, base+9, pParse->db->next_cookie);
- if( !nested ){
- sqliteEndWriteOperation(pParse);
+ sqliteBeginWriteOperation(pParse, 0);
+ sqliteOpenMasterTable(v, pTable->isTemp);
+ base = sqliteVdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger);
+ sqliteVdbeChangeP3(v, base+1, zName, 0);
+ if( !pTable->isTemp ){
+ sqliteChangeCookie(pParse->db, v);
}
+ sqliteVdbeAddOp(v, OP_Close, 0, 0);
+ sqliteEndWriteOperation(pParse);
}
sqliteFree(zName);