diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2018-04-06 09:38:59 +0100 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2018-04-06 09:38:59 +0100 |
commit | f1464c53804fa7280a7942f6ac08038440f73b11 (patch) | |
tree | 92667694010e18a435bd7d409b341d935a1ee90b /src/backend/nodes/readfuncs.c | |
parent | 3b0b4f31f73a5f45f8e122d826211c13cd2412f7 (diff) | |
download | postgresql-f1464c53804fa7280a7942f6ac08038440f73b11.tar.gz postgresql-f1464c53804fa7280a7942f6ac08038440f73b11.zip |
Improve parse representation for MERGE
Separation of parser data structures from executor, as
requested by Tom Lane. Further improvements possible.
While there, implement error for multiple VALUES clauses via parser
to allow line number of error, as requested by Andres Freund.
Author: Pavan Deolasee
Discussion: https://www.postgresql.org/message-id/CABOikdPpqjectFchg0FyTOpsGXyPoqwgC==OLKWuxgBOsrDDZw@mail.gmail.com
Diffstat (limited to 'src/backend/nodes/readfuncs.c')
-rw-r--r-- | src/backend/nodes/readfuncs.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 4518fa0cdb7..37e35685956 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1332,6 +1332,22 @@ _readOnConflictExpr(void) } /* + * _readMergeAction + */ +static MergeAction * +_readMergeAction(void) +{ + READ_LOCALS(MergeAction); + + READ_BOOL_FIELD(matched); + READ_ENUM_FIELD(commandType, CmdType); + READ_NODE_FIELD(qual); + READ_NODE_FIELD(targetList); + + READ_DONE(); +} + +/* * Stuff from parsenodes.h. */ @@ -1602,19 +1618,20 @@ _readModifyTable(void) } /* - * _readMergeAction + * _readMergeWhenClause */ -static MergeAction * -_readMergeAction(void) +static MergeWhenClause * +_readMergeWhenClause(void) { - READ_LOCALS(MergeAction); + READ_LOCALS(MergeWhenClause); READ_BOOL_FIELD(matched); READ_ENUM_FIELD(commandType, CmdType); READ_NODE_FIELD(condition); - READ_NODE_FIELD(qual); - READ_NODE_FIELD(stmt); READ_NODE_FIELD(targetList); + READ_NODE_FIELD(cols); + READ_NODE_FIELD(values); + READ_ENUM_FIELD(override, OverridingKind); READ_DONE(); } @@ -2596,6 +2613,8 @@ parseNodeString(void) return_value = _readFromExpr(); else if (MATCH("ONCONFLICTEXPR", 14)) return_value = _readOnConflictExpr(); + else if (MATCH("MERGEACTION", 11)) + return_value = _readMergeAction(); else if (MATCH("RTE", 3)) return_value = _readRangeTblEntry(); else if (MATCH("RANGETBLFUNCTION", 16)) @@ -2618,8 +2637,8 @@ parseNodeString(void) return_value = _readProjectSet(); else if (MATCH("MODIFYTABLE", 11)) return_value = _readModifyTable(); - else if (MATCH("MERGEACTION", 11)) - return_value = _readMergeAction(); + else if (MATCH("MERGEWHENCLAUSE", 15)) + return_value = _readMergeWhenClause(); else if (MATCH("APPEND", 6)) return_value = _readAppend(); else if (MATCH("MERGEAPPEND", 11)) |