summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-01-24 00:06:07 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-01-24 00:06:07 +0000
commit997ee51631728e79f558cf583b884b7a507a43ab (patch)
treeaa17137776c75a22a6198ab9b0dedbfa79540bf5
parentc654c69c05b30401c93199dce07f9a04f3249c57 (diff)
downloadpostgresql-997ee51631728e79f558cf583b884b7a507a43ab.tar.gz
Make functional index copy attstorage from the column data type, rather
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.
-rw-r--r--src/backend/catalog/index.c62
1 files changed, 27 insertions, 35 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 590e2a59f3..633f47bd5f 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);