diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml
index 84f4f5c958f..b22b9e4088f 100644
--- a/doc/src/sgml/ref/create_function.sgml
+++ b/doc/src/sgml/ref/create_function.sgml
@@ -1,5 +1,5 @@
@@ -25,8 +25,14 @@ Postgres documentation
CREATE FUNCTION name ( [ ftype [, ...] ] )
RETURNS rtype
- AS definition
+ AS definition
LANGUAGE 'langname'
+
+
+CREATE FUNCTION name ( [ ftype [, ...] ] )
+ RETURNS rtype
+ AS obj_file , link_symbol
+ LANGUAGE 'c'
@@ -83,6 +89,22 @@ CREATE FUNCTION name ( [
+
+ obj_file , link_symbol
+
+
+ This form of the AS clause is used for
+ dynamically-linked, C language functions when the function name in
+ the C language source code is not the same as the name of the SQL
+ function. The string obj_file is the name of the file
+ containing the dynamically loadable object, and link_symbol, is the object's link
+ symbol which is the same as the name of the function in the C
+ language source code.
+
+
+ langname
@@ -165,10 +187,10 @@ CREATE
Postgres allows function "overloading";
that is, the same name can be used for several different functions
- so long as they have distinct argument types. This facility must be
- used with caution for internal
- and C-language functions, however.
-
+ so long as they have distinct argument types. This facility must
+ be used with caution for internal and
+ C-language functions, however.
+
Two internal
@@ -181,18 +203,15 @@ CREATE
- For dynamically-loaded C functions, the SQL name of the function must
- be the same as the C function name, because the AS clause is used to
- give the path name of the object file containing the C code. In this
- situation it is best not to try to overload SQL function names. It
- might work to load a C function that has the same C name as an internal
- function or another dynamically-loaded function --- or it might not.
- On some platforms the dynamic loader may botch the load in interesting
- ways if there is a conflict of C function names. So, even if it works
- for you today, you might regret overloading names later when you try
- to run the code somewhere else.
+ When overloading SQL functions with C-language functions, give
+ each C-language instance of the function a distinct name, and use
+ the alternative form of the AS clause in the
+ CREATE FUNCTION syntax to ensure that
+ overloaded SQL functions names are resolved to the correct
+ dynamically linked objects.
+
A C function cannot return a set of values.
@@ -227,7 +246,6 @@ SELECT one() AS answer;
is correct. It is intended for use in a CHECK contraint.
-
CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS bool
AS '/usr1/proj/bray/sql/funcs.so' LANGUAGE 'c';
@@ -238,8 +256,41 @@ CREATE TABLE product (
eancode char(6) CHECK (eancode ~ '[0-9]{6}'),
CONSTRAINT ean CHECK (ean_checkdigit(eanprefix, eancode))
);
-
+
+
+
+ This example creates a function that does type conversion between the
+ user defined type complex, and the internal type point. The
+ function is implemented by a dynamically loaded object that was
+ compiled from C source. For Postgres to
+ find a type conversion function automatically, the sql function has
+ to have the same name as the return type, and overloading is
+ unavoidable. The function name is overloaded by using the second
+ form of the AS clause in the SQL definition
+
+
+CREATE FUNCTION point(complex) RETURNS point
+ AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
+ LANGUAGE 'c';
+
+
+ The C decalaration of the function is:
+
+
+Point * complex_to_point (Complex *z)
+{
+ Point *p;
+
+ p = (Point *) palloc(sizeof(Point));
+ p->x = z->x;
+ p->y = z->y;
+
+ return p;
+}
+
+
+
@@ -283,8 +334,7 @@ CREATE TABLE product (
SQL/PSM CREATE FUNCTION has the following syntax:
CREATE FUNCTION name
- ( [ [ IN | OUT | INOUT ] etereable>eable> type [, ...] ] )
+ ( [ [ IN | OUT | INOUT ] type [, ...] ] )
RETURNS rtype
LANGUAGE 'langname'
ESPECIFIC routine
diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml
index 036d029d818..879f6f66672 100644
--- a/doc/src/sgml/xfunc.sgml
+++ b/doc/src/sgml/xfunc.sgml
@@ -357,25 +357,43 @@ WARN::function declared to return type EMP does not retrieve (EMP.*)
Compiled (C) Language Functions
- Functions written in C can be defined to Postgres, which will dynamically
- load them into its address space. The AS
- clause gives the full path name of the object file that contains the
- function. This file is loaded either using
- load(l)
- or automatically the first time the function is necessary for
- execution. Repeated execution of a function will cause negligible
- additional overhead, as the function will remain in a main memory
- cache.
+ Functions written in C can be compiled into dynamically loadable
+ objects, and used to implement user-defined SQL functions. The
+ first time the user defined function is called inside the backend,
+ the dynamic loader loads the function's object code into memory,
+ and links the function with the running
+ Postgres executable. The SQL syntax
+ for the command links the SQL function
+ to the C source function in one of two ways. If the SQL function
+ has the same name as the C source function the first form of the
+ statement is used. The string argument in the AS clause is the
+ full pathname of the file that contains the dynamically loadable
+ compiled object. If the name of C function is different from the
+ name of the SQL function, then the second form is used. In this
+ form the AS clause takes two string arguments, the first is the
+ full pathname of the dynamically loadable object file, and the
+ second is the link symbol that the dynamic loader should search
+ for. This link symbol is just the function name in the C source
+ code.
+
+ After it is used for the first time, a dynamically loaded, user
+ function is retained in memory, and future calls to the function
+ only incur the small overhead of a symbol table lookup.
- The string which specifies the object file (the string in the AS clause)
- should be the full path
- of the object code file for the function, bracketed by quotation
- marks. (Postgres will not compile a
- function automatically; it must
- be compiled before it is used in a CREATE FUNCTION
- command. See below for additional information.)
+ The string which specifies the object file (the string in the AS
+ clause) should be the full path of the object
+ code file for the function, bracketed by quotation marks. If a
+ link symbol is used in the AS clause, the link symbol should also be
+ bracketed by single quotation marks, and should be exactly the
+ same as the name of function in the C source code. On UNIX systems
+ the command nm will print all of the link
+ symbols in a dynamically loadable object.
+ (Postgres will not compile a function
+ automatically; it must be compiled before it is used in a CREATE
+ FUNCTION command. See below for additional information.)
@@ -960,10 +978,13 @@ memmove(destination->data, buffer, 40);
Name Space Conflicts
- As of Postgres v6.5,
- CREATE FUNCTION can decouple a C language
- function name from the name of the entry point. This is now the
- preferred technique to accomplish function overloading.
+ As of Postgres v6.6, the alternative
+ form of the AS clause for the SQL CREATE
+ FUNCTION command described in
+ decouples the SQL function name from the function name in the C
+ source code. This is now the preferred technique to accomplish
+ function overloading.
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