summaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/Gen_fmgrtab.sh.in8
-rw-r--r--src/backend/utils/cache/syscache.c21
-rw-r--r--src/backend/utils/fmgr/fmgr.c107
3 files changed, 116 insertions, 20 deletions
diff --git a/src/backend/utils/Gen_fmgrtab.sh.in b/src/backend/utils/Gen_fmgrtab.sh.in
index 1d7c8d2356..409372e8ce 100644
--- a/src/backend/utils/Gen_fmgrtab.sh.in
+++ b/src/backend/utils/Gen_fmgrtab.sh.in
@@ -8,7 +8,7 @@
#
#
# IDENTIFICATION
-# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.4 1997/07/28 00:55:41 momjian Exp $
+# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $
#
# NOTES
# Passes any -D options on to cpp prior to generating the list
@@ -81,7 +81,7 @@ cat > $HFILE <<FuNkYfMgRsTuFf
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: Gen_fmgrtab.sh.in,v 1.4 1997/07/28 00:55:41 momjian Exp $
+ * $Id: Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $
*
* NOTES
* ******************************
@@ -114,6 +114,8 @@ typedef struct {
/*
* defined in fmgr.c
*/
+extern char *fmgr_pl(Oid func_id, int n_arguments, FmgrValues *values,
+ bool *isNull);
extern char *fmgr_c(func_ptr user_fn, Oid func_id, int n_arguments,
FmgrValues *values, bool *isNull);
extern void fmgr_info(Oid procedureId, func_ptr *function, int *nargs);
@@ -175,7 +177,7 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.4 1997/07/28 00:55:41 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $
*
* NOTES
*
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index 149e99888e..f12e17f03d 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.9 1997/09/18 20:22:25 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.10 1997/10/28 15:03:06 vadim Exp $
*
* NOTES
* These routines allow the parser/planner/executor to perform
@@ -57,7 +57,7 @@ extern bool AMI_OVERRIDE; /* XXX style */
#include "utils/syscache.h"
#include "catalog/indexing.h"
-typedef HeapTuple (*ScanFunc) ();
+typedef HeapTuple(*ScanFunc) ();
/* ----------------
* Warning: cacheinfo[] below is changed, then be sure and
@@ -179,7 +179,7 @@ static struct cachedesc cacheinfo[] = {
0,
0,
0},
- offsetof(TypeTupleFormData, typalign) +sizeof(char),
+ offsetof(TypeTupleFormData, typalign) + sizeof(char),
TypeNameIndex,
TypeNameIndexScan},
{TypeRelationName, /* TYPOID */
@@ -316,7 +316,16 @@ static struct cachedesc cacheinfo[] = {
0},
sizeof(FormData_pg_opclass),
NULL,
- (ScanFunc) NULL}
+ (ScanFunc) NULL},
+ {LanguageRelationName, /* LANOID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_language, lancompiler),
+ NULL,
+ NULL}
};
static struct catcache *SysCache[
@@ -383,7 +392,7 @@ InitCatalogCache()
* XXX The tuple that is returned is NOT supposed to be pfree'd!
*/
HeapTuple
-SearchSysCacheTuple(int cacheId,/* cache selection code */
+SearchSysCacheTuple(int cacheId, /* cache selection code */
Datum key1,
Datum key2,
Datum key3,
@@ -562,7 +571,7 @@ SearchSysCacheGetAttribute(int cacheId,
: attributeLength; /* fixed length */
tmp = (char *) palloc(size);
- memmove(tmp, (void *)attributeValue, size);
+ memmove(tmp, (void *) attributeValue, size);
returnValue = (void *) tmp;
}
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index 939341a3de..a225c98255 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.6 1997/09/08 21:49:07 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.7 1997/10/28 15:05:32 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -28,13 +28,69 @@
#include "utils/elog.h"
+#include "nodes/parsenodes.h"
+#include "commands/trigger.h"
+
+
+char *
+fmgr_pl(Oid func_id,
+ int n_arguments,
+ FmgrValues * values,
+ bool * isNull)
+{
+ HeapTuple procedureTuple;
+ HeapTuple languageTuple;
+ Form_pg_proc procedureStruct;
+ Form_pg_language languageStruct;
+ func_ptr plcall_fn;
+ int plcall_nargs;
+
+ /* Fetch the pg_proc tuple from the syscache */
+ procedureTuple = SearchSysCacheTuple(PROOID,
+ ObjectIdGetDatum(func_id),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(procedureTuple))
+ {
+ elog(WARN, "fmgr_pl(): Cache lookup of procedure %ld failed.",
+ ObjectIdGetDatum(func_id));
+ }
+ procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);
+
+ /* Fetch the pg_language tuple from the syscache */
+ languageTuple = SearchSysCacheTuple(LANOID,
+ ObjectIdGetDatum(procedureStruct->prolang),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(languageTuple))
+ {
+ elog(WARN, "fmgr_pl(): Cache lookup of language %ld for procedure %ld failed.",
+ ObjectIdGetDatum(procedureStruct->prolang),
+ ObjectIdGetDatum(func_id));
+ }
+ languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
+
+ /* Get the function pointer for the PL call handler */
+ fmgr_info(languageStruct->lanplcallfoid, &plcall_fn, &plcall_nargs);
+ if (plcall_fn == NULL)
+ {
+ elog(WARN, "fmgr_pl(): failed to load PL handler for procedure %ld.",
+ ObjectIdGetDatum(func_id));
+ }
+
+ /* Call the PL handler */
+ CurrentTriggerData = NULL;
+ return (*plcall_fn) (func_id,
+ n_arguments,
+ values,
+ isNull);
+}
+
char *
fmgr_c(func_ptr user_fn,
Oid func_id,
int n_arguments,
- FmgrValues *values,
- bool *isNull)
+ FmgrValues * values,
+ bool * isNull)
{
char *returnValue = (char *) NULL;
@@ -43,11 +99,11 @@ fmgr_c(func_ptr user_fn,
{
/*
- * a NULL func_ptr denotes untrusted function (in postgres 4.2).
- * Untrusted functions have very limited use and is clumsy. We
- * just get rid of it.
+ * a NULL func_ptr denotet untrusted function (in postgres 4.2).
+ * Untrusted functions have very limited use and is clumsy. We now
+ * use this feature for procedural languages.
*/
- elog(WARN, "internal error: untrusted function not supported.");
+ return fmgr_pl(func_id, n_arguments, values, isNull);
}
switch (n_arguments)
@@ -115,12 +171,14 @@ fmgr_c(func_ptr user_fn,
}
void
-fmgr_info(Oid procedureId, func_ptr *function, int *nargs)
+fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
{
func_ptr user_fn = NULL;
FmgrCall *fcp;
HeapTuple procedureTuple;
FormData_pg_proc *procedureStruct;
+ HeapTuple languageTuple;
+ Form_pg_language languageStruct;
Oid language;
if (!(fcp = fmgr_isbuiltin(procedureId)))
@@ -158,8 +216,35 @@ fmgr_info(Oid procedureId, func_ptr *function, int *nargs)
*nargs = procedureStruct->pronargs;
break;
default:
- elog(WARN, "fmgr_info: function %d: unknown language %d",
- procedureId, language);
+
+ /*
+ * Might be a created procedural language Lookup the
+ * syscache for the language and check the lanispl flag If
+ * this is the case, we return a NULL function pointer and
+ * the number of arguments from the procedure.
+ */
+ languageTuple = SearchSysCacheTuple(LANOID,
+ ObjectIdGetDatum(procedureStruct->prolang),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(languageTuple))
+ {
+ elog(WARN, "fmgr_info: %s %ld",
+ "Cache lookup for language %d failed",
+ ObjectIdGetDatum(procedureStruct->prolang));
+ }
+ languageStruct = (Form_pg_language)
+ GETSTRUCT(languageTuple);
+ if (languageStruct->lanispl)
+ {
+ user_fn = (func_ptr) NULL;
+ *nargs = procedureStruct->pronargs;
+ }
+ else
+ {
+ elog(WARN, "fmgr_info: function %d: unknown language %d",
+ procedureId, language);
+ }
+ break;
}
}
else
@@ -252,7 +337,7 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...)
* to fmgr_c().
*/
char *
-fmgr_array_args(Oid procedureId, int nargs, char *args[], bool *isNull)
+fmgr_array_args(Oid procedureId, int nargs, char *args[], bool * isNull)
{
func_ptr user_fn;
int true_arguments;