codekingpro/portable-devtools
115k
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>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>3 This module implements a data type <code class="type">cube</code> for4 representing multidimensional cubes.5 </p><p>6 This module is considered <span class="quote">“<span class="quote">trusted</span>”</span>, that is, it can be7 installed by non-superusers who have <code class="literal">CREATE</code> privilege8 on the current database.9 </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>10 <a class="xref" href="cube.html#CUBE-REPR-TABLE" title="Table F.2. Cube External Representations">Table F.2</a> shows the valid external11 representations for the <code class="type">cube</code>12 type. <em class="replaceable"><code>x</code></em>, <em class="replaceable"><code>y</code></em>, etc. denote13 floating-point numbers.14 </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 point15 (or, zero-length one-dimensional interval)16 </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 a17 zero-volume cube18 </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; the19 order does not matter20 </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 diagonally21 opposite corners22 </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>23 It does not matter which order the opposite corners of a cube are24 entered in. The <code class="type">cube</code> functions25 automatically swap values if needed to create a uniform26 <span class="quote">“<span class="quote">lower left — upper right</span>”</span> internal representation.27 When the corners coincide, <code class="type">cube</code> stores only one corner28 along with an <span class="quote">“<span class="quote">is point</span>”</span> flag to avoid wasting space.29 </p><p>30 White space is ignored on input, so31 <code class="literal">[(<em class="replaceable"><code>x</code></em>),(<em class="replaceable"><code>y</code></em>)]</code> is the same as32 <code class="literal">[ ( <em class="replaceable"><code>x</code></em> ), ( <em class="replaceable"><code>y</code></em> ) ]</code>.33 </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>34 Values are stored internally as 64-bit floating point numbers. This means35 that numbers with more than about 16 significant digits will be truncated.36 </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>37 <a class="xref" href="cube.html#CUBE-OPERATORS-TABLE" title="Table F.3. Cube Operators">Table F.3</a> shows the specialized operators38 provided for type <code class="type">cube</code>.39 </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">40 Operator41 </p>42 <p>43 Description44 </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">45 <code class="type">cube</code> <code class="literal">&&</code> <code class="type">cube</code>46 → <code class="returnvalue">boolean</code>47 </p>48 <p>49 Do the cubes overlap?50 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">51 <code class="type">cube</code> <code class="literal">@></code> <code class="type">cube</code>52 → <code class="returnvalue">boolean</code>53 </p>54 <p>55 Does the first cube contain the second?56 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">57 <code class="type">cube</code> <code class="literal"><@</code> <code class="type">cube</code>58 → <code class="returnvalue">boolean</code>59 </p>60 <p>61 Is the first cube contained in the second?62 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">63 <code class="type">cube</code> <code class="literal">-></code> <code class="type">integer</code>64 → <code class="returnvalue">float8</code>65 </p>66 <p>67 Extracts the <em class="parameter"><code>n</code></em>-th coordinate of the cube68 (counting from 1).69 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">70 <code class="type">cube</code> <code class="literal">~></code> <code class="type">integer</code>71 → <code class="returnvalue">float8</code>72 </p>73 <p>74 Extracts the <em class="parameter"><code>n</code></em>-th coordinate of the cube,75 counting in the following way: <em class="parameter"><code>n</code></em> = 276 * <em class="parameter"><code>k</code></em> - 1 means lower bound77 of <em class="parameter"><code>k</code></em>-th dimension, <em class="parameter"><code>n</code></em> = 278 * <em class="parameter"><code>k</code></em> means upper bound of79 <em class="parameter"><code>k</code></em>-th dimension. Negative80 <em class="parameter"><code>n</code></em> denotes the inverse value of the corresponding81 positive coordinate. This operator is designed for KNN-GiST support.82 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">83 <code class="type">cube</code> <code class="literal"><-></code> <code class="type">cube</code>84 → <code class="returnvalue">float8</code>85 </p>86 <p>87 Computes the Euclidean distance between the two cubes.88 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">89 <code class="type">cube</code> <code class="literal"><#></code> <code class="type">cube</code>90 → <code class="returnvalue">float8</code>91 </p>92 <p>93 Computes the taxicab (L-1 metric) distance between the two cubes.94 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">95 <code class="type">cube</code> <code class="literal"><=></code> <code class="type">cube</code>96 → <code class="returnvalue">float8</code>97 </p>98 <p>99 Computes the Chebyshev (L-inf metric) distance between the two cubes.100 </p></td></tr></tbody></table></div></div><br class="table-break" /><p>101 In addition to the above operators, the usual comparison102 operators shown in <a class="xref" href="functions-comparison.html#FUNCTIONS-COMPARISON-OP-TABLE" title="Table 9.1. Comparison Operators">Table 9.1</a> are103 available for type <code class="type">cube</code>. These104 operators first compare the first coordinates, and if those are equal,105 compare the second coordinates, etc. They exist mainly to support the106 b-tree index operator class for <code class="type">cube</code>, which can be useful for107 example if you would like a UNIQUE constraint on a <code class="type">cube</code> column.108 Otherwise, this ordering is not of much practical use.109 </p><p>110 The <code class="filename">cube</code> module also provides a GiST index operator class for111 <code class="type">cube</code> values.112 A <code class="type">cube</code> GiST index can be used to search for values using the113 <code class="literal">=</code>, <code class="literal">&&</code>, <code class="literal">@></code>, and114 <code class="literal"><@</code> operators in <code class="literal">WHERE</code> clauses.115 </p><p>116 In addition, a <code class="type">cube</code> GiST index can be used to find nearest117 neighbors using the metric operators118 <code class="literal"><-></code>, <code class="literal"><#></code>, and119 <code class="literal"><=></code> in <code class="literal">ORDER BY</code> clauses.120 For example, the nearest neighbor of the 3-D point (0.5, 0.5, 0.5)121 could be found efficiently with:122</p><pre class="programlisting">123SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;124</pre><p>125 </p><p>126 The <code class="literal">~></code> operator can also be used in this way to127 efficiently retrieve the first few values sorted by a selected coordinate.128 For example, to get the first few cubes ordered by the first coordinate129 (lower left corner) ascending one could use the following query:130</p><pre class="programlisting">131SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;132</pre><p>133 And to get 2-D cubes ordered by the first coordinate of the upper right134 corner descending:135</p><pre class="programlisting">136SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;137</pre><p>138 </p><p>139 <a class="xref" href="cube.html#CUBE-FUNCTIONS-TABLE" title="Table F.4. Cube Functions">Table F.4</a> shows the available functions.140 </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">141 Function142 </p>143 <p>144 Description145 </p>146 <p>147 Example(s)148 </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">149 <code class="function">cube</code> ( <code class="type">float8</code> )150 → <code class="returnvalue">cube</code>151 </p>152 <p>153 Makes a one dimensional cube with both coordinates the same.154 </p>155 <p>156 <code class="literal">cube(1)</code>157 → <code class="returnvalue">(1)</code>158 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">159 <code class="function">cube</code> ( <code class="type">float8</code>, <code class="type">float8</code> )160 → <code class="returnvalue">cube</code>161 </p>162 <p>163 Makes a one dimensional cube.164 </p>165 <p>166 <code class="literal">cube(1, 2)</code>167 → <code class="returnvalue">(1),(2)</code>168 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">169 <code class="function">cube</code> ( <code class="type">float8[]</code> )170 → <code class="returnvalue">cube</code>171 </p>172 <p>173 Makes a zero-volume cube using the coordinates defined by the array.174 </p>175 <p>176 <code class="literal">cube(ARRAY[1,2,3])</code>177 → <code class="returnvalue">(1, 2, 3)</code>178 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">179 <code class="function">cube</code> ( <code class="type">float8[]</code>, <code class="type">float8[]</code> )180 → <code class="returnvalue">cube</code>181 </p>182 <p>183 Makes a cube with upper right and lower left coordinates as defined by184 the two arrays, which must be of the same length.185 </p>186 <p>187 <code class="literal">cube(ARRAY[1,2], ARRAY[3,4])</code>188 → <code class="returnvalue">(1, 2),(3, 4)</code>189 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">190 <code class="function">cube</code> ( <code class="type">cube</code>, <code class="type">float8</code> )191 → <code class="returnvalue">cube</code>192 </p>193 <p>194 Makes a new cube by adding a dimension on to an existing cube,195 with the same values for both endpoints of the new coordinate. This196 is useful for building cubes piece by piece from calculated values.197 </p>198 <p>199 <code class="literal">cube('(1,2),(3,4)'::cube, 5)</code>200 → <code class="returnvalue">(1, 2, 5),(3, 4, 5)</code>201 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">202 <code class="function">cube</code> ( <code class="type">cube</code>, <code class="type">float8</code>, <code class="type">float8</code> )203 → <code class="returnvalue">cube</code>204 </p>205 <p>206 Makes a new cube by adding a dimension on to an existing cube. This is207 useful for building cubes piece by piece from calculated values.208 </p>209 <p>210 <code class="literal">cube('(1,2),(3,4)'::cube, 5, 6)</code>211 → <code class="returnvalue">(1, 2, 5),(3, 4, 6)</code>212 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">213 <code class="function">cube_dim</code> ( <code class="type">cube</code> )214 → <code class="returnvalue">integer</code>215 </p>216 <p>217 Returns the number of dimensions of the cube.218 </p>219 <p>220 <code class="literal">cube_dim('(1,2),(3,4)')</code>221 → <code class="returnvalue">2</code>222 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">223 <code class="function">cube_ll_coord</code> ( <code class="type">cube</code>, <code class="type">integer</code> )224 → <code class="returnvalue">float8</code>225 </p>226 <p>227 Returns the <em class="parameter"><code>n</code></em>-th coordinate value for the lower228 left corner of the cube.229 </p>230 <p>231 <code class="literal">cube_ll_coord('(1,2),(3,4)', 2)</code>232 → <code class="returnvalue">2</code>233 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">234 <code class="function">cube_ur_coord</code> ( <code class="type">cube</code>, <code class="type">integer</code> )235 → <code class="returnvalue">float8</code>236 </p>237 <p>238 Returns the <em class="parameter"><code>n</code></em>-th coordinate value for the239 upper right corner of the cube.240 </p>241 <p>242 <code class="literal">cube_ur_coord('(1,2),(3,4)', 2)</code>243 → <code class="returnvalue">4</code>244 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">245 <code class="function">cube_is_point</code> ( <code class="type">cube</code> )246 → <code class="returnvalue">boolean</code>247 </p>248 <p>249 Returns true if the cube is a point, that is,250 the two defining corners are the same.251 </p>252 <p>253 <code class="literal">cube_is_point(cube(1,1))</code>254 → <code class="returnvalue">t</code>255 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">256 <code class="function">cube_distance</code> ( <code class="type">cube</code>, <code class="type">cube</code> )257 → <code class="returnvalue">float8</code>258 </p>259 <p>260 Returns the distance between two cubes. If both261 cubes are points, this is the normal distance function.262 </p>263 <p>264 <code class="literal">cube_distance('(1,2)', '(3,4)')</code>265 → <code class="returnvalue">2.8284271247461903</code>266 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">267 <code class="function">cube_subset</code> ( <code class="type">cube</code>, <code class="type">integer[]</code> )268 → <code class="returnvalue">cube</code>269 </p>270 <p>271 Makes a new cube from an existing cube, using a list of272 dimension indexes from an array. Can be used to extract the endpoints273 of a single dimension, or to drop dimensions, or to reorder them as274 desired.275 </p>276 <p>277 <code class="literal">cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2])</code>278 → <code class="returnvalue">(3),(7)</code>279 </p>280 <p>281 <code class="literal">cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1])</code>282 → <code class="returnvalue">(5, 3, 1, 1),(8, 7, 6, 6)</code>283 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">284 <code class="function">cube_union</code> ( <code class="type">cube</code>, <code class="type">cube</code> )285 → <code class="returnvalue">cube</code>286 </p>287 <p>288 Produces the union of two cubes.289 </p>290 <p>291 <code class="literal">cube_union('(1,2)', '(3,4)')</code>292 → <code class="returnvalue">(1, 2),(3, 4)</code>293 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">294 <code class="function">cube_inter</code> ( <code class="type">cube</code>, <code class="type">cube</code> )295 → <code class="returnvalue">cube</code>296 </p>297 <p>298 Produces the intersection of two cubes.299 </p>300 <p>301 <code class="literal">cube_inter('(1,2)', '(3,4)')</code>302 → <code class="returnvalue">(3, 4),(1, 2)</code>303 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">304 <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> )305 → <code class="returnvalue">cube</code>306 </p>307 <p>308 Increases the size of the cube by the specified309 radius <em class="parameter"><code>r</code></em> in at least <em class="parameter"><code>n</code></em>310 dimensions. If the radius is negative the cube is shrunk instead.311 All defined dimensions are changed by the312 radius <em class="parameter"><code>r</code></em>. Lower-left coordinates are decreased313 by <em class="parameter"><code>r</code></em> and upper-right coordinates are increased314 by <em class="parameter"><code>r</code></em>. If a lower-left coordinate is increased315 to more than the corresponding upper-right coordinate (this can only316 happen when <em class="parameter"><code>r</code></em> < 0) than both coordinates are317 set to their average. If <em class="parameter"><code>n</code></em> is greater than the318 number of defined dimensions and the cube is being enlarged319 (<em class="parameter"><code>r</code></em> > 0), then extra dimensions are added to320 make <em class="parameter"><code>n</code></em> altogether; 0 is used as the initial321 value for the extra coordinates. This function is useful for creating322 bounding boxes around a point for searching for nearby points.323 </p>324 <p>325 <code class="literal">cube_enlarge('(1,2),(3,4)', 0.5, 3)</code>326 → <code class="returnvalue">(0.5, 1.5, -0.5),(3.5, 4.5, 0.5)</code>327 </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>328 This union:329 </p><pre class="programlisting">330select cube_union('(0,5,2),(2,3,1)', '0');331cube_union332-------------------333(0, 0, 0),(2, 5, 2)334(1 row)335</pre><p>336 does not contradict common sense, neither does the intersection:337 </p><pre class="programlisting">338select cube_inter('(0,-1),(1,1)', '(-2),(2)');339cube_inter340-------------341(0, 0),(1, 0)342(1 row)343</pre><p>344 In all binary operations on differently-dimensioned cubes,345 the lower-dimensional one is assumed to be a Cartesian projection, i. e., having zeroes346 in place of coordinates omitted in the string representation. The above347 examples are equivalent to:348 </p><pre class="programlisting">349cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');350cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');351</pre><p>352 The following containment predicate uses the point syntax,353 while in fact the second argument is internally represented by a box.354 This syntax makes it unnecessary to define a separate point type355 and functions for (box,point) predicates.356 </p><pre class="programlisting">357select cube_contains('(0,0),(1,1)', '0.5,0.5');358cube_contains359--------------360t361(1 row)362</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>363 For examples of usage, see the regression test <code class="filename">sql/cube.sql</code>.364 </p><p>365 To make it harder for people to break things, there366 is a limit of 100 on the number of dimensions of cubes. This is set367 in <code class="filename">cubedata.h</code> if you need something bigger.368 </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>369 Original author: Gene Selkov, Jr. <code class="email"><<a class="email" href="mailto:selkovjr@mcs.anl.gov">selkovjr@mcs.anl.gov</a>></code>,370 Mathematics and Computer Science Division, Argonne National Laboratory.371 </p><p>372 My thanks are primarily to Prof. Joe Hellerstein373 (<a class="ulink" href="https://dsf.berkeley.edu/jmh/" target="_top">https://dsf.berkeley.edu/jmh/</a>) for elucidating the374 gist of the GiST (<a class="ulink" href="http://gist.cs.berkeley.edu/" target="_top">http://gist.cs.berkeley.edu/</a>), and375 to his former student Andy Dong for his example written for Illustra.376 I am also grateful to all Postgres developers, present and past, for377 enabling myself to create my own world and live undisturbed in it. And I378 would like to acknowledge my gratitude to Argonne Lab and to the379 U.S. Department of Energy for the years of faithful support of my database380 research.381 </p><p>382 Minor updates to this package were made by Bruno Wolff III383 <code class="email"><<a class="email" href="mailto:bruno@wolff.to">bruno@wolff.to</a>></code> in August/September of 2002. These include384 changing the precision from single precision to double precision and adding385 some new functions.386 </p><p>387 Additional updates were made by Joshua Reich <code class="email"><<a class="email" href="mailto:josh@root.net">josh@root.net</a>></code> in388 July 2006. These include <code class="literal">cube(float8[], float8[])</code> and389 cleaning up the code to use the V1 call protocol instead of the deprecated390 V0 protocol.391 </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>