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  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
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:

Previous
From: Alvaro Herrera
Date:
Subject: Re: support for MERGE
Next
From: Arjun Prashanth
Date:
Subject: [GSOC 22] GUI representation of monitoring System Activity with the system_stats Extension in pgAdmin 4