Index: third_party/sqlite/src/src/trigger.c |
diff --git a/third_party/sqlite/src/src/trigger.c b/third_party/sqlite/src/src/trigger.c |
index d2e7b5a1e6580b0b1be26ac5278dfad763b10fd0..be490e923a323c8ffaba7b4eb8b01ea4c9e31feb 100644 |
--- a/third_party/sqlite/src/src/trigger.c |
+++ b/third_party/sqlite/src/src/trigger.c |
@@ -193,7 +193,6 @@ void sqlite3BeginTrigger( |
/* Do not create a trigger on a system table */ |
if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ |
sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); |
- pParse->nErr++; |
goto trigger_cleanup; |
} |
@@ -373,12 +372,12 @@ static TriggerStep *triggerStepAllocate( |
){ |
TriggerStep *pTriggerStep; |
- pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n); |
+ pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); |
if( pTriggerStep ){ |
char *z = (char*)&pTriggerStep[1]; |
memcpy(z, pName->z, pName->n); |
- pTriggerStep->target.z = z; |
- pTriggerStep->target.n = pName->n; |
+ sqlite3Dequote(z); |
+ pTriggerStep->zTarget = z; |
pTriggerStep->op = op; |
} |
return pTriggerStep; |
@@ -560,31 +559,12 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ |
*/ |
assert( pTable!=0 ); |
if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
- int base; |
- static const int iLn = VDBE_OFFSET_LINENO(2); |
- static const VdbeOpList dropTrigger[] = { |
- { OP_Rewind, 0, ADDR(9), 0}, |
- { OP_String8, 0, 1, 0}, /* 1 */ |
- { OP_Column, 0, 1, 2}, |
- { OP_Ne, 2, ADDR(8), 1}, |
- { OP_String8, 0, 1, 0}, /* 4: "trigger" */ |
- { OP_Column, 0, 0, 2}, |
- { OP_Ne, 2, ADDR(8), 1}, |
- { OP_Delete, 0, 0, 0}, |
- { OP_Next, 0, ADDR(1), 0}, /* 8 */ |
- }; |
- |
- sqlite3BeginWriteOperation(pParse, 0, iDb); |
- sqlite3OpenMasterTable(pParse, iDb); |
- base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger, iLn); |
- sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT); |
- sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC); |
+ sqlite3NestedParse(pParse, |
+ "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", |
+ db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pTrigger->zName |
+ ); |
sqlite3ChangeCookie(pParse, iDb); |
- sqlite3VdbeAddOp2(v, OP_Close, 0, 0); |
sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); |
- if( pParse->nMem<3 ){ |
- pParse->nMem = 3; |
- } |
} |
} |
@@ -661,7 +641,7 @@ Trigger *sqlite3TriggersExist( |
} |
/* |
-** Convert the pStep->target token into a SrcList and return a pointer |
+** Convert the pStep->zTarget string into a SrcList and return a pointer |
** to that SrcList. |
** |
** This routine adds a specific database name, if needed, to the target when |
@@ -674,17 +654,17 @@ static SrcList *targetSrcList( |
Parse *pParse, /* The parsing context */ |
TriggerStep *pStep /* The trigger containing the target token */ |
){ |
+ sqlite3 *db = pParse->db; |
int iDb; /* Index of the database to use */ |
SrcList *pSrc; /* SrcList to be returned */ |
- pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0); |
+ pSrc = sqlite3SrcListAppend(db, 0, 0, 0); |
if( pSrc ){ |
assert( pSrc->nSrc>0 ); |
- assert( pSrc->a!=0 ); |
- iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema); |
+ pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); |
+ iDb = sqlite3SchemaToIndex(db, pStep->pTrig->pSchema); |
if( iDb==0 || iDb>=2 ){ |
- sqlite3 *db = pParse->db; |
- assert( iDb<pParse->db->nDb ); |
+ assert( iDb<db->nDb ); |
pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName); |
} |
} |
@@ -796,6 +776,7 @@ static void transferParseError(Parse *pTo, Parse *pFrom){ |
if( pTo->nErr==0 ){ |
pTo->zErrMsg = pFrom->zErrMsg; |
pTo->nErr = pFrom->nErr; |
+ pTo->rc = pFrom->rc; |
}else{ |
sqlite3DbFree(pFrom->db, pFrom->zErrMsg); |
} |