mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
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
This commit is contained in:
@@ -269,6 +269,7 @@ typedef enum NodeTag
|
||||
T_RollupData,
|
||||
T_GroupingSetData,
|
||||
T_StatisticExtInfo,
|
||||
T_MergeAction,
|
||||
|
||||
/*
|
||||
* TAGS FOR MEMORY NODES (memnodes.h)
|
||||
@@ -310,7 +311,6 @@ typedef enum NodeTag
|
||||
T_DeleteStmt,
|
||||
T_UpdateStmt,
|
||||
T_MergeStmt,
|
||||
T_MergeAction,
|
||||
T_SelectStmt,
|
||||
T_AlterTableStmt,
|
||||
T_AlterTableCmd,
|
||||
@@ -475,6 +475,7 @@ typedef enum NodeTag
|
||||
T_PartitionRangeDatum,
|
||||
T_PartitionCmd,
|
||||
T_VacuumRelation,
|
||||
T_MergeWhenClause,
|
||||
|
||||
/*
|
||||
* TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.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;
|
||||
|
||||
/* ----------------------
|
||||
|
||||
Reference in New Issue
Block a user