Re: Free indexed_tlist memory explicitly within set_plan_refs()
От | Peter Geoghegan |
---|---|
Тема | Re: Free indexed_tlist memory explicitly within set_plan_refs() |
Дата | |
Msg-id | CAM3SWZS8RPvA=KFxADZWw3wAHnnbxMxDzkEC6fNaFc7zSm411w@mail.gmail.com обсуждение исходный текст |
Ответ на | Free indexed_tlist memory explicitly within set_plan_refs() (Peter Geoghegan <pg@heroku.com>) |
Ответы |
Re: Free indexed_tlist memory explicitly within set_plan_refs()
Re: Free indexed_tlist memory explicitly within set_plan_refs() Re: Free indexed_tlist memory explicitly within set_plan_refs() |
Список | pgsql-hackers |
On Sun, May 24, 2015 at 6:17 PM, Peter Geoghegan <pg@heroku.com> wrote: > Attached patch adds such a pfree() call. Attached, revised version incorporates this small fix, while adding an additional big fix, and a number of small style tweaks. This is mainly concerned with fixing the bug I was trying to fix when I spotted the minor pfree() issue: postgres=# insert into upsert (key, val) values('Foo', 'Bar') on conflict (key) do update set val = excluded.val where excluded.* is not null; ERROR: XX000: variable not found in subplan target lists LOCATION: fix_join_expr_mutator, setrefs.c:2003 postgres=# insert into upsert (key, val) values(('Foo', 'Bar') on conflict (key) do update set val = excluded.val where excluded.ctid is not null; ERROR: XX000: variable not found in subplan target lists LOCATION: fix_join_expr_mutator, setrefs.c:2003 The first query shown should clearly finish processing by the optimizer without raising this error message (execution should work correctly too, of course). The second query shown should fail with a user visible error message about referencing the excluded pseudo-relation's ctid column not making sense. The basic problem is that there wasn't much thought put into how the excluded pseudo-relation's "reltargetlist" is generated -- it currently comes from a call to expandRelAttrs() during parse analysis, which, on its own, doesn't allow whole row Vars to work. One approach to fixing this is to follow the example of RETURNING lists with references to more than one relation: preprocess_targetlist() handles this by calling pull_var_clause() and making new TargetEntry entries for Vars found to not be referencing the target (and not already in the targetlist for some other reason). Another approach, preferred by Andres, is to have query_planner() do more. I understand that the idea there is to make excluded.* closer to a regular table, in that it can be expected to have a baserel, and within the executor we have something closer to a bona-fide scan reltargetlist, that we can expect to have all Vars appear in. This should be enough to make the reltargetlist have the appropriate Vars more or less in the regular course of planning, including excluded.* whole row Vars. To make this work we could call add_vars_to_targetlist(), and call add_base_rels_to_query() and then build_base_rel_tlists() within query_planner() (while moving a few other things around). However, the ordering dependencies within query_planner() seemed quite complicated to me, and I didn't want to modify such an important routine just to fix this bug. RETURNING seemed like a perfectly good precedent to follow, so that's what I did. Now, it might have been that I misunderstood Andres when we discussed this problem on Jabber/IM, but ISTM that the second idea doesn't have much advantage over the first (I'm sure that Andres will be able to explain what he'd like to do better here -- it was a quick conversation). I did prototype the second approach, and the code footprint of what I have here (the first approach) seems lower than it would have to be with the second. Besides, I didn't see a convenient choke point to reject system column references with the second approach. Attached patch fixes the bug using the first approach. Tests were added demonstrating that the cases above are fixed. A second attached patch fixes another, largely independent bug. I noticed array assignment with ON CONFLICT DO UPDATE was broken. See commit message for full details. Thoughts? -- Peter Geoghegan
Вложения
В списке pgsql-hackers по дате отправления: