Re: Another multi-row VALUES bug
От | Dean Rasheed |
---|---|
Тема | Re: Another multi-row VALUES bug |
Дата | |
Msg-id | CAEZATCW5dvPFSG8og1iRoLtzLK3tHKNjF3OhocoP16NYLYfZ-Q@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Another multi-row VALUES bug (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: Another multi-row VALUES bug
|
Список | pgsql-hackers |
On Wed, 23 Nov 2022 at 18:56, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > I wonder if somehow we could just make one pass over > all the VALUES RTEs, and process each one as needed? The problem > is to identify the relevant target relation, I guess. > I have been thinking about that some more, but I think it would be pretty difficult to achieve. Part of the problem is that the targetlist processing and VALUES RTE processing are quite closely coupled (because of things like GENERATED ALWAYS columns). Both rewriteTargetListIU() and rewriteValuesRTE() rely on being passed the VALUES RTE that the targetlist is reading from, and rewriteValuesRTE() then relies on extra information returned by rewriteTargetListIU(). Also, there's the way that DEFAULTs from updatable views work, which means that the DEFAULTs in a VALUES RTE won't necessarily all come from the same target relation. So I think it would be much harder to do the VALUES RTE processing anywhere other than where it's being done right now, and even if it could be done elsewhere, it would be a very invasive change, and therefore hard to back-patch. That, of course, leaves the problem of identifying the right VALUES RTE to process. A different way to do this, without relying on the contents of the targetlist, is to note that, while processing a product query, what we really want to do is ignore any VALUES RTEs from the original query, since they will have already been processed. There should then never be more than one VALUES RTE left to process -- the one from the rule action. This can be done by exploiting the fact that in product queries, the rtable always consists of the rtable from the original query followed by the rtable from the rule action, so we just need to ignore the right number of RTEs at the start of the rtable. Of course that would break if we ever changed the way rewriteRuleAction() worked, but at least it only depends on that one other place in the code, which has been stable for a long time, so the risk of future breakage seems managable. Regards, Dean
Вложения
В списке pgsql-hackers по дате отправления: