aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/bin/psql/psqlHelp.h12
-rw-r--r--src/include/nodes/parsenodes.h14
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y11
-rw-r--r--src/tools/backend/index.html36
7 files changed, 112 insertions, 43 deletions
diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c
index c7dc7d3ad1c..509d5026d30 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 32c46e05d1c..67d7ac00cd1 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 dcf2814171b..171f269127d 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);
diff --git a/src/bin/psql/psqlHelp.h b/src/bin/psql/psqlHelp.h
index 020d8e450e1..63268c2cbd9 100644
--- a/src/bin/psql/psqlHelp.h
+++ b/src/bin/psql/psqlHelp.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: psqlHelp.h,v 1.75 1999/09/27 20:27:20 momjian Exp $
+ * $Id: psqlHelp.h,v 1.76 1999/09/28 04:34:48 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -88,8 +88,14 @@ static struct _helpStruct QL_HELP[] = {
"create a user-defined function",
"\
\tCREATE FUNCTION function_name ([type1, ...typeN]) RETURNS return_type\n\
-\tAS 'object_filename'|'sql-queries'|'builtin_function_name'\n\
-\tLANGUAGE 'c'|'sql'|'internal';"},
+\tAS 'sql-queries'|'builtin_function_name'|'object_filename'\n\
+\tLANGUAGE 'sql'|'internal'|'c';\n\
+\n\
+OR\n\
+\n\
+\tCREATE FUNCTION function_name ([type1, ...typeN]) RETURNS return_type\n\
+\tAS 'object_filename', 'link_symbol'\n\
+\tLANGUAGE 'c';"},
{"create index",
"construct an index",
"\
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 66c5a9132aa..4bf879137ac 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: parsenodes.h,v 1.79 1999/09/23 17:03:22 momjian Exp $
+ * $Id: parsenodes.h,v 1.80 1999/09/28 04:34:50 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -70,7 +70,7 @@ typedef struct Query
/* internal to planner */
List *base_rel_list; /* list of base-relation RelOptInfos */
List *join_rel_list; /* list of join-relation RelOptInfos */
- List *query_pathkeys; /* pathkeys for query_planner()'s result */
+ List *query_pathkeys; /* pathkeys for query_planner()'s result */
} Query;
@@ -361,7 +361,7 @@ typedef struct ProcedureStmt
Node *returnType; /* the return type (as a string or a
* TypeName (ie.setof) */
List *withClause; /* a list of ParamString */
- char *as; /* the SQL statement or filename */
+ List *as; /* the SQL statement or filename */
char *language; /* C or SQL */
} ProcedureStmt;
@@ -836,8 +836,10 @@ typedef struct ResTarget
{
NodeTag type;
char *name; /* column name or NULL */
- List *indirection; /* subscripts for destination column, or NIL */
- Node *val; /* the value expression to compute or assign */
+ List *indirection; /* subscripts for destination column, or
+ * NIL */
+ Node *val; /* the value expression to compute or
+ * assign */
} ResTarget;
/*
@@ -970,7 +972,7 @@ typedef struct RangeTblEntry
typedef struct SortClause
{
NodeTag type;
- Index tleSortGroupRef; /* reference into targetlist */
+ Index tleSortGroupRef;/* reference into targetlist */
Oid sortop; /* the sort operator to use */
} SortClause;
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 6151a6328d8..9ba3daacb64 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -799,7 +799,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
%type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
%type <str> index_list func_index index_elem opt_type opt_class access_method_clause
%type <str> index_opt_unique IndexStmt set_opt func_return def_rest
-%type <str> func_args_list func_args opt_with ProcedureStmt def_arg
+%type <str> func_as func_args_list func_args opt_with ProcedureStmt def_arg
%type <str> def_elem def_list definition def_name def_type DefineStmt
%type <str> opt_instead event event_object RuleActionList,
%type <str> RuleActionBlock RuleActionMulti join_list
@@ -2208,11 +2208,12 @@ RecipeStmt: EXECUTE RECIPE recipe_name
* [, iscachable])
* [arg is (<type-1> { , <type-n>})]
* as <filename or code in language as appropriate>
+ * [, <link name for dynamic loader>]
*
*****************************************************************************/
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
{
$$ = cat2_str(cat5_str(cat5_str(make1_str("create function"), $3, $4, make1_str("returns"), $6), $7, make1_str("as"), $9, make1_str("language")), $11);
}
@@ -2230,6 +2231,12 @@ func_args_list: TypeId { $$ = $1; }
{ $$ = cat3_str($1, make1_str(","), $3); }
;
+func_as: Sconst
+ { $$ = $1; }
+ | Sconst ',' Sconst
+ { $$ = cat3_str($1, make1_str(","), $3); }
+ ;
+
func_return: set_opt TypeId
{
$$ = cat2_str($1, $2);
diff --git a/src/tools/backend/index.html b/src/tools/backend/index.html
index e21efb71c19..499698412c8 100644
--- a/src/tools/backend/index.html
+++ b/src/tools/backend/index.html
@@ -11,28 +11,26 @@ by Bruce Momjian
</H2>
<P>
<CENTER>
-<BR>
-<BR>
<IMG src="flow.gif" usemap="#flowmap" alt="flowchart" border=0>
</CENTER>
<MAP name="flowmap">
-<AREA COORDS="70,0,230,40" HREF="backend_dirs.html#main">
-<AREA COORDS="70,80,230,120" HREF="backend_dirs.html#postmaster">
-<AREA COORDS="330,40,490,80" HREF="backend_dirs.html#libpq">
-<AREA COORDS="70,160,230,200" HREF="backend_dirs.html#tcop">
-<AREA COORDS="330,160,490,200" HREF="backend_dirs.html#tcop">
-<AREA COORDS="70,260,230,300" HREF="backend_dirs.html#parser">
-<AREA COORDS="70,340,230,380" HREF="backend_dirs.html#tcop">
-<AREA COORDS="70,420,230,460" HREF="backend_dirs.html#optimizer">
-<AREA COORDS="70,400,230,540" HREF="backend_dirs.html#optimizer/plan">
-<AREA COORDS="70,580,230,620" HREF="backend_dirs.html#executor">
-<AREA COORDS="330,340,490,380" HREF="backend_dirs.html#commands">
-<AREA COORDS="0,690,160,740" HREF="backend_dirs.html#utils">
-<AREA COORDS="210,690,370,730" HREF="backend_dirs.html#catalog">
-<AREA COORDS="420,690,590,740" HREF="backend_dirs.html#storage">
-<AREA COORDS="100,770,270,820" HREF="backend_dirs.html#access">
-<AREA COORDS="330,770,490,820" HREF="backend_dirs.html#nodes">
-<AREA COORDS="10,860,170,900" HREF="backend_dirs.html#bootstrap">
+<AREA COORDS="125,35,245,65" HREF="backend_dirs.html#main">
+<AREA COORDS="125,100,245,125" HREF="backend_dirs.html#postmaster">
+<AREA COORDS="325,65,450,95" HREF="backend_dirs.html#libpq">
+<AREA COORDS="125,160,245,190" HREF="backend_dirs.html#tcop">
+<AREA COORDS="325,160,450,190" HREF="backend_dirs.html#tcop">
+<AREA COORDS="125,240,245,265" HREF="backend_dirs.html#parser">
+<AREA COORDS="125,300,250,330" HREF="backend_dirs.html#tcop">
+<AREA COORDS="125,360,250,390" HREF="backend_dirs.html#optimizer">
+<AREA COORDS="125,425,245,455" HREF="backend_dirs.html#optimizer/plan">
+<AREA COORDS="125,490,245,515" HREF="backend_dirs.html#executor">
+<AREA COORDS="325,300,450,330" HREF="backend_dirs.html#commands">
+<AREA COORDS="75,575,195,605" HREF="backend_dirs.html#utils">
+<AREA COORDS="235,575,360,605" HREF="backend_dirs.html#catalog">
+<AREA COORDS="405,575,525,605" HREF="backend_dirs.html#storage">
+<AREA COORDS="155,635,275,665" HREF="backend_dirs.html#access">
+<AREA COORDS="325,635,450,665" HREF="backend_dirs.html#nodes">
+<AREA COORDS="75,705,200,730" HREF="backend_dirs.html#bootstrap">
</MAP>
<CENTER><EM>
Click on an item to see more detail or look at the full