@ -24,6 +24,7 @@
# include "nodes/makefuncs.h"
# include "partitioning/partbounds.h"
# include "partitioning/partprune.h"
# include "rewrite/rewriteManip.h"
# include "utils/lsyscache.h"
# include "utils/partcache.h"
# include "utils/rel.h"
@ -307,8 +308,12 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
ModifyTable * node = ( ModifyTable * ) mtstate - > ps . plan ;
Relation rootrel = resultRelInfo - > ri_RelationDesc ,
partrel ;
Relation firstResultRel = mtstate - > resultRelInfo [ 0 ] . ri_RelationDesc ;
ResultRelInfo * leaf_part_rri ;
MemoryContext oldContext ;
AttrNumber * part_attnos = NULL ;
bool found_whole_row ;
bool equalTupdescs ;
/*
* We locked all the partitions in ExecSetupPartitionTupleRouting
@ -356,6 +361,10 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
( node ! = NULL & &
node - > onConflictAction ! = ONCONFLICT_NONE ) ) ;
/* if tuple descs are identical, we don't need to map the attrs */
equalTupdescs = equalTupleDescs ( RelationGetDescr ( partrel ) ,
RelationGetDescr ( firstResultRel ) ) ;
/*
* Build WITH CHECK OPTION constraints for the partition . Note that we
* didn ' t build the withCheckOptionList for partitions within the planner ,
@ -369,7 +378,6 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
List * wcoExprs = NIL ;
ListCell * ll ;
int firstVarno = mtstate - > resultRelInfo [ 0 ] . ri_RangeTableIndex ;
Relation firstResultRel = mtstate - > resultRelInfo [ 0 ] . ri_RelationDesc ;
/*
* In the case of INSERT on a partitioned table , there is only one
@ -397,8 +405,22 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
/*
* Convert Vars in it to contain this partition ' s attribute numbers .
*/
wcoList = map_partition_varattnos ( wcoList , firstVarno ,
partrel , firstResultRel , NULL ) ;
if ( ! equalTupdescs )
{
part_attnos =
convert_tuples_by_name_map ( RelationGetDescr ( partrel ) ,
RelationGetDescr ( firstResultRel ) ,
gettext_noop ( " could not convert row type " ) ) ;
wcoList = ( List * )
map_variable_attnos ( ( Node * ) wcoList ,
firstVarno , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
}
foreach ( ll , wcoList )
{
WithCheckOption * wco = castNode ( WithCheckOption , lfirst ( ll ) ) ;
@ -425,7 +447,6 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
ExprContext * econtext ;
List * returningList ;
int firstVarno = mtstate - > resultRelInfo [ 0 ] . ri_RangeTableIndex ;
Relation firstResultRel = mtstate - > resultRelInfo [ 0 ] . ri_RelationDesc ;
/* See the comment above for WCO lists. */
Assert ( ( node - > operation = = CMD_INSERT & &
@ -443,12 +464,26 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
*/
returningList = linitial ( node - > returningLists ) ;
/*
* Convert Vars in it to contain this partition ' s attribute numbers .
*/
returningList = map_partition_varattnos ( returningList , firstVarno ,
partrel , firstResultRel ,
NULL ) ;
if ( ! equalTupdescs )
{
/*
* Convert Vars in it to contain this partition ' s attribute numbers .
*/
if ( part_attnos = = NULL )
part_attnos =
convert_tuples_by_name_map ( RelationGetDescr ( partrel ) ,
RelationGetDescr ( firstResultRel ) ,
gettext_noop ( " could not convert row type " ) ) ;
returningList = ( List * )
map_variable_attnos ( ( Node * ) returningList ,
firstVarno , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
}
leaf_part_rri - > ri_returningList = returningList ;
/*
@ -473,7 +508,6 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
{
TupleConversionMap * map = proute - > parent_child_tupconv_maps [ partidx ] ;
int firstVarno = mtstate - > resultRelInfo [ 0 ] . ri_RangeTableIndex ;
Relation firstResultRel = mtstate - > resultRelInfo [ 0 ] . ri_RelationDesc ;
TupleDesc partrelDesc = RelationGetDescr ( partrel ) ;
ExprContext * econtext = mtstate - > ps . ps_ExprContext ;
ListCell * lc ;
@ -549,17 +583,33 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
* target relation ( firstVarno ) .
*/
onconflset = ( List * ) copyObject ( ( Node * ) node - > onConflictSet ) ;
onconflset =
map_partition_varattnos ( onconflset , INNER_VAR , partrel ,
firstResultRel , & found_whole_row ) ;
Assert ( ! found_whole_row ) ;
onconflset =
map_partition_varattnos ( onconflset , firstVarno , partrel ,
firstResultRel , & found_whole_row ) ;
Assert ( ! found_whole_row ) ;
/* Finally, adjust this tlist to match the partition. */
onconflset = adjust_partition_tlist ( onconflset , map ) ;
if ( ! equalTupdescs )
{
if ( part_attnos = = NULL )
part_attnos =
convert_tuples_by_name_map ( RelationGetDescr ( partrel ) ,
RelationGetDescr ( firstResultRel ) ,
gettext_noop ( " could not convert row type " ) ) ;
onconflset = ( List * )
map_variable_attnos ( ( Node * ) onconflset ,
INNER_VAR , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
onconflset = ( List * )
map_variable_attnos ( ( Node * ) onconflset ,
firstVarno , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
/* Finally, adjust this tlist to match the partition. */
onconflset = adjust_partition_tlist ( onconflset , map ) ;
}
/*
* Build UPDATE SET ' s projection info . The user of this
@ -587,14 +637,25 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
List * clause ;
clause = copyObject ( ( List * ) node - > onConflictWhere ) ;
clause = map_partition_varattnos ( clause , INNER_VAR ,
partrel , firstResultRel ,
& found_whole_row ) ;
Assert ( ! found_whole_row ) ;
clause = map_partition_varattnos ( clause , firstVarno ,
partrel , firstResultRel ,
& found_whole_row ) ;
Assert ( ! found_whole_row ) ;
if ( ! equalTupdescs )
{
clause = ( List * )
map_variable_attnos ( ( Node * ) clause ,
INNER_VAR , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
clause = ( List * )
map_variable_attnos ( ( Node * ) clause ,
firstVarno , 0 ,
part_attnos ,
RelationGetDescr ( firstResultRel ) - > natts ,
RelationGetForm ( partrel ) - > reltype ,
& found_whole_row ) ;
/* We ignore the value of found_whole_row. */
}
leaf_part_rri - > ri_onConflict - > oc_WhereClause =
ExecInitQual ( ( List * ) clause , & mtstate - > ps ) ;
}