aboutsummaryrefslogtreecommitdiff
path: root/doc/src/sgml/ref/create_language.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/ref/create_language.sgml')
-rw-r--r--doc/src/sgml/ref/create_language.sgml400
1 files changed, 400 insertions, 0 deletions
diff --git a/doc/src/sgml/ref/create_language.sgml b/doc/src/sgml/ref/create_language.sgml
new file mode 100644
index 00000000000..57b41f7793b
--- /dev/null
+++ b/doc/src/sgml/ref/create_language.sgml
@@ -0,0 +1,400 @@
+<REFENTRY ID="SQL-CREATELANGUAGE-1">
+ <REFMETA>
+ <REFENTRYTITLE>
+ CREATE LANGUAGE
+ </REFENTRYTITLE>
+ <REFMISCINFO>SQL - Language Statements</REFMISCINFO>
+ </REFMETA>
+ <REFNAMEDIV>
+ <REFNAME>
+ CREATE LANGUAGE
+ </REFNAME>
+ <REFPURPOSE>
+ Defines a new language for functions
+ </REFPURPOSE>
+
+ <REFSYNOPSISDIV>
+ <REFSYNOPSISDIVINFO>
+ <DATE>1998-04-15</DATE>
+ </REFSYNOPSISDIVINFO>
+ <SYNOPSIS>
+ CREATE [TRUSTED] PROCEDURAL LANGUAGE '<replaceable class="parameter">langname</replaceable>'
+ HANDLER <replaceable class="parameter">call_handler</replaceable>
+ LANCOMPILER '<replaceable class="parameter">comment</replaceable>'
+ </SYNOPSIS>
+
+ <REFSECT2 ID="R2-SQL-CREATELANGUAGE-1">
+ <REFSECT2INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Inputs
+ </TITLE>
+ <PARA>
+ </PARA>
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ <function>TRUSTED</function>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ <function> TRUSTED</function> specifies that the call handler for
+ the language is safe; that is, it offers an unprivileged user
+ no functionality to get around access restrictions. If
+ this keyword is omitted when registering the language,
+ only users with the PostgreSQL superuser privilege can use
+ this language to create new functions
+ (like the 'C' language).
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+
+ <VARLISTENTRY>
+ <TERM>
+ <replaceable class="parameter">langname</replaceable>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ The name of the new procedural language.
+ The language name is case insensitive. A procedural
+ language cannot override one of the built-in languages of
+ PostgreSQL.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ <VARLISTENTRY>
+ <TERM>
+ <replaceable class="parameter">call_handler</replaceable>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ The argument for <function>HANDLER</function> is the name
+ of a previously
+ registered function that will be called to execute the PL
+ procedures.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ <VARLISTENTRY>
+ <TERM>
+ <replaceable class="parameter">comment</replaceable>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ The <function>LANCOMPILER</function> argument is the
+ string that will be
+ inserted in the <literal>LANCOMPILER</literal> attribute
+ of the new
+ <filename>pg_language</filename> entry. At present,
+ PostgreSQL doesn't use
+ this attribute in any way.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ </variablelist>
+ </LISTITEM>
+ </VARLISTENTRY>
+ </VARIABLELIST>
+ </REFSECT2>
+
+ <REFSECT2 ID="R2-SQL-CREATELANGUAGE-2">
+ <REFSECT2INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Outputs
+ </TITLE>
+ <PARA>
+ </PARA>
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ <VARIABLELIST>
+ <VARLISTENTRY>
+ <TERM>
+ <ReturnValue>CREATE</ReturnValue>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ This message is returned if the language is successfully
+ created.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ <VARLISTENTRY>
+ <TERM>
+ <ReturnValue>ERROR: PL handler function <replaceable class="parameter">funcname</replaceable>() doesn't exist</ReturnValue>
+ </TERM>
+ <LISTITEM>
+ <PARA>
+ This error is returned if the function
+ <replaceable class="parameter">funcname</replaceable>()
+ is not found.
+ </PARA>
+ </LISTITEM>
+ </VARLISTENTRY>
+ </variablelist>
+ </LISTITEM>
+ </VARLISTENTRY>
+ </VARIABLELIST>
+ </REFSECT2>
+ </REFSYNOPSISDIV>
+
+ <REFSECT1 ID="R1-SQL-CREATELANGUAGE-1">
+ <REFSECT1INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT1INFO>
+ <TITLE>
+ Description
+ </TITLE>
+ <PARA>
+ Using <command>CREATE LANGUAGE</command>, a PostgreSQL user can register
+ a new language with PostgreSQL. Subsequently, functions and
+ trigger procedures can be defined in this new language.
+ The user must have the PostgreSQL superuser privilege to
+ register a new language.
+ </PARA>
+
+ <REFSECT2 ID="R2-SQL-CREATELANGUAGE-3">
+ <REFSECT2INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Writing PL handlers
+ </TITLE>
+ <PARA>
+ The call handler for a procedural language must be written
+ in a compiler language such as 'C' and registered with
+ PostgreSQL as a function taking no arguments and returning
+ opaque type.
+ <comment>What does `opaque type' mean?</comment>
+ This prevents the call handler from being
+ called directly as a function from queries.
+ </para>
+ <para>
+ However, arguments must be supplied on the actual call when a
+ PL function or trigger
+ procedure in the language offered by the handler is to be
+ executed.
+ <itemizedlist>
+ <listitem>
+ <para>
+ When called from the trigger manager, the only argument is
+ the object ID from the procedure's <filename>pg_proc</filename>
+ entry. All other
+ information from the trigger manager is found in the
+ global <structname>CurrentTriggerData</structname> pointer.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When called from the function manager, the arguments are
+ the object ID of the procedure's <filename>pg_proc</filename>
+ entry, the number
+ of arguments given to the PL function, the arguments in a
+ <structname>FmgrValues</structname> structure and a pointer
+ to a boolean where the
+ function tells the caller if the return value is the SQL
+ NULL value.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </PARA>
+ <para>
+ It's up to the call handler to fetch the
+ <filename>pg_proc</filename> entry and
+ to analyze the argument and return types of the called
+ procedure. The <function>AS</function> clause from the
+ <command>CREATE FUNCTION</command> of
+ the procedure will be found in the <literal>prosrc</literal>
+ attribute of the
+ <filename>pg_proc</filename> entry. This may be the
+ source text in the procedural
+ language itself (like for PL/Tcl), a pathname to a
+ file or anything else that tells the call handler what to
+ do in detail.
+ </para>
+
+ <REFSECT2 ID="R2-SQL-CREATELANGUAGE-4">
+ <REFSECT2INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ Notes
+ </TITLE>
+ <PARA>
+ Use <citerefentry>
+ <refentrytitle>CREATE FUNCTION</refentrytitle>
+ </citerefentry>
+ to create a function.
+ </para>
+ <para>
+ Use <citerefentry>
+ <refentrytitle>DROP LANGUAGE</refentrytitle>
+ </citerefentry> to drop procedural languages.
+ </para>
+ <para>
+ Refer to the table <filename>pg_language</filename>
+ for further information:
+ <programlisting>
+ <computeroutput>
+ Table = pg_language
+ +--------------------------+--------------------------+-------+
+ | Field | Type | Length|
+ +--------------------------+--------------------------+-------+
+ | lanname | name | 32 |
+ | lancompiler | text | var |
+ +--------------------------+--------------------------+-------+
+
+ lanname |lancompiler
+ --------+--------------
+ internal|n/a
+ lisp |/usr/ucb/liszt
+ C |/bin/cc
+ sql |postgres
+ </computeroutput>
+ </programlisting>
+ </para>
+ </refsect2>
+ </refsect1>
+
+ <REFSECT1 ID="R1-SQL-CREATELANGUAGE-4">
+ <TITLE>
+ Restrictions
+ </TITLE>
+ <PARA>
+ Since the call handler for a procedural language must be
+ registered with PostgreSQL in the 'C' language, it inherits
+ all the restrictions of 'C' functions.
+ <comment>
+ What are these restrictions?
+ </comment>
+ </para>
+ </refsect1>
+ <REFSECT1 ID="R1-SQL-CREATELANGUAGE-5">
+ <TITLE>
+ Bugs
+ </TITLE>
+ <PARA>
+ At present, the definitions for a procedural language cannot be
+ changed once they have been created.
+ </para>
+ </refsect1>
+
+ <REFSECT1 ID="R1-SQL-CREATELANGUAGE-6">
+ <TITLE>
+ Usage
+ </TITLE>
+ <PARA>
+ This is a template for a PL handler written in 'C':
+ </PARA>
+ <ProgramListing>
+ #include "executor/spi.h"
+ #include "commands/trigger.h"
+ #include "utils/elog.h"
+ #include "fmgr.h" /* for FmgrValues struct */
+ #include "access/heapam.h"
+ #include "utils/syscache.h"
+ #include "catalog/pg_proc.h"
+ #include "catalog/pg_type.h"
+
+ Datum
+ plsample_call_handler(
+ Oid prooid,
+ int pronargs,
+ FmgrValues *proargs,
+ bool *isNull)
+ {
+ Datum retval;
+ TriggerData *trigdata;
+
+ if (CurrentTriggerData == NULL) {
+ /*
+ * Called as a function
+ */
+
+ retval = ...
+ } else {
+ /*
+ * Called as a trigger procedure
+ */
+ trigdata = CurrentTriggerData;
+ CurrentTriggerData = NULL;
+
+ retval = ...
+ }
+
+ *isNull = false;
+ return retval;
+ }
+ </ProgramListing>
+ <para>
+ Only a few thousand lines of code have to be added instead
+ of the dots to complete the PL call handler. See <citerefentry>
+ <refentrytitle>CREATE FUNCTION</refentrytitle>
+ </citerefentry> for information on how to compile
+ it into a loadable module
+.</para>
+ <para>
+ The following commands then register the sample procedural
+ language.</para>
+ <programlisting>
+ CREATE FUNCTION plsample_call_handler () RETURNS opaque
+ AS '/usr/local/pgsql/lib/plsample.so'
+ LANGUAGE 'C';
+
+ CREATE PROCEDURAL LANGUAGE 'plsample'
+ HANDLER plsample_call_handler
+ LANCOMPILER 'PL/Sample';
+ </programlisting>
+ </REFSECT1>
+
+ <REFSECT1 ID="R1-SQL-CREATELANGUAGE-7">
+ <TITLE>
+ Compatibility
+ </TITLE>
+ <PARA>
+ CREATE LANGUAGE is a PostgreSQL extension.
+ </PARA>
+
+ <REFSECT2 ID="R2-SQL-CREATELANGUAGE-5">
+ <REFSECT2INFO>
+ <DATE>1998-04-15</DATE>
+ </REFSECT2INFO>
+ <TITLE>
+ SQL92
+ </TITLE>
+ <PARA>
+ There is no CREATE LANGUAGE statement in SQL92.
+ </PARA>
+ </refsect2>
+ </refsect1>
+</REFENTRY>
+
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:"../reference.ced"
+sgml-exposed-tags:nil
+sgml-local-catalogs:"/usr/lib/sgml/catalog"
+sgml-local-ecat-files:nil
+End:
+-->