|
|
|
|
@ -1,252 +1,196 @@ |
|
|
|
|
<!-- |
|
|
|
|
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_language.sgml,v 1.16 2001/09/03 12:57:49 petere Exp $ |
|
|
|
|
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_language.sgml,v 1.17 2001/09/06 10:28:39 petere Exp $ |
|
|
|
|
Postgres documentation |
|
|
|
|
--> |
|
|
|
|
|
|
|
|
|
<refentry id="SQL-CREATELANGUAGE"> |
|
|
|
|
<docinfo> |
|
|
|
|
<date>2001-09-05</date> |
|
|
|
|
</docinfo> |
|
|
|
|
|
|
|
|
|
<refmeta> |
|
|
|
|
<refentrytitle id="sql-createlanguage-title"> |
|
|
|
|
CREATE LANGUAGE |
|
|
|
|
</refentrytitle> |
|
|
|
|
<refentrytitle id="sql-createlanguage-title">CREATE LANGUAGE</refentrytitle> |
|
|
|
|
<refmiscinfo>SQL - Language Statements</refmiscinfo> |
|
|
|
|
</refmeta> |
|
|
|
|
|
|
|
|
|
<refnamediv> |
|
|
|
|
<refname> |
|
|
|
|
CREATE LANGUAGE |
|
|
|
|
</refname> |
|
|
|
|
<refpurpose> |
|
|
|
|
define a new procedural language |
|
|
|
|
</refpurpose> |
|
|
|
|
<refname>CREATE LANGUAGE</refname> |
|
|
|
|
<refpurpose>define a new procedural language</refpurpose> |
|
|
|
|
</refnamediv> |
|
|
|
|
|
|
|
|
|
<refsynopsisdiv> |
|
|
|
|
<refsynopsisdivinfo> |
|
|
|
|
<date>1999-07-20</date> |
|
|
|
|
</refsynopsisdivinfo> |
|
|
|
|
<synopsis> |
|
|
|
|
<synopsis> |
|
|
|
|
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE <replaceable class="parameter">langname</replaceable> |
|
|
|
|
HANDLER <replaceable class="parameter">call_handler</replaceable> |
|
|
|
|
</synopsis> |
|
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATELANGUAGE-1"> |
|
|
|
|
<refsect2info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect2info> |
|
|
|
|
<title> |
|
|
|
|
Inputs |
|
|
|
|
</title> |
|
|
|
|
<para> |
|
|
|
|
|
|
|
|
|
<variablelist> |
|
|
|
|
<varlistentry> |
|
|
|
|
<term>TRUSTED</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 bypass access restrictions. If |
|
|
|
|
this keyword is omitted when registering the language, |
|
|
|
|
only users with the <productname>Postgres</productname> |
|
|
|
|
superuser privilege can use |
|
|
|
|
this language to create new functions. |
|
|
|
|
</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 |
|
|
|
|
<productname>Postgres</productname>. |
|
|
|
|
</para> |
|
|
|
|
<para> |
|
|
|
|
For backward compatibility, the name may be enclosed by single |
|
|
|
|
quotes. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
<varlistentry> |
|
|
|
|
<term>HANDLER <replaceable class="parameter">call_handler</replaceable></term> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable class="parameter">call_handler</replaceable> is the name |
|
|
|
|
of a previously |
|
|
|
|
registered function that will be called to execute the PL |
|
|
|
|
procedures. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
</variablelist> |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
</refsect2> |
|
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATELANGUAGE-2"> |
|
|
|
|
<refsect2info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect2info> |
|
|
|
|
<title> |
|
|
|
|
Outputs |
|
|
|
|
</title> |
|
|
|
|
<para> |
|
|
|
|
|
|
|
|
|
<variablelist> |
|
|
|
|
<varlistentry> |
|
|
|
|
<term><computeroutput> |
|
|
|
|
CREATE |
|
|
|
|
</computeroutput></term> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
This message is returned if the language is successfully |
|
|
|
|
created. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
<varlistentry> |
|
|
|
|
<term><computeroutput> |
|
|
|
|
ERROR: PL handler function <replaceable class="parameter">funcname</replaceable>() doesn't exist |
|
|
|
|
</computeroutput></term> |
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
This error is returned if the function |
|
|
|
|
<replaceable class="parameter">funcname</replaceable>() |
|
|
|
|
is not found. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
</variablelist> |
|
|
|
|
</para> |
|
|
|
|
</refsect2> |
|
|
|
|
</synopsis> |
|
|
|
|
</refsynopsisdiv> |
|
|
|
|
|
|
|
|
|
<refsect1 id="R1-SQL-CREATELANGUAGE-1"> |
|
|
|
|
<refsect1info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect1info> |
|
|
|
|
<title> |
|
|
|
|
Description |
|
|
|
|
</title> |
|
|
|
|
<refsect1 id="sql-createlanguage-description"> |
|
|
|
|
<title>Description</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Using <command>CREATE LANGUAGE</command>, a |
|
|
|
|
<productname>Postgres</productname> user can register |
|
|
|
|
a new language with <productname>Postgres</productname>. |
|
|
|
|
Subsequently, functions and |
|
|
|
|
trigger procedures can be defined in this new language. |
|
|
|
|
The user must have the <productname>Postgres</productname> |
|
|
|
|
superuser privilege to |
|
|
|
|
Using <command>CREATE LANGUAGE</command>, a |
|
|
|
|
<productname>PostgreSQL</productname> user can register a new |
|
|
|
|
procedural language with a <productname>PostgreSQL</productname> |
|
|
|
|
database. Subsequently, functions and trigger procedures can be |
|
|
|
|
defined in this new language. The user must have the |
|
|
|
|
<productname>PostgreSQL</productname> superuser privilege to |
|
|
|
|
register a new language. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATELANGUAGE-3"> |
|
|
|
|
<refsect2info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect2info> |
|
|
|
|
<title> |
|
|
|
|
Writing PL handlers |
|
|
|
|
</title> |
|
|
|
|
<para> |
|
|
|
|
<command>CREATE LANGUAGE</command> effectively associates the |
|
|
|
|
language name with a call handler that is responsible for executing |
|
|
|
|
functions written in the language. Refer to the |
|
|
|
|
<citetitle>Programmer's Guide</citetitle> for more information |
|
|
|
|
about language call handlers. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Note that procedural languages are local to individual databases. |
|
|
|
|
To make a language available in all databases by default, it should |
|
|
|
|
be installed into the <literal>template1</literal> database. |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="sql-createlanguage-parameters"> |
|
|
|
|
<title>Parameters</title> |
|
|
|
|
|
|
|
|
|
<variablelist> |
|
|
|
|
<varlistentry> |
|
|
|
|
<term><literal>TRUSTED</literal></term> |
|
|
|
|
|
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<literal>TRUSTED</literal> specifies that the call handler for |
|
|
|
|
the language is safe, that is, it does not offer an |
|
|
|
|
unprivileged user any functionality to bypass access |
|
|
|
|
restrictions. If this keyword is omitted when registering the |
|
|
|
|
language, only users with the |
|
|
|
|
<productname>PostgreSQL</productname> superuser privilege can |
|
|
|
|
use this language to create new functions. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
<varlistentry> |
|
|
|
|
<term><literal>PROCEDURAL</literal></term> |
|
|
|
|
|
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
This is a noise word. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
<note> |
|
|
|
|
<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 <productname>PostgreSQL</productname>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
For backward compatibility, the name may be enclosed by single |
|
|
|
|
quotes. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
|
|
|
|
|
<varlistentry> |
|
|
|
|
<term><literal>HANDLER</literal> <replaceable class="parameter">call_handler</replaceable></term> |
|
|
|
|
|
|
|
|
|
<listitem> |
|
|
|
|
<para> |
|
|
|
|
<replaceable class="parameter">call_handler</replaceable> is |
|
|
|
|
the name of a previously registered function that will be |
|
|
|
|
called to execute the procedural language functions. The call |
|
|
|
|
handler for a procedural language must be written in a compiled |
|
|
|
|
language such as C with version 1 call convention and |
|
|
|
|
registered with <productname>PostgreSQL</productname> as a |
|
|
|
|
function taking no arguments and returning the |
|
|
|
|
<type>opaque</type> type, a placeholder for unspecified or |
|
|
|
|
undefined types. |
|
|
|
|
</para> |
|
|
|
|
</listitem> |
|
|
|
|
</varlistentry> |
|
|
|
|
</variablelist> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="sql-createlanguage-diagnostics"> |
|
|
|
|
<title>Diagnostics</title> |
|
|
|
|
|
|
|
|
|
<msgset> |
|
|
|
|
<msgentry> |
|
|
|
|
<msg> |
|
|
|
|
<msgmain> |
|
|
|
|
<msgtext> |
|
|
|
|
<screen> |
|
|
|
|
CREATE |
|
|
|
|
</screen> |
|
|
|
|
</msgtext> |
|
|
|
|
</msgmain> |
|
|
|
|
</msg> |
|
|
|
|
|
|
|
|
|
<msgexplan> |
|
|
|
|
<para> |
|
|
|
|
In <productname>Postgres</productname> 7.1 and later, call handlers |
|
|
|
|
must adhere to the "version 1" function manager interface, not the |
|
|
|
|
old-style interface. |
|
|
|
|
This message is returned if the language is successfully |
|
|
|
|
created. |
|
|
|
|
</para> |
|
|
|
|
</note> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The call handler for a procedural language must be written |
|
|
|
|
in a compiled language such as C and registered with |
|
|
|
|
<productname>Postgres</productname> as a function taking |
|
|
|
|
no arguments and returning the |
|
|
|
|
<type>opaque</type> type, a placeholder for unspecified or undefined types. |
|
|
|
|
This prevents the call handler from being |
|
|
|
|
called directly as a function from queries. |
|
|
|
|
(However, arguments may be supplied in the actual call when a |
|
|
|
|
PL function in the language offered by the handler is to be executed.) |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The call handler is called in the same way as any other |
|
|
|
|
function: it receives a pointer to a FunctionCallInfoData struct |
|
|
|
|
containing argument values and information about the called function, |
|
|
|
|
and it is expected to return a Datum result (and possibly set the |
|
|
|
|
<literal>isnull</literal> field of the FunctionCallInfoData struct, |
|
|
|
|
if it wishes to return an SQL NULL result). The difference between |
|
|
|
|
a call handler and an ordinary callee function is that the |
|
|
|
|
<literal>flinfo->fn_oid</literal> field of the FunctionCallInfoData |
|
|
|
|
struct will contain the OID of the PL function to be called, not of |
|
|
|
|
the call handler itself. The call handler must use this field to |
|
|
|
|
determine which function to execute. Also, the passed argument list |
|
|
|
|
has been set up according to the declaration of the target PL function, |
|
|
|
|
not of the call handler. |
|
|
|
|
</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 AS 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> table 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> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Often, the same function is called many times per SQL statement. |
|
|
|
|
A call handler can avoid repeated lookups of information about the |
|
|
|
|
called function by using the <literal>flinfo->fn_extra</literal> field. |
|
|
|
|
This will initially be NULL, but can be set by the call handler to |
|
|
|
|
point at information about the PL function. On subsequent calls, |
|
|
|
|
if <literal>flinfo->fn_extra</literal> is already non-NULL then it |
|
|
|
|
can be used and the information lookup step skipped. The call handler |
|
|
|
|
must be careful that <literal>flinfo->fn_extra</literal> is made to |
|
|
|
|
point at memory that will live at least until the end of the current |
|
|
|
|
query, since an FmgrInfo data structure could be kept that long. |
|
|
|
|
One way to do this is to allocate the extra data in the memory context |
|
|
|
|
specified by <literal>flinfo->fn_mcxt</literal>; such data will |
|
|
|
|
normally have the same lifespan as the FmgrInfo itself. But the handler |
|
|
|
|
could also choose to use a longer-lived context so that it can cache |
|
|
|
|
function definition information across queries. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
When a PL function is invoked as a trigger, no explicit arguments |
|
|
|
|
are passed, but the FunctionCallInfoData's |
|
|
|
|
<literal>context</literal> field points at a TriggerData node, |
|
|
|
|
rather than being NULL as it is in a plain function call. |
|
|
|
|
A PL handler should provide mechanisms for PL functions to get |
|
|
|
|
at the trigger information. |
|
|
|
|
</para> |
|
|
|
|
</refsect2> |
|
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATELANGUAGE-4"> |
|
|
|
|
<refsect2info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect2info> |
|
|
|
|
<title> |
|
|
|
|
Notes |
|
|
|
|
</title> |
|
|
|
|
<para> |
|
|
|
|
Use <command>CREATE FUNCTION</command> |
|
|
|
|
to create a function. |
|
|
|
|
</para> |
|
|
|
|
<para> |
|
|
|
|
Use <command>DROP LANGUAGE</command> to drop procedural languages. |
|
|
|
|
</para> |
|
|
|
|
<para> |
|
|
|
|
Refer to the table <filename>pg_language</filename> |
|
|
|
|
for further information: |
|
|
|
|
<programlisting> |
|
|
|
|
<computeroutput> |
|
|
|
|
</msgexplan> |
|
|
|
|
</msgentry> |
|
|
|
|
|
|
|
|
|
<msgentry> |
|
|
|
|
<msg> |
|
|
|
|
<msgmain> |
|
|
|
|
<msgtext> |
|
|
|
|
<screen> |
|
|
|
|
ERROR: PL handler function <replaceable class="parameter">funcname</replaceable>() doesn't exist |
|
|
|
|
</screen> |
|
|
|
|
</msgtext> |
|
|
|
|
</msgmain> |
|
|
|
|
</msg> |
|
|
|
|
|
|
|
|
|
<msgexplan> |
|
|
|
|
<para> |
|
|
|
|
This error is returned if the function <replaceable |
|
|
|
|
class="parameter">funcname</replaceable>() is not found. |
|
|
|
|
</para> |
|
|
|
|
</msgexplan> |
|
|
|
|
</msgentry> |
|
|
|
|
</msgset> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="sql-createlanguage-notes"> |
|
|
|
|
<title>Notes</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
This command normally should not be executed directly by users. |
|
|
|
|
For the procedural languages supplied in the |
|
|
|
|
<productname>PostgreSQL</productname> distribution, the <xref |
|
|
|
|
linkend="app-createlang"> program should be used, which will also |
|
|
|
|
install the correct call handler. (<command>createlang</command> |
|
|
|
|
will call <command>CREATE LANGUAGE</command> internally.) |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Use the <xref linkend="sql-createfunction"> command to create a new |
|
|
|
|
function. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Use <xref linkend="sql-droplanguage">, or better yet the <xref |
|
|
|
|
linkend="app-droplang"> program, to drop procedural languages. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The system catalog <classname>pg_language</classname> records |
|
|
|
|
information about the currently installed procedural languages. |
|
|
|
|
|
|
|
|
|
<screen> |
|
|
|
|
Table "pg_language" |
|
|
|
|
Attribute | Type | Modifier |
|
|
|
|
---------------+---------+---------- |
|
|
|
|
@ -261,107 +205,61 @@ ERROR: PL handler function <replaceable class="parameter">funcname</replaceable |
|
|
|
|
internal | f | f | 0 | n/a |
|
|
|
|
C | f | f | 0 | /bin/cc |
|
|
|
|
sql | f | f | 0 | postgres |
|
|
|
|
</computeroutput> |
|
|
|
|
</programlisting> |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The call handler for a procedural language must normally be written |
|
|
|
|
in C and registered as 'internal' or 'C' language, depending |
|
|
|
|
on whether it is linked into the backend or dynamically loaded. |
|
|
|
|
The call handler cannot use the old-style 'C' function interface. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
At present, the definitions for a procedural language cannot be |
|
|
|
|
changed once they have been created. |
|
|
|
|
</para> |
|
|
|
|
</refsect2> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="R1-SQL-CREATELANGUAGE-6"> |
|
|
|
|
<title> |
|
|
|
|
Usage |
|
|
|
|
</title> |
|
|
|
|
<para> |
|
|
|
|
This is a template for a PL handler written in C: |
|
|
|
|
<programlisting> |
|
|
|
|
#include "executor/spi.h" |
|
|
|
|
#include "commands/trigger.h" |
|
|
|
|
#include "utils/elog.h" |
|
|
|
|
#include "fmgr.h" |
|
|
|
|
#include "access/heapam.h" |
|
|
|
|
#include "utils/syscache.h" |
|
|
|
|
#include "catalog/pg_proc.h" |
|
|
|
|
#include "catalog/pg_type.h" |
|
|
|
|
|
|
|
|
|
PG_FUNCTION_INFO_V1(plsample_call_handler); |
|
|
|
|
|
|
|
|
|
Datum |
|
|
|
|
plsample_call_handler(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
Datum retval; |
|
|
|
|
|
|
|
|
|
if (CALLED_AS_TRIGGER(fcinfo)) |
|
|
|
|
{ |
|
|
|
|
/* |
|
|
|
|
* Called as a trigger procedure |
|
|
|
|
*/ |
|
|
|
|
TriggerData *trigdata = (TriggerData *) fcinfo->context; |
|
|
|
|
|
|
|
|
|
retval = ... |
|
|
|
|
} else { |
|
|
|
|
/* |
|
|
|
|
* Called as a function |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
retval = ... |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return retval; |
|
|
|
|
} |
|
|
|
|
</programlisting> |
|
|
|
|
</screen> |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Only a few thousand lines of code have to be added instead |
|
|
|
|
of the dots to complete the PL call handler. |
|
|
|
|
See <command>CREATE FUNCTION</command> for information on how to compile |
|
|
|
|
it into a loadable module. |
|
|
|
|
At present, the definition of a procedural language cannot be |
|
|
|
|
changed once is has been created. |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="sql-createlanguage-examples"> |
|
|
|
|
<title>Examples</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The following commands then register the sample procedural |
|
|
|
|
language: |
|
|
|
|
<programlisting> |
|
|
|
|
The following two commands executed in sequence will register a new |
|
|
|
|
procedural language and the associated call handler. |
|
|
|
|
<programlisting> |
|
|
|
|
CREATE FUNCTION plsample_call_handler () RETURNS opaque |
|
|
|
|
AS '/usr/local/pgsql/lib/plsample.so' |
|
|
|
|
LANGUAGE C; |
|
|
|
|
CREATE LANGUAGE plsample |
|
|
|
|
HANDLER plsample_call_handler; |
|
|
|
|
</programlisting> |
|
|
|
|
</programlisting> |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="sql-createlanguage-compat"> |
|
|
|
|
<title>Compatibility</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
<command>CREATE LANGUAGE</command> is a |
|
|
|
|
<productname>PostgreSQL</productname> extension. |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1 id="R1-SQL-CREATELANGUAGE-7"> |
|
|
|
|
<title> |
|
|
|
|
Compatibility |
|
|
|
|
</title> |
|
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATELANGUAGE-5"> |
|
|
|
|
<refsect2info> |
|
|
|
|
<date>1998-09-09</date> |
|
|
|
|
</refsect2info> |
|
|
|
|
<title> |
|
|
|
|
SQL92 |
|
|
|
|
</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
<command>CREATE LANGUAGE</command> |
|
|
|
|
is a <productname>Postgres</productname> extension. |
|
|
|
|
There is no <command>CREATE LANGUAGE</command> statement in |
|
|
|
|
<acronym>SQL92</acronym>. |
|
|
|
|
</para> |
|
|
|
|
</refsect2> |
|
|
|
|
<refsect1> |
|
|
|
|
<title>History</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The <command>CREATE LANGUAGE</command> command first appeared in |
|
|
|
|
<productname>PostgreSQL</productname> 6.3. |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
|
|
|
|
|
<refsect1> |
|
|
|
|
<title>See Also</title> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
<simplelist type="inline"> |
|
|
|
|
<member><xref linkend="app-createlang"></member> |
|
|
|
|
<member><xref linkend="sql-createfunction"></member> |
|
|
|
|
<member><xref linkend="app-droplang"></member> |
|
|
|
|
<member><xref linkend="sql-droplanguage"></member> |
|
|
|
|
<member><citetitle>PostgreSQL Programmer's Guide</citetitle></member> |
|
|
|
|
</simplelist> |
|
|
|
|
</para> |
|
|
|
|
</refsect1> |
|
|
|
|
</refentry> |
|
|
|
|
|
|
|
|
|
|