]> granicus.if.org Git - postgresql/commitdiff
Allow indexes on system catalogs for use in cache code.
authorBruce Momjian <bruce@momjian.us>
Mon, 1 Nov 1999 02:29:27 +0000 (02:29 +0000)
committerBruce Momjian <bruce@momjian.us>
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()