69 targetRelRTE,
true,
true);
71 sourceRelRTE,
true,
true);
83 targetRelRTE,
true,
true);
85 sourceRelRTE,
false,
false);
96 targetRelRTE,
false,
false);
98 sourceRelRTE,
true,
true);
114 List *mergeActionList;
121 qry->hasRecursive =
false;
124 if (
stmt->withClause)
126 if (
stmt->withClause->recursive)
128 (
errcode(ERRCODE_SYNTAX_ERROR),
129 errmsg(
"WITH RECURSIVE is not supported for MERGE statement")));
141 foreach(l,
stmt->mergeWhenClauses)
167 elog(
ERROR,
"unknown action in MERGE WHEN clause");
173 if (is_terminal[mergeWhenClause->
matchKind])
175 (
errcode(ERRCODE_SYNTAX_ERROR),
176 errmsg(
"unreachable WHEN clause specified after unconditional WHEN clause")));
178 is_terminal[mergeWhenClause->
matchKind] =
true;
195 qry->mergeTargetRelation = qry->resultRelation;
202 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
203 errmsg(
"cannot execute MERGE on relation \"%s\"",
221 errcode(ERRCODE_DUPLICATE_ALIAS),
222 errmsg(
"name \"%s\" specified more than once",
224 errdetail(
"The name is used both as MERGE target table and data source."));
267 mergeActionList =
NIL;
268 foreach(l,
stmt->mergeWhenClauses)
298 switch (
action->commandType)
364 forthree(lc, exprList, icols, icolumns, attnos, attrnos)
398 elog(
ERROR,
"unknown action in MERGE WHEN clause");
406 qry->hasTargetSRFs =
false;
421 foreach(lc,
namespace)
425 if (nsitem->
p_rte == rte)
Bitmapset * bms_add_member(Bitmapset *a, int x)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
List * lappend(List *list, void *datum)
FromExpr * makeFromExpr(List *fromlist, Node *quals)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
Node * transformWhereClause(ParseState *pstate, Node *clause, ParseExprKind exprKind, const char *constructName)
void transformFromClause(ParseState *pstate, List *frmList)
int setTargetTable(ParseState *pstate, RangeVar *relation, bool inh, bool alsoSource, AclMode requiredPerms)
void assign_query_collations(ParseState *pstate, Query *query)
List * transformWithClause(ParseState *pstate, WithClause *withClause)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
static void setNamespaceForMergeWhen(ParseState *pstate, MergeWhenClause *mergeWhenClause, Index targetRTI, Index sourceRTI)
Query * transformMergeStmt(ParseState *pstate, MergeStmt *stmt)
static void setNamespaceVisibilityForRTE(List *namespace, RangeTblEntry *rte, bool rel_visible, bool cols_visible)
@ EXPR_KIND_MERGE_RETURNING
@ EXPR_KIND_VALUES_SINGLE
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
ParseNamespaceItem * GetNSItemByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up)
List * transformExpressionList(ParseState *pstate, List *exprlist, ParseExprKind exprKind, bool allowDefault)
List * checkInsertTargets(ParseState *pstate, List *cols, List **attrnos)
List * transformInsertRow(ParseState *pstate, List *exprlist, List *stmtcols, List *icolumns, List *attrnos, bool strip_indirection)
void transformReturningClause(ParseState *pstate, Query *qry, ReturningClause *returningClause, ParseExprKind exprKind)
List * transformUpdateTargetList(ParseState *pstate, List *origTlist)
#define rt_fetch(rangetable_index, rangetable)
int errdetail_relkind_not_supported(char relkind)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forthree(cell1, list1, cell2, list2, cell3, list3)
#define NUM_MERGE_MATCH_KINDS
@ MERGE_WHEN_NOT_MATCHED_BY_TARGET
@ MERGE_WHEN_NOT_MATCHED_BY_SOURCE
#define RelationGetRelationName(relation)
RTEPermissionInfo * p_perminfo
ParseNamespaceItem * p_target_nsitem
Relation p_target_relation
Node * mergeJoinCondition
#define FirstLowInvalidHeapAttributeNumber