On 2018/04/18 0:04, Alvaro Herrera wrote:
> Amit Langote wrote:
> 
>> I just confirmed my hunch that this wouldn't somehow do the right thing
>> when the OID system column is involved.  Like this case:
> 
> This looks too big a patch to pursue now.  I'm inclined to just remove
> the equalTupdesc changes.

OK.  Here is the patch that removes equalTupdesc optimization.

I will add the rest of the patch to the next CF after starting a new
thread for it sometime later.

Thanks,
Amit
From ceaba0f59653be237f9bafee47fe82205db6fe14 Mon Sep 17 00:00:00 2001
From: amit <amitlangot...@gmail.com>
Date: Wed, 18 Apr 2018 13:22:49 +0900
Subject: [PATCH v1] Remove equalTupDescs-based optimization in
 ExecInitPartitionInfo

---
 src/backend/executor/execPartition.c | 151 ++++++++++++++++-------------------
 1 file changed, 67 insertions(+), 84 deletions(-)

diff --git a/src/backend/executor/execPartition.c 
b/src/backend/executor/execPartition.c
index 23a74bc3d9..a2f6b29cd5 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -313,7 +313,6 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
        MemoryContext oldContext;
        AttrNumber *part_attnos = NULL;
        bool            found_whole_row;
-       bool            equalTupdescs;
 
        /*
         * We locked all the partitions in ExecSetupPartitionTupleRouting
@@ -361,10 +360,6 @@ 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,
@@ -405,21 +400,18 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
                /*
                 * Convert Vars in it to contain this partition's attribute 
numbers.
                 */
-               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. */
-               }
+               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)
                {
@@ -464,25 +456,22 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
                 */
                returningList = linitial(node->returningLists);
 
-               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. */
-               }
+               /*
+                * 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;
 
@@ -583,33 +572,30 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
                                 * target relation (firstVarno).
                                 */
                                onconflset = (List *) copyObject((Node *) 
node->onConflictSet);
-                               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. */
+                               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);
-                               }
+                               /* Finally, adjust this tlist to match the 
partition. */
+                               onconflset = adjust_partition_tlist(onconflset, 
map);
 
                                /*
                                 * Build UPDATE SET's projection info.  The 
user of this
@@ -637,25 +623,22 @@ ExecInitPartitionInfo(ModifyTableState *mtstate,
                                        List       *clause;
 
                                        clause = copyObject((List *) 
node->onConflictWhere);
-                                       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. */
-                                       }
+                                       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);
                                }
-- 
2.11.0

Reply via email to