aboutsummaryrefslogtreecommitdiff
path: root/src/trigger.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2003-01-13 23:27:31 +0000
committerdrh <drh@noemail.net>2003-01-13 23:27:31 +0000
commite5f9c6442f4277bc6bc29987cbc3df5c1ff55514 (patch)
treeebee71ac3e0d646809368ac165f753b560981ee9 /src/trigger.c
parent1962bda76414921a526663e16d11602ce46dc212 (diff)
downloadsqlite-e5f9c6442f4277bc6bc29987cbc3df5c1ff55514.tar.gz
sqlite-e5f9c6442f4277bc6bc29987cbc3df5c1ff55514.zip
Revise the sqlite_set_authorizer API to provide more detailed information
about the SQL statement being authorized. Only partially tested so far. (CVS 830) FossilOrigin-Name: 45de93f913a18026a45de6254963dbcd1b0f1a19
Diffstat (limited to 'src/trigger.c')
-rw-r--r--src/trigger.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/src/trigger.c b/src/trigger.c
index 079a4c2f8..ce00c2b05 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -49,8 +49,7 @@ void sqliteCreateTrigger(
){
Trigger *nt;
Table *tab;
-
- if( sqliteAuthCommand(pParse, "CREATE", "TRIGGER") ) goto trigger_cleanup;
+ char *zName = 0; /* Name of the trigger */
/* Check that:
** 1. the trigger name does not already exist.
@@ -59,16 +58,12 @@ void sqliteCreateTrigger(
** 4. That we are not trying to create an INSTEAD OF trigger on a table.
** 5. That we are not trying to create a BEFORE or AFTER trigger on a view.
*/
- {
- char *tmp_str = sqliteStrNDup(pName->z, pName->n);
- if( sqliteHashFind(&(pParse->db->trigHash), tmp_str, pName->n + 1) ){
- sqliteSetNString(&pParse->zErrMsg, "trigger ", -1,
- pName->z, pName->n, " already exists", -1, 0);
- sqliteFree(tmp_str);
- pParse->nErr++;
- goto trigger_cleanup;
- }
- sqliteFree(tmp_str);
+ zName = sqliteStrNDup(pName->z, pName->n);
+ if( sqliteHashFind(&(pParse->db->trigHash), zName, pName->n + 1) ){
+ sqliteSetNString(&pParse->zErrMsg, "trigger ", -1,
+ pName->z, pName->n, " already exists", -1, 0);
+ pParse->nErr++;
+ goto trigger_cleanup;
}
{
char *tmp_str = sqliteStrNDup(pTableName->z, pTableName->n);
@@ -104,9 +99,15 @@ void sqliteCreateTrigger(
" trigger on table: ", -1, pTableName->z, pTableName->n, 0);
goto trigger_cleanup;
}
- if( sqliteAuthInsert(pParse, SCHEMA_TABLE(tab->isTemp), 1) ){
- goto trigger_cleanup;
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ {
+ int code = SQLITE_CREATE_TRIGGER;
+ if( tab->isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER;
+ if( sqliteAuthCheck(pParse, code, zName, tab->zName) ){
+ goto trigger_cleanup;
+ }
}
+#endif
}
if (tr_tm == TK_INSTEAD){
@@ -116,7 +117,8 @@ void sqliteCreateTrigger(
/* Build the Trigger object */
nt = (Trigger*)sqliteMalloc(sizeof(Trigger));
if( nt==0 ) goto trigger_cleanup;
- nt->name = sqliteStrNDup(pName->z, pName->n);
+ nt->name = zName;
+ zName = 0;
nt->table = sqliteStrNDup(pTableName->z, pTableName->n);
if( sqlite_malloc_failed ) goto trigger_cleanup;
nt->op = op;
@@ -179,6 +181,7 @@ void sqliteCreateTrigger(
trigger_cleanup:
+ sqliteFree(zName);
sqliteIdListDelete(pColumns);
sqliteExprDelete(pWhen);
sqliteDeleteTriggerStep(pStepList);
@@ -342,7 +345,6 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){
Table *pTable;
Vdbe *v;
- if( sqliteAuthCommand(pParse, "DROP", "TRIGGER") ) return;
zName = sqliteStrNDup(pName->z, pName->n);
/* ensure that the trigger being dropped exists */
@@ -355,11 +357,17 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){
}
pTable = sqliteFindTable(pParse->db, pTrigger->table);
assert(pTable);
- if( sqliteAuthDelete(pParse, SCHEMA_TABLE(pTable->isTemp), 1) ){
- sqliteFree(zName);
- return;
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ {
+ int code = SQLITE_DROP_TRIGGER;
+ if( pTable->isTemp ) code = SQLITE_DROP_TEMP_TRIGGER;
+ if( sqliteAuthCheck(pParse, code, pTrigger->name, pTable->zName) ||
+ sqliteAuthCheck(pParse, SQLITE_DELETE, SCHEMA_TABLE(pTable->isTemp),0) ){
+ sqliteFree(zName);
+ return;
+ }
}
-
+#endif
/*
* If this is not an "explain", then delete the trigger structure.