diff options
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/commands/define.c | 36 | ||||
| -rw-r--r-- | src/backend/parser/gram.y | 12 | ||||
| -rw-r--r-- | src/backend/utils/fmgr/dfmgr.c | 34 |
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); |
