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

数据库系统

开发平台:

Unix_Linux

  1. <refentry id="SQL-CREATEOPERATOR">
  2.  <refmeta>
  3.   <refentrytitle>
  4.    CREATE OPERATOR
  5.   </refentrytitle>
  6.   <refmiscinfo>SQL - Language Statements</refmiscinfo>
  7.  </refmeta>
  8.  <refnamediv>
  9.   <refname>
  10.    CREATE OPERATOR
  11.   </refname>
  12.   <refpurpose>
  13.    Defines a new user operator
  14.   </refpurpose>
  15.   </refnamediv>
  16.  <refsynopsisdiv>
  17.   <refsynopsisdivinfo>
  18.    <date>1999-04-14</date>
  19.   </refsynopsisdivinfo>
  20.   <synopsis>
  21. CREATE OPERATOR <replaceable>name</replaceable> (
  22.         PROCEDURE  = <replaceable class="parameter">func_name</replaceable>
  23.      [, LEFTARG    = <replaceable class="parameter">type1</replaceable> ]
  24.      [, RIGHTARG   = <replaceable class="parameter">type2</replaceable> ]
  25.      [, COMMUTATOR = <replaceable class="parameter">com_op</replaceable> ]
  26.      [, NEGATOR    = <replaceable class="parameter">neg_op</replaceable> ]
  27.      [, RESTRICT   = <replaceable class="parameter">res_proc</replaceable> ]
  28.      [, JOIN       = <replaceable class="parameter">join_proc</replaceable> ]
  29.      [, HASHES ]
  30.      [, SORT1      = <replaceable class="parameter">left_sort_op</replaceable> ]
  31.      [, SORT2      = <replaceable class="parameter">right_sort_op</replaceable> ]
  32.     )
  33.   </synopsis>
  34.   
  35.   <refsect2 id="R2-SQL-CREATEOPERATOR-1">
  36.    <refsect2info>
  37.     <date>1999-04-14</date>
  38.    </refsect2info>
  39.    <title>
  40.     Inputs
  41.    </title>
  42.    <para>
  43.     <variablelist>
  44.      <varlistentry>
  45.       <term><replaceable class="parameter">name</replaceable></term>
  46.       <listitem>
  47.        <para>
  48. The operator to be defined. See below for allowable characters.
  49.        </para>
  50.       </listitem>
  51.      </varlistentry>
  52.      <varlistentry>
  53.       <term><replaceable class="parameter">func_name</replaceable></term>
  54.       <listitem>
  55.        <para>
  56. The function used to implement this operator.
  57.        </para>
  58.       </listitem>
  59.      </varlistentry>
  60.      <varlistentry>
  61.       <term><replaceable class="parameter">type1</replaceable></term>
  62.       <listitem>
  63.        <para>
  64. The type for the left-hand side of the operator, if any. This option would be
  65. omitted for a right-unary operator.
  66.        </para>
  67.       </listitem>
  68.      </varlistentry>
  69.      <varlistentry>
  70.       <term><replaceable class="parameter">type2</replaceable></term>
  71.       <listitem>
  72.        <para>
  73. The type for the right-hand side of the operator, if any. This option would be
  74. omitted for a left-unary operator.
  75.        </para>
  76.       </listitem>
  77.      </varlistentry>
  78.      <varlistentry>
  79.       <term><replaceable class="parameter">com_op</replaceable></term>
  80.       <listitem>
  81.        <para>
  82. The commutator for this operator.
  83.        </para>
  84.       </listitem>
  85.      </varlistentry>
  86.      <varlistentry>
  87.       <term><replaceable class="parameter">neg_op</replaceable></term>
  88.       <listitem>
  89.        <para>
  90. The negator of this operator.
  91.        </para>
  92.       </listitem>
  93.      </varlistentry>
  94.      <varlistentry>
  95.       <term><replaceable class="parameter">res_proc</replaceable></term>
  96.       <listitem>
  97.        <para>
  98. The restriction selectivity estimator function for this operator.
  99.        </para>
  100.       </listitem>
  101.      </varlistentry>
  102.      <varlistentry>
  103.       <term><replaceable class="parameter">join_proc</replaceable></term>
  104.       <listitem>
  105.        <para>
  106. The join selectivity estimator function for this operator.
  107.        </para>
  108.       </listitem>
  109.      </varlistentry>
  110.      <varlistentry>
  111.       <term>HASHES</term>
  112.       <listitem>
  113.        <para>
  114. Indicates this operator can support a hash-join algorithm.
  115.        </para>
  116.       </listitem>
  117.      </varlistentry>
  118.      <varlistentry>
  119.       <term><replaceable class="parameter">left_sort_op</replaceable></term>
  120.       <listitem>
  121.        <para>
  122. Operator that sorts the left-hand data type of this operator.
  123.        </para>
  124.       </listitem>
  125.      </varlistentry>
  126.      <varlistentry>
  127.       <term><replaceable class="parameter">right_sort_op</replaceable></term>
  128.       <listitem>
  129.        <para>
  130. Operator that sorts the right-hand data type of this operator.
  131.        </para>
  132.       </listitem>
  133.      </varlistentry>
  134.     </variablelist>
  135.    </para>
  136.   </refsect2>
  137.   <refsect2 id="R2-SQL-CREATEOPERATOR-2">
  138.    <refsect2info>
  139.     <date>1999-04-14</date>
  140.    </refsect2info>
  141.    <title>
  142.     Outputs
  143.    </title>
  144.    <para>
  145.     <variablelist>
  146.      <varlistentry>
  147.       <term><computeroutput>
  148. CREATE
  149.        </computeroutput></term>
  150.       <listitem>
  151.        <para>
  152. Message returned if the operator is successfully created.
  153.        </para>
  154.       </listitem>
  155.      </varlistentry>
  156.     </variablelist>
  157.    </para>
  158.   </refsect2>
  159.  </refsynopsisdiv>
  160.  <refsect1 id="R1-SQL-CREATEOPERATOR-1">
  161.   <refsect1info>
  162.    <date>1999-04-14</date>
  163.   </refsect1info>
  164.   <title>
  165.    Description
  166.   </title>
  167.   <para>
  168.    <command>CREATE OPERATOR</command>  defines a new operator,
  169.    <replaceable class="parameter">name</replaceable>.
  170.    The user who defines an operator becomes its owner.
  171.   </para>
  172.   <para>
  173.    The operator <replaceable class="parameter">name</replaceable>
  174.    is a sequence of up to thirty two (32) characters in any combination
  175.    from the following:
  176.    <literallayout>
  177. + - * / &lt; &gt; = ~ ! @ # % ^ & | ` ? $ : 
  178.    </literallayout>
  179.    <note>
  180.     <para>
  181.      No  alphabetic characters are allowed in an operator name.
  182.      This enables <productname>Postgres</productname> to parse SQL input
  183.      into tokens without requiring spaces between each token.
  184.      </para>
  185.    </note>   
  186.   </para>
  187.   <para>
  188.    The operator "!=" is mapped to "&lt;&gt;" on input, so they are
  189.    therefore equivalent.
  190.   </para>
  191.   <para>
  192.    At least one of LEFTARG and RIGHTARG must be defined.  For
  193.    binary operators, both should be defined. For right  unary
  194.    operators,  only  LEFTARG  should  be defined, while for left
  195.    unary operators only RIGHTARG should be defined.
  196.   </para>
  197.   <para>
  198.    Also, the
  199.    <replaceable class="parameter">func_name</replaceable> procedure must have
  200.    been previously defined using <command>CREATE FUNCTION</command> and  must
  201.    be defined to accept the correct number of arguments
  202.    (either  one or two).
  203.   </para>
  204.   <para>
  205.    The commutator operator should be identified if one exists,
  206.    so that <productname>Postgres</productname> can
  207.    reverse the order of the operands if it wishes.
  208.    For example, the operator area-less-than, &lt;&lt;&lt;,
  209.    would probably have a commutator
  210.    operator, area-greater-than, &gt;&gt;&gt;.
  211.    Hence, the query optimizer could freely  convert:
  212.    <programlisting>
  213. "0,0,1,1"::box  &gt;&gt;&gt; MYBOXES.description
  214.    </programlisting>
  215.    to
  216.    <programlisting>
  217. MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
  218.    </programlisting>
  219.   </para>
  220.   <para>
  221.    This  allows  the  execution code to always use the latter
  222.    representation and simplifies the  query  optimizer  somewhat.
  223.   </para>
  224.   <para>
  225.    Similarly, if there is a negator operator then it should be
  226.    identified.
  227.    Suppose  that  an
  228.    operator,  area-equal, ===, exists, as well as an area not
  229.    equal, !==.
  230.    The negator link allows the query optimizer to simplify
  231.    <programlisting>
  232. NOT MYBOXES.description === "0,0,1,1"::box
  233.    </programlisting>
  234.    to
  235.    <programlisting>
  236. MYBOXES.description !== "0,0,1,1"::box
  237.    </programlisting>
  238.   </para>
  239.   <para>
  240.    If  a  commutator  operator  name  is  supplied,  
  241.    <productname>Postgres</productname>
  242.    searches  for  it  in  the catalog.  If it is found and it
  243.    does not yet have a commutator itself, then the commutator's
  244.    entry is updated to have the newly created operator as its
  245.    commutator.  This applies to the negator, as well.
  246.   </para>
  247.   <para>
  248.    This  is to allow the definition of two operators that are
  249.    the commutators or the negators of each other.  The  first
  250.    operator should be defined without a commutator or negator
  251.    (as appropriate).  When the second  operator  is  defined,
  252.    name  the  first  as the commutator or negator.  The first
  253.    will be updated as a side effect.  (As of Postgres 6.5,
  254.    it also works to just have both operators refer to each other.)
  255.   </para>
  256.   <para>
  257.    The next three specifications are  present  to  support  the
  258.    query  optimizer in performing joins.  
  259.    <productname>Postgres</productname> can always
  260.    evaluate a join (i.e., processing a clause with two  tuple
  261.    variables separated by an operator that returns a boolean)
  262.    by iterative substitution [WONG76].  
  263.    In addition, <productname>Postgres</productname>
  264.    can use a hash-join algorithm along
  265.    the lines of [SHAP86]; however, it must know whether  this
  266.    strategy  is  applicable.   The current hash-join algorithm
  267.    is only correct for operators that represent equality tests;
  268.    furthermore, equality of the datatype must mean bitwise equality
  269.    of the representation of the type.  (For example, a datatype that
  270.    contains unused bits that don't matter for equality tests could
  271.    not be hashjoined.)
  272.    The HASHES flag indicates to the query optimizer that a hash join
  273.    may safely be used with this operator.</para>
  274.   <para>
  275.    Similarly, the two sort operators indicate  to  the  query
  276.    optimizer whether merge-sort is a usable join strategy and
  277.    which operators should be used  to  sort  the  two  operand
  278.    classes.  Sort operators should only be provided for an equality
  279.    operator, and they should refer to less-than operators for the
  280.    left and right side data types respectively.
  281.   </para>
  282.   <para>
  283.    If  other join strategies are found to be practical,
  284.    <productname>Postgres</productname>
  285.    will change the optimizer and run-time system to  use
  286.    them  and  will  require  additional specification when an
  287.    operator is defined.  Fortunately, the research  community
  288.    invents  new  join  strategies infrequently, and the added
  289.    generality of user-defined join strategies was not felt to
  290.    be worth the complexity involved.
  291.   </para>
  292.   <para>
  293.    The  last  two  pieces of the specification are present so
  294.    the query optimizer  can  estimate  result  sizes.   If  a
  295.    clause of the form:
  296.    <programlisting>
  297. MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
  298.    </programlisting>
  299.    is present in the qualification,
  300.    then <productname>Postgres</productname> may have to
  301.    estimate the fraction of the  instances  in  MYBOXES  that
  302.    satisfy  the clause.  The function
  303.    <replaceable class="parameter">res_proc</replaceable>
  304.    must be a registered function (meaning  it  is  already  defined  using
  305.    <command>CREATE FUNCTION</command>) which accepts arguments of the correct
  306.    data types and returns a floating point  number.   The
  307.    query  optimizer  simply  calls this function, passing the
  308.    parameter "0,0,1,1" and multiplies the result by the relation
  309.    size to get the desired expected number of instances.
  310.   </para>
  311.   <para>
  312.    Similarly, when the operands of the operator both  contain
  313.    instance  variables, the query optimizer must estimate the
  314.    size of the resulting join.  The function  join_proc  will
  315.    return  another floating point number which will be multiplied
  316.    by the cardinalities of the two classes involved  to
  317.    compute the desired expected result size.
  318.   </para>
  319.   <para>
  320.    The difference between the function
  321.    <programlisting>
  322. my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)
  323.    </programlisting>
  324.    and the operator
  325.    <programlisting>
  326. MYBOXES.description === "0,0,1,1"::box
  327.    </programlisting>
  328.    is  that  <productname>Postgres</productname>
  329.    attempts to optimize operators and can
  330.    decide to use an index to restrict the search  space  when
  331.    operators  are  involved.  However, there is no attempt to
  332.    optimize functions, and they are performed by brute force.
  333.    Moreover, functions can have any number of arguments while
  334.    operators are restricted to one or two.
  335.   </para>
  336.   
  337.   <refsect2 id="R2-SQL-CREATEOPERATOR-3">
  338.    <refsect2info>
  339.     <date>1999-04-14</date>
  340.    </refsect2info>
  341.    <title>
  342.     Notes
  343.    </title>
  344.    <para>
  345.     Refer to the chapter on operators in the
  346.     <citetitle>PostgreSQL User's Guide</citetitle>
  347.     for further information.
  348.     Refer to <command>DROP OPERATOR</command> to delete
  349.     user-defined operators from a database.
  350.    </para>
  351.   </refsect2>
  352.  </refsect1>
  353.   
  354.  <refsect1 id="R1-SQL-CREATEOPERATOR-2">
  355.   <title>
  356.    Usage
  357.   </title>
  358.   <para>The following command defines a new operator,
  359.    area-equality, for the BOX data type.
  360.   </para>
  361.   <programlisting>
  362. CREATE OPERATOR === (
  363.    LEFTARG = box,
  364.    RIGHTARG = box,
  365.    PROCEDURE = area_equal_procedure,
  366.    COMMUTATOR = ===,
  367.    NEGATOR = !==,
  368.    RESTRICT = area_restriction_procedure,
  369.    JOIN = area_join_procedure,
  370.    HASHES,
  371.    SORT1 = <<<,
  372.    SORT2 = <<<
  373. );
  374.   </programlisting>  
  375.  </refsect1>
  376.  
  377.  <refsect1 id="R1-SQL-CREATEOPERATOR-3">
  378.   <title>
  379.    Compatibility
  380.   </title>
  381.   <para>
  382.    CREATE OPERATOR is a <productname>Postgres</productname> extension.
  383.   </para>
  384.   
  385.   <refsect2 id="R2-SQL-CREATEOPERATOR-4">
  386.    <refsect2info>
  387.     <date>1999-04-14</date>
  388.    </refsect2info>
  389.    <title>
  390.     SQL92
  391.    </title>
  392.    <para>
  393.     There is no CREATE OPERATOR statement in <acronym>SQL92</acronym>.
  394.    </para>
  395.   </refsect2>
  396.  </refsect1>
  397. </refentry>
  398. <!-- Keep this comment at the end of the file
  399. Local variables:
  400. mode: sgml
  401. sgml-omittag:nil
  402. sgml-shorttag:t
  403. sgml-minimize-attributes:nil
  404. sgml-always-quote-attributes:t
  405. sgml-indent-step:1
  406. sgml-indent-data:t
  407. sgml-parent-document:nil
  408. sgml-default-dtd-file:"../reference.ced"
  409. sgml-exposed-tags:nil
  410. sgml-local-catalogs:"/usr/lib/sgml/catalog"
  411. sgml-local-ecat-files:nil
  412. End:
  413. -->