Re: MERGE ... RETURNING - Mailing list pgsql-hackers
From | Dean Rasheed |
---|---|
Subject | Re: MERGE ... RETURNING |
Date | |
Msg-id | CAEZATCWcZd59aZ-LTWCutoKYKvqGaW1aMNLvpaQV-BgLHiaXxA@mail.gmail.com Whole thread Raw |
In response to | Re: MERGE ... RETURNING (Gurjeet Singh <gurjeet@singh.im>) |
Responses |
Re: MERGE ... RETURNING
|
List | pgsql-hackers |
On Tue, 25 Jul 2023 at 21:46, Gurjeet Singh <gurjeet@singh.im> wrote: > > There seems to be other use cases which need us to invent a method to > expose a command-specific alias. See Tatsuo Ishii's call for help in > his patch for Row Pattern Recognition [1]. > I think that's different though, because in that example "START" is a row from the table, and "price" is a table column, so using the table alias syntax "START.price" makes sense, to refer to a value from the table. In this case "MERGE" and "action" have nothing to do with table rows or columns, so saying "MERGE.action" doesn't fit the pattern. > I performed the review vo v9 patch by comparing it to v8 and v7 > patches, and then comparing to HEAD. > Many thanks for looking at this. > The v9 patch is more or less a complete revert to v7 patch, plus the > planner support for calling the merge-support functions in subqueries, > parser catching use of merge-support functions outside MERGE command, > and name change for one of the support functions. > Yes, that's a fair summary. > But reverting to v7 also means that some of my gripes with that > version also return; e.g. invention of EXPR_KIND_MERGE_RETURNING. And > as noted in v7 review, I don't have a better proposal. > True, but I think that it's in keeping with the purpose of the ParseExprKind enumeration: /* * Expression kinds distinguished by transformExpr(). Many of these are not * semantically distinct so far as expression transformation goes; rather, * we distinguish them so that context-specific error messages can be printed. */ which matches what the patch is using EXPR_KIND_MERGE_RETURNING for. > - * Uplevel PlaceHolderVars and aggregates are replaced, too. > + * Uplevel PlaceHolderVars, aggregates, GROUPING() expressions and merge > + * support functions are replaced, too. > > Needs Oxford comma: s/GROUPING() expressions and/GROUPING() expressions, and/ > Added. > +pg_merge_action(PG_FUNCTION_ARGS) > +{ > ... > + relaction = mtstate->mt_merge_action; > + if (relaction) > + { > .. > + } > + > + PG_RETURN_NULL(); > +} > > Under what circumstances would the relaction be null? Is it okay to > return NULL from this function if relaction is null, or is it better > to throw an error? These questions apply to the > pg_merge_when_clause_number() function as well. > Yes, it's really a "should never happen" situation, so I've converted it to elog() an error. Similarly, commandType should never be CMD_NOTHING in pg_merge_action(), so that also now throws an error. Also, the planner code now throws an error if it sees a merge support function outside a MERGE. Again, that should never happen, due to the parser check, but it seems better to be sure, and catch it early. While at it, I tidied up the planner code a bit, making the merge support function handling more like the other cases in replace_correlation_vars_mutator(), and making replace_outer_merge_support_function() more like its neighbouring functions, such as replace_outer_grouping(). In particular, it is now only called if it is a reference to an upper-level MERGE, not for local references, which matches the pattern used in the neighbouring functions. Finally, I have added some new RLS code and tests, to apply SELECT policies to new rows inserted by MERGE INSERT actions, if a RETURNING clause is specified, to make it consistent with a plain INSERT ... RETURNING command (see commit c2e08b04c9). Regards, Dean
Attachment
pgsql-hackers by date: