]> granicus.if.org Git - postgresql/commitdiff
Make functional index copy attstorage from the column data type, rather
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Jan 2001 00:06:07 +0000 (00:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Jan 2001 00:06:07 +0000 (00:06 +0000)
than forcing 'plain'.  This probably does not matter right now, but I
think it needs to be consistent with the regular (not-functional) index
case, where attstorage is copied from the underlying table.  Clean up
some other dead and infelicitous code too.

src/backend/catalog/index.c

index 590e2a59f33037584e64cff70fce3d55a8b8c494..633f47bd5fc202bd725d55e17d32a3a1b942638b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.136 2001/01/23 04:32:21 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.137 2001/01/24 00:06:07 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -62,7 +62,7 @@
 static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName,
                                   bool istemp);
 static TupleDesc BuildFuncTupleDesc(Oid funcOid);
-static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
+static TupleDesc ConstructTupleDescriptor(Relation heapRelation,
                                                                                  int numatts, AttrNumber *attNums);
 static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
 static Oid     UpdateRelationRelation(Relation indexRelation, char *temp_relname);
@@ -166,7 +166,7 @@ BuildFuncTupleDesc(Oid funcOid)
        Oid                     retType;
 
        /*
-        * Allocate and zero a tuple descriptor.
+        * Allocate and zero a tuple descriptor for a one-column tuple.
         */
        funcTupDesc = CreateTemplateTupleDesc(1);
        funcTupDesc->attrs[0] = (Form_pg_attribute) palloc(ATTRIBUTE_TUPLE_SIZE);
@@ -208,7 +208,7 @@ BuildFuncTupleDesc(Oid funcOid)
        funcTupDesc->attrs[0]->attbyval = ((Form_pg_type) GETSTRUCT(tuple))->typbyval;
        funcTupDesc->attrs[0]->attcacheoff = -1;
        funcTupDesc->attrs[0]->atttypmod = -1;
-       funcTupDesc->attrs[0]->attstorage = 'p';
+       funcTupDesc->attrs[0]->attstorage = ((Form_pg_type) GETSTRUCT(tuple))->typstorage;
        funcTupDesc->attrs[0]->attalign = ((Form_pg_type) GETSTRUCT(tuple))->typalign;
 
        ReleaseSysCache(tuple);
@@ -223,8 +223,7 @@ BuildFuncTupleDesc(Oid funcOid)
  * ----------------------------------------------------------------
  */
 static TupleDesc
-ConstructTupleDescriptor(Oid heapoid,
-                                                Relation heapRelation,
+ConstructTupleDescriptor(Relation heapRelation,
                                                 int numatts,
                                                 AttrNumber *attNums)
 {
@@ -253,25 +252,16 @@ ConstructTupleDescriptor(Oid heapoid,
        {
                AttrNumber      atnum;          /* attributeNumber[attributeOffset] */
                AttrNumber      atind;
-               char       *from;               /* used to simplify memcpy below */
-               char       *to;                 /* used to simplify memcpy below */
+               Form_pg_attribute from;
+               Form_pg_attribute to;
 
                /* ----------------
-                *       get the attribute number and make sure it's valid
+                *       get the attribute number and make sure it's valid;
+                *       determine which attribute descriptor to copy
                 * ----------------
                 */
                atnum = attNums[i];
-               if (atnum > natts)
-                       elog(ERROR, "Cannot create index: attribute %d does not exist",
-                                atnum);
 
-               indexTupDesc->attrs[i] =
-                       (Form_pg_attribute) palloc(ATTRIBUTE_TUPLE_SIZE);
-
-               /* ----------------
-                *       determine which tuple descriptor to copy
-                * ----------------
-                */
                if (!AttrNumberIsForUserDefinedAttr(atnum))
                {
                        /* ----------------
@@ -285,7 +275,7 @@ ConstructTupleDescriptor(Oid heapoid,
                                elog(ERROR, "Cannot create index on system attribute: attribute number out of range (%d)", atnum);
                        atind = (-atnum) - 1;
 
-                       from = (char *) (&sysatts[atind]);
+                       from = &sysatts[atind];
                }
                else
                {
@@ -293,9 +283,12 @@ ConstructTupleDescriptor(Oid heapoid,
                         *        here we are indexing on a normal attribute (1...n)
                         * ----------------
                         */
+                       if (atnum > natts)
+                               elog(ERROR, "Cannot create index: attribute %d does not exist",
+                                        atnum);
                        atind = AttrNumberGetAttrOffset(atnum);
 
-                       from = (char *) (heapTupDesc->attrs[atind]);
+                       from = heapTupDesc->attrs[atind];
                }
 
                /* ----------------
@@ -303,26 +296,26 @@ ConstructTupleDescriptor(Oid heapoid,
                 *       the tuple desc data...
                 * ----------------
                 */
-               to = (char *) (indexTupDesc->attrs[i]);
+               indexTupDesc->attrs[i] = to =
+                       (Form_pg_attribute) palloc(ATTRIBUTE_TUPLE_SIZE);
                memcpy(to, from, ATTRIBUTE_TUPLE_SIZE);
 
                /*
                 * Fix the stuff that should not be the same as the underlying attr
                 */
-               ((Form_pg_attribute) to)->attnum = i + 1;
+               to->attnum = i + 1;
 
-               ((Form_pg_attribute) to)->attdispersion = 0.0;
-               ((Form_pg_attribute) to)->attnotnull = false;
-               ((Form_pg_attribute) to)->atthasdef = false;
-               ((Form_pg_attribute) to)->attcacheoff = -1;
+               to->attdispersion = 0.0;
+               to->attnotnull = false;
+               to->atthasdef = false;
+               to->attcacheoff = -1;
 
-               /* ----------------
-                *        now we have to drop in the proper relation descriptor
-                *        into the copied tuple form's attrelid and we should be
-                *        all set.
-                * ----------------
+               /*
+                * We do not yet have the correct relation OID for the index,
+                * so just set it invalid for now.  InitializeAttributeOids()
+                * will fix it later.
                 */
-               ((Form_pg_attribute) to)->attrelid = heapoid;
+               to->attrelid = InvalidOid;
        }
 
        return indexTupDesc;
@@ -916,8 +909,7 @@ index_create(char *heapRelationName,
        if (OidIsValid(indexInfo->ii_FuncOid))
                indexTupDesc = BuildFuncTupleDesc(indexInfo->ii_FuncOid);
        else
-               indexTupDesc = ConstructTupleDescriptor(heapoid,
-                                                                                               heapRelation,
+               indexTupDesc = ConstructTupleDescriptor(heapRelation,
                                                                                                indexInfo->ii_NumKeyAttrs,
                                                                                                indexInfo->ii_KeyAttrNumbers);