fix for index problem.
authorBruce Momjian
Thu, 20 Aug 1998 22:07:46 +0000 (22:07 +0000)
committerBruce Momjian
Thu, 20 Aug 1998 22:07:46 +0000 (22:07 +0000)
src/backend/access/heap/heapam.c
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/catalog/indexing.c
src/backend/catalog/pg_type.c
src/backend/commands/vacuum.c
src/backend/executor/execUtils.c
src/backend/utils/cache/inval.c
src/bin/initdb/initdb.sh

index 139db3b5e36dcccb03d2c70650f1feab15fbd5a2..45899d15d83c4bde02bb5f7a923206410f5c7833 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.32 1998/08/19 02:01:05 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.33 1998/08/20 22:07:30 momjian Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1274,10 +1274,10 @@ heap_delete(Relation relation, ItemPointer tid)
  * ----------------
  */
 int
-heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
+heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
 {
    ItemId      lp;
-   HeapTuple   tp;
+   HeapTuple   old_tuple;
    Page        dp;
    Buffer      buffer;
    HeapTuple   tuple;
@@ -1319,8 +1319,8 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
     * ----------------
     */
 
-   tp = (HeapTuple) PageGetItem(dp, lp);
-   Assert(HeapTupleIsValid(tp));
+   old_tuple = (HeapTuple) PageGetItem(dp, lp);
+   Assert(HeapTupleIsValid(old_tuple));
 
    /* -----------------
     *  the following test should be able to catch all non-functional
@@ -1333,7 +1333,7 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
     * -----------------
     */
 
-   if (TupleUpdatedByCurXactAndCmd(tp))
+   if (TupleUpdatedByCurXactAndCmd(old_tuple))
    {
        elog(NOTICE, "Non-functional update, only first update is performed");
        if (IsSystemRelationName(RelationGetRelationName(relation)->data))
@@ -1367,19 +1367,19 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
    }
 
    /* XXX order problems if not atomic assignment ??? */
-   tup->t_oid = tp->t_oid;
-   TransactionIdStore(GetCurrentTransactionId(), &(tup->t_xmin));
-   tup->t_cmin = GetCurrentCommandId();
-   StoreInvalidTransactionId(&(tup->t_xmax));
-   tup->t_infomask &= ~(HEAP_XACT_MASK);
-   tup->t_infomask |= HEAP_XMAX_INVALID;
+   replace_tuple->t_oid = old_tuple->t_oid;
+   TransactionIdStore(GetCurrentTransactionId(), &(replace_tuple->t_xmin));
+   replace_tuple->t_cmin = GetCurrentCommandId();
+   StoreInvalidTransactionId(&(replace_tuple->t_xmax));
+   replace_tuple->t_infomask &= ~(HEAP_XACT_MASK);
+   replace_tuple->t_infomask |= HEAP_XMAX_INVALID;
 
    /* ----------------
     *  insert new item
     * ----------------
     */
-   if ((unsigned) DOUBLEALIGN(tup->t_len) <= PageGetFreeSpace((Page) dp))
-       RelationPutHeapTuple(relation, BufferGetBlockNumber(buffer), tup);
+   if ((unsigned) DOUBLEALIGN(replace_tuple->t_len) <= PageGetFreeSpace((Page) dp))
+       RelationPutHeapTuple(relation, BufferGetBlockNumber(buffer), replace_tuple);
    else
    {
        /* ----------------
@@ -1387,23 +1387,23 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
         *  for a new place to put it.
         * ----------------
         */
-       doinsert(relation, tup);
+       doinsert(relation, replace_tuple);
    }
 
    /* ----------------
     *  new item in place, now record transaction information
     * ----------------
     */
-   TransactionIdStore(GetCurrentTransactionId(), &(tp->t_xmax));
-   tp->t_cmax = GetCurrentCommandId();
-   tp->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
+   TransactionIdStore(GetCurrentTransactionId(), &(old_tuple->t_xmax));
+   old_tuple->t_cmax = GetCurrentCommandId();
+   old_tuple->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
 
    /* ----------------
     *  invalidate caches
     * ----------------
     */
    SetRefreshWhenInvalidate(ImmediateInvalidation);
-   RelationInvalidateHeapTuple(relation, tp);
+   RelationInvalidateHeapTuple(relation, old_tuple);
    SetRefreshWhenInvalidate((bool) !ImmediateInvalidation);
 
    WriteBuffer(buffer);
index 7d70b7a453d17809b5a44c3b6a500a03a2c7a7f4..84f6849357f9df88f776b8975f04581c95ce087e 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.58 1998/08/19 02:01:30 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.59 1998/08/20 22:07:32 momjian Exp $
  *
  * INTERFACE ROUTINES
  *     heap_create()           - Create an uncataloged heap relation
@@ -1051,18 +1051,20 @@ DeletePgAttributeTuples(Relation rel)
     */
    RelationSetLockForWrite(pg_attribute_desc);
 
-   attnum = FirstLowInvalidHeapAttributeNumber + 1; /* cmax */
-
-   while (HeapTupleIsValid(tup = SearchSysCacheTupleCopy(ATTNUM,
-                                   ObjectIdGetDatum(rel->rd_att->attrs[0]->attrelid),
-                                   Int16GetDatum(attnum),
-                                   0, 0)))
+   for (attnum = FirstLowInvalidHeapAttributeNumber + 1;
+           attnum <= rel->rd_att->natts;
+           attnum++)
    {
-       heap_delete(pg_attribute_desc, &tup->t_ctid);
-       pfree(tup);
-       attnum++;
+       if (HeapTupleIsValid(tup = SearchSysCacheTupleCopy(ATTNUM,
+                                       ObjectIdGetDatum(RelationGetRelid(rel)),
+                                       Int16GetDatum(attnum),
+                                       0, 0)))
+       {
+           heap_delete(pg_attribute_desc, &tup->t_ctid);
+           pfree(tup);
+       }
    }
-
+   
    /* ----------------
     * Release the write lock
     * ----------------
@@ -1104,8 +1106,10 @@ DeletePgTypeTuple(Relation rel)
     *  to this relation.
     * ----------------
     */
-   ScanKeyEntryInitialize(&key, 0, Anum_pg_type_typrelid, F_INT4EQ,
-                          rel->rd_att->attrs[0]->attrelid);
+   ScanKeyEntryInitialize(&key, 0,
+                           Anum_pg_type_typrelid,
+                           F_OIDEQ,
+                           ObjectIdGetDatum(RelationGetRelid(rel)));
 
    pg_type_scan = heap_beginscan(pg_type_desc,
                                  0,
@@ -1140,7 +1144,9 @@ DeletePgTypeTuple(Relation rel)
    pg_attribute_desc = heap_openr(AttributeRelationName);
 
    ScanKeyEntryInitialize(&attkey,
-                          0, Anum_pg_attribute_atttypid, F_INT4EQ,
+                          0,
+                          Anum_pg_attribute_atttypid,
+                          F_OIDEQ,
                           typoid);
 
    pg_attribute_scan = heap_beginscan(pg_attribute_desc,
@@ -1151,13 +1157,13 @@ DeletePgTypeTuple(Relation rel)
 
    /* ----------------
     *  try and get a pg_attribute tuple.  if we succeed it means
-    *  we cant delete the relation because something depends on
+    *  we can't delete the relation because something depends on
     *  the schema.
     * ----------------
     */
    atttup = heap_getnext(pg_attribute_scan, 0);
 
-   if (PointerIsValid(atttup))
+   if (HeapTupleIsValid(atttup))
    {
        Oid         relid = ((AttributeTupleForm) GETSTRUCT(atttup))->attrelid;
 
index 48a2cada29a306755e0148adc72fc6f42f805817..95442918f69eb14316f2225da32ac07691b18459 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.49 1998/08/20 15:16:54 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.50 1998/08/20 22:07:34 momjian Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1173,6 +1173,7 @@ index_destroy(Oid indexId)
 {
    Relation    indexRelation;
    Relation    catalogRelation;
+   Relation    attributeRelation;
    HeapTuple   tuple;
    int16       attnum;
    
@@ -1200,7 +1201,7 @@ index_destroy(Oid indexId)
     * fix ATTRIBUTE relation
     * ----------------
     */
-   catalogRelation = heap_openr(AttributeRelationName);
+   attributeRelation = heap_openr(AttributeRelationName);
 
    attnum = 1; /* indexes start at 1 */
 
@@ -1209,29 +1210,28 @@ index_destroy(Oid indexId)
                                    Int16GetDatum(attnum),
                                    0, 0)))
    {
-       heap_delete(catalogRelation, &tuple->t_ctid);
+       heap_delete(attributeRelation, &tuple->t_ctid);
        pfree(tuple);
        attnum++;
    }
-
-   heap_close(catalogRelation);
+   heap_close(attributeRelation);
 
    /* ----------------
     * fix INDEX relation
     * ----------------
     */
    tuple = SearchSysCacheTupleCopy(INDEXRELID,
-                                 ObjectIdGetDatum(indexId),
-                                 0, 0, 0);
+                                     ObjectIdGetDatum(indexId),
+                                     0, 0, 0);
 
    if (!HeapTupleIsValid(tuple))
-   {
        elog(NOTICE, "IndexRelationDestroy: %s's INDEX tuple missing",
             RelationGetRelationName(indexRelation));
-   }
-   heap_delete(catalogRelation, &tuple->t_ctid);
+
+   Assert(ItemPointerIsValid(&tuple->t_ctid));
+                    
+   heap_delete(indexRelation, &tuple->t_ctid);
    pfree(tuple);
-   heap_close(catalogRelation);
 
    /*
     * flush cache and physically remove the file
index 8b50cee327c1e384933ea71a8275ea238cdc5b60..e13200c96b2c180c186c58a1d39846f7d9813564 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.21 1998/08/20 15:16:55 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.22 1998/08/20 22:07:36 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -125,7 +125,7 @@ CatalogIndexInsert(Relation *idescs,
        InsertIndexResult indexRes;
 
        indexDescriptor = RelationGetTupleDescriptor(idescs[i]);
-       pgIndexTup = SearchSysCacheTuple(INDEXRELID,
+       pgIndexTup = SearchSysCacheTupleCopy(INDEXRELID,
                                         ObjectIdGetDatum(idescs[i]->rd_id),
                                         0, 0, 0);
        Assert(pgIndexTup);
@@ -163,6 +163,7 @@ CatalogIndexInsert(Relation *idescs,
                                &heapTuple->t_ctid, heapRelation);
        if (indexRes)
            pfree(indexRes);
+       pfree(pgIndexTup);
    }
 }
 
index a23e73893f825dc1aab9ae3fd0a2a17c85250a28..999a398db6c21d9f9ef898eaa54bd228a8301a5a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.27 1998/08/19 02:01:38 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.28 1998/08/20 22:07:37 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -384,12 +384,12 @@ TypeCreate(char *typeName,
    values[i++] = (Datum) GetUserId();  /* 2 */
    values[i++] = (Datum) internalSize; /* 3 */
    values[i++] = (Datum) externalSize; /* 4 */
-   values[i++] = (Datum) passedByValue;        /* 5 */
+   values[i++] = (Datum) passedByValue;/* 5 */
    values[i++] = (Datum) typeType;     /* 6 */
    values[i++] = (Datum) (bool) 1;     /* 7 */
    values[i++] = (Datum) typDelim;     /* 8 */
    values[i++] = (Datum) (typeType == 'c' ? relationOid : InvalidOid); /* 9 */
-   values[i++] = (Datum) elementObjectId;      /* 10 */
+   values[i++] = (Datum) elementObjectId;/* 10 */
 
    /*
     * arguments to type input and output functions must be 0
@@ -431,7 +431,7 @@ TypeCreate(char *typeName,
                func_error("TypeCreate", procname, 1, argList, NULL);
        }
 
-       values[i++] = (Datum) tup->t_oid;       /* 11 - 14 */
+       values[i++] = (Datum) tup->t_oid;   /* 11 - 14 */
    }
 
    /* ----------------
index 6448d2e830c21237e58076668f1653530d838bb6..bd92c1368eff50b28f9226b13cdf761b1e846a27 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.75 1998/08/20 15:16:57 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.76 1998/08/20 22:07:39 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2217,7 +2217,7 @@ vc_mkindesc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc)
        cachetuple = SearchSysCacheTupleCopy(INDEXRELID,
                                        ObjectIdGetDatum(RelationGetRelid(Irel[i])),
                                        0, 0, 0);
-       Assert(tuple);
+       Assert(cachetuple);
 
        /* get the buffer cache tuple */
        tuple = heap_fetch(onerel, SnapshotNow, &cachetuple->t_ctid, &buffer);
index 489fc9096a8bb822473b156f6d9dbad7a03b25d1..bbc8e2d94085f8ddf63d3b1a8aad7cfab4997da6 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.35 1998/08/19 02:02:01 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.36 1998/08/20 22:07:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -690,7 +690,7 @@ ExecGetIndexKeyInfo(IndexTupleForm indexTuple,
  *     the IndexCatalogInformation function in plancat.c
  *     because IndexCatalogInformation is poorly written.
  *
- *     It would be much better the functionality provided
+ *     It would be much better if the functionality provided
  *     by this function and IndexCatalogInformation was
  *     in the form of a small set of orthogonal routines..
  *     If you are trying to understand this, I suggest you
index 9fc911a99bcc5b935ca21babc9082379087057dd..cd327632a870ee791dd40d04aae7cd015e77a334 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.13 1998/08/19 14:51:29 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.14 1998/08/20 22:07:43 momjian Exp $
  *
  * Note - this code is real crufty...
  *
@@ -643,6 +643,7 @@ RelationInvalidateHeapTuple(Relation relation, HeapTuple tuple)
                                    RelationIdRegisterLocalInvalid);
 
    if (RefreshWhenInvalidate)
+       /* what does this do?  bjm 1998/08/20 */
        RelationInvalidateCatalogCacheTuple(relation,
                                            tuple,
                                            (void (*) ()) NULL);
index 02077511aa87b1c2271fa77f4e3292c430b43861..8a5c665b939da0b82597ac11f542ec8cddad6459 100644 (file)
@@ -26,7 +26,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.49 1998/08/20 15:16:59 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.50 1998/08/20 22:07:46 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -404,13 +404,13 @@ echo
 PGSQL_OPT="-o /dev/null -F -Q -D$PGDATA"
 
 # If the COPY is first, the VACUUM generates an error, so we vacuum first
-echo "vacuuming template1"
+echo "Vacuuming template1"
 echo "vacuum" | postgres $PGSQL_OPT template1 > /dev/null
 
 echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" | \
    postgres $PGSQL_OPT template1 > /dev/null
 
-echo "creating public pg_user view"
+echo "Creating public pg_user view"
 echo "CREATE TABLE xpg_user (      \
        usename name,       \
        usesysid    int4,       \
@@ -436,7 +436,7 @@ echo "CREATE RULE _RETpg_user AS ON SELECT TO pg_user DO INSTEAD    \
 echo "REVOKE ALL on pg_shadow FROM public" | \
    postgres $PGSQL_OPT template1 > /dev/null
 
-echo "loading pg_description"
+echo "Loading pg_description"
 echo "copy pg_description from '$TEMPLATE_DESCR'" | \
    postgres $PGSQL_OPT template1 > /dev/null
 echo "copy pg_description from '$GLOBAL_DESCR'" | \