Fix for regproc so proc name can be supplied if unique, if not, oid.
authorBruce Momjian
Fri, 2 Oct 1998 05:10:11 +0000 (05:10 +0000)
committerBruce Momjian
Fri, 2 Oct 1998 05:10:11 +0000 (05:10 +0000)
src/backend/catalog/indexing.c
src/backend/utils/adt/regproc.c

index b3c9db48b85bea3620667a758a5d3e36d7a87853..ef80c648b7fe5f1eaa40c53b3461a3c216f932c7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.32 1998/09/23 04:21:59 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.33 1998/10/02 05:10:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -62,9 +62,9 @@ char     *Name_pg_trigger_indices[Num_pg_trigger_indices] = {TriggerRelidIndex};
 
 
 static HeapTuple CatalogIndexFetchTuple(Relation heapRelation,
-                      Relation idesc,
-                      ScanKey skey,
-                      int16 num_keys);
+                                       Relation idesc,
+                                       ScanKey skey,
+                                       int16 num_keys);
 
 
 /*
@@ -213,6 +213,7 @@ CatalogHasIndex(char *catName, Oid catId)
    return pgRelP->relhasindex;
 }
 
+
 /*
  * CatalogIndexFetchTuple() -- Get a tuple that satisfies a scan key
  *                             from a catalog relation.
@@ -253,6 +254,7 @@ CatalogIndexFetchTuple(Relation heapRelation,
    return tuple;
 }
 
+
 /*
  * The remainder of the file is for individual index scan routines.  Each
  * index should be scanned according to how it was defined during bootstrap
@@ -288,6 +290,7 @@ AttributeNameIndexScan(Relation heapRelation,
    return tuple;
 }
 
+
 HeapTuple
 AttributeNumIndexScan(Relation heapRelation,
                      Oid relid,
@@ -317,6 +320,7 @@ AttributeNumIndexScan(Relation heapRelation,
    return tuple;
 }
 
+
 HeapTuple
 ProcedureOidIndexScan(Relation heapRelation, Oid procId)
 {
@@ -339,7 +343,6 @@ ProcedureOidIndexScan(Relation heapRelation, Oid procId)
 }
 
 
-
 HeapTuple
 ProcedureNameIndexScan(Relation heapRelation,
                       char *procName,
@@ -377,7 +380,6 @@ ProcedureNameIndexScan(Relation heapRelation,
 }
 
 
-
 HeapTuple
 ProcedureSrcIndexScan(Relation heapRelation, text *procSrc)
 {
@@ -399,6 +401,7 @@ ProcedureSrcIndexScan(Relation heapRelation, text *procSrc)
    return tuple;
 }
 
+
 HeapTuple
 TypeOidIndexScan(Relation heapRelation, Oid typeId)
 {
@@ -420,6 +423,7 @@ TypeOidIndexScan(Relation heapRelation, Oid typeId)
    return tuple;
 }
 
+
 HeapTuple
 TypeNameIndexScan(Relation heapRelation, char *typeName)
 {
@@ -441,6 +445,7 @@ TypeNameIndexScan(Relation heapRelation, char *typeName)
    return tuple;
 }
 
+
 HeapTuple
 ClassNameIndexScan(Relation heapRelation, char *relName)
 {
@@ -461,6 +466,7 @@ ClassNameIndexScan(Relation heapRelation, char *relName)
    return tuple;
 }
 
+
 HeapTuple
 ClassOidIndexScan(Relation heapRelation, Oid relId)
 {
index aeaab7eca30973dd10c56302fe5a3579b7f14901..4c58383884b5d677418a2c6b2e02d45f70c13682 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.30 1998/09/25 03:36:33 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.31 1998/10/02 05:10:11 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 #include "miscadmin.h"
 #include "access/heapam.h"
+#include "access/genam.h"
+#include "access/itup.h"
 #include "access/relscan.h"
+#include "storage/bufmgr.h"
 #include "fmgr.h"
 #include "utils/palloc.h"
 #include "utils/syscache.h"
 
 #include "catalog/catname.h"
+#include "catalog/indexing.h"
 #include "catalog/pg_proc.h"
 #include "catalog/pg_type.h"
 #include "utils/builtins.h"        /* where function declarations go */
  *****************************************************************************/
 
 /*
- *     regprocin       - converts "proname" to proid
+ *     regprocin       - converts "proname" or "proid" to proid
  *
  *     proid of NULL signifies unknown
  */
 int32
-regprocin(char *pro_name_and_oid)
+regprocin(char *pro_name_or_oid)
 {
-   HeapTuple   proctup = NULL;
-   RegProcedure result = (Oid) 0;
-
-   if (pro_name_and_oid == NULL)
-       return 0;
+   HeapTuple    proctup = NULL;
+   RegProcedure result = InvalidOid;
 
+   if (pro_name_or_oid == NULL)
+       return InvalidOid;
 
    if (!IsBootstrapProcessingMode())
    {
-
        /*
         * we need to use the oid because there can be multiple entries
         * with the same name.  We accept int4eq_1323 and 1323.
         */
-       if (strrchr(pro_name_and_oid, '_') != NULL)
+       if (pro_name_or_oid[0] >= '0' &&
+           pro_name_or_oid[0] <= '9')
        {
            proctup = SearchSysCacheTuple(PROOID,
-             ObjectIdGetDatum(atoi(strrchr(pro_name_and_oid, '_') + 1)),
+                               ObjectIdGetDatum(oidin(pro_name_or_oid)),
                                          0, 0, 0);
-
+           if (HeapTupleIsValid(proctup))
+               result = (RegProcedure) proctup->t_oid;
+           else
+               elog(ERROR, "No such procedure with oid %s", pro_name_or_oid);
        }
-       else if (atoi(pro_name_and_oid) != InvalidOid)
+       else
        {
-           proctup = SearchSysCacheTuple(PROOID,
-           /* atoi stops at the _ */
-                               ObjectIdGetDatum(atoi(pro_name_and_oid)),
-                                         0, 0, 0);
+           Relation    hdesc;
+           Relation    idesc;
+           IndexScanDesc sd;
+           ScanKeyData skey[1];
+           RetrieveIndexResult indexRes;
+           Buffer      buffer;
+           int         matches = 0;
+       
+           ScanKeyEntryInitialize(&skey[0],
+                                  (bits16) 0x0,
+                                  (AttrNumber) 1,
+                                  (RegProcedure) F_NAMEEQ,
+                                  PointerGetDatum(pro_name_or_oid));
+       
+           hdesc = heap_openr(ProcedureRelationName);
+           idesc = index_openr(ProcedureNameIndex);
+       
+           sd = index_beginscan(idesc, false, 1, skey);
+           while ((indexRes = index_getnext(sd, ForwardScanDirection)))
+           {
+               proctup = heap_fetch(hdesc, SnapshotNow,
+                                   &indexRes->heap_iptr,
+                                   &buffer);
+               pfree(indexRes);
+               if (HeapTupleIsValid(proctup))
+               {
+                   result = (RegProcedure) proctup->t_oid;
+                   ReleaseBuffer(buffer);
+
+                   if (++matches > 1)
+                       break;
+               }
+           }
+
+           index_endscan(sd);
+           pfree(sd);
+           index_close(idesc);
+
+           if (matches > 1)
+               elog(ERROR, "There is more than one %s procedure, supply oid in quotes.", pro_name_or_oid);
+           else if (matches == 0)
+               elog(ERROR, "No such procedure %s", pro_name_or_oid);
        }
-       if (HeapTupleIsValid(proctup))
-           result = (RegProcedure) proctup->t_oid;
-       else
-           elog(ERROR, "regprocin: no such procedure %s", pro_name_and_oid);
    }
    else
    {
@@ -88,7 +128,7 @@ regprocin(char *pro_name_and_oid)
                               (bits16) 0,
                               (AttrNumber) 1,
                               (RegProcedure) F_NAMEEQ,
-                              (Datum) pro_name_and_oid);
+                              (Datum) pro_name_or_oid);
 
        procscan = heap_beginscan(proc, 0, SnapshotNow, 1, &key);
        if (!HeapScanIsValid(procscan))
@@ -106,7 +146,7 @@ regprocin(char *pro_name_and_oid)
                                                 RelationGetDescr(proc),
                                                 &isnull);
            if (isnull)
-               elog(FATAL, "regprocin: null procedure %s", pro_name_and_oid);
+               elog(FATAL, "regprocin: null procedure %s", pro_name_or_oid);
        }
        else
            result = (RegProcedure) 0;
@@ -115,14 +155,11 @@ regprocin(char *pro_name_and_oid)
        heap_close(proc);
    }
 
-#ifdef EBUG
-   elog(DEBUG, "regprocin: no such procedure %s", pro_name_and_oid);
-#endif  /* defined(EBUG) */
    return (int32) result;
 }
 
 /*
- *     regprocout      - converts proid to "pro_name_and_oid"
+ *     regprocout      - converts proid to "pro_name"
  */
 char *
 regprocout(RegProcedure proid)
@@ -143,7 +180,7 @@ regprocout(RegProcedure proid)
            char       *s;
 
            s = ((Form_pg_proc) GETSTRUCT(proctup))->proname.data;
-           snprintf(result, NAMEDATALEN, "%s_%d", s, proid);
+           StrNCpy(result, s, NAMEDATALEN);
        }
        else
        {
@@ -160,8 +197,7 @@ regprocout(RegProcedure proid)
        proc = heap_openr(ProcedureRelationName);
        if (!RelationIsValid(proc))
        {
-           elog(ERROR, "regprocout: could not open %s",
-                ProcedureRelationName);
+           elog(ERROR, "regprocout: could not open %s", ProcedureRelationName);
            return 0;
        }
        ScanKeyEntryInitialize(&key,
@@ -201,9 +237,6 @@ regprocout(RegProcedure proid)
        return result;
    }
 
-#ifdef EBUG
-   elog(DEBUG, "regprocout: no such procedure %d", proid);
-#endif  /* defined(EBUG) */
    return result;
 }