Re: delta relations in AFTER triggers - Mailing list pgsql-hackers
From | Kevin Grittner |
---|---|
Subject | Re: delta relations in AFTER triggers |
Date | |
Msg-id | 1403128458.51266.YahooMailNeo@web122306.mail.ne1.yahoo.com Whole thread Raw |
In response to | Re: delta relations in AFTER triggers (Robert Haas <robertmhaas@gmail.com>) |
List | pgsql-hackers |
Robert Haas <robertmhaas@gmail.com> wrote: > Kevin Grittner <kgrittn@ymail.com> wrote: > Can you describe what the standard syntax for the row variables > is, as opposed to our syntax? Also, what's the standard syntax > for the the transition relations? If you want either (or both), the standard has you using a REFERENCING clause right before the FOR EACH part of the statement. You can specify one or more sections in the format: { OLD | NEW } [ ROW | TABLE ] [ AS ] name If you have more than one, they are separated by whitespace. (No commas or other visible delimiters.) If you omit ROW/TABLE it defaults to ROW. You are only allowed to specify TABLE on an AFTER trigger. You are only allowed to specify ROW on a FOR EACH ROW trigger. (There is no prohibition against specifying TABLE on a FOR EACH ROW trigger.) You are only allowed to specify OLD for a DELETE or UPDATE trigger. (The ability for one trigger definition to specify multiple operations is a PostgreSQL extension.) You are only allowed to specify NEW for an UPDATE or INSERT trigger. You may not repeat an entry. Essentially, we have an implied clause on every FOR EACH ROW trigger like: REFERENCING OLD ROW AS OLD NEW ROW AS NEW >> Some things which I *did* follow from the standard: these new >> relations are only allowed within AFTER triggers, but are >> available in both AFTER STATEMENT and AFTER ROW triggers. That >> is, an AFTER UPDATE ... FOR EACH ROW trigger could use both the >> OLD and NEW row variables as well as the delta relations (under >> whatever names we pick). That probably won't be used very >> often, but I can imagine some cases where it might be useful. I >> expect that these will normally be used in FOR EACH STATEMENT >> triggers. > > I'm concerned about the performance implications of capturing the > delta relations unconditionally. If a particular trigger > actually needs the delta relations, then the time spent capturing > that information is well spent; but if it doesn't, then it's a > waste. There are lots of people using FOR EACH STATEMENT > triggers right now who won't be happy if those start requiring > O(n) additional temporary storage, where n is the number of rows > modified by the statement. This is likely an even bigger issue > for per-row triggers, of course, where as you say, it probably > won't be used often. That is why I added a reloption which must be specifically enabled for a table in order to generate these deltas. That would be an inconvenience for those wanting to use the new feature, but should prevent a performance regression for any tables where it is not specifically turned on. That's not perfect, of course, because if you turn it on for an UPDATE ... AFTER EACH STATEMENT trigger where you want it, you do suffer the overhead on every AFTER trigger on that table. Perhaps this is sufficient reason to use the standard syntax for the new delta tables -- the would then be generated only in the specific cases where they were needed. And I think I could lose the reloption. -- Kevin Grittner EDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
pgsql-hackers by date: