Fix for indexing problem (?): heap tuple was pfree-d before CatalogIndexInsert()...
authorVadim B. Mikheev
Wed, 9 Sep 1998 03:42:52 +0000 (03:42 +0000)
committerVadim B. Mikheev
Wed, 9 Sep 1998 03:42:52 +0000 (03:42 +0000)
src/backend/catalog/index.c

index e56deb906647eee4155da688e147d9859f9a5ed9..fbf9f3017246d58388e27572b357bb279cc2d062 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.61 1998/09/07 05:35:37 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.62 1998/09/09 03:42:52 vadim Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -64,7 +64,8 @@
 #define NTUPLES_PER_PAGE(natts) (BLCKSZ/((natts)*AVG_TUPLE_SIZE))
 
 /* non-export function prototypes */
-static Oid RelationNameGetObjectId(char *relationName, Relation pg_class);
+static Oid
+           RelationNameGetObjectId(char *relationName, Relation pg_class);
 static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName);
 static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
 static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
@@ -72,11 +73,12 @@ static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
                         int numatts, AttrNumber *attNums);
 
 static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
-static Oid UpdateRelationRelation(Relation indexRelation);
+static Oid UpdateRelationRelation(Relation indexRelation);
 static void InitializeAttributeOids(Relation indexRelation,
                        int numatts,
                        Oid indexoid);
-static void AppendAttributeTuples(Relation indexRelation, int numatts);
+static void
+           AppendAttributeTuples(Relation indexRelation, int numatts);
 static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
                    FuncIndexInfo *funcInfo, int natts,
                    AttrNumber *attNums, Oid *classOids, Node *predicate,
@@ -550,9 +552,11 @@ UpdateRelationRelation(Relation indexRelation)
                           sizeof(*indexRelation->rd_rel),
                           (char *) indexRelation->rd_rel);
 
-   /*
-    *  The new tuple must have the same oid as the heap_create() we just
-    *  did.
+   /* ----------------
+    *  the new tuple must have the same oid as the relcache entry for the
+    *  index.  sure would be embarassing to do this sort of thing in polite
+    *  company.
+    * ----------------
     */
    tuple->t_oid = RelationGetRelid(indexRelation);
    heap_insert(pg_class, tuple);
@@ -1074,7 +1078,7 @@ index_create(char *heapRelationName,
 
    /* ----------------
     *    add index to catalogs
-    *    (INSERT pg_class tuple)
+    *    (append RELATION tuple)
     * ----------------
     */
    indexoid = UpdateRelationRelation(indexRelation);
@@ -1260,7 +1264,8 @@ FormIndexDatum(int numberOfAttributes,
               char *nullv,
               FuncIndexInfoPtr fInfo)
 {
-   AttrNumber  attOff;
+   AttrNumber  i;
+   int         offset;
    bool        isNull;
 
    /* ----------------
@@ -1270,16 +1275,18 @@ FormIndexDatum(int numberOfAttributes,
     * ----------------
     */
 
-   for (attOff = 0; attOff < numberOfAttributes; attOff++)
+   for (i = 1; i <= numberOfAttributes; i++)
    {
-       datum[attOff] = PointerGetDatum(GetIndexValue(heapTuple,
+       offset = AttrNumberGetAttrOffset(i);
+
+       datum[offset] = PointerGetDatum(GetIndexValue(heapTuple,
                                                      heapDescriptor,
-                                                     attOff,
+                                                     offset,
                                                      attributeNumber,
                                                      fInfo,
                                                      &isNull));
 
-       nullv[attOff] = (isNull) ? 'n' : ' ';
+       nullv[offset] = (isNull) ? 'n' : ' ';
    }
 }
 
@@ -1417,10 +1424,10 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
 
        newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
        heap_replace(pg_class, &tuple->t_ctid, newtup);
-       pfree(newtup);
        CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
        CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
        CatalogCloseIndices(Num_pg_class_indices, idescs);
+       pfree(newtup);
    }
 
    if (!IsBootstrapProcessingMode())