Allow indexes on system catalogs for use in cache code.
authorBruce Momjian
Mon, 1 Nov 1999 02:29:27 +0000 (02:29 +0000)
committerBruce Momjian
Mon, 1 Nov 1999 02:29:27 +0000 (02:29 +0000)
Thanks to Hiroshi

src/backend/catalog/index.c
src/backend/catalog/indexing.c
src/backend/utils/cache/catcache.c
src/backend/utils/cache/syscache.c
src/include/catalog/indexing.h
src/include/utils/syscache.h

index 9e7850f8f637a9254a896815b7a27dcbccc1ffef..a8c2adf7cbd1c1ee866b9835c25e08f4e87b3e8e 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.92 1999/10/26 03:12:33 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.93 1999/11/01 02:29:24 momjian Exp $
  *
  *
  * INTERFACE ROUTINES
 
 /* non-export function prototypes */
 static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName,
-                  bool istemp);
+       bool istemp);
 static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
 static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
-                        List *attributeList,
-                        int numatts, AttrNumber *attNums);
+       List *attributeList, int numatts, AttrNumber *attNums);
 
 static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
 static Oid UpdateRelationRelation(Relation indexRelation, char *temp_relname);
 static void InitializeAttributeOids(Relation indexRelation,
-                       int numatts,
-                       Oid indexoid);
-static void
-           AppendAttributeTuples(Relation indexRelation, int numatts);
+       int numatts, Oid indexoid);
+static void AppendAttributeTuples(Relation indexRelation, int numatts);
 static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
-                   FuncIndexInfo *funcInfo, int natts,
-                   AttrNumber *attNums, Oid *classOids, Node *predicate,
-          List *attributeList, bool islossy, bool unique, bool primary);
+       FuncIndexInfo *funcInfo, int natts,
+       AttrNumber *attNums, Oid *classOids, Node *predicate,
+       List *attributeList, bool islossy, bool unique, bool primary);
 static void DefaultBuild(Relation heapRelation, Relation indexRelation,
-            int numberOfAttributes, AttrNumber *attributeNumber,
-            IndexStrategy indexStrategy, uint16 parameterCount,
+       int numberOfAttributes, AttrNumber *attributeNumber,
+       IndexStrategy indexStrategy, uint16 parameterCount,
        Datum *parameter, FuncIndexInfoPtr funcInfo, PredInfo *predInfo);
 
 /* ----------------------------------------------------------------
@@ -661,6 +658,7 @@ UpdateIndexRelation(Oid indexoid,
    Relation    pg_index;
    HeapTuple   tuple;
    int         i;
+   Relation    idescs[Num_pg_index_indices];
 
    /* ----------------
     *  allocate an Form_pg_index big enough to hold the
@@ -752,6 +750,16 @@ UpdateIndexRelation(Oid indexoid,
     */
    heap_insert(pg_index, tuple);
 
+   /* ----------------
+    *  insert the index tuple into the pg_index
+    * ----------------
+    */
+   if (!IsBootstrapProcessingMode())
+   {
+       CatalogOpenIndices(Num_pg_index_indices, Name_pg_index_indices, idescs);
+       CatalogIndexInsert(idescs, Num_pg_index_indices, pg_index, tuple);
+       CatalogCloseIndices(Num_pg_index_indices, idescs);
+   }
    /* ----------------
     *  close the relation and free the tuple
     * ----------------
index 2caffcbcf5cac67af4bed656c1511e97bcb39c1e..c8d1bf05535501e3d0cb44cc42f9b5cd49f70606 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.48 1999/10/15 01:49:39 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.49 1999/11/01 02:29:25 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
  *     pg_trigger
  */
 
