From 555ee77a9668e3f1b03307055b5027e13bf1a715 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 26 Mar 2018 10:43:54 -0300 Subject: Handle INSERT .. ON CONFLICT with partitioned tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/include/nodes/execnodes.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/include/nodes/execnodes.h') 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 @@ -362,6 +362,20 @@ typedef struct JunkFilter AttrNumber jf_junkAttNo; } 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 * @@ -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; -- cgit v1.2.3