mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Support statement-level ON TRUNCATE triggers. Simon Riggs
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.248 2008/03/27 03:57:33 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.249 2008/03/28 00:21:55 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -539,6 +539,9 @@ ExecuteTruncate(TruncateStmt *stmt)
|
||||
{
|
||||
List *rels = NIL;
|
||||
List *relids = NIL;
|
||||
EState *estate;
|
||||
ResultRelInfo *resultRelInfos;
|
||||
ResultRelInfo *resultRelInfo;
|
||||
ListCell *cell;
|
||||
|
||||
/*
|
||||
@ -601,6 +604,45 @@ ExecuteTruncate(TruncateStmt *stmt)
|
||||
heap_truncate_check_FKs(rels, false);
|
||||
#endif
|
||||
|
||||
/* Prepare to catch AFTER triggers. */
|
||||
AfterTriggerBeginQuery();
|
||||
|
||||
/*
|
||||
* To fire triggers, we'll need an EState as well as a ResultRelInfo
|
||||
* for each relation.
|
||||
*/
|
||||
estate = CreateExecutorState();
|
||||
resultRelInfos = (ResultRelInfo *)
|
||||
palloc(list_length(rels) * sizeof(ResultRelInfo));
|
||||
resultRelInfo = resultRelInfos;
|
||||
foreach(cell, rels)
|
||||
{
|
||||
Relation rel = (Relation) lfirst(cell);
|
||||
|
||||
InitResultRelInfo(resultRelInfo,
|
||||
rel,
|
||||
0, /* dummy rangetable index */
|
||||
CMD_DELETE, /* don't need any index info */
|
||||
false);
|
||||
resultRelInfo++;
|
||||
}
|
||||
estate->es_result_relations = resultRelInfos;
|
||||
estate->es_num_result_relations = list_length(rels);
|
||||
|
||||
/*
|
||||
* Process all BEFORE STATEMENT TRUNCATE triggers before we begin
|
||||
* truncating (this is because one of them might throw an error).
|
||||
* Also, if we were to allow them to prevent statement execution,
|
||||
* that would need to be handled here.
|
||||
*/
|
||||
resultRelInfo = resultRelInfos;
|
||||
foreach(cell, rels)
|
||||
{
|
||||
estate->es_result_relation_info = resultRelInfo;
|
||||
ExecBSTruncateTriggers(estate, resultRelInfo);
|
||||
resultRelInfo++;
|
||||
}
|
||||
|
||||
/*
|
||||
* OK, truncate each table.
|
||||
*/
|
||||
@ -637,6 +679,23 @@ ExecuteTruncate(TruncateStmt *stmt)
|
||||
*/
|
||||
reindex_relation(heap_relid, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process all AFTER STATEMENT TRUNCATE triggers.
|
||||
*/
|
||||
resultRelInfo = resultRelInfos;
|
||||
foreach(cell, rels)
|
||||
{
|
||||
estate->es_result_relation_info = resultRelInfo;
|
||||
ExecASTruncateTriggers(estate, resultRelInfo);
|
||||
resultRelInfo++;
|
||||
}
|
||||
|
||||
/* Handle queued AFTER triggers */
|
||||
AfterTriggerEndQuery(estate);
|
||||
|
||||
/* We can clean up the EState now */
|
||||
FreeExecutorState(estate);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user