+char      *Name_pg_amop_indices[Num_pg_amop_indices] = {AccessMethodOpidIndex,
+           AccessMethodStrategyIndex};
 char      *Name_pg_attr_indices[Num_pg_attr_indices] = {AttributeNameIndex,
-   AttributeNumIndex,
-AttributeRelidIndex};
+           AttributeNumIndex, AttributeRelidIndex};
+char      *Name_pg_index_indices[Num_pg_index_indices] = {IndexRelidIndex};
 char      *Name_pg_proc_indices[Num_pg_proc_indices] = {ProcedureNameIndex,
-   ProcedureOidIndex};
+           ProcedureOidIndex};
 char      *Name_pg_type_indices[Num_pg_type_indices] = {TypeNameIndex,
-TypeOidIndex};
+           TypeOidIndex};
 char      *Name_pg_class_indices[Num_pg_class_indices] = {ClassNameIndex,
-ClassOidIndex};
+           ClassOidIndex};
 char      *Name_pg_attrdef_indices[Num_pg_attrdef_indices] = {AttrDefaultIndex};
 
 char      *Name_pg_relcheck_indices[Num_pg_relcheck_indices] = {RelCheckIndex};
@@ -255,12 +257,89 @@ CatalogIndexFetchTuple(Relation heapRelation,
 }
 
 
+/*---------------------------------------------------------------------
+ *                       Class-specific index lookups
+ *---------------------------------------------------------------------
+ */
+
 /*
  * The remainder of the file is for individual index scan routines.  Each
  * index should be scanned according to how it was defined during bootstrap
  * (that is, functional or normal) and what arguments the cache lookup
  * requires.  Each routine returns the heap tuple that qualifies.
  */
+HeapTuple
+AccessMethodOpidIndexScan(Relation heapRelation,
+                         Oid claid,
+                         Oid opopr,
+                         Oid opid)
+{
+   Relation    idesc;
+   ScanKeyData skey[3];
+   HeapTuple   tuple;
+
+   ScanKeyEntryInitialize(&skey[0],
+                          (bits16) 0x0,
+                          (AttrNumber) 1,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(claid));
+
+   ScanKeyEntryInitialize(&skey[1],
+                          (bits16) 0x0,
+                          (AttrNumber) 2,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(opopr));
+
+   ScanKeyEntryInitialize(&skey[2],
+                          (bits16) 0x0,
+                          (AttrNumber) 3,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(opid));
+
+   idesc = index_openr(AccessMethodOpidIndex);
+   tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 3);
+
+   index_close(idesc);
+
+   return tuple;
+}
+
+HeapTuple
+AccessMethodStrategyIndexScan(Relation heapRelation,
+                             Oid opid,
+                             Oid claid,
+                             int2 opstrategy)
+{
+   Relation    idesc;
+   ScanKeyData skey[3];
+   HeapTuple   tuple;
+
+   ScanKeyEntryInitialize(&skey[0],
+                          (bits16) 0x0,
+                          (AttrNumber) 1,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(opid));
+
+   ScanKeyEntryInitialize(&skey[1],
+                          (bits16) 0x0,
+                          (AttrNumber) 2,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(claid));
+
+   ScanKeyEntryInitialize(&skey[2],
+                          (bits16) 0x0,
+                          (AttrNumber) 3,
+                          (RegProcedure) F_INT2EQ,
+                          Int16GetDatum(opstrategy));
+
+   idesc = index_openr(AccessMethodStrategyIndex);
+   tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 3);
+
+   index_close(idesc);
+
+   return tuple;
+}
 HeapTuple
 AttributeNameIndexScan(Relation heapRelation,
                       Oid relid,
@@ -320,6 +399,28 @@ AttributeNumIndexScan(Relation heapRelation,
    return tuple;
 }
 
+HeapTuple
+IndexRelidIndexScan(Relation heapRelation, Oid relid)
+{
+   Relation    idesc;
+   ScanKeyData skey[1];
+   HeapTuple   tuple;
+
+   ScanKeyEntryInitialize(&skey[0],
+                          (bits16) 0x0,
+                          (AttrNumber) 1,
+                          (RegProcedure) F_OIDEQ,
+                          ObjectIdGetDatum(relid));
+
+   idesc = index_openr(IndexRelidIndex);
+   tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 1);
+
+   index_close(idesc);
+
+   return tuple;
+}
+
+
 
 HeapTuple
 ProcedureOidIndexScan(Relation heapRelation, Oid procId)
index 22d933bb37a3f4886e4875714ec453c3d7d38223..d3c022c2479b5aa2bbad1c24674cd83517010a91 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.49 1999/09/18 19:07:55 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.50 1999/11/01 02:29:25 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "access/heapam.h"
 #include "access/valid.h"
 #include "catalog/pg_type.h"
+#include "catalog/catname.h"
+#include "catalog/indexing.h"
 #include "miscadmin.h"
 #include "utils/builtins.h"
 #include "utils/catcache.h"
+#include "utils/syscache.h"
 
 static void CatCacheRemoveCTup(CatCache *cache, Dlelem *e);
 static Index CatalogCacheComputeHashIndex(struct catcache * cacheInP);
@@ -805,6 +808,62 @@ InitSysCache(char *relname,
 }
 
 
+/* --------------------------------
+ *     SearchSelfReferences
+ *
+ *     This call searches a self referencing information,
+ *
+ *     which causes a cycle in system catalog cache
+ *
+ *     cache should already be initailized
+ * --------------------------------
+ */
+static HeapTuple
+SearchSelfReferences(const struct catcache * cache)
+{
+   HeapTuple       ntp;
+   Relation        rel;
+   static Oid      indexSelfOid = 0;
+   static HeapTuple    indexSelfTuple = 0;
+
+   if (cache->id != INDEXRELID)
+       return (HeapTuple)0;
+
+   if (!indexSelfOid)
+   {
+       rel = heap_openr(RelationRelationName, AccessShareLock);
+       ntp = ClassNameIndexScan(rel, IndexRelidIndex);
+       if (!HeapTupleIsValid(ntp))
+           elog(ERROR, "SearchSelfRefernces: %s not found in %s",
+               IndexRelidIndex, RelationRelationName);
+       indexSelfOid = ntp->t_data->t_oid;
+       pfree(ntp);
+       heap_close(rel, AccessShareLock);
+   }
+   if ((Oid)cache->cc_skey[0].sk_argument != indexSelfOid)
+       return (HeapTuple)0;
+   if (!indexSelfTuple)
+   {
+       HeapScanDesc    sd;
+       MemoryContext   oldcxt;
+
+       if (!CacheCxt)
+           CacheCxt = CreateGlobalMemory("Cache");
+       rel = heap_open(cache->relationId, AccessShareLock);
+       sd = heap_beginscan(rel, false, SnapshotNow, 1, cache->cc_skey);
+       ntp = heap_getnext(sd, 0);
+       if (!HeapTupleIsValid(ntp))
+           elog(ERROR, "SearchSelfRefernces: tuple not found");
+       oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
+       indexSelfTuple = heap_copytuple(ntp);
+       MemoryContextSwitchTo(oldcxt);
+       heap_endscan(sd);
+       heap_close(rel, AccessShareLock);
+   }
+
+   return indexSelfTuple;
+}
+
 /* --------------------------------
  *     SearchSysCache
  *
@@ -845,6 +904,14 @@ SearchSysCache(struct catcache * cache,
    cache->cc_skey[2].sk_argument = v3;
    cache->cc_skey[3].sk_argument = v4;
 
+   /*
+    *  resolve self referencing informtion
+    */
+   if (ntp = SearchSelfReferences(cache), ntp)
+   {
+           return heap_copytuple(ntp);
+   }
+
    /* ----------------
     *  find the hash bucket in which to look for the tuple
     * ----------------
index 53917f92c56f0dd9ef721e13a72dfa197aabaa44..3cb393b802f8ae673eb7317c88525f16ebecece3 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.37 1999/09/30 10:31:43 wieck Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.38 1999/11/01 02:29:25 momjian Exp $
  *
  * NOTES
  *   These routines allow the parser/planner/executor to perform
@@ -59,8 +59,8 @@ static struct cachedesc cacheinfo[] = {
            0
        },
        sizeof(FormData_pg_amop),
-       NULL,
-   (ScanFunc) NULL},
+       AccessMethodOpidIndex,
+   (ScanFunc) AccessMethodOpidIndexScan},
    {AccessMethodOperatorRelationName,  /* AMOPSTRATEGY */
        3,
        {
@@ -70,8 +70,8 @@ static struct cachedesc cacheinfo[] = {
            0
        },
        sizeof(FormData_pg_amop),
-       NULL,
-   (ScanFunc) NULL},
+       AccessMethodStrategyIndex,
+   (ScanFunc) AccessMethodStrategyIndexScan},
    {AttributeRelationName,     /* ATTNAME */
        2,
        {
@@ -103,8 +103,8 @@ static struct cachedesc cacheinfo[] = {
            0
        },
        offsetof(FormData_pg_index, indpred),
-       NULL,
-   NULL},
+       IndexRelidIndex,
+   (ScanFunc) IndexRelidIndexScan},
    {LanguageRelationName,      /* LANNAME */
        1,
        {
@@ -226,17 +226,6 @@ static struct cachedesc cacheinfo[] = {
        sizeof(FormData_pg_opclass),
        NULL,
    NULL},
-   {IndexRelationName,         /* INDRELIDKEY *//* never used */
-       2,
-       {
-           Anum_pg_index_indrelid,
-           Anum_pg_index_indkey,
-           0,
-           0
-       },
-       offsetof(FormData_pg_index, indpred),
-       NULL,
-   (ScanFunc) NULL},
    {InheritsRelationName,      /* INHRELID */
        2,
        {
index 7ff749f889a06d2891bdb6050ef075f260714bc0..6d093728c42768bbf0a3036c223f0ac84d1ea913 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: indexing.h,v 1.25 1999/09/30 10:31:44 wieck Exp $
+ * $Id: indexing.h,v 1.26 1999/11/01 02:29:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,7 +19,9 @@
 /*
  * Some definitions for indices on pg_attribute
  */
+#define Num_pg_amop_indices        2
 #define Num_pg_attr_indices        3
+#define Num_pg_index_indices       1
 #define Num_pg_proc_indices        2
 #define Num_pg_type_indices        2
 #define Num_pg_class_indices   2
 /*
  * Names of indices on system catalogs
  */
+#define AccessMethodOpidIndex      "pg_amop_opid_index"
+#define AccessMethodStrategyIndex  "pg_amop_strategy_index"
 #define AttributeNameIndex     "pg_attribute_relid_attnam_index"
 #define AttributeNumIndex      "pg_attribute_relid_attnum_index"
+#define IndexRelidIndex            "pg_index_indexrelid_index"
 #define AttributeRelidIndex        "pg_attribute_attrelid_index"
 #define ProcedureOidIndex      "pg_proc_oid_index"
 #define ProcedureNameIndex     "pg_proc_proname_narg_type_index"
@@ -48,7 +53,9 @@
 #define TriggerConstrRelidIndex    "pg_trigger_tgconstrrelid_index"
 #define DescriptionObjIndex        "pg_description_objoid_index"
 
+extern char *Name_pg_amop_indices[];
 extern char *Name_pg_attr_indices[];
+extern char *Name_pg_index_indices[];
 extern char *Name_pg_proc_indices[];
 extern char *Name_pg_type_indices[];
 extern char *Name_pg_class_indices[];
@@ -57,6 +64,7 @@ extern char *Name_pg_relcheck_indices[];
 extern char *Name_pg_trigger_indices[];
 extern char *Name_pg_description_indices[];
 
+
 extern char *IndexedCatalogNames[];
 
 /*
@@ -72,13 +80,17 @@ extern void CatalogIndexInsert(Relation *idescs,
                   HeapTuple heapTuple);
 extern bool CatalogHasIndex(char *catName, Oid catId);
 
+extern HeapTuple AccessMethodOpidIndexScan(Relation heapRelation,
+               Oid claid, Oid opopr, Oid opid);
+extern HeapTuple AccessMethodStrategyIndexScan(Relation heapRelation,
+               Oid opid, Oid claid, int2 opstrategy);
 extern HeapTuple AttributeNameIndexScan(Relation heapRelation,
                       Oid relid,
                       char *attname);
-
 extern HeapTuple AttributeNumIndexScan(Relation heapRelation,
                      Oid relid,
                      AttrNumber attnum);
+extern HeapTuple IndexRelidIndexScan(Relation heapRelation, Oid relid);
 extern HeapTuple ProcedureOidIndexScan(Relation heapRelation, Oid procId);
 extern HeapTuple ProcedureNameIndexScan(Relation heapRelation,
                       char *procName, int2 nargs, Oid *argTypes);
@@ -88,6 +100,8 @@ extern HeapTuple ClassNameIndexScan(Relation heapRelation, char *relName);
 extern HeapTuple ClassOidIndexScan(Relation heapRelation, Oid relId);
 
 
+
+
 /*
  * What follows are lines processed by genbki.sh to create the statements
  * the bootstrap parser will turn into DefineIndex commands.
@@ -95,10 +109,15 @@ extern HeapTuple ClassOidIndexScan(Relation heapRelation, Oid relId);
  * The keyword is DECLARE_INDEX every thing after that is just like in a
  * normal specification of the 'define index' POSTQUEL command.
  */
+DECLARE_INDEX(pg_amop_opid_index on pg_amop using btree(amopclaid oid_ops, amopopr oid_ops, amopid oid_ops));
+DECLARE_INDEX(pg_amop_strategy_index on pg_amop using btree(amopid oid_ops, amopclaid oid_ops, amopstrategy int2_ops));
+
 DECLARE_INDEX(pg_attribute_relid_attnam_index on pg_attribute using btree(attrelid oid_ops, attname name_ops));
 DECLARE_INDEX(pg_attribute_relid_attnum_index on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
 DECLARE_INDEX(pg_attribute_attrelid_index on pg_attribute using btree(attrelid oid_ops));
 
+DECLARE_INDEX(pg_index_indexrelid_index on pg_index using btree(indexrelid oid_ops));
+
 DECLARE_INDEX(pg_proc_oid_index on pg_proc using btree(oid oid_ops));
 DECLARE_INDEX(pg_proc_proname_narg_type_index on pg_proc using btree(proname name_ops, pronargs int2_ops, proargtypes oid8_ops));
 
index 5ba3b16e9a7ffec2dfcc975eb8ab799f43cef20c..68cb079c4f1f3217c949d410ac90f89b6ad33692 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: syscache.h,v 1.19 1999/09/30 10:31:47 wieck Exp $
+ * $Id: syscache.h,v 1.20 1999/11/01 02:29:27 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #define TYPOID         13
 #define AMNAME         14
 #define CLANAME            15
-#define INDRELIDKEY        16
-#define INHRELID       17
-#define RULOID         18
-#define AGGNAME            19
-#define LISTENREL      20
-#define USENAME            21
-#define USESYSID       22
-#define GRONAME            23
-#define GROSYSID       24
-#define REWRITENAME        25
-#define CLADEFTYPE     26
-#define LANOID         27
+/* #define INDRELIDKEY     16 */
+#define INHRELID       16
+#define RULOID         17
+#define AGGNAME            18
+#define LISTENREL      19
+#define USENAME            20
+#define USESYSID       21
+#define GRONAME            22
+#define GROSYSID       23
+#define REWRITENAME        24
+#define CLADEFTYPE     25
+#define LANOID         26
 
 /* ----------------
  *     struct cachedesc:       information needed for a call to InitSysCache()