Re: support for MERGE - Mailing list pgsql-hackers
From | Justin Pryzby |
---|---|
Subject | Re: support for MERGE |
Date | |
Msg-id | 20220312160815.GP28503@telsasoft.com Whole thread Raw |
In response to | Re: support for MERGE (Alvaro Herrera <alvherre@alvh.no-ip.org>) |
Responses |
Re: support for MERGE
|
List | pgsql-hackers |
On Sat, Jan 29, 2022 at 12:03:35AM -0600, Justin Pryzby wrote: > Note that MergeWhenClause and MergeAction have the node definition in a > different order than the header, which is a bit confusing. The .h files still order these fields differently than the other .h files, and then the node funcs (at least MergeAction) also have a different order than the .h files. > diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h > index 1617702d9d..c8e8254b16 100644 > --- a/src/include/nodes/parsenodes.h > +++ b/src/include/nodes/parsenodes.h > @@ -117,7 +117,7 @@ typedef struct Query > +typedef struct MergeWhenClause > +{ > + NodeTag type; > + bool matched; /* true=MATCHED, false=NOT MATCHED */ > + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ > + Node *condition; /* WHEN 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 conditions */ > + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ > + List *targetList; /* the target list (of TargetEntry) */ > + List *updateColnos; /* target attribute numbers of an UPDATE */ > +} MergeAction; > diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c > index d4f8455a2b..234a701045 100644 > --- a/src/backend/nodes/copyfuncs.c > +++ b/src/backend/nodes/copyfuncs.c > +static MergeAction * > +_copyMergeAction(const MergeAction *from) > +{ > + MergeAction *newnode = makeNode(MergeAction); > + > + COPY_SCALAR_FIELD(matched); > + COPY_SCALAR_FIELD(commandType); > + COPY_SCALAR_FIELD(override); > + COPY_NODE_FIELD(qual); > + COPY_NODE_FIELD(targetList); > + COPY_NODE_FIELD(updateColnos); > +static MergeWhenClause * > +_copyMergeWhenClause(const MergeWhenClause *from) > +{ > + MergeWhenClause *newnode = makeNode(MergeWhenClause); > + > + COPY_SCALAR_FIELD(matched); > + COPY_SCALAR_FIELD(commandType); > + COPY_NODE_FIELD(condition); > + COPY_NODE_FIELD(targetList); > + COPY_NODE_FIELD(cols); > + COPY_NODE_FIELD(values); > + COPY_SCALAR_FIELD(override); > + return newnode; > +} > diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c > index f1002afe7a..5e1ff02a55 100644 > --- a/src/backend/nodes/equalfuncs.c > +++ b/src/backend/nodes/equalfuncs.c > @@ -841,6 +841,20 @@ _equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b) > +static bool > +_equalMergeAction(const MergeAction *a, const MergeAction *b) > +{ > + COMPARE_SCALAR_FIELD(matched); > + COMPARE_SCALAR_FIELD(commandType); > + COMPARE_SCALAR_FIELD(override); > + COMPARE_NODE_FIELD(qual); > + COMPARE_NODE_FIELD(targetList); > + COMPARE_NODE_FIELD(updateColnos); > +static bool > +_equalMergeWhenClause(const MergeWhenClause *a, const MergeWhenClause *b) > +{ > + COMPARE_SCALAR_FIELD(matched); > + COMPARE_SCALAR_FIELD(commandType); > + COMPARE_NODE_FIELD(condition); > + COMPARE_NODE_FIELD(targetList); > + COMPARE_NODE_FIELD(cols); > + COMPARE_NODE_FIELD(values); > + COMPARE_SCALAR_FIELD(override); > + > + return true; > +} > diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c > index 6bdad462c7..7549b27b39 100644 > --- a/src/backend/nodes/outfuncs.c > +++ b/src/backend/nodes/outfuncs.c > @@ -429,6 +429,21 @@ _outModifyTable(StringInfo str, const ModifyTable *node) > +static void > +_outMergeWhenClause(StringInfo str, const MergeWhenClause *node) > +{ > + WRITE_NODE_TYPE("MERGEWHENCLAUSE"); > + > + WRITE_BOOL_FIELD(matched); > + WRITE_ENUM_FIELD(commandType, CmdType); > + WRITE_NODE_FIELD(condition); > + WRITE_NODE_FIELD(targetList); > + WRITE_NODE_FIELD(cols); > + WRITE_NODE_FIELD(values); > + WRITE_ENUM_FIELD(override, OverridingKind); > +static void > +_outMergeAction(StringInfo str, const MergeAction *node) > +{ > + WRITE_NODE_TYPE("MERGEACTION"); > + > + WRITE_BOOL_FIELD(matched); > + WRITE_ENUM_FIELD(commandType, CmdType); > + WRITE_ENUM_FIELD(override, OverridingKind); > + WRITE_NODE_FIELD(qual); > + WRITE_NODE_FIELD(targetList); > + WRITE_NODE_FIELD(updateColnos); > +} > diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c > index 3f68f7c18d..d3ca5f0e45 100644 > --- a/src/backend/nodes/readfuncs.c > +++ b/src/backend/nodes/readfuncs.c > +static MergeAction * > +_readMergeAction(void) > +{ > + READ_LOCALS(MergeAction); > + > + READ_BOOL_FIELD(matched); > + READ_ENUM_FIELD(commandType, CmdType); > + READ_ENUM_FIELD(override, OverridingKind); > + READ_NODE_FIELD(qual); > + READ_NODE_FIELD(targetList); > + READ_NODE_FIELD(updateColnos); > + > + READ_DONE(); > +} > +static MergeWhenClause * > +_readMergeWhenClause(void) > +{ > + READ_LOCALS(MergeWhenClause); > + > + READ_BOOL_FIELD(matched); > + READ_ENUM_FIELD(commandType, CmdType); > + READ_NODE_FIELD(condition); > + READ_NODE_FIELD(targetList); > + READ_NODE_FIELD(cols); > + READ_NODE_FIELD(values); > + READ_ENUM_FIELD(override, OverridingKind);
pgsql-hackers by date: