create_language.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. <refentry id="SQL-CREATELANGUAGE">
  2.  <refmeta>
  3.   <refentrytitle>
  4.    CREATE LANGUAGE
  5.   </refentrytitle>
  6.   <refmiscinfo>SQL - Language Statements</refmiscinfo>
  7.  </refmeta>
  8.  <refnamediv>
  9.   <refname>
  10.    CREATE LANGUAGE
  11.   </refname>
  12.   <refpurpose>
  13.    Defines a new language for functions
  14.   </refpurpose>
  15.  </refnamediv>
  16.  <refsynopsisdiv>
  17.   <refsynopsisdivinfo>
  18.    <date>1998-09-09</date>
  19.   </refsynopsisdivinfo>
  20.   <synopsis>
  21. CREATE [ TRUSTED ] PROCEDURAL LANGUAGE '<replaceable class="parameter">langname</replaceable>'
  22.     HANDLER <replaceable class="parameter">call_handler</replaceable>
  23.     LANCOMPILER '<replaceable class="parameter">comment</replaceable>'
  24.   </synopsis>
  25.   
  26.   <refsect2 id="R2-SQL-CREATELANGUAGE-1">
  27.    <refsect2info>
  28.     <date>1998-09-09</date>
  29.    </refsect2info>
  30.    <title>
  31.     Inputs
  32.    </title>
  33.    <para>
  34.     <variablelist>
  35.      <varlistentry>
  36.       <term>TRUSTED</term>
  37.       <listitem>
  38.        <para>
  39. <function> TRUSTED</function> specifies that the call handler for
  40. the language is safe; that is, it offers an unprivileged user
  41. no functionality to bypass access restrictions. If
  42. this keyword is omitted when registering the language,
  43. only users with the <productname>Postgres</productname>
  44. superuser privilege can use
  45. this language to create new functions
  46. (like the 'C' language).  
  47.        </para>
  48.       </listitem>
  49.      </varlistentry>
  50.      <varlistentry>
  51.       <term><replaceable class="parameter">langname</replaceable></term>
  52.       <listitem>
  53.        <para>   
  54. The name of the new procedural language.
  55. The language name is case insensitive. A procedural 
  56. language cannot override one of the built-in languages of
  57. <productname>Postgres</productname>.
  58.        </para>
  59.       </listitem>
  60.      </varlistentry> 
  61.      <varlistentry>
  62.       <term>HANDLER <replaceable class="parameter">call_handler</replaceable></term>
  63.       <listitem>
  64.        <para>
  65. <replaceable class="parameter">call_handler</replaceable> is the name
  66. of a previously
  67. registered function that will be called to execute the PL
  68. procedures.
  69.        </para>
  70.       </listitem>
  71.      </varlistentry>
  72.      <varlistentry>
  73.       <term><replaceable class="parameter">comment</replaceable></term>
  74.       <listitem>
  75.        <para>
  76. The <function>LANCOMPILER</function> argument is the
  77. string that will be
  78. inserted in the <literal>LANCOMPILER</literal> attribute
  79. of the new
  80. <filename>pg_language</filename> entry. At present,
  81. <productname>Postgres</productname> does not use
  82. this attribute in any way.
  83.        </para>
  84.       </listitem>
  85.      </varlistentry>
  86.     </variablelist>
  87.    </para>
  88.    
  89.   </refsect2>
  90.   
  91.   <refsect2 id="R2-SQL-CREATELANGUAGE-2">
  92.    <refsect2info>
  93.     <date>1998-09-09</date>
  94.    </refsect2info>
  95.    <title>
  96.     Outputs
  97.    </title>
  98.    <para>
  99.     <variablelist>
  100.      <varlistentry>
  101.       <term><computeroutput>
  102. CREATE
  103.        </computeroutput></term>
  104.       <listitem>
  105.        <para>
  106. This message is returned if the language is successfully
  107. created.
  108.        </para>
  109.       </listitem>
  110.      </varlistentry>
  111.      <varlistentry>
  112.       <term><computeroutput>
  113. ERROR:  PL handler function <replaceable class="parameter">funcname</replaceable>() doesn't exist
  114.        </computeroutput></term>
  115.       <listitem>
  116.        <para>
  117. This error is returned if the function
  118. <replaceable class="parameter">funcname</replaceable>()
  119. is not found.
  120.        </para>
  121.       </listitem>
  122.      </varlistentry>
  123.     </variablelist>
  124.    </para>
  125.   </refsect2>
  126.  </refsynopsisdiv>
  127.  <refsect1 id="R1-SQL-CREATELANGUAGE-1">
  128.   <refsect1info>
  129.    <date>1998-09-09</date>
  130.   </refsect1info>
  131.   <title>
  132.    Description
  133.   </title>
  134.   <para>
  135.    Using <command>CREATE LANGUAGE</command>, a 
  136.    <productname>Postgres</productname> user can register
  137.    a new language with <productname>Postgres</productname>. 
  138.    Subsequently, functions and
  139.    trigger procedures can be defined in this new language.
  140.    The user must have the <productname>Postgres</productname>
  141.    superuser privilege to
  142.    register a new language.
  143.   </para>
  144.   <refsect2 id="R2-SQL-CREATELANGUAGE-3">
  145.    <refsect2info>
  146.     <date>1998-09-09</date>
  147.    </refsect2info>
  148.    <title>
  149.     Writing PL handlers
  150.    </title>
  151.    <para>
  152.     The call handler for a procedural language must be written
  153.     in a compiler language such as 'C' and registered with
  154.     <productname>Postgres</productname> as a function taking
  155.     no arguments and returning the
  156.     <type>opaque</type> type, a placeholder for unspecified or undefined types..
  157.     This prevents the call handler from being
  158.     called directly as a function from queries.
  159.    </para>
  160.    <para>
  161.     However, arguments must be supplied on the actual call when a
  162.     PL function or trigger
  163.     procedure in the language offered by the handler is to be
  164.     executed.
  165.     <itemizedlist>
  166.      <listitem>
  167.       <para>
  168.        When called from the trigger manager, the only argument is
  169.        the object ID from the procedure's <filename>pg_proc</filename>
  170.        entry. All other
  171.        information from the trigger manager is found in the
  172.        global <structname>CurrentTriggerData</structname> pointer.
  173.       </para>
  174.      </listitem>
  175.      <listitem>
  176.       <para>
  177.        When called from the function manager, the arguments are
  178.        the object ID of the procedure's <filename>pg_proc</filename>
  179.        entry, the number
  180.        of arguments given to the PL function, the arguments in a
  181.        <structname>FmgrValues</structname> structure and a pointer
  182.        to a boolean where the
  183.        function tells the caller if the return value is the SQL
  184.        NULL value.
  185.       </para>
  186.      </listitem>
  187.     </itemizedlist>
  188.    </para>
  189.    <para>
  190.     It's up to the call handler to fetch the
  191.     <filename>pg_proc</filename> entry and
  192.     to analyze the argument and return types of the called
  193.     procedure. The AS clause from the
  194.     <command>CREATE FUNCTION</command> of
  195.     the procedure will be found in the <literal>prosrc</literal>
  196.     attribute of the
  197.     <filename>pg_proc</filename> table entry. This may be the
  198.     source text in the procedural
  199.     language itself (like for PL/Tcl), a pathname to a
  200.     file or anything else that tells the call handler what to
  201.     do in detail.
  202.    </para>
  203.   </refsect2>
  204.    
  205.   <refsect2 id="R2-SQL-CREATELANGUAGE-4">
  206.    <refsect2info>
  207.     <date>1998-09-09</date>
  208.    </refsect2info>
  209.    <title>
  210.     Notes
  211.    </title>
  212.    <para>
  213.     Use <command>CREATE FUNCTION</command>
  214.     to create a function.
  215.    </para>
  216.    <para>
  217.     Use <command>DROP LANGUAGE</command>  to drop procedural languages.
  218.    </para>
  219.    <para>
  220.     Refer to the table <filename>pg_language</filename>
  221.     for further information:
  222.     <programlisting>
  223.      <computeroutput>
  224. Table    = pg_language
  225. +--------------------------+--------------------------+-------+
  226. |          Field           |          Type            | Length|
  227. +--------------------------+--------------------------+-------+
  228. | lanname                  | name                     |    32 |
  229. | lancompiler              | text                     |   var |
  230. +--------------------------+--------------------------+-------+
  231. lanname |lancompiler   
  232. --------+--------------
  233. internal|n/a           
  234. lisp    |/usr/ucb/liszt
  235. C       |/bin/cc       
  236. sql     |postgres
  237.      </computeroutput>
  238.     </programlisting>
  239.    </para>
  240.   </refsect2>
  241.  </refsect1>
  242.  <refsect1 id="R1-SQL-CREATELANGUAGE-4">
  243.   <title>
  244.    Restrictions
  245.   </title>
  246.   <para>
  247.    Since the call handler for a procedural language must be
  248.    registered with <productname>Postgres</productname> in the 'C' language,
  249.    it inherits
  250.    all the capabilities and restrictions of 'C' functions.
  251.   </para>
  252.  </refsect1>
  253.  <refsect1 id="R1-SQL-CREATELANGUAGE-5">
  254.   <title>
  255.    Bugs
  256.   </title>
  257.   <para> 
  258.    At present, the definitions for a procedural language cannot be
  259.    changed once they have been created.
  260.   </para>
  261.  </refsect1>
  262.  
  263.  <refsect1 id="R1-SQL-CREATELANGUAGE-6">
  264.   <title>
  265.    Usage
  266.   </title>
  267.   <para>
  268.    This is a template for a PL handler written in 'C':
  269.    <programlisting>
  270. #include "executor/spi.h"
  271. #include "commands/trigger.h"
  272. #include "utils/elog.h"
  273. #include "fmgr.h"        /* for FmgrValues struct */
  274. #include "access/heapam.h"
  275. #include "utils/syscache.h"
  276. #include "catalog/pg_proc.h"
  277. #include "catalog/pg_type.h"
  278. Datum
  279. plsample_call_handler(
  280.      Oid       prooid,
  281.      int       pronargs,
  282.      FmgrValues     *proargs,
  283.      bool      *isNull)
  284. {
  285.      Datum          retval;
  286.      TriggerData    *trigdata;
  287.      if (CurrentTriggerData == NULL) {
  288.           /*
  289.            * Called as a function
  290.            */
  291.           retval = ...
  292.      } else {
  293.           /*
  294.            * Called as a trigger procedure
  295.            */
  296.           trigdata = CurrentTriggerData;
  297.           CurrentTriggerData = NULL;
  298.           retval = ...
  299.      }
  300.      *isNull = false;
  301.      return retval;
  302. }
  303.    </programlisting>
  304.   </para>
  305.   <para>
  306.    Only a few thousand lines of code have to be added instead
  307.    of the dots to complete the PL call handler. 
  308.    See <command>CREATE FUNCTION</command> for information on how to compile
  309.    it into a loadable module.
  310.   </para>
  311.   <para>
  312.    The following commands then register the sample procedural
  313.    language:
  314.    <programlisting>
  315. CREATE FUNCTION plsample_call_handler () RETURNS opaque
  316.     AS '/usr/local/pgsql/lib/plsample.so'
  317.     LANGUAGE 'C';
  318. CREATE PROCEDURAL LANGUAGE 'plsample'
  319.     HANDLER plsample_call_handler
  320.     LANCOMPILER 'PL/Sample';
  321.    </programlisting>
  322.   </para>
  323.  </refsect1>
  324.  <refsect1 id="R1-SQL-CREATELANGUAGE-7">
  325.   <title>
  326.    Compatibility
  327.   </title>
  328.   <para>
  329.    CREATE LANGUAGE is a <productname>Postgres</productname> extension.
  330.   </para>
  331.   <refsect2 id="R2-SQL-CREATELANGUAGE-5">
  332.    <refsect2info>
  333.     <date>1998-09-09</date>
  334.    </refsect2info>
  335.    <title>
  336.     SQL92
  337.    </title>
  338.    <para>
  339.     There is no <command>CREATE LANGUAGE</command> statement in
  340.     <acronym>SQL92</acronym>.
  341.    </para>
  342.   </refsect2>
  343.  </refsect1>
  344. </refentry>
  345. <!-- Keep this comment at the end of the file
  346. Local variables:
  347. mode: sgml
  348. sgml-omittag:nil
  349. sgml-shorttag:t
  350. sgml-minimize-attributes:nil
  351. sgml-always-quote-attributes:t
  352. sgml-indent-step:1
  353. sgml-indent-data:t
  354. sgml-parent-document:nil
  355. sgml-default-dtd-file:"../reference.ced"
  356. sgml-exposed-tags:nil
  357. sgml-local-catalogs:"/usr/lib/sgml/catalog"
  358. sgml-local-ecat-files:nil
  359. End:
  360. -->