diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 590e2a59f33037584e64cff70fce3d55a8b8c494..633f47bd5fc202bd725d55e17d32a3a1b942638b 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -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);