diff options
| author | Alvaro Herrera | 2018-03-26 13:43:54 +0000 |
|---|---|---|
| committer | Alvaro Herrera | 2018-03-26 13:43:54 +0000 |
| commit | 555ee77a9668e3f1b03307055b5027e13bf1a715 (patch) | |
| tree | e024aef2f35c73208a7e5f11822d89d97548c6c1 /src/include/nodes | |
| parent | 1b89c2188bd38eac68251f16051859996128f2d0 (diff) | |
Handle INSERT .. ON CONFLICT with partitioned tables
Commit eb7ed3f30634 enabled unique constraints on partitioned tables,
but one thing that was not working properly is INSERT/ON CONFLICT.
This commit introduces a new node keeps state related to the ON CONFLICT
clause per partition, and fills it when that partition is about to be
used for tuple routing.
Author: Amit Langote, Álvaro Herrera
Reviewed-by: Etsuro Fujita, Pavan Deolasee
Discussion: https://postgr.es/m/20180228004602.cwdyralmg5ejdqkq@alvherre.pgsql
Diffstat (limited to 'src/include/nodes')
| -rw-r--r-- | src/include/nodes/execnodes.h | 22 | ||||
| -rw-r--r-- | src/include/nodes/nodes.h | 1 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index bf2616a95ed..2c2d2823c05 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -363,6 +363,20 @@ typedef struct JunkFilter } JunkFilter; /* + * OnConflictSetState + * + * Executor state of an ON CONFLICT DO UPDATE operation. + */ +typedef struct OnConflictSetState +{ + NodeTag type; + + ProjectionInfo *oc_ProjInfo; /* for ON CONFLICT DO UPDATE SET */ + TupleDesc oc_ProjTupdesc; /* TupleDesc for the above projection */ + ExprState *oc_WhereClause; /* state for the WHERE clause */ +} OnConflictSetState; + +/* * ResultRelInfo * * Whenever we update an existing relation, we have to update indexes on the @@ -424,11 +438,11 @@ typedef struct ResultRelInfo /* for computing a RETURNING list */ ProjectionInfo *ri_projectReturning; - /* for computing ON CONFLICT DO UPDATE SET */ - ProjectionInfo *ri_onConflictSetProj; + /* list of arbiter indexes to use to check conflicts */ + List *ri_onConflictArbiterIndexes; - /* list of ON CONFLICT DO UPDATE exprs (qual) */ - ExprState *ri_onConflictSetWhere; + /* ON CONFLICT evaluation state */ + OnConflictSetState *ri_onConflict; /* partition check expression */ List *ri_PartitionCheck; diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 74b094a9c39..443de227041 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -34,6 +34,7 @@ typedef enum NodeTag T_ExprContext, T_ProjectionInfo, T_JunkFilter, + T_OnConflictSetState, T_ResultRelInfo, T_EState, T_TupleTableSlot, |
