aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/ruleutils.c
diff options
context:
space:
mode:
authorKevin Grittner <kgrittn@postgresql.org>2016-11-04 10:49:50 -0500
committerKevin Grittner <kgrittn@postgresql.org>2016-11-04 10:49:50 -0500
commit8c48375e5f43ebd832f93c9166d1fe0e639ff806 (patch)
tree5115baa716b278c4dcabcf6b22fd446a17eb36d8 /src/backend/utils/adt/ruleutils.c
parent69d590fffbdcfb50a31a8c78ce87e602002a869f (diff)
downloadpostgresql-8c48375e5f43ebd832f93c9166d1fe0e639ff806.tar.gz
postgresql-8c48375e5f43ebd832f93c9166d1fe0e639ff806.zip
Implement syntax for transition tables in AFTER triggers.
This is infrastructure for the complete SQL standard feature. No support is included at this point for execution nodes or PLs. The intent is to add that soon. As this patch leaves things, standard syntax can create tuplestores to contain old and/or new versions of rows affected by a statement. References to these tuplestores are in the TriggerData structure. C triggers can access the tuplestores directly, so they are usable, but they cannot yet be referenced within a SQL statement.
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r--src/backend/utils/adt/ruleutils.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 8a81d7a078f..a3a4174abfb 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -813,6 +813,8 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty)
SysScanDesc tgscan;
int findx = 0;
char *tgname;
+ char *tgoldtable;
+ char *tgnewtable;
Oid argtypes[1]; /* dummy */
Datum value;
bool isnull;
@@ -924,6 +926,27 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty)
appendStringInfoString(&buf, "IMMEDIATE ");
}
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgoldtable,
+ tgrel->rd_att, &isnull);
+ if (!isnull)
+ tgoldtable = NameStr(*((NameData *) DatumGetPointer(value)));
+ else
+ tgoldtable = NULL;
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgnewtable,
+ tgrel->rd_att, &isnull);
+ if (!isnull)
+ tgnewtable = NameStr(*((NameData *) DatumGetPointer(value)));
+ else
+ tgnewtable = NULL;
+ if (tgoldtable != NULL || tgnewtable != NULL)
+ {
+ appendStringInfoString(&buf, "REFERENCING ");
+ if (tgoldtable != NULL)
+ appendStringInfo(&buf, "OLD TABLE AS %s ", tgoldtable);
+ if (tgnewtable != NULL)
+ appendStringInfo(&buf, "NEW TABLE AS %s ", tgnewtable);
+ }
+
if (TRIGGER_FOR_ROW(trigrec->tgtype))
appendStringInfoString(&buf, "FOR EACH ROW ");
else