????
Current Path : C:/opt/pgsql/doc/postgresql/html/ |
Current File : C:/opt/pgsql/doc/postgresql/html/cube.html |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!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>F.11. cube — a multi-dimensional cube data type</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="citext.html" title="F.10. citext — a case-insensitive character string type" /><link rel="next" href="dblink.html" title="F.12. dblink — connect to other PostgreSQL databases" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">F.11. cube — a multi-dimensional cube data type</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="citext.html" title="F.10. citext — a case-insensitive character string type">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="contrib.html" title="Appendix F. Additional Supplied Modules and Extensions">Up</a></td><th width="60%" align="center">Appendix F. Additional Supplied Modules and Extensions</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="dblink.html" title="F.12. dblink — connect to other PostgreSQL databases">Next</a></td></tr></table><hr /></div><div class="sect1" id="CUBE"><div class="titlepage"><div><div><h2 class="title" style="clear: both">F.11. cube — a multi-dimensional cube data type <a href="#CUBE" class="id_link">#</a></h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="sect2"><a href="cube.html#CUBE-SYNTAX">F.11.1. Syntax</a></span></dt><dt><span class="sect2"><a href="cube.html#CUBE-PRECISION">F.11.2. Precision</a></span></dt><dt><span class="sect2"><a href="cube.html#CUBE-USAGE">F.11.3. Usage</a></span></dt><dt><span class="sect2"><a href="cube.html#CUBE-DEFAULTS">F.11.4. Defaults</a></span></dt><dt><span class="sect2"><a href="cube.html#CUBE-NOTES">F.11.5. Notes</a></span></dt><dt><span class="sect2"><a href="cube.html#CUBE-CREDITS">F.11.6. Credits</a></span></dt></dl></div><a id="id-1.11.7.21.2" class="indexterm"></a><p> This module implements a data type <code class="type">cube</code> for representing multidimensional cubes. </p><p> This module is considered <span class="quote">“<span class="quote">trusted</span>”</span>, that is, it can be installed by non-superusers who have <code class="literal">CREATE</code> privilege on the current database. </p><div class="sect2" id="CUBE-SYNTAX"><div class="titlepage"><div><div><h3 class="title">F.11.1. Syntax <a href="#CUBE-SYNTAX" class="id_link">#</a></h3></div></div></div><p> <a class="xref" href="cube.html#CUBE-REPR-TABLE" title="Table F.2. Cube External Representations">Table F.2</a> shows the valid external representations for the <code class="type">cube</code> type. <em class="replaceable"><code>x</code></em>, <em class="replaceable"><code>y</code></em>, etc. denote floating-point numbers. </p><div class="table" id="CUBE-REPR-TABLE"><p class="title"><strong>Table F.2. Cube External Representations</strong></p><div class="table-contents"><table class="table" summary="Cube External Representations" border="1"><colgroup><col /><col /></colgroup><thead><tr><th>External Syntax</th><th>Meaning</th></tr></thead><tbody><tr><td><code class="literal"><em class="replaceable"><code>x</code></em></code></td><td>A one-dimensional point (or, zero-length one-dimensional interval) </td></tr><tr><td><code class="literal">(<em class="replaceable"><code>x</code></em>)</code></td><td>Same as above</td></tr><tr><td><code class="literal"><em class="replaceable"><code>x1</code></em>,<em class="replaceable"><code>x2</code></em>,...,<em class="replaceable"><code>xn</code></em></code></td><td>A point in n-dimensional space, represented internally as a zero-volume cube </td></tr><tr><td><code class="literal">(<em class="replaceable"><code>x1</code></em>,<em class="replaceable"><code>x2</code></em>,...,<em class="replaceable"><code>xn</code></em>)</code></td><td>Same as above</td></tr><tr><td><code class="literal">(<em class="replaceable"><code>x</code></em>),(<em class="replaceable"><code>y</code></em>)</code></td><td>A one-dimensional interval starting at <em class="replaceable"><code>x</code></em> and ending at <em class="replaceable"><code>y</code></em> or vice versa; the order does not matter </td></tr><tr><td><code class="literal">[(<em class="replaceable"><code>x</code></em>),(<em class="replaceable"><code>y</code></em>)]</code></td><td>Same as above</td></tr><tr><td><code class="literal">(<em class="replaceable"><code>x1</code></em>,...,<em class="replaceable"><code>xn</code></em>),(<em class="replaceable"><code>y1</code></em>,...,<em class="replaceable"><code>yn</code></em>)</code></td><td>An n-dimensional cube represented by a pair of its diagonally opposite corners </td></tr><tr><td><code class="literal">[(<em class="replaceable"><code>x1</code></em>,...,<em class="replaceable"><code>xn</code></em>),(<em class="replaceable"><code>y1</code></em>,...,<em class="replaceable"><code>yn</code></em>)]</code></td><td>Same as above</td></tr></tbody></table></div></div><br class="table-break" /><p> It does not matter which order the opposite corners of a cube are entered in. The <code class="type">cube</code> functions automatically swap values if needed to create a uniform <span class="quote">“<span class="quote">lower left — upper right</span>”</span> internal representation. When the corners coincide, <code class="type">cube</code> stores only one corner along with an <span class="quote">“<span class="quote">is point</span>”</span> flag to avoid wasting space. </p><p> White space is ignored on input, so <code class="literal">[(<em class="replaceable"><code>x</code></em>),(<em class="replaceable"><code>y</code></em>)]</code> is the same as <code class="literal">[ ( <em class="replaceable"><code>x</code></em> ), ( <em class="replaceable"><code>y</code></em> ) ]</code>. </p></div><div class="sect2" id="CUBE-PRECISION"><div class="titlepage"><div><div><h3 class="title">F.11.2. Precision <a href="#CUBE-PRECISION" class="id_link">#</a></h3></div></div></div><p> Values are stored internally as 64-bit floating point numbers. This means that numbers with more than about 16 significant digits will be truncated. </p></div><div class="sect2" id="CUBE-USAGE"><div class="titlepage"><div><div><h3 class="title">F.11.3. Usage <a href="#CUBE-USAGE" class="id_link">#</a></h3></div></div></div><p> <a class="xref" href="cube.html#CUBE-OPERATORS-TABLE" title="Table F.3. Cube Operators">Table F.3</a> shows the specialized operators provided for type <code class="type">cube</code>. </p><div class="table" id="CUBE-OPERATORS-TABLE"><p class="title"><strong>Table F.3. Cube Operators</strong></p><div class="table-contents"><table class="table" summary="Cube Operators" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature"> Operator </p> <p> Description </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal">&&</code> <code class="type">cube</code> → <code class="returnvalue">boolean</code> </p> <p> Do the cubes overlap? </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal">@></code> <code class="type">cube</code> → <code class="returnvalue">boolean</code> </p> <p> Does the first cube contain the second? </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal"><@</code> <code class="type">cube</code> → <code class="returnvalue">boolean</code> </p> <p> Is the first cube contained in the second? </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal">-></code> <code class="type">integer</code> → <code class="returnvalue">float8</code> </p> <p> Extracts the <em class="parameter"><code>n</code></em>-th coordinate of the cube (counting from 1). </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal">~></code> <code class="type">integer</code> → <code class="returnvalue">float8</code> </p> <p> Extracts the <em class="parameter"><code>n</code></em>-th coordinate of the cube, counting in the following way: <em class="parameter"><code>n</code></em> = 2 * <em class="parameter"><code>k</code></em> - 1 means lower bound of <em class="parameter"><code>k</code></em>-th dimension, <em class="parameter"><code>n</code></em> = 2 * <em class="parameter"><code>k</code></em> means upper bound of <em class="parameter"><code>k</code></em>-th dimension. Negative <em class="parameter"><code>n</code></em> denotes the inverse value of the corresponding positive coordinate. This operator is designed for KNN-GiST support. </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal"><-></code> <code class="type">cube</code> → <code class="returnvalue">float8</code> </p> <p> Computes the Euclidean distance between the two cubes. </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal"><#></code> <code class="type">cube</code> → <code class="returnvalue">float8</code> </p> <p> Computes the taxicab (L-1 metric) distance between the two cubes. </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="type">cube</code> <code class="literal"><=></code> <code class="type">cube</code> → <code class="returnvalue">float8</code> </p> <p> Computes the Chebyshev (L-inf metric) distance between the two cubes. </p></td></tr></tbody></table></div></div><br class="table-break" /><p> In addition to the above operators, the usual comparison operators shown in <a class="xref" href="functions-comparison.html#FUNCTIONS-COMPARISON-OP-TABLE" title="Table 9.1. Comparison Operators">Table 9.1</a> are available for type <code class="type">cube</code>. These operators first compare the first coordinates, and if those are equal, compare the second coordinates, etc. They exist mainly to support the b-tree index operator class for <code class="type">cube</code>, which can be useful for example if you would like a UNIQUE constraint on a <code class="type">cube</code> column. Otherwise, this ordering is not of much practical use. </p><p> The <code class="filename">cube</code> module also provides a GiST index operator class for <code class="type">cube</code> values. A <code class="type">cube</code> GiST index can be used to search for values using the <code class="literal">=</code>, <code class="literal">&&</code>, <code class="literal">@></code>, and <code class="literal"><@</code> operators in <code class="literal">WHERE</code> clauses. </p><p> In addition, a <code class="type">cube</code> GiST index can be used to find nearest neighbors using the metric operators <code class="literal"><-></code>, <code class="literal"><#></code>, and <code class="literal"><=></code> in <code class="literal">ORDER BY</code> clauses. For example, the nearest neighbor of the 3-D point (0.5, 0.5, 0.5) could be found efficiently with: </p><pre class="programlisting"> SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1; </pre><p> </p><p> The <code class="literal">~></code> operator can also be used in this way to efficiently retrieve the first few values sorted by a selected coordinate. For example, to get the first few cubes ordered by the first coordinate (lower left corner) ascending one could use the following query: </p><pre class="programlisting"> SELECT c FROM test ORDER BY c ~> 1 LIMIT 5; </pre><p> And to get 2-D cubes ordered by the first coordinate of the upper right corner descending: </p><pre class="programlisting"> SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5; </pre><p> </p><p> <a class="xref" href="cube.html#CUBE-FUNCTIONS-TABLE" title="Table F.4. Cube Functions">Table F.4</a> shows the available functions. </p><div class="table" id="CUBE-FUNCTIONS-TABLE"><p class="title"><strong>Table F.4. Cube Functions</strong></p><div class="table-contents"><table class="table" summary="Cube Functions" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature"> Function </p> <p> Description </p> <p> Example(s) </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">float8</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a one dimensional cube with both coordinates the same. </p> <p> <code class="literal">cube(1)</code> → <code class="returnvalue">(1)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">float8</code>, <code class="type">float8</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a one dimensional cube. </p> <p> <code class="literal">cube(1, 2)</code> → <code class="returnvalue">(1),(2)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">float8[]</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a zero-volume cube using the coordinates defined by the array. </p> <p> <code class="literal">cube(ARRAY[1,2,3])</code> → <code class="returnvalue">(1, 2, 3)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">float8[]</code>, <code class="type">float8[]</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a cube with upper right and lower left coordinates as defined by the two arrays, which must be of the same length. </p> <p> <code class="literal">cube(ARRAY[1,2], ARRAY[3,4])</code> → <code class="returnvalue">(1, 2),(3, 4)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">cube</code>, <code class="type">float8</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a new cube by adding a dimension on to an existing cube, with the same values for both endpoints of the new coordinate. This is useful for building cubes piece by piece from calculated values. </p> <p> <code class="literal">cube('(1,2),(3,4)'::cube, 5)</code> → <code class="returnvalue">(1, 2, 5),(3, 4, 5)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube</code> ( <code class="type">cube</code>, <code class="type">float8</code>, <code class="type">float8</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a new cube by adding a dimension on to an existing cube. This is useful for building cubes piece by piece from calculated values. </p> <p> <code class="literal">cube('(1,2),(3,4)'::cube, 5, 6)</code> → <code class="returnvalue">(1, 2, 5),(3, 4, 6)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_dim</code> ( <code class="type">cube</code> ) → <code class="returnvalue">integer</code> </p> <p> Returns the number of dimensions of the cube. </p> <p> <code class="literal">cube_dim('(1,2),(3,4)')</code> → <code class="returnvalue">2</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_ll_coord</code> ( <code class="type">cube</code>, <code class="type">integer</code> ) → <code class="returnvalue">float8</code> </p> <p> Returns the <em class="parameter"><code>n</code></em>-th coordinate value for the lower left corner of the cube. </p> <p> <code class="literal">cube_ll_coord('(1,2),(3,4)', 2)</code> → <code class="returnvalue">2</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_ur_coord</code> ( <code class="type">cube</code>, <code class="type">integer</code> ) → <code class="returnvalue">float8</code> </p> <p> Returns the <em class="parameter"><code>n</code></em>-th coordinate value for the upper right corner of the cube. </p> <p> <code class="literal">cube_ur_coord('(1,2),(3,4)', 2)</code> → <code class="returnvalue">4</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_is_point</code> ( <code class="type">cube</code> ) → <code class="returnvalue">boolean</code> </p> <p> Returns true if the cube is a point, that is, the two defining corners are the same. </p> <p> <code class="literal">cube_is_point(cube(1,1))</code> → <code class="returnvalue">t</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_distance</code> ( <code class="type">cube</code>, <code class="type">cube</code> ) → <code class="returnvalue">float8</code> </p> <p> Returns the distance between two cubes. If both cubes are points, this is the normal distance function. </p> <p> <code class="literal">cube_distance('(1,2)', '(3,4)')</code> → <code class="returnvalue">2.8284271247461903</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_subset</code> ( <code class="type">cube</code>, <code class="type">integer[]</code> ) → <code class="returnvalue">cube</code> </p> <p> Makes a new cube from an existing cube, using a list of dimension indexes from an array. Can be used to extract the endpoints of a single dimension, or to drop dimensions, or to reorder them as desired. </p> <p> <code class="literal">cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2])</code> → <code class="returnvalue">(3),(7)</code> </p> <p> <code class="literal">cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1])</code> → <code class="returnvalue">(5, 3, 1, 1),(8, 7, 6, 6)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_union</code> ( <code class="type">cube</code>, <code class="type">cube</code> ) → <code class="returnvalue">cube</code> </p> <p> Produces the union of two cubes. </p> <p> <code class="literal">cube_union('(1,2)', '(3,4)')</code> → <code class="returnvalue">(1, 2),(3, 4)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_inter</code> ( <code class="type">cube</code>, <code class="type">cube</code> ) → <code class="returnvalue">cube</code> </p> <p> Produces the intersection of two cubes. </p> <p> <code class="literal">cube_inter('(1,2)', '(3,4)')</code> → <code class="returnvalue">(3, 4),(1, 2)</code> </p></td></tr><tr><td class="func_table_entry"><p class="func_signature"> <code class="function">cube_enlarge</code> ( <em class="parameter"><code>c</code></em> <code class="type">cube</code>, <em class="parameter"><code>r</code></em> <code class="type">double</code>, <em class="parameter"><code>n</code></em> <code class="type">integer</code> ) → <code class="returnvalue">cube</code> </p> <p> Increases the size of the cube by the specified radius <em class="parameter"><code>r</code></em> in at least <em class="parameter"><code>n</code></em> dimensions. If the radius is negative the cube is shrunk instead. All defined dimensions are changed by the radius <em class="parameter"><code>r</code></em>. Lower-left coordinates are decreased by <em class="parameter"><code>r</code></em> and upper-right coordinates are increased by <em class="parameter"><code>r</code></em>. If a lower-left coordinate is increased to more than the corresponding upper-right coordinate (this can only happen when <em class="parameter"><code>r</code></em> < 0) than both coordinates are set to their average. If <em class="parameter"><code>n</code></em> is greater than the number of defined dimensions and the cube is being enlarged (<em class="parameter"><code>r</code></em> > 0), then extra dimensions are added to make <em class="parameter"><code>n</code></em> altogether; 0 is used as the initial value for the extra coordinates. This function is useful for creating bounding boxes around a point for searching for nearby points. </p> <p> <code class="literal">cube_enlarge('(1,2),(3,4)', 0.5, 3)</code> → <code class="returnvalue">(0.5, 1.5, -0.5),(3.5, 4.5, 0.5)</code> </p></td></tr></tbody></table></div></div><br class="table-break" /></div><div class="sect2" id="CUBE-DEFAULTS"><div class="titlepage"><div><div><h3 class="title">F.11.4. Defaults <a href="#CUBE-DEFAULTS" class="id_link">#</a></h3></div></div></div><p> This union: </p><pre class="programlisting"> select cube_union('(0,5,2),(2,3,1)', '0'); cube_union ------------------- (0, 0, 0),(2, 5, 2) (1 row) </pre><p> does not contradict common sense, neither does the intersection: </p><pre class="programlisting"> select cube_inter('(0,-1),(1,1)', '(-2),(2)'); cube_inter ------------- (0, 0),(1, 0) (1 row) </pre><p> In all binary operations on differently-dimensioned cubes, the lower-dimensional one is assumed to be a Cartesian projection, i. e., having zeroes in place of coordinates omitted in the string representation. The above examples are equivalent to: </p><pre class="programlisting"> cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)'); </pre><p> The following containment predicate uses the point syntax, while in fact the second argument is internally represented by a box. This syntax makes it unnecessary to define a separate point type and functions for (box,point) predicates. </p><pre class="programlisting"> select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row) </pre></div><div class="sect2" id="CUBE-NOTES"><div class="titlepage"><div><div><h3 class="title">F.11.5. Notes <a href="#CUBE-NOTES" class="id_link">#</a></h3></div></div></div><p> For examples of usage, see the regression test <code class="filename">sql/cube.sql</code>. </p><p> To make it harder for people to break things, there is a limit of 100 on the number of dimensions of cubes. This is set in <code class="filename">cubedata.h</code> if you need something bigger. </p></div><div class="sect2" id="CUBE-CREDITS"><div class="titlepage"><div><div><h3 class="title">F.11.6. Credits <a href="#CUBE-CREDITS" class="id_link">#</a></h3></div></div></div><p> Original author: Gene Selkov, Jr. <code class="email"><<a class="email" href="mailto:selkovjr@mcs.anl.gov">selkovjr@mcs.anl.gov</a>></code>, Mathematics and Computer Science Division, Argonne National Laboratory. </p><p> My thanks are primarily to Prof. Joe Hellerstein (<a class="ulink" href="https://dsf.berkeley.edu/jmh/" target="_top">https://dsf.berkeley.edu/jmh/</a>) for elucidating the gist of the GiST (<a class="ulink" href="http://gist.cs.berkeley.edu/" target="_top">http://gist.cs.berkeley.edu/</a>), and to his former student Andy Dong for his example written for Illustra. I am also grateful to all Postgres developers, present and past, for enabling myself to create my own world and live undisturbed in it. And I would like to acknowledge my gratitude to Argonne Lab and to the U.S. Department of Energy for the years of faithful support of my database research. </p><p> Minor updates to this package were made by Bruno Wolff III <code class="email"><<a class="email" href="mailto:bruno@wolff.to">bruno@wolff.to</a>></code> in August/September of 2002. These include changing the precision from single precision to double precision and adding some new functions. </p><p> Additional updates were made by Joshua Reich <code class="email"><<a class="email" href="mailto:josh@root.net">josh@root.net</a>></code> in July 2006. These include <code class="literal">cube(float8[], float8[])</code> and cleaning up the code to use the V1 call protocol instead of the deprecated V0 protocol. </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="citext.html" title="F.10. citext — a case-insensitive character string type">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="contrib.html" title="Appendix F. Additional Supplied Modules and Extensions">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="dblink.html" title="F.12. dblink — connect to other PostgreSQL databases">Next</a></td></tr><tr><td width="40%" align="left" valign="top">F.10. citext — a case-insensitive character string type </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="40%" align="right" valign="top"> F.12. dblink — connect to other PostgreSQL databases</td></tr></table></div></body></html>