diff options
author | danielk1977 <danielk1977@noemail.net> | 2006-01-06 15:03:48 +0000 |
---|---|---|
committer | danielk1977 <danielk1977@noemail.net> | 2006-01-06 15:03:48 +0000 |
commit | aaf22685d74a5e394109ae63b81f324b66b349c3 (patch) | |
tree | a506d684679c06ba04008355f0a47d0565f2d782 /src | |
parent | 0739723d7628e4830b9d1b5ef1c3e5df78bfa622 (diff) | |
download | sqlite-aaf22685d74a5e394109ae63b81f324b66b349c3.tar.gz sqlite-aaf22685d74a5e394109ae63b81f324b66b349c3.zip |
Fix a crash caused by adding a trigger to a shared-schema and then deleting it
using a different connection. (CVS 2873)
FossilOrigin-Name: 19f93e135f1ff4f987d14afe74b955e119904017
Diffstat (limited to 'src')
-rw-r--r-- | src/sqliteInt.h | 7 | ||||
-rw-r--r-- | src/trigger.c | 9 |
2 files changed, 9 insertions, 7 deletions
diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 721d4318e..c3fadd135 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.451 2006/01/06 12:03:19 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.452 2006/01/06 15:03:48 danielk1977 Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -1297,8 +1297,6 @@ struct AuthContext { struct Trigger { char *name; /* The name of the trigger */ char *table; /* The table or view to which the trigger applies */ -//u8 iDb; /* Database containing this trigger */ - u8 iTabDb; /* Database containing Trigger.table */ u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ Expr *pWhen; /* The WHEN clause of the expresion (may be NULL) */ @@ -1306,7 +1304,8 @@ struct Trigger { the <column-list> is stored here */ int foreach; /* One of TK_ROW or TK_STATEMENT */ Token nameToken; /* Token containing zName. Use during parsing only */ - DbSchema *pSchema; + DbSchema *pSchema; /* Schema containing the trigger */ + DbSchema *pTabSchema; /* Schema containing the table */ TriggerStep *step_list; /* Link list of trigger program steps */ Trigger *pNext; /* Next trigger associated with the table */ }; diff --git a/src/trigger.c b/src/trigger.c index cd68f4497..fcb852d95 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -164,7 +164,7 @@ void sqlite3BeginTrigger( zName = 0; pTrigger->table = sqliteStrDup(pTableName->a[0].zName); pTrigger->pSchema = db->aDb[iDb].pSchema; - pTrigger->iTabDb = iTabDb; + pTrigger->pTabSchema = pTab->pSchema; pTrigger->op = op; pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER; pTrigger->pWhen = sqlite3ExprDup(pWhen); @@ -249,6 +249,7 @@ void sqlite3FinishTrigger( } if( db->init.busy ){ + int n; Table *pTab; Trigger *pDel; pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash, @@ -257,7 +258,8 @@ void sqlite3FinishTrigger( assert( sqlite3Tsd()->mallocFailed && pDel==pTrig ); goto triggerfinish_cleanup; } - pTab = sqlite3LocateTable(pParse,pTrig->table,db->aDb[pTrig->iTabDb].zName); + n = strlen(pTrig->table) + 1; + pTab = sqlite3HashFind(&pTrig->pTabSchema->tblHash, pTrig->table, n); assert( pTab!=0 ); pTrig->pNext = pTab->pTrigger; pTab->pTrigger = pTrig; @@ -467,7 +469,8 @@ drop_trigger_cleanup: ** is set on. */ static Table *tableOfTrigger(sqlite3 *db, Trigger *pTrigger){ - return sqlite3FindTable(db,pTrigger->table,db->aDb[pTrigger->iTabDb].zName); + int n = strlen(pTrigger->table) + 1; + return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table, n); } |