]> begriffs open source - ai-pg/blob - full-docs/src/sgml/html/xoper.html
PG 18 docs from https://ftp.postgresql.org/pub/source/v18.0/postgresql-18.0-docs...
[ai-pg] / full-docs / src / sgml / html / xoper.html
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>36.14. User-Defined Operators</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="xtypes.html" title="36.13. User-Defined Types" /><link rel="next" href="xoper-optimization.html" title="36.15. Operator Optimization Information" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">36.14. User-Defined Operators</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="xtypes.html" title="36.13. User-Defined Types">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="extend.html" title="Chapter 36. Extending SQL">Up</a></td><th width="60%" align="center">Chapter 36. Extending <acronym class="acronym">SQL</acronym></th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="xoper-optimization.html" title="36.15. Operator Optimization Information">Next</a></td></tr></table><hr /></div><div class="sect1" id="XOPER"><div class="titlepage"><div><div><h2 class="title" style="clear: both">36.14. User-Defined Operators <a href="#XOPER" class="id_link">#</a></h2></div></div></div><a id="id-1.8.3.17.2" class="indexterm"></a><p>
3    Every operator is <span class="quote">“<span class="quote">syntactic sugar</span>”</span> for a call to an
4    underlying function that does the real work; so you must
5    first create the underlying function before you can create
6    the operator.  However, an operator is <span class="emphasis"><em>not merely</em></span>
7    syntactic sugar, because it carries additional information
8    that helps the query planner optimize queries that use the
9    operator.  The next section will be devoted to explaining
10    that additional information.
11   </p><p>
12    <span class="productname">PostgreSQL</span> supports prefix
13    and infix operators.  Operators can be
14    overloaded;<a id="id-1.8.3.17.4.2" class="indexterm"></a>
15    that is, the same operator name can be used for different operators
16    that have different numbers and types of operands.  When a query is
17    executed, the system determines the operator to call from the
18    number and types of the provided operands.
19   </p><p>
20    Here is an example of creating an operator for adding two complex
21    numbers.  We assume we've already created the definition of type
22    <code class="type">complex</code> (see <a class="xref" href="xtypes.html" title="36.13. User-Defined Types">Section 36.13</a>).  First we need a
23    function that does the work, then we can define the operator:
24
25 </p><pre class="programlisting">
26 CREATE FUNCTION complex_add(complex, complex)
27     RETURNS complex
28     AS '<em class="replaceable"><code>filename</code></em>', 'complex_add'
29     LANGUAGE C IMMUTABLE STRICT;
30
31 CREATE OPERATOR + (
32     leftarg = complex,
33     rightarg = complex,
34     function = complex_add,
35     commutator = +
36 );
37 </pre><p>
38   </p><p>
39    Now we could execute a query like this:
40
41 </p><pre class="screen">
42 SELECT (a + b) AS c FROM test_complex;
43
44         c
45 -----------------
46  (5.2,6.05)
47  (133.42,144.95)
48 </pre><p>
49   </p><p>
50    We've shown how to create a binary operator here.  To create a prefix
51    operator, just omit the <code class="literal">leftarg</code>.
52    The <code class="literal">function</code>
53    clause and the argument clauses are the only required items in
54    <code class="command">CREATE OPERATOR</code>.  The <code class="literal">commutator</code>
55    clause shown in the example is an optional hint to the query
56    optimizer.  Further details about <code class="literal">commutator</code> and other
57    optimizer hints appear in the next section.
58   </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="xtypes.html" title="36.13. User-Defined Types">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="extend.html" title="Chapter 36. Extending SQL">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="xoper-optimization.html" title="36.15. Operator Optimization Information">Next</a></td></tr><tr><td width="40%" align="left" valign="top">36.13. User-Defined Types </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="40%" align="right" valign="top"> 36.15. Operator Optimization Information</td></tr></table></div></body></html>