diff options
Diffstat (limited to 'doc/man/create_function.l')
-rw-r--r-- | doc/man/create_function.l | 417 |
1 files changed, 0 insertions, 417 deletions
diff --git a/doc/man/create_function.l b/doc/man/create_function.l deleted file mode 100644 index 2eaa148e119..00000000000 --- a/doc/man/create_function.l +++ /dev/null @@ -1,417 +0,0 @@ -.\" This is -*-nroff-*- -.\" XXX standard disclaimer belongs here.... -.\" $Header: /cvsroot/pgsql/doc/man/Attic/create_function.l,v 1.1.1.1 1996/08/18 22:14:21 scrappy Exp $ -.TH "CREATE FUNCTION" SQL 11/05/95 Postgres95 Postgres95 -.SH "NAME" -create function \(em define a new function -.SH "SYNOPSIS" -.nf -\fBcreate function\fP function_name \fB(\fP - ([type1 {, type-n}]) - \fBreturns\fP type-r - \fBas\fP {'/full/path/to/objectfile' | 'sql-queries'} - \fBlanguage\fP {'c' \ 'sql' \ 'internal'} -.fi -.SH "DESCRIPTION" -With this command, a Postgres user can register a function with Postgres. -Subsequently, this user is treated as the owner of the function. -.PP -When defining a function with arguments, the input data types, -.IR type-1 , -.IR type-2 , -\&..., -.IR type-n , -and the return data type, -.IR type-r -must be specified, along with the language, which may be -.IR "\*(lqc\*(rq" -or -.IR "\*(lqsql\*(rq" . -or -.IR "\*(lqinternal\*(rq" . -(The -.IR "arg is" -clause may be left out if the function has no arguments, or -alternatively the argument list may be left empty.) -The input types may be base or complex types, or -.IR opaque . -.IR Opaque -indicates that the function accepts arguments of an -invalid type such as (char *). -The output type may be specified as a base type, complex type, -.IR "setof <type>", -or -.IR opaque . -The -.IR setof -modifier indicates that the function will return a set of items, -rather than a single item. -The -.IR as -clause of the command is treated differently for C and SQL -functions, as explained below. -.SH "C FUNCTIONS" -Functions written in C can be defined to Postgres, which will dynamically -load them into its address space. The loading happens either using -.IR 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. -.PP -Internal functions are functions written in C which have been statically -linked into the postgres backend process. The -.BR as -clause must still be specified when defining an internal function but -the contents are ignored. -.SH "Writing C Functions" -The body of a C function following -.BR as -should be the -.BR "FULL PATH" -of the object code (.o file) for the function, bracketed by quotation -marks. (Postgres will not compile a function automatically \(em it must -be compiled before it is used in a -.BR "define function" -command.) -.PP -C functions with base type arguments can be written in a -straightforward fashion. The C equivalents of built-in Postgres types -are accessible in a C file if -.nf -\&.../src/backend/utils/builtins.h -.fi -is included as a header file. This can be achieved by having -.nf -\&#include <utils/builtins.h> -.fi -at the top of the C source file and by compiling all C files with the -following include options: -.nf --I.../src/backend --I.../src/backend/port/<portname> --I.../src/backend/obj -.fi -before any \*(lq.c\*(rq programs in the -.IR cc -command line, e.g.: -.nf -cc -I.../src/backend \e - -I.../src/backend/port/<portname> \e - -I.../src/backend/obj \e - -c progname.c -.fi -where \*(lq...\*(rq is the path to the installed Postgres source tree and -\*(lq<portname>\*(rq is the name of the port for which the source tree -has been built. -.PP -The convention for passing arguments to and from the user's C -functions is to use pass-by-value for data types that are 32 bits (4 -bytes) or smaller, and pass-by-reference for data types that require -more than 32 bits. -.if t \{ -The following table gives the C type required for parameters in the C -functions that will be loaded into Postgres. The \*(lqDefined In\*(rq -column gives the actual header file (in the -.nf -\&.../src/backend -.fi -directory) that the equivalent C type is defined. However, if you -include \*(lqutils/builtins.h\*(rq, these files will automatically be -included. -.SH "Equivalent C Types for Built-In Postgres Types" -.PP -.TS -center; -l l l -l l l. -\fBBuilt-In Type\fP \fBC Type\fP \fBDefined In\fP -_ -abstime AbsoluteTime utils/nabstime.h -bool bool include/c.h -box (BOX *) utils/geo-decls.h -bytea (bytea *) include/postgres.h -char char N/A -char16 Char16 or (char16 *) include/postgres.h -cid CID include/postgres.h -int2 int2 include/postgres.h -int28 (int28 *) include/postgres.h -int4 int4 include/postgres.h -float4 float32 or (float4 *) include/c.h or include/postgres.h -float8 float64 or (float8 *) include/c.h or include/postgres.h -lseg (LSEG *) include/geo-decls.h -name (Name) include/postgres.h -oid oid include/postgres.h -oid8 (oid8 *) include/postgres.h -path (PATH *) utils/geo-decls.h -point (POINT *) utils/geo-decls.h -regproc regproc or REGPROC include/postgres.h -reltime RelativeTime utils/nabstime.h -text (text *) include/postgres.h -tid ItemPointer storage/itemptr.h -tinterval TimeInterval utils/nabstime.h -uint2 uint16 include/c.h -uint4 uint32 include/c.h -xid (XID *) include/postgres.h -.TE -\} -.PP -Complex arguments to C functions are passed into the C function as a -special C type, TUPLE, defined in -.nf -\&.../src/libpq/libpq-fe.h. -.fi -Given a variable -.IR t -of this type, the C function may extract attributes from the function -using the function call: -.nf -GetAttributeByName(t, "fieldname", &isnull) -.fi -where -.IR isnull -is a pointer to a -.IR bool , -which the function sets to -.IR true -if the field is null. The result of this function should be cast -appropriately as shown in the examples below. -.SH "Compiling Dynamically-Loaded C Functions" -.PP -Different operating systems require different procedures for compiling -C source files so that Postgres can load them dynamically. This section -discusses the required compiler and loader options on each system. -.PP -Under Linux ELF, object files can be generated by specifing the compiler -flag -fpic. -.PP -Under Ultrix, all object files that Postgres is expected to load -dynamically must be compiled using -.IR /bin/cc -with the \*(lq-G 0\*(rq option turned on. The object file name in the -.IR as -clause should end in \*(lq.o\*(rq. -.PP -Under HP-UX, DEC OSF/1, AIX and SunOS 4, all object files must be -turned into -.IR "shared libraries" -using the operating system's native object file loader, -.IR ld (1). -.PP -Under HP-UX, an object file must be compiled using the native HP-UX C -compiler, -.IR /bin/cc , -with both the \*(lq+z\*(rq and \*(lq+u\*(rq flags turned on. The -first flag turns the object file into \*(lqposition-independent -code\*(rq (PIC); the second flag removes some alignment restrictions -that the PA-RISC architecture normally enforces. The object file must -then be turned into a shared library using the HP-UX loader, -.IR /bin/ld . -The command lines to compile a C source file, \*(lqfoo.c\*(rq, look -like: -.nf -cc <other flags> +z +u -c foo.c -ld <other flags> -b -o foo.sl foo.o -.fi -The object file name in the -.BR as -clause should end in \*(lq.sl\*(rq. -.PP -An extra step is required under versions of HP-UX prior to 9.00. If -the Postgres header file -.nf -include/c.h -.fi -is not included in the source file, then the following line must also -be added at the top of every source file: -.nf -#pragma HP_ALIGN HPUX_NATURAL_S500 -.fi -However, this line must not appear in programs compiled under HP-UX -9.00 or later. -.PP -Under DEC OSF/1, an object file must be compiled and then turned -into a shared library using the OSF/1 loader, -.IR /bin/ld . -In this case, the command lines look like: -.nf -cc <other flags> -c foo.c -ld <other flags> -shared -expect_unresolved '*' -o foo.so foo.o -.fi -The object file name in the -.BR as -clause should end in \*(lq.so\*(rq. -.PP -Under SunOS 4, an object file must be compiled and then turned into a -shared library using the SunOS 4 loader, -.IR /bin/ld . -The command lines look like: -.nf -cc <other flags> -PIC -c foo.c -ld <other flags> -dc -dp -Bdynamic -o foo.so foo.o -.fi -The object file name in the -.BR as -clause should end in \*(lq.so\*(rq. -.PP -Under AIX, object files are compiled normally but building the shared -library requires a couple of steps. First, create the object file: -.nf -cc <other flags> -c foo.c -.fi -You must then create a symbol \*(lqexports\*(rq file for the object -file: -.nf -mkldexport foo.o `pwd` > foo.exp -.fi -Finally, you can create the shared library: -.nf -ld <other flags> -H512 -T512 -o foo.so -e _nostart \e - -bI:.../lib/postgres.exp -bE:foo.exp foo.o \e - -lm -lc 2>/dev/null -.fi -You should look at the Postgres User's Manual for an explanation of this -procedure. -.SH "SQL FUNCTIONS" -SQL functions execute an arbitrary list of SQL queries, returning -the results of the last query in the list. SQL functions in general -return sets. If their returntype is not specified as a -.IR setof , -then an arbitrary element of the last query's result will be returned. -.PP -The body of a SQL function following -.BR as -should be a list of queries separated by whitespace characters and -bracketed within quotation marks. Note that quotation marks used in -the queries must be escaped, by preceding them with two backslashes -(i.e. \e\e"). -.PP -Arguments to the SQL function may be referenced in the queries using -a $n syntax: $1 refers to the first argument, $2 to the second, and so -on. If an argument is complex, then a \*(lqdot\*(rq notation may be -used to access attributes of the argument (e.g. \*(lq$1.emp\*(rq), or -to invoke functions via a nested-dot syntax. -.SH "EXAMPLES: C Functions" -The following command defines a C function, overpaid, of two basetype -arguments. -.nf -create function overpaid (float8, int4) returns bool - as '/usr/postgres/src/adt/overpaid.o' - language 'c' -.fi -The C file "overpaid.c" might look something like: -.nf -#include <utils/builtins.h> - -bool overpaid(salary, age) - float8 *salary; - int4 age; -{ - if (*salary > 200000.00) - return(TRUE); - if ((age < 30) & (*salary > 100000.00)) - return(TRUE); - return(FALSE); -} -.fi -The overpaid function can be used in a query, e.g: -.nf -select name from EMP where overpaid(salary, age) -.fi -One can also write this as a function of a single argument of type -EMP: -.nf -create function overpaid_2 (EMP) - returns bool - as '/usr/postgres/src/adt/overpaid_2.o' - language 'c' -.fi -The following query is now accepted: -.nf -select name from EMP where overpaid_2(EMP) -.fi -In this case, in the body of the overpaid_2 function, the fields in the EMP -record must be extracted. The C file "overpaid_2.c" might look -something like: -.nf -#include <utils/builtins.h> -#include <libpq-fe.h> - -bool overpaid_2(t) -TUPLE t; -{ - float8 *salary; - int4 age; - bool salnull, agenull; - - salary = (float8 *)GetAttributeByName(t, "salary", - &salnull); - age = (int4)GetAttributeByName(t, "age", &agenull); - if (!salnull && *salary > 200000.00) - return(TRUE); - if (!agenull && (age<30) && (*salary > 100000.00)) - return(TRUE); - return(FALSE) -} -.fi -.SH "EXAMPLES: SQL Functions" -To illustrate a simple SQL function, consider the following, -which might be used to debit a bank account: -.nf -create function TP1 (int4, float8) returns int4 - as 'update BANK set balance = BANK.balance - $2 - where BANK.acctountno = $1 - select(x = 1)' - language 'sql' -.fi -A user could execute this function to debit account 17 by $100.00 as -follows: -.nf -select (x = TP1( 17,100.0)) -.fi -The following more interesting examples take a single argument of type -EMP, and retrieve multiple results: -.nf -select function hobbies (EMP) returns set of HOBBIES - as 'select (HOBBIES.all) from HOBBIES - where $1.name = HOBBIES.person' - language 'sql' -.SH "SEE ALSO" -.PP -information(1), load(l), drop function(l). -.SH "NOTES" -.SH "Name Space Conflicts" -More than one function may be defined with the same name, as long as -the arguments they take are different. In other words, function names -can be -.IR overloaded . -A function may also have the same name as an attribute. In the case -that there is an ambiguity between a function on a complex type and -an attribute of the complex type, the attribute will always be used. -.SH "RESTRICTIONS" -The name of the C function must be a legal C function name, and the -name of the function in C code must be exactly the same as the name -used in -.BR "create function" . -There is a subtle implication of this restriction: while the -dynamic loading routines in most operating systems are more than -happy to allow you to load any number of shared libraries that -contain conflicting (identically-named) function names, they may -in fact botch the load in interesting ways. For example, if you -define a dynamically-loaded function that happens to have the -same name as a function built into Postgres, the DEC OSF/1 dynamic -loader causes Postgres to call the function within itself rather than -allowing Postgres to call your function. Hence, if you want your -function to be used on different architectures, we recommend that -you do not overload C function names. -.PP -There is a clever trick to get around the problem just described. -Since there is no problem overloading SQL functions, you can -define a set of C functions with different names and then define -a set of identically-named SQL function wrappers that take the -appropriate argument types and call the matching C function. -.PP -.IR opaque -cannot be given as an argument to a SQL function. -.SH "BUGS" -C functions cannot return a set of values. |