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/include/nodes/parsenodes.h | |
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/include/nodes/parsenodes.h')
-rw-r--r-- | src/include/nodes/parsenodes.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 699fa77bc70..06abb70e947 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1518,19 +1518,34 @@ typedef struct MergeStmt RangeVar *relation; /* target relation to merge into */ Node *source_relation; /* source relation */ Node *join_condition; /* join condition between source and target */ - List *mergeActionList; /* list of MergeAction(s) */ + List *mergeWhenClauses; /* list of MergeWhenClause(es) */ WithClause *withClause; /* WITH clause */ } MergeStmt; -typedef struct MergeAction +typedef struct MergeWhenClause { NodeTag type; bool matched; /* true=MATCHED, false=NOT MATCHED */ - Node *condition; /* WHEN AND conditions (raw parser) */ - Node *qual; /* transformed WHEN AND conditions */ CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ - Node *stmt; /* T_UpdateStmt etc */ - List *targetList; /* the target list (of ResTarget) */ + Node *condition; /* WHEN AND conditions (raw parser) */ + List *targetList; /* INSERT/UPDATE targetlist */ + /* the following members are only useful for INSERT action */ + List *cols; /* optional: names of the target columns */ + List *values; /* VALUES to INSERT, or NULL */ + OverridingKind override; /* OVERRIDING clause */ +} MergeWhenClause; + +/* + * WHEN [NOT] MATCHED THEN action info + */ +typedef struct MergeAction +{ + NodeTag type; + bool matched; /* true=MATCHED, false=NOT MATCHED */ + OverridingKind override; /* OVERRIDING clause */ + Node *qual; /* transformed WHEN AND conditions */ + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ + List *targetList; /* the target list (of ResTarget) */ } MergeAction; /* ---------------------- |