From 06ea984af3096589ee324f91a7d9d3d6e66af981 Mon Sep 17 00:00:00 2001 From: Tender Wang Date: Wed, 16 Sep 2026 10:49:33 +0800 Subject: [PATCH] Reject set-returning functions in MERGE INSERT actions MERGE INSERT values are transformed using EXPR_KIND_VALUES_SINGLE, which allows set-returning functions and sets p_hasTargetSRFs. However, a MERGE INSERT action is supposed to insert one row for each candidate change row, and its target list cannot be expanded using a ProjectSet plan node. As a result, an SRF in a MERGE INSERT action was accepted during parse analysis, but failed during executor initialization with "set-valued function called in context that cannot accept a set". In particular, this allowed PREPARE to succeed for a statement that would always fail when executed. Reject such functions while transforming the MERGE INSERT action, so the error is reported during parse analysis. --- src/backend/parser/parse_merge.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/parser/parse_merge.c b/src/backend/parser/parse_merge.c index 0a70d48fd4c..daa89e199a5 100644 --- a/src/backend/parser/parse_merge.c +++ b/src/backend/parser/parse_merge.c @@ -17,6 +17,7 @@ #include "access/sysattr.h" #include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" #include "parser/analyze.h" #include "parser/parse_clause.h" #include "parser/parse_collate.h" @@ -345,6 +346,11 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) mergeWhenClause->values, EXPR_KIND_VALUES_SINGLE, true); + if (pstate->p_hasTargetSRFs) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-returning functions are not allowed in MERGE INSERT actions"), + parser_errposition(pstate, exprLocation(pstate->p_last_srf)))); /* Prepare row for assignment to target table */ exprList = transformInsertRow(pstate, exprList, -- 2.43.0