7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.30 1998/09/25 03:36:33 momjian Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.31 1998/10/02 05:10:11 momjian Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
14
14
#include <string.h>
15
15
#include "postgres.h"
16
16
#include "miscadmin.h"
17
17
#include "access/heapam.h"
18
+ #include "access/genam.h"
19
+ #include "access/itup.h"
18
20
#include "access/relscan.h"
21
+ #include "storage/bufmgr.h"
19
22
#include "fmgr.h"
20
23
#include "utils/palloc.h"
21
24
#include "utils/syscache.h"
22
25
23
26
#include "catalog/catname.h"
27
+ #include "catalog/indexing.h"
24
28
#include "catalog/pg_proc.h"
25
29
#include "catalog/pg_type.h"
26
30
#include "utils/builtins.h" /* where function declarations go */
30
34
*****************************************************************************/
31
35
32
36
/*
33
- * regprocin - converts "proname" to proid
37
+ * regprocin - converts "proname" or "proid" to proid
34
38
*
35
39
* proid of NULL signifies unknown
36
40
*/
37
41
int32
38
- regprocin (char * pro_name_and_oid )
42
+ regprocin (char * pro_name_or_oid )
39
43
{
40
- HeapTuple proctup = NULL ;
41
- RegProcedure result = (Oid ) 0 ;
42
-
43
- if (pro_name_and_oid == NULL )
44
- return 0 ;
44
+ HeapTuple proctup = NULL ;
45
+ RegProcedure result = InvalidOid ;
45
46
47
+ if (pro_name_or_oid == NULL )
48
+ return InvalidOid ;
46
49
47
50
if (!IsBootstrapProcessingMode ())
48
51
{
49
-
50
52
/*
51
53
* we need to use the oid because there can be multiple entries
52
54
* with the same name. We accept int4eq_1323 and 1323.
53
55
*/
54
- if (strrchr (pro_name_and_oid , '_' ) != NULL )
56
+ if (pro_name_or_oid [0 ] >= '0' &&
57
+ pro_name_or_oid [0 ] <= '9' )
55
58
{
56
59
proctup = SearchSysCacheTuple (PROOID ,
57
- ObjectIdGetDatum (atoi ( strrchr ( pro_name_and_oid , '_' ) + 1 )),
60
+ ObjectIdGetDatum (oidin ( pro_name_or_oid )),
58
61
0 , 0 , 0 );
59
-
62
+ if (HeapTupleIsValid (proctup ))
63
+ result = (RegProcedure ) proctup -> t_oid ;
64
+ else
65
+ elog (ERROR , "No such procedure with oid %s" , pro_name_or_oid );
60
66
}
61
- else if ( atoi ( pro_name_and_oid ) != InvalidOid )
67
+ else
62
68
{
63
- proctup = SearchSysCacheTuple (PROOID ,
64
- /* atoi stops at the _ */
65
- ObjectIdGetDatum (atoi (pro_name_and_oid )),
66
- 0 , 0 , 0 );
69
+ Relation hdesc ;
70
+ Relation idesc ;
71
+ IndexScanDesc sd ;
72
+ ScanKeyData skey [1 ];
73
+ RetrieveIndexResult indexRes ;
74
+ Buffer buffer ;
75
+ int matches = 0 ;
76
+
77
+ ScanKeyEntryInitialize (& skey [0 ],
78
+ (bits16 ) 0x0 ,
79
+ (AttrNumber ) 1 ,
80
+ (RegProcedure ) F_NAMEEQ ,
81
+ PointerGetDatum (pro_name_or_oid ));
82
+
83
+ hdesc = heap_openr (ProcedureRelationName );
84
+ idesc = index_openr (ProcedureNameIndex );
85
+
86
+ sd = index_beginscan (idesc , false, 1 , skey );
87
+ while ((indexRes = index_getnext (sd , ForwardScanDirection )))
88
+ {
89
+ proctup = heap_fetch (hdesc , SnapshotNow ,
90
+ & indexRes -> heap_iptr ,
91
+ & buffer );
92
+ pfree (indexRes );
93
+ if (HeapTupleIsValid (proctup ))
94
+ {
95
+ result = (RegProcedure ) proctup -> t_oid ;
96
+ ReleaseBuffer (buffer );
97
+
98
+ if (++ matches > 1 )
99
+ break ;
100
+ }
101
+ }
102
+
103
+ index_endscan (sd );
104
+ pfree (sd );
105
+ index_close (idesc );
106
+
107
+ if (matches > 1 )
108
+ elog (ERROR , "There is more than one %s procedure, supply oid in quotes." , pro_name_or_oid );
109
+ else if (matches == 0 )
110
+ elog (ERROR , "No such procedure %s" , pro_name_or_oid );
67
111
}
68
- if (HeapTupleIsValid (proctup ))
69
- result = (RegProcedure ) proctup -> t_oid ;
70
- else
71
- elog (ERROR , "regprocin: no such procedure %s" , pro_name_and_oid );
72
112
}
73
113
else
74
114
{
@@ -88,7 +128,7 @@ regprocin(char *pro_name_and_oid)
88
128
(bits16 ) 0 ,
89
129
(AttrNumber ) 1 ,
90
130
(RegProcedure ) F_NAMEEQ ,
91
- (Datum ) pro_name_and_oid );
131
+ (Datum ) pro_name_or_oid );
92
132
93
133
procscan = heap_beginscan (proc , 0 , SnapshotNow , 1 , & key );
94
134
if (!HeapScanIsValid (procscan ))
@@ -106,7 +146,7 @@ regprocin(char *pro_name_and_oid)
106
146
RelationGetDescr (proc ),
107
147
& isnull );
108
148
if (isnull )
109
- elog (FATAL , "regprocin: null procedure %s" , pro_name_and_oid );
149
+ elog (FATAL , "regprocin: null procedure %s" , pro_name_or_oid );
110
150
}
111
151
else
112
152
result = (RegProcedure ) 0 ;
@@ -115,14 +155,11 @@ regprocin(char *pro_name_and_oid)
115
155
heap_close (proc );
116
156
}
117
157
118
- #ifdef EBUG
119
- elog (DEBUG , "regprocin: no such procedure %s" , pro_name_and_oid );
120
- #endif /* defined(EBUG) */
121
158
return (int32 ) result ;
122
159
}
123
160
124
161
/*
125
- * regprocout - converts proid to "pro_name_and_oid "
162
+ * regprocout - converts proid to "pro_name "
126
163
*/
127
164
char *
128
165
regprocout (RegProcedure proid )
@@ -143,7 +180,7 @@ regprocout(RegProcedure proid)
143
180
char * s ;
144
181
145
182
s = ((Form_pg_proc ) GETSTRUCT (proctup ))-> proname .data ;
146
- snprintf (result , NAMEDATALEN , "%s_%d" , s , proid );
183
+ StrNCpy (result , s , NAMEDATALEN );
147
184
}
148
185
else
149
186
{
@@ -160,8 +197,7 @@ regprocout(RegProcedure proid)
160
197
proc = heap_openr (ProcedureRelationName );
161
198
if (!RelationIsValid (proc ))
162
199
{
163
- elog (ERROR , "regprocout: could not open %s" ,
164
- ProcedureRelationName );
200
+ elog (ERROR , "regprocout: could not open %s" , ProcedureRelationName );
165
201
return 0 ;
166
202
}
167
203
ScanKeyEntryInitialize (& key ,
@@ -201,9 +237,6 @@ regprocout(RegProcedure proid)
201
237
return result ;
202
238
}
203
239
204
- #ifdef EBUG
205
- elog (DEBUG , "regprocout: no such procedure %d" , proid );
206
- #endif /* defined(EBUG) */
207
240
return result ;
208
241
}
209
242
0 commit comments