diff options
author | Dean Rasheed <dean.a.rasheed@gmail.com> | 2024-03-17 13:58:59 +0000 |
---|---|---|
committer | Dean Rasheed <dean.a.rasheed@gmail.com> | 2024-03-17 13:58:59 +0000 |
commit | c649fa24a42ba89bf5460c7110e4fc8eeca65959 (patch) | |
tree | de7d51489c6c6fff56fddad66c0ced2aa427d6a5 /src/include/executor | |
parent | 6a004f1be87d34cfe51acf2fe2552d2b08a79273 (diff) |
Add RETURNING support to MERGE.
This allows a RETURNING clause to be appended to a MERGE query, to
return values based on each row inserted, updated, or deleted. As with
plain INSERT, UPDATE, and DELETE commands, the returned values are
based on the new contents of the target table for INSERT and UPDATE
actions, and on its old contents for DELETE actions. Values from the
source relation may also be returned.
As with INSERT/UPDATE/DELETE, the output of MERGE ... RETURNING may be
used as the source relation for other operations such as WITH queries
and COPY commands.
Additionally, a special function merge_action() is provided, which
returns 'INSERT', 'UPDATE', or 'DELETE', depending on the action
executed for each row. The merge_action() function can be used
anywhere in the RETURNING list, including in arbitrary expressions and
subqueries, but it is an error to use it anywhere outside of a MERGE
query's RETURNING list.
Dean Rasheed, reviewed by Isaac Morland, Vik Fearing, Alvaro Herrera,
Gurjeet Singh, Jian He, Jeff Davis, Merlin Moncure, Peter Eisentraut,
and Wolfgang Walther.
Discussion: http://postgr.es/m/CAEZATCWePEGQR5LBn-vD6SfeLZafzEm2Qy_L_Oky2=qw2w3Pzg@mail.gmail.com
Diffstat (limited to 'src/include/executor')
-rw-r--r-- | src/include/executor/execExpr.h | 3 | ||||
-rw-r--r-- | src/include/executor/spi.h | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index a28ddcdd771..8953d767387 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -243,6 +243,7 @@ typedef enum ExprEvalOp EEOP_AGGREF, EEOP_GROUPING_FUNC, EEOP_WINDOW_FUNC, + EEOP_MERGE_SUPPORT_FUNC, EEOP_SUBPLAN, /* aggregation related nodes */ @@ -810,6 +811,8 @@ extern void ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op); extern void ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op); +extern void ExecEvalMergeSupportFunc(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); extern void ExecEvalSubPlan(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index c13e1f64fb1..48b87730ea0 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -97,6 +97,7 @@ typedef struct _SPI_plan *SPIPlanPtr; #define SPI_OK_REL_UNREGISTER 16 #define SPI_OK_TD_REGISTER 17 #define SPI_OK_MERGE 18 +#define SPI_OK_MERGE_RETURNING 19 #define SPI_OPT_NONATOMIC (1 << 0) |