8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.51 2001/03/22 03:59:59 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.52 2001/05/19 09:28:08 petere Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -57,8 +57,8 @@ typedef struct
57
57
} Oldstyle_fnextra ;
58
58
59
59
60
- static void fmgr_info_C_lang (FmgrInfo * finfo , HeapTuple procedureTuple );
61
- static void fmgr_info_other_lang (FmgrInfo * finfo , HeapTuple procedureTuple );
60
+ static void fmgr_info_C_lang (Oid functionId , FmgrInfo * finfo , HeapTuple procedureTuple );
61
+ static void fmgr_info_other_lang (Oid functionId , FmgrInfo * finfo , HeapTuple procedureTuple );
62
62
static Datum fmgr_oldstyle (PG_FUNCTION_ARGS );
63
63
static Datum fmgr_untrusted (PG_FUNCTION_ARGS );
64
64
@@ -123,7 +123,11 @@ fmgr_info(Oid functionId, FmgrInfo *finfo)
123
123
Form_pg_proc procedureStruct ;
124
124
char * prosrc ;
125
125
126
- finfo -> fn_oid = functionId ;
126
+ /*
127
+ * fn_oid *must* be filled in last. Code may assume that is fn_oid is valid,
128
+ * the whole struct is valid. Some FmgrInfo struct's do survive elogs.
129
+ */
130
+ finfo -> fn_oid = InvalidOid ;
127
131
finfo -> fn_extra = NULL ;
128
132
finfo -> fn_mcxt = CurrentMemoryContext ;
129
133
@@ -138,6 +142,7 @@ fmgr_info(Oid functionId, FmgrInfo *finfo)
138
142
finfo -> fn_strict = fbp -> strict ;
139
143
finfo -> fn_retset = fbp -> retset ;
140
144
finfo -> fn_addr = fbp -> func ;
145
+ finfo -> fn_oid = functionId ;
141
146
return ;
142
147
}
143
148
@@ -158,6 +163,7 @@ fmgr_info(Oid functionId, FmgrInfo *finfo)
158
163
{
159
164
/* This isn't really supported anymore... */
160
165
finfo -> fn_addr = fmgr_untrusted ;
166
+ finfo -> fn_oid = functionId ;
161
167
ReleaseSysCache (procedureTuple );
162
168
return ;
163
169
}
@@ -187,26 +193,28 @@ fmgr_info(Oid functionId, FmgrInfo *finfo)
187
193
break ;
188
194
189
195
case ClanguageId :
190
- fmgr_info_C_lang (finfo , procedureTuple );
196
+ fmgr_info_C_lang (functionId , finfo , procedureTuple );
191
197
break ;
192
198
193
199
case SQLlanguageId :
194
200
finfo -> fn_addr = fmgr_sql ;
195
201
break ;
196
202
197
203
default :
198
- fmgr_info_other_lang (finfo , procedureTuple );
204
+ fmgr_info_other_lang (functionId , finfo , procedureTuple );
199
205
break ;
200
206
}
201
207
208
+ finfo -> fn_oid = functionId ;
202
209
ReleaseSysCache (procedureTuple );
203
210
}
204
211
205
212
/*
206
- * Special fmgr_info processing for C-language functions
213
+ * Special fmgr_info processing for C-language functions. Note that
214
+ * finfo->fn_oid is not valid yet.
207
215
*/
208
216
static void
209
- fmgr_info_C_lang (FmgrInfo * finfo , HeapTuple procedureTuple )
217
+ fmgr_info_C_lang (Oid functionId , FmgrInfo * finfo , HeapTuple procedureTuple )
210
218
{
211
219
Form_pg_proc procedureStruct = (Form_pg_proc ) GETSTRUCT (procedureTuple );
212
220
Datum prosrcattr ,
@@ -224,14 +232,14 @@ fmgr_info_C_lang(FmgrInfo *finfo, HeapTuple procedureTuple)
224
232
Anum_pg_proc_prosrc , & isnull );
225
233
if (isnull )
226
234
elog (ERROR , "fmgr: Could not extract prosrc for %u from pg_proc" ,
227
- finfo -> fn_oid );
235
+ functionId );
228
236
prosrcstring = DatumGetCString (DirectFunctionCall1 (textout , prosrcattr ));
229
237
230
238
probinattr = SysCacheGetAttr (PROCOID , procedureTuple ,
231
239
Anum_pg_proc_probin , & isnull );
232
240
if (isnull )
233
241
elog (ERROR , "fmgr: Could not extract probin for %u from pg_proc" ,
234
- finfo -> fn_oid );
242
+ functionId );
235
243
probinstring = DatumGetCString (DirectFunctionCall1 (textout , probinattr ));
236
244
237
245
/* Look up the function itself */
@@ -276,10 +284,11 @@ fmgr_info_C_lang(FmgrInfo *finfo, HeapTuple procedureTuple)
276
284
}
277
285
278
286
/*
279
- * Special fmgr_info processing for other-language functions
287
+ * Special fmgr_info processing for other-language functions. Note
288
+ * that finfo->fn_oid is not valid yet.
280
289
*/
281
290
static void
282
- fmgr_info_other_lang (FmgrInfo * finfo , HeapTuple procedureTuple )
291
+ fmgr_info_other_lang (Oid functionId , FmgrInfo * finfo , HeapTuple procedureTuple )
283
292
{
284
293
Form_pg_proc procedureStruct = (Form_pg_proc ) GETSTRUCT (procedureTuple );
285
294
Oid language = procedureStruct -> prolang ;
@@ -312,7 +321,7 @@ fmgr_info_other_lang(FmgrInfo *finfo, HeapTuple procedureTuple)
312
321
else
313
322
{
314
323
elog (ERROR , "fmgr_info: function %u: unsupported language %u" ,
315
- finfo -> fn_oid , language );
324
+ functionId , language );
316
325
}
317
326
ReleaseSysCache (languageTuple );
318
327
}
0 commit comments