diff options
| author | Simon Riggs | 2018-04-03 11:13:59 +0000 |
|---|---|---|
| committer | Simon Riggs | 2018-04-03 11:13:59 +0000 |
| commit | aa3faa3c7a7a49b3318059ccaf79bc1886a64707 (patch) | |
| tree | 1ccf93dda1b6481727d416f1dedfa556a704247a /src/backend | |
| parent | 83454e3c2b28141c0db01c7d2027e01040df5249 (diff) | |
WITH support in MERGE
Author: Peter Geoghegan
Recursive support removed, no tests
Docs added by me
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/nodes/copyfuncs.c | 1 | ||||
| -rw-r--r-- | src/backend/nodes/equalfuncs.c | 1 | ||||
| -rw-r--r-- | src/backend/nodes/nodeFuncs.c | 2 | ||||
| -rw-r--r-- | src/backend/parser/gram.y | 11 | ||||
| -rw-r--r-- | src/backend/parser/parse_merge.c | 14 |
5 files changed, 24 insertions, 5 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 770ed3b1a88..c3efca3c452 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -3055,6 +3055,7 @@ _copyMergeStmt(const MergeStmt *from) COPY_NODE_FIELD(source_relation); COPY_NODE_FIELD(join_condition); COPY_NODE_FIELD(mergeActionList); + COPY_NODE_FIELD(withClause); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 5a0151eece5..45ceba28309 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1051,6 +1051,7 @@ _equalMergeStmt(const MergeStmt *a, const MergeStmt *b) COMPARE_NODE_FIELD(source_relation); COMPARE_NODE_FIELD(join_condition); COMPARE_NODE_FIELD(mergeActionList); + COMPARE_NODE_FIELD(withClause); return true; } diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 3c302db0575..4157e7eb9a3 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -3446,6 +3446,8 @@ raw_expression_tree_walker(Node *node, return true; if (walker(stmt->mergeActionList, context)) return true; + if (walker(stmt->withClause, context)) + return true; } break; case T_MergeAction: diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 583ee321e1d..b879358de16 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11105,17 +11105,18 @@ set_target_list: *****************************************************************************/ MergeStmt: - MERGE INTO relation_expr_opt_alias + opt_with_clause MERGE INTO relation_expr_opt_alias USING table_ref ON a_expr merge_when_list { MergeStmt *m = makeNode(MergeStmt); - m->relation = $3; - m->source_relation = $5; - m->join_condition = $7; - m->mergeActionList = $8; + m->withClause = $1; + m->relation = $4; + m->source_relation = $6; + m->join_condition = $8; + m->mergeActionList = $9; $$ = (Node *)m; } diff --git a/src/backend/parser/parse_merge.c b/src/backend/parser/parse_merge.c index d6d6876961c..eb4c615ce1c 100644 --- a/src/backend/parser/parse_merge.c +++ b/src/backend/parser/parse_merge.c @@ -24,6 +24,7 @@ #include "parser/parsetree.h" #include "parser/parser.h" #include "parser/parse_clause.h" +#include "parser/parse_cte.h" #include "parser/parse_merge.h" #include "parser/parse_relation.h" #include "parser/parse_target.h" @@ -202,6 +203,19 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) Assert(pstate->p_ctenamespace == NIL); qry->commandType = CMD_MERGE; + qry->hasRecursive = false; + + /* process the WITH clause independently of all else */ + if (stmt->withClause) + { + if (stmt->withClause->recursive) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("WITH RECURSIVE is not supported for MERGE statement"))); + + qry->cteList = transformWithClause(pstate, stmt->withClause); + qry->hasModifyingCTE = pstate->p_hasModifyingCTE; + } /* * Check WHEN clauses for permissions and sanity |
