Code review for ATExecAttachPartition.
authorRobert Haas <rhaas@postgresql.org>
Thu, 22 Dec 2016 17:39:19 +0000 (12:39 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 22 Dec 2016 17:40:45 +0000 (12:40 -0500)
Amit Langote.  Most of this reported by Álvaro Herrera.

src/backend/commands/tablecmds.c

index 115b98313e350d0916ff5c79521d12effc30b3f0..ee79b726f2ec831f25edbd7469404ff7b4ee6ed4 100644 (file)
@@ -12996,7 +12996,6 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
                           *existConstraint;
        SysScanDesc scan;
        ScanKeyData skey;
-       HeapTuple       tuple;
        AttrNumber      attno;
        int                     natts;
        TupleDesc       tupleDesc;
@@ -13018,7 +13017,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
                                 errmsg("\"%s\" is already a partition",
                                                RelationGetRelationName(attachRel))));
 
-       if (attachRel->rd_rel->reloftype)
+       if (OidIsValid(attachRel->rd_rel->reloftype))
                ereport(ERROR,
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
                                 errmsg("cannot attach a typed table as partition")));
@@ -13119,9 +13118,10 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
                if (attribute->attisdropped)
                        continue;
 
-               /* Find same column in parent (matching on column name). */
-               tuple = SearchSysCacheCopyAttName(RelationGetRelid(rel), attributeName);
-               if (!HeapTupleIsValid(tuple))
+               /* Try to find the column in parent (matching on column name) */
+               if (!SearchSysCacheExists2(ATTNAME,
+                                                                  ObjectIdGetDatum(RelationGetRelid(rel)),
+                                                                  CStringGetDatum(attributeName)))
                        ereport(ERROR,
                                        (errcode(ERRCODE_DATATYPE_MISMATCH),
                                         errmsg("table \"%s\" contains column \"%s\" not found in parent \"%s\"",
@@ -13167,7 +13167,6 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd)
         * There is a case in which we cannot rely on just the result of the
         * proof.
         */
-       tupleDesc = RelationGetDescr(attachRel);
        attachRel_constr = tupleDesc->constr;
        existConstraint = NIL;
        if (attachRel_constr != NULL)