Re: delta relations in AFTER triggers - Mailing list pgsql-hackers
From | Kevin Grittner |
---|---|
Subject | Re: delta relations in AFTER triggers |
Date | |
Msg-id | 1403151246.60573.YahooMailNeo@web122301.mail.ne1.yahoo.com Whole thread Raw |
In response to | Re: delta relations in AFTER triggers (David Fetter <david@fetter.org>) |
Responses |
Re: delta relations in AFTER triggers
|
List | pgsql-hackers |
David Fetter <david@fetter.org> wrote: > On Wed, Jun 18, 2014 at 03:30:34PM -0700, Kevin Grittner wrote: >> the more I think about it (and discuss it) the more I'm >> inclined to suffer the additional complexity of the standard >> syntax for specifying transition relations in order to avoid >> unnecessary overhead creating them when not needed. I'm also >> leaning toward just storing TIDs in the tuplestores, even though >> it requires mixed snapshots in executing queries in the >> triggers. > > So in this case one tuplestore with two TIDs, either of which > might be NULL? No, one or two tuplestores, depending on need, each with TIDs of either the "before" set or the "after" set of all tuples affected by the DML statement, however many that may be. More or less like this first draft patch, except with TIDs instead of copies of the rows, and with better selectivity about when the tuplestores are generated. > Having the "before" tuplestore available to a BEFORE STATEMENT > trigger would make it possible to do things with the before > transition table that are fragile and hacky now. How do you propose to have an accurate "before" tuplestore of affected rows before the scan runs and before the BEFORE ... FOR EACH ROW triggers fire? That would be particularly interesting to try to generate if the scan involves evaluating any VOLATILE functions. > Again, I see the tuplestores as infrastructure both deltas and > many other things, so long as they're attached to the right > objects. In my opinion, the right objects would include > materialized views, triggers, and certain very specific kinds of > DML of which all the RETURNING ones are one example. They would > not include the underlying tables. Right now I've presented something for capturing the information and allowing it to be accessed from triggers. I don't think the means of capturing it precludes passing it along to other consumers. I would like to get this part working before trying to wire it up to anything other than triggers. The best way to kill an effort like this is to allow scope creep. Now, if you think that something fundamentally belongs at another level, that's something to address -- but the point where we capture data to pass to triggers seems like a natural and sound place to capture it for other purposes. And since almost all the code for this patch is in trigger.c, this seems like I'm in the right place for a trigger feature. >> standard syntax, the first thing would be for the statement to >> somehow communicate to the trigger layer the need to capture a >> tuplestore it might otherwise not generate, and there would need >> to be a way for the statement to access the needed >> tuplestore(s). > > Right. Hence my proposal to make the existence of the > tuplestores part of Query, writeable by the types of triggers > which specify that they'll be needed. > I just don't think that Rel is the place to connect them. I don't know what you mean by that. I've already said that I now think we should use the standard CREATE TRIGGER syntax to specify the transition tables, and that if we do that we don't need the reloption that's in the patch. If you ignore the 19 lines of new code to add that reloption, absolutely 100% of the code changes in the patch so far are in trigger.c and trigger.h. That reloption was never anything I would consider as *connecting* the tuplestores to the Rel anyway -- it was simply an attempt to minimize unnecessary work. No matter how I try, I'm not seeing what you mean by references to "connecting to Rel". -- Kevin Grittner EDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
pgsql-hackers by date: