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: