summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/define.c36
-rw-r--r--src/backend/parser/gram.y12
-rw-r--r--src/backend/utils/fmgr/dfmgr.c34
3 files changed, 69 insertions, 13 deletions
diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c
index c7dc7d3ad1..509d5026d3 100644
--- a/src/backend/commands/define.c
+++ b/src/backend/commands/define.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.34 1999/07/17 20:16:52 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.35 1999/09/28 04:34:40 momjian Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
@@ -178,23 +178,45 @@ compute_full_attributes(const List *parameters, int32 *byte_pct_p,
}
+/*
+ * For a dynamically linked C language object, the form of the clause is
+ *
+ * AS <object file name> [, <link symbol name> ]
+ *
+ * In all other cases
+ *
+ * AS <object reference, or sql code>
+ *
+ */
static void
-interpret_AS_clause(const char *languageName, const char *as,
+interpret_AS_clause(const char *languageName, const List *as,
char **prosrc_str_p, char **probin_str_p)
{
+ Assert(as != NIL);
if (strcmp(languageName, "C") == 0)
{
- /* For "C" language, store the given string in probin */
- *prosrc_str_p = "-";
- *probin_str_p = (char *) as;
+
+ /*
+ * For "C" language, store the file name in probin and, when
+ * given, the link symbol name in prosrc.
+ */
+ *probin_str_p = strVal(lfirst(as));
+ if (lnext(as) == NULL)
+ *prosrc_str_p = "-";
+ else
+ *prosrc_str_p = strVal(lsecond(as));
}
else
{
- /* Everything else wants the given string in prosrc */
- *prosrc_str_p = (char *) as;
+ /* Everything else wants the given string in prosrc. */
+ *prosrc_str_p = strVal(lfirst(as));
*probin_str_p = "-";
+
+ if (lnext(as) != NULL)
+ elog(ERROR, "CREATE FUNCTION: parse error in 'AS %s, %s'.",
+ strVal(lfirst(as)), strVal(lsecond(as)));
}
}
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 32c46e05d1..67d7ac00cd 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.99 1999/09/23 17:02:46 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.100 1999/09/28 04:34:44 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -163,7 +163,7 @@ Oid param_type(int t); /* used in parse_expr.c */
%type <list> stmtblock, stmtmulti,
result, relation_name_list, OptTableElementList,
OptInherit, definition,
- opt_with, func_args, func_args_list,
+ opt_with, func_args, func_args_list, func_as,
oper_argtypes, RuleActionList, RuleActionBlock, RuleActionMulti,
opt_column_list, columnList, opt_va_list, va_list,
sort_clause, sortby_list, index_params, index_list, name_list,
@@ -1923,7 +1923,7 @@ RecipeStmt: EXECUTE RECIPE recipe_name
*****************************************************************************/
ProcedureStmt: CREATE FUNCTION func_name func_args
- RETURNS func_return opt_with AS Sconst LANGUAGE Sconst
+ RETURNS func_return opt_with AS func_as LANGUAGE Sconst
{
ProcedureStmt *n = makeNode(ProcedureStmt);
n->funcname = $3;
@@ -1949,6 +1949,12 @@ func_args_list: TypeId
{ $$ = lappend($1,makeString($3)); }
;
+func_as: Sconst
+ { $$ = lcons(makeString($1),NIL); }
+ | Sconst ',' Sconst
+ { $$ = lappend(lcons(makeString($1),NIL), makeString($3)); }
+ ;
+
func_return: set_opt TypeId
{
TypeName *n = makeNode(TypeName);
diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c
index dcf2814171..171f269127 100644
--- a/src/backend/utils/fmgr/dfmgr.c
+++ b/src/backend/utils/fmgr/dfmgr.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.32 1999/09/18 19:08:01 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.33 1999/09/28 04:34:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -42,8 +42,11 @@ fmgr_dynamic(Oid procedureId, int *pronargs)
HeapTuple procedureTuple;
Form_pg_proc procedureStruct;
char *proname,
- *probinstring;
+ *probinstring,
+ *prosrcstring,
+ *linksymbol;
Datum probinattr;
+ Datum prosrcattr;
func_ptr user_fn;
Relation rel;
bool isnull;
@@ -90,7 +93,32 @@ fmgr_dynamic(Oid procedureId, int *pronargs)
heap_close(rel, AccessShareLock);
- user_fn = handle_load(probinstring, proname);
+ prosrcattr = heap_getattr(procedureTuple,
+ Anum_pg_proc_prosrc,
+ RelationGetDescr(rel), &isnull);
+
+ if (isnull)
+ { /* Use the proname for the link symbol */
+ linksymbol = proname;
+ }
+ else if (!PointerIsValid(prosrcattr))
+ { /* pg_proc must be messed up! */
+ heap_close(rel);
+ elog(ERROR, "fmgr: Could not extract prosrc for %u from %s",
+ procedureId, ProcedureRelationName);
+ return (func_ptr) NULL;
+ }
+ else
+ { /* The text in prosrcattr is either "-" or
+ * a link symbol */
+ prosrcstring = textout((struct varlena *) prosrcattr);
+ if (strcmp(prosrcstring, "-") == 0)
+ linksymbol = proname;
+ else
+ linksymbol = prosrcstring;
+ }
+
+ user_fn = handle_load(probinstring, linksymbol);
pfree(probinstring);