Commit 39f69bc3 authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Start updating for the v7.0 release.

Use "generic functions" for math and other routines.
Use SQL92 "type 'literal'" syntax rather than Postgres "'literal'::type".
parent 2dabd2cd
......@@ -3,7 +3,7 @@
<para>
<productname>PostgreSQL</productname> is available without cost. This manual
describes version 6.5 of <productname>PostgreSQL</productname>.
describes version 7.0 of <productname>PostgreSQL</productname>.
</para>
<para>
......@@ -21,7 +21,7 @@
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
......@@ -31,7 +31,7 @@ sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
......@@ -38,26 +38,26 @@
</thead>
<tbody>
<row>
<entry> COALESCE(<replaceable class="parameter">list</replaceable>) </entry>
<entry> non-NULL </entry>
<entry> return first non-NULL value in list </entry>
<entry> COALESCE(rle, c2 + 5, 0) </entry>
<entry>COALESCE(<replaceable class="parameter">list</replaceable>)</entry>
<entry>non-NULL</entry>
<entry>return first non-NULL value in list</entry>
<entry>COALESCE(rle, c2 + 5, 0)</entry>
</row>
<row>
<entry> NULLIF(<replaceable class="parameter">input</replaceable>,<replaceable class="parameter">value</replaceable>) </entry>
<entry> <replaceable class="parameter">input</replaceable> or NULL </entry>
<entry> return NULL if
<entry>NULLIF(<replaceable class="parameter">input</replaceable>,<replaceable class="parameter">value</replaceable>)</entry>
<entry><replaceable class="parameter">input</replaceable> or NULL</entry>
<entry>return NULL if
<replaceable class="parameter">input</replaceable> =
<replaceable class="parameter">value</replaceable>,
else <replaceable class="parameter">input</replaceable>
</entry>
<entry> NULLIF(c1, 'N/A') </entry>
<entry>NULLIF(c1, 'N/A')</entry>
</row>
<row>
<entry> CASE WHEN <replaceable class="parameter">expr</replaceable> THEN <replaceable class="parameter">expr</replaceable> [...] ELSE <replaceable class="parameter">expr</replaceable> END </entry>
<entry> <replaceable class="parameter">expr</replaceable> </entry>
<entry> return expression for first true WHEN clause </entry>
<entry> CASE WHEN c1 = 1 THEN 'match' ELSE 'no match' END </entry>
<entry>CASE WHEN <replaceable class="parameter">expr</replaceable> THEN <replaceable class="parameter">expr</replaceable> [...] ELSE <replaceable class="parameter">expr</replaceable> END</entry>
<entry><replaceable class="parameter">expr</replaceable></entry>
<entry>return expression for first true WHEN clause</entry>
<entry>CASE WHEN c1 = 1 THEN 'match' ELSE 'no match' END</entry>
</row>
</tbody>
</tgroup>
......@@ -82,70 +82,70 @@
</thead>
<tbody>
<row>
<entry> abs(float8) </entry>
<entry> float8 </entry>
<entry> absolute value </entry>
<entry> abs(-17.4) </entry>
<entry>abs(float8)</entry>
<entry>float8</entry>
<entry>absolute value</entry>
<entry>abs(-17.4)</entry>
</row>
<row>
<entry> sqrt(float8) </entry>
<entry> float8 </entry>
<entry> square root </entry>
<entry> sqrt(2.0) </entry>
<entry>sqrt(float8)</entry>
<entry>float8</entry>
<entry>square root</entry>
<entry>sqrt(2.0)</entry>
</row>
<row>
<entry> exp(float8) </entry>
<entry> float8 </entry>
<entry> raise e to the specified exponent </entry>
<entry> exp(2.0) </entry>
<entry>exp(float8)</entry>
<entry>float8</entry>
<entry>raise e to the specified exponent</entry>
<entry>exp(2.0)</entry>
</row>
<row>
<entry> ln(float8) </entry>
<entry> float8 </entry>
<entry> natural logarithm </entry>
<entry> ln(2.0) </entry>
<entry>ln(float8)</entry>
<entry>float8</entry>
<entry>natural logarithm</entry>
<entry>ln(2.0)</entry>
</row>
<row>
<entry> log(float8) </entry>
<entry> float8 </entry>
<entry> base 10 logarithm </entry>
<entry> log(2.0) </entry>
<entry>log(float8)</entry>
<entry>float8</entry>
<entry>base 10 logarithm</entry>
<entry>log(2.0)</entry>
</row>
<row>
<entry> pow(float8,float8) </entry>
<entry> float8 </entry>
<entry> raise a number to the specified exponent </entry>
<entry> pow(2.0, 16.0) </entry>
<entry>pow(float8,float8)</entry>
<entry>float8</entry>
<entry>raise a number to the specified exponent</entry>
<entry>pow(2.0, 16.0)</entry>
</row>
<row>
<entry> round(float8) </entry>
<entry> float8 </entry>
<entry> round to nearest integer </entry>
<entry> round(42.4) </entry>
<entry>round(float8)</entry>
<entry>float8</entry>
<entry>round to nearest integer</entry>
<entry>round(42.4)</entry>
</row>
<row>
<entry> trunc(float8) </entry>
<entry> float8 </entry>
<entry> truncate (towards zero) </entry>
<entry> trunc(42.4) </entry>
<entry>trunc(float8)</entry>
<entry>float8</entry>
<entry>truncate (towards zero)</entry>
<entry>trunc(42.4)</entry>
</row>
<row>
<entry> float(int) </entry>
<entry> float8 </entry>
<entry> convert integer to floating point </entry>
<entry> float(2) </entry>
<entry>float(int)</entry>
<entry>float8</entry>
<entry>convert integer to floating point</entry>
<entry>float(2)</entry>
</row>
<row>
<entry> float4(int) </entry>
<entry> float4 </entry>
<entry> convert integer to floating point </entry>
<entry> float4(2) </entry>
<entry>float4(int)</entry>
<entry>float4</entry>
<entry>convert integer to floating point</entry>
<entry>float4(2)</entry>
</row>
<row>
<entry> integer(float) </entry>
<entry> int </entry>
<entry> convert floating point to integer </entry>
<entry> integer(2.0) </entry>
<entry>integer(float)</entry>
<entry>int</entry>
<entry>convert floating point to integer</entry>
<entry>integer(2.0)</entry>
</row>
</tbody>
</tgroup>
......@@ -153,8 +153,8 @@
</para>
<para>
Most of the functions listed for FLOAT8 are also available for
type NUMERIC.
Most of the functions listed for FLOAT8 are also available for
type NUMERIC.
</para>
</sect1>
......@@ -182,52 +182,52 @@
</thead>
<tbody>
<row>
<entry> char_length(string) </entry>
<entry> int4 </entry>
<entry> length of string </entry>
<entry> char_length('jose') </entry>
<entry>char_length(string)</entry>
<entry>int4</entry>
<entry>length of string</entry>
<entry>char_length('jose')</entry>
</row>
<row>
<entry> character_length(string) </entry>
<entry> int4 </entry>
<entry> length of string </entry>
<entry> char_length('jose') </entry>
<entry>character_length(string)</entry>
<entry>int4</entry>
<entry>length of string</entry>
<entry>char_length('jose')</entry>
</row>
<row>
<entry> lower(string) </entry>
<entry> string </entry>
<entry> convert string to lower case </entry>
<entry> lower('TOM') </entry>
<entry>lower(string)</entry>
<entry>string</entry>
<entry>convert string to lower case</entry>
<entry>lower('TOM')</entry>
</row>
<row>
<entry> octet_length(string) </entry>
<entry> int4 </entry>
<entry> storage length of string </entry>
<entry> octet_length('jose') </entry>
<entry>octet_length(string)</entry>
<entry>int4</entry>
<entry>storage length of string</entry>
<entry>octet_length('jose')</entry>
</row>
<row>
<entry> position(string in string) </entry>
<entry> int4 </entry>
<entry> location of specified substring </entry>
<entry> position('o' in 'Tom') </entry>
<entry>position(string in string)</entry>
<entry>int4</entry>
<entry>location of specified substring</entry>
<entry>position('o' in 'Tom')</entry>
</row>
<row>
<entry> substring(string [from int] [for int]) </entry>
<entry> string </entry>
<entry> extract specified substring </entry>
<entry> substring('Tom' from 2 for 2) </entry>
<entry>substring(string [from int] [for int])</entry>
<entry>string</entry>
<entry>extract specified substring</entry>
<entry>substring('Tom' from 2 for 2)</entry>
</row>
<row>
<entry> trim([leading|trailing|both] [string] from string) </entry>
<entry> string </entry>
<entry> trim characters from string </entry>
<entry> trim(both 'x' from 'xTomx') </entry>
<entry>trim([leading|trailing|both] [string] from string)</entry>
<entry>string</entry>
<entry>trim characters from string</entry>
<entry>trim(both 'x' from 'xTomx')</entry>
</row>
<row>
<entry> upper(text) </entry>
<entry> text </entry>
<entry> convert text to upper case </entry>
<entry> upper('tom') </entry>
<entry>upper(text)</entry>
<entry>text</entry>
<entry>convert text to upper case</entry>
<entry>upper('tom')</entry>
</row>
</tbody>
</tgroup>
......@@ -253,88 +253,88 @@
</thead>
<tbody>
<row>
<entry> char(text) </entry>
<entry> char </entry>
<entry> convert text to char type </entry>
<entry> char('text string') </entry>
<entry>char(text)</entry>
<entry>char</entry>
<entry>convert text to char type</entry>
<entry>char('text string')</entry>
</row>
<row>
<entry> char(varchar) </entry>
<entry> char </entry>
<entry> convert varchar to char type </entry>
<entry> char(varchar 'varchar string') </entry>
<entry>char(varchar)</entry>
<entry>char</entry>
<entry>convert varchar to char type</entry>
<entry>char(varchar 'varchar string')</entry>
</row>
<row>
<entry> initcap(text) </entry>
<entry> text </entry>
<entry> first letter of each word to upper case </entry>
<entry> initcap('thomas') </entry>
<entry>initcap(text)</entry>
<entry>text</entry>
<entry>first letter of each word to upper case</entry>
<entry>initcap('thomas')</entry>
</row>
<row>
<entry> lpad(text,int,text) </entry>
<entry> text </entry>
<entry> left pad string to specified length </entry>
<entry> lpad('hi',4,'??') </entry>
<entry>lpad(text,int,text)</entry>
<entry>text</entry>
<entry>left pad string to specified length</entry>
<entry>lpad('hi',4,'??')</entry>
</row>
<row>
<entry> ltrim(text,text) </entry>
<entry> text </entry>
<entry> left trim characters from text </entry>
<entry> ltrim('xxxxtrim','x') </entry>
<entry>ltrim(text,text)</entry>
<entry>text</entry>
<entry>left trim characters from text</entry>
<entry>ltrim('xxxxtrim','x')</entry>
</row>
<row>
<entry> textpos(text,text) </entry>
<entry> text </entry>
<entry> locate specified substring </entry>
<entry> position('high','ig') </entry>
<entry>textpos(text,text)</entry>
<entry>text</entry>
<entry>locate specified substring</entry>
<entry>position('high','ig')</entry>
</row>
<row>
<entry> rpad(text,int,text) </entry>
<entry> text </entry>
<entry> right pad string to specified length </entry>
<entry> rpad('hi',4,'x') </entry>
<entry>rpad(text,int,text)</entry>
<entry>text</entry>
<entry>right pad string to specified length</entry>
<entry>rpad('hi',4,'x')</entry>
</row>
<row>
<entry> rtrim(text,text) </entry>
<entry> text </entry>
<entry> right trim characters from text </entry>
<entry> rtrim('trimxxxx','x') </entry>
<entry>rtrim(text,text)</entry>
<entry>text</entry>
<entry>right trim characters from text</entry>
<entry>rtrim('trimxxxx','x')</entry>
</row>
<row>
<entry> substr(text,int[,int]) </entry>
<entry> text </entry>
<entry> extract specified substring </entry>
<entry> substr('hi there',3,5) </entry>
<entry>substr(text,int[,int])</entry>
<entry>text</entry>
<entry>extract specified substring</entry>
<entry>substr('hi there',3,5)</entry>
</row>
<row>
<entry> text(char) </entry>
<entry> text </entry>
<entry> convert char to text type </entry>
<entry> text('char string') </entry>
<entry>text(char)</entry>
<entry>text</entry>
<entry>convert char to text type</entry>
<entry>text('char string')</entry>
</row>
<row>
<entry> text(varchar) </entry>
<entry> text </entry>
<entry> convert varchar to text type </entry>
<entry> text(varchar 'varchar string') </entry>
<entry>text(varchar)</entry>
<entry>text</entry>
<entry>convert varchar to text type</entry>
<entry>text(varchar 'varchar string')</entry>
</row>
<row>
<entry> translate(text,from,to) </entry>
<entry> text </entry>
<entry> convert character in string </entry>
<entry> translate('12345', '1', 'a') </entry>
<entry>translate(text,from,to)</entry>
<entry>text</entry>
<entry>convert character in string</entry>
<entry>translate('12345', '1', 'a')</entry>
</row>
<row>
<entry> varchar(char) </entry>
<entry> varchar </entry>
<entry> convert char to varchar type </entry>
<entry> varchar('char string') </entry>
<entry>varchar(char)</entry>
<entry>varchar</entry>
<entry>convert char to varchar type</entry>
<entry>varchar('char string')</entry>
</row>
<row>
<entry> varchar(text) </entry>
<entry> varchar </entry>
<entry> convert text to varchar type </entry>
<entry> varchar('text string') </entry>
<entry>varchar(text)</entry>
<entry>varchar</entry>
<entry>convert text to varchar type</entry>
<entry>varchar('text string')</entry>
</row>
</tbody>
</tgroup>
......@@ -368,82 +368,88 @@
</thead>
<tbody>
<row>
<entry> abstime(datetime) </entry>
<entry> abstime </entry>
<entry> convert to abstime </entry>
<entry> abstime('now'::datetime) </entry>
<entry>abstime(timestamp)</entry>
<entry>abstime</entry>
<entry>convert to abstime</entry>
<entry>abstime(timestamp 'now')</entry>
</row>
<row>
<entry> age(datetime,datetime) </entry>
<entry> timespan </entry>
<entry> preserve months and years </entry>
<entry> age('now','1957-06-13'::datetime) </entry>
<entry>age(timestamp)</entry>
<entry>interval</entry>
<entry>preserve months and years</entry>
<entry>age(timestamp '1957-06-13')</entry>
</row>
<row>
<entry> datetime(abstime) </entry>
<entry> datetime </entry>
<entry> convert to datetime </entry>
<entry> datetime('now'::abstime) </entry>
<entry>age(timestamp,timestamp)</entry>
<entry>interval</entry>
<entry>preserve months and years</entry>
<entry>age('now', timestamp '1957-06-13')</entry>
</row>
<row>
<entry> datetime(date) </entry>
<entry> datetime </entry>
<entry> convert to datetime </entry>
<entry> datetime('today'::date) </entry>
<entry>timestamp(abstime)</entry>
<entry>timestamp</entry>
<entry>convert to timestamp</entry>
<entry>timestamp(abstime 'now')</entry>
</row>
<row>
<entry> datetime(date,time) </entry>
<entry> datetime </entry>
<entry> convert to datetime </entry>
<entry> datetime('1998-02-24'::datetime, '23:07'::time); </entry>
</row>
<entry>timestamp(date)</entry>
<entry>timestamp</entry>
<entry>convert to timestamp</entry>
<entry>timestamp(date 'today')</entry>
</row>
<row>
<entry>timestamp(date,time)</entry>
<entry>timestamp</entry>
<entry>convert to timestamp</entry>
<entry>timestamp(timestamp '1998-02-24',time '23:07');</entry>
</row>
<row>
<entry> date_part(text,datetime) </entry>
<entry> float8 </entry>
<entry> portion of date </entry>
<entry> date_part('dow','now'::datetime) </entry>
<entry>date_part(text,timestamp)</entry>
<entry>float8</entry>
<entry>portion of date</entry>
<entry>date_part('dow',timestamp 'now')</entry>
</row>
<row>
<entry> date_part(text,timespan) </entry>
<entry> float8 </entry>
<entry> portion of time </entry>
<entry> date_part('hour','4 hrs 3 mins'::timespan) </entry>
<entry>date_part(text,interval)</entry>
<entry>float8</entry>
<entry>portion of time</entry>
<entry>date_part('hour',interval '4 hrs 3 mins')</entry>
</row>
<row>
<entry> date_trunc(text,datetime) </entry>
<entry> datetime </entry>
<entry> truncate date </entry>
<entry> date_trunc('month','now'::abstime) </entry>
<entry>date_trunc(text,timestamp)</entry>
<entry>timestamp</entry>
<entry>truncate date</entry>
<entry>date_trunc('month',abstime 'now')</entry>
</row>
<row>
<entry> isfinite(abstime) </entry>
<entry> bool </entry>
<entry> a finite time? </entry>
<entry> isfinite('now'::abstime) </entry>
<entry>isfinite(abstime)</entry>
<entry>bool</entry>
<entry>a finite time?</entry>
<entry>isfinite(abstime 'now')</entry>
</row>
<row>
<entry> isfinite(datetime) </entry>
<entry> bool </entry>
<entry> a finite time? </entry>
<entry> isfinite('now'::datetime) </entry>
<entry>isfinite(timestamp)</entry>
<entry>bool</entry>
<entry>a finite time?</entry>
<entry>isfinite(timestamp 'now')</entry>
</row>
<row>
<entry> isfinite(timespan) </entry>
<entry> bool </entry>
<entry> a finite time? </entry>
<entry> isfinite('4 hrs'::timespan) </entry>
<entry>isfinite(interval)</entry>
<entry>bool</entry>
<entry>a finite time?</entry>
<entry>isfinite(interval '4 hrs')</entry>
</row>
<row>
<entry> reltime(timespan) </entry>
<entry> reltime </entry>
<entry> convert to reltime </entry>
<entry> reltime('4 hrs'::timespan) </entry>
<entry>reltime(interval)</entry>
<entry>reltime</entry>
<entry>convert to reltime</entry>
<entry>reltime(interval '4 hrs')</entry>
</row>
<row>
<entry> timespan(reltime) </entry>
<entry> timespan </entry>
<entry> convert to timespan </entry>
<entry> timespan('4 hours'::reltime) </entry>
<entry>interval(reltime)</entry>
<entry>interval</entry>
<entry>convert to interval</entry>
<entry>interval(reltime '4 hours')</entry>
</row>
</tbody>
</tgroup>
......@@ -459,15 +465,15 @@
`decade', `century', `millenium', `millisecond', and `microsecond'.
<function>date_part</function> allows `dow'
to return day of week and `epoch' to return seconds since 1970
(for <type>datetime</type>)
or 'epoch' to return total elapsed seconds (for <type>timespan</type>).
(for <type>timestamp</type>)
or 'epoch' to return total elapsed seconds (for <type>interval</type>).
</para>
</sect1>
<sect1>
<title id="formatting-funcs"> Formatting Functions </title>
<title id="formatting-funcs">Formatting Functions</title>
<note>
<title>Author</title>
......@@ -477,11 +483,18 @@
on 2000-01-24.
</para>
</note>
<para>
Formatting functions provide a powerful set of tools for converting
The <productname>Postgres</productname>
formatting functions provide a powerful set of tools for converting
various datetypes (date/time, int, float, numeric) to formatted strings
and reverse convert from formatted strings to original datetypes.
and for converting from formatted strings to specific datetypes.
<note>
<para>
The second argument for all formatting functions is a template to
be used for the conversion.
</para>
</note>
</para>
<para>
......@@ -498,206 +511,190 @@
</thead>
<tbody>
<row>
<entry> to_char(datetime, text) </entry>
<entry> text </entry>
<entry> convert datetime to string </entry>
<entry> to_char('now'::datetime, 'HH12:MI:SS') </entry>
<entry>to_char(timestamp, text)</entry>
<entry>text</entry>
<entry>convert timestamp to string</entry>
<entry>to_char(timestamp 'now','HH12:MI:SS')</entry>
</row>
<row>
<entry> to_char(timestamp, text) </entry>
<entry> text </entry>
<entry> convert timestamp to string </entry>
<entry> to_char( now(), 'HH12:MI:SS') </entry>
<entry>to_char(int, text)</entry>
<entry>text</entry>
<entry>convert int4/int8 to string</entry>
<entry>to_char(125, '999')</entry>
</row>
<row>
<entry> to_char(int, text) </entry>
<entry> text </entry>
<entry> convert int4/int8 to string </entry>
<entry> to_char(125, '999') </entry>
<entry>to_char(float, text)</entry>
<entry>text</entry>
<entry>convert float4/float8 to string</entry>
<entry>to_char(125.8, '999D9')</entry>
</row>
<row>
<entry> to_char(float, text) </entry>
<entry> text </entry>
<entry> convert float4/float8 to string </entry>
<entry> to_char(125.8, '999D9') </entry>
</row>
<row>
<entry> to_char(numeric, text) </entry>
<entry> text </entry>
<entry> convert numeric to string </entry>
<entry> to_char(-125.8, '999D99S') </entry>
</row>
<row>
<entry> to_datetime(text, text) </entry>
<entry> datetime </entry>
<entry> convert string to datetime </entry>
<entry> to_datetime('05 Dec 2000 13', 'DD Mon YYYY HH') </entry>
<entry>to_char(numeric, text)</entry>
<entry>text</entry>
<entry>convert numeric to string</entry>
<entry>to_char(numeric '-125.8', '999D99S')</entry>
</row>
<row>
<entry> to_date(text, text) </entry>
<entry> date </entry>
<entry> convert string to date </entry>
<entry> to_date('05 Dec 2000', 'DD Mon YYYY') </entry>
<entry>to_date(text, text)</entry>
<entry>date</entry>
<entry>convert string to date</entry>
<entry>to_date('05 Dec 2000', 'DD Mon YYYY')</entry>
</row>
<row>
<entry> to_timestamp(text, text) </entry>
<entry> date </entry>
<entry> convert string to timestamp </entry>
<entry> to_timestamp('05 Dec 2000', 'DD Mon YYYY') </entry>
<entry>to_timestamp(text, text)</entry>
<entry>date</entry>
<entry>convert string to timestamp</entry>
<entry>to_timestamp('05 Dec 2000', 'DD Mon YYYY')</entry>
</row>
<row>
<entry> to_number(text, text) </entry>
<entry> numeric </entry>
<entry> convert string to numeric </entry>
<entry> to_number('12,454.8-', '99G999D9S') </entry>
<entry>to_number(text, text)</entry>
<entry>numeric</entry>
<entry>convert string to numeric</entry>
<entry>to_number('12,454.8-', '99G999D9S')</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
For all formatting functions is second argument format-picture.
</para>
<para>
<table tocentry="1">
<title>Format-pictures for date/time to_char() version.</title>
<title>Templates for date/time conversions</title>
<tgroup cols="2">
<thead>
<row>
<entry>Format-picture</entry>
<entry>Template</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry> HH </entry>
<entry> hour of day (01-12) </entry>
<entry>HH</entry>
<entry>hour of day (01-12)</entry>
</row>
<row>
<entry> HH12 </entry>
<entry> hour of day (01-12) </entry>
<entry>HH12</entry>
<entry>hour of day (01-12)</entry>
</row>
<row>
<entry> MI </entry>
<entry> minute (00-59) </entry>
<entry>MI</entry>
<entry>minute (00-59)</entry>
</row>
<row>
<entry> SS </entry>
<entry> socond (00-59) </entry>
<entry>SS</entry>
<entry>second (00-59)</entry>
</row>
<row>
<entry> SSSS </entry>
<entry> seconds past midnight (0-86399) </entry>
<entry>SSSS</entry>
<entry>seconds past midnight (0-86399)</entry>
</row>
<row>
<entry> Y,YYY </entry>
<entry> year (4 and more digits) with comma </entry>
<entry>Y,YYY</entry>
<entry>year (4 and more digits) with comma</entry>
</row>
<row>
<entry> YYYY </entry>
<entry> year (4 and more digits) </entry>
<entry>YYYY</entry>
<entry>year (4 and more digits)</entry>
</row>
<row>
<entry> YYY </entry>
<entry> last 3 digits of year </entry>
<entry>YYY</entry>
<entry>last 3 digits of year</entry>
</row>
<row>
<entry> YY </entry>
<entry> last 2 digits of year </entry>
<entry>YY</entry>
<entry>last 2 digits of year</entry>
</row>
<row>
<entry> Y </entry>
<entry> last digit of year </entry>
<entry>Y</entry>
<entry>last digit of year</entry>
</row>
<row>
<entry> MONTH </entry>
<entry> full month name (9-letters) - all characters is upper </entry>
<entry>MONTH</entry>
<entry>full upper case month name (9 chars)</entry>
</row>
<row>
<entry> Month </entry>
<entry> full month name (9-letters) - first character is upper </entry>
<entry>Month</entry>
<entry>full mixed case month name (9 chars)</entry>
</row>
<row>
<entry> month </entry>
<entry> full month name (9-letters) - all characters is lower </entry>
<entry>month</entry>
<entry>full lower case month name (9 chars)</entry>
</row>
<row>
<entry> MON </entry>
<entry> abbreviated month name (3-letters) - all characters is upper </entry>
<entry>MON</entry>
<entry>upper case abbreviated month name (3 chars)</entry>
</row>
<row>
<entry> Mon </entry>
<entry> abbreviated month name (3-letters) - first character is upper </entry>
<entry>Mon</entry>
<entry>abbreviated mixed case month name (3 chars)</entry>
</row>
<row>
<entry> mon </entry>
<entry> abbreviated month name (3-letters) - all characters is lower </entry>
<entry>mon</entry>
<entry>abbreviated lower case month name (3 chars)</entry>
</row>
<row>
<entry> MM </entry>
<entry> month (01-12) </entry>
<entry>MM</entry>
<entry>month (01-12)</entry>
</row>
<row>
<entry> DAY </entry>
<entry> full day name (9-letters) - all characters is upper </entry>
<entry>DAY</entry>
<entry>full upper case day name (9 chars)</entry>
</row>
<row>
<entry> Day </entry>
<entry> full day name (9-letters) - first character is upper </entry>
<entry>Day</entry>
<entry>full mixed case day name (9 chars)</entry>
</row>
<row>
<entry> day </entry>
<entry> full day name (9-letters) - all characters is lower </entry>
<entry>day</entry>
<entry>full lower case day name (9 chars)</entry>
</row>
<row>
<entry> DY </entry>
<entry> abbreviated day name (3-letters) - all characters is upper </entry>
<entry>DY</entry>
<entry>abbreviated upper case day name (3 chars)</entry>
</row>
<row>
<entry> Dy </entry>
<entry> abbreviated day name (3-letters) - first character is upper </entry>
<entry>Dy</entry>
<entry>abbreviated mixed case day name (3 chars)</entry>
</row>
<row>
<entry> dy </entry>
<entry> abbreviated day name (3-letters) - all characters is upper </entry>
<entry>dy</entry>
<entry>abbreviated lower case day name (3 chars)</entry>
</row>
<row>
<entry> DDD </entry>
<entry> day of year (001-366) </entry>
<entry>DDD</entry>
<entry>day of year (001-366)</entry>
</row>
<row>
<entry> DD </entry>
<entry> day of month (01-31) </entry>
<entry>DD</entry>
<entry>day of month (01-31)</entry>
</row>
<row>
<entry> D </entry>
<entry> day of week (1-7; SUN=1) </entry>
<entry>D</entry>
<entry>day of week (1-7; SUN=1)</entry>
</row>
<row>
<entry> W </entry>
<entry> week of month </entry>
<entry>W</entry>
<entry>week of month</entry>
</row>
<row>
<entry> WW </entry>
<entry> week number of year </entry>
<entry>WW</entry>
<entry>week number of year</entry>
</row>
<row>
<entry> CC </entry>
<entry> century (2-digits) </entry>
<entry>CC</entry>
<entry>century (2 digits)</entry>
</row>
<row>
<entry> J </entry>
<entry> julian day (days since January 1, 4712 BC) </entry>
<entry>J</entry>
<entry>Julian Day (days since January 1, 4712 BC)</entry>
</row>
<row>
<entry> Q </entry>
<entry> quarter </entry>
<entry>Q</entry>
<entry>quarter</entry>
</row>
<row>
<entry> RM </entry>
<entry> month in roman numeral (I-XII; I=JAN) </entry>
<entry>RM</entry>
<entry>month in Roman Numerals (I-XII; I=JAN)</entry>
</row>
</tbody>
</tgroup>
......@@ -705,13 +702,13 @@
</para>
<para>
All format-pictures allow use suffixes (postfix / prefix). The suffix is
always valid for a near format-picture. The 'FX' is global prefix only.
All templates allow the use of prefix and suffix modifiers. Modifiers are
always valid for use in templates. The prefix 'FX' is a global modifier only.
</para>
<para>
<table tocentry="1">
<title>Suffixes for format-pictures for date/time to_char() version.</title>
<title>Suffixes for templates for date/time to_char()</title>
<tgroup cols="3">
<thead>
<row>
......@@ -722,31 +719,29 @@
</thead>
<tbody>
<row>
<entry> FM </entry>
<entry> fill mode - prefix </entry>
<entry> FMMonth </entry>
<entry>FM</entry>
<entry>fill mode prefix</entry>
<entry>FMMonth</entry>
</row>
<row>
<entry> TH </entry>
<entry> upper ordinal number - postfix </entry>
<entry> DDTH </entry>
<entry>TH</entry>
<entry>upper ordinal number suffix</entry>
<entry>DDTH</entry>
</row>
<row>
<entry> th </entry>
<entry> lower ordinal number - postfix </entry>
<entry> DDTH </entry>
<entry>th</entry>
<entry>lower ordinal number suffix</entry>
<entry>DDTH</entry>
</row>
<row>
<entry> FX </entry>
<entry> FX - (Fixed format) global format-picture switch.
The TO_DATETIME / TO_DATE skip blank space if this option is
not use. Must by used as first item in formt-picture. </entry>
<entry> FX Month DD Day </entry>
<entry>FX</entry>
<entry>FiXed format global option (see below)</entry>
<entry>FX Month DD Day</entry>
</row>
<row>
<entry> SP </entry>
<entry> spell mode (not implement now)</entry>
<entry> DDSP </entry>
<entry>SP</entry>
<entry>spell mode (not yet implemented)</entry>
<entry>DDSP</entry>
</row>
</tbody>
</tgroup>
......@@ -754,94 +749,116 @@
</para>
<para>
'\' - must be use as double \\, example '\\HH\\MI\\SS'
</para>
<para>
'"' - string between a quotation marks is skipen and not is parsed.
If you want write '"' to output you must use \\", example '\\"YYYY Month\\"'.
</para>
<para>
text - the PostgreSQL's to_char() support text without '"', but string
between a quotation marks is fastly and you have guarantee, that a text
not will interpreted as a keyword (format-picture), exapmle '"Hello Year: "YYYY'.
Usage notes:
<itemizedlist>
<listitem>
<para>
<function>to_timestamp</function> and <function>to_date</function>
skip blank space if the <literal>FX</literal> option is
not use. <literal>FX</literal> Must be specified as the first item
in the template.
</para>
</listitem>
<listitem>
<para>
'\' - must be use as double \\, example '\\HH\\MI\\SS'
</para>
</listitem>
<listitem>
<para>
'"' - string between a quotation marks is skipen and not is parsed.
If you want write '"' to output you must use \\", example '\\"YYYY Month\\"'.
</para>
</listitem>
<listitem>
<para>
text - the PostgreSQL's to_char() support text without '"', but string
between a quotation marks is fastly and you have guarantee, that a text
not will interpreted as a keyword (format-picture), exapmle '"Hello Year: "YYYY'.
</para>
</listitem>
</itemizedlist>
</para>
<para>
<table tocentry="1">
<title>Format-pictures for number (int/float/numeric) to_char() version.</title>
<title>Templates for to_char(<replaceable>numeric</replaceable>)</title>
<tgroup cols="2">
<thead>
<row>
<entry>Format-picture</entry>
<entry>Template</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry> 9 </entry>
<entry> return value with the specified number of digits, and if digit is
not available use blank space </entry>
<entry>9</entry>
<entry>value with the specified number of digits</entry>
</row>
<row>
<entry> 0 </entry>
<entry> as 9, but instead blank space use zero </entry>
<entry>0</entry>
<entry>value with leading zeros</entry>
</row>
<row>
<entry> . (period) </entry>
<entry> decimal point </entry>
<entry>. (period)</entry>
<entry>decimal point</entry>
</row>
<row>
<entry> , (comma) </entry>
<entry> group (thousand) separator </entry>
<entry>, (comma)</entry>
<entry>group (thousand) separator</entry>
</row>
<row>
<entry> PR </entry>
<entry> return negative value in angle brackets </entry>
<entry>PR</entry>
<entry>negative value in angle brackets</entry>
</row>
<row>
<entry> S </entry>
<entry> return negatice value with minus sign (use locales) </entry>
<entry>S</entry>
<entry>negative value with minus sign (use locales)</entry>
</row>
<row>
<entry> L </entry>
<entry> currency symbol (use locales) </entry>
<entry>L</entry>
<entry>currency symbol (use locales)</entry>
</row>
<row>
<entry> D </entry>
<entry> decimal point (use locales) </entry>
<entry>D</entry>
<entry>decimal point (use locales)</entry>
</row>
<row>
<entry> G </entry>
<entry> group separator (use locales) </entry>
<entry>G</entry>
<entry>group separator (use locales)</entry>
</row>
<row>
<entry> MI </entry>
<entry> return minus sign on specified position (if number < 0) </entry>
<entry>MI</entry>
<entry>minus sign on specified position (if number < 0)</entry>
</row>
<row>
<entry> PL </entry>
<entry> return plus sign on specified position (if number > 0) - PostgreSQL extension </entry>
<entry>PL</entry>
<entry>plus sign on specified position (if number > 0)</entry>
</row>
<row>
<entry> SG </entry>
<entry> return plus/minus sign on specified position - PostgreSQL extension </entry>
<entry>SG</entry>
<entry>plus/minus sign on specified position</entry>
</row>
<row>
<entry> RN </entry>
<entry> return number as roman number (number must be between 1 and 3999) </entry>
<entry>RN</entry>
<entry>roman numeral (input between 1 and 3999)</entry>
</row>
<row>
<entry> TH or th </entry>
<entry> convert number to ordinal number (not convert numbers under zero and decimal numbers) - PostgreSQL extension </entry>
<entry>TH or th</entry>
<entry>convert to ordinal number</entry>
</row>
<row>
<entry> V </entry>
<entry> arg1 * (10 ^ n); - return a value multiplied by 10^n (where 'n' is number of '9's after the 'V').
The to_char() not support use 'V' and decimal poin together, example "99.9V99". </entry>
<entry>V</entry>
<entry>Shift <replaceable>n</replaceable> digits (see
notes)</entry>
</row>
<row>
<entry> EEEE </entry>
<entry> science numbers. Now not supported. </entry>
<entry>EEEE</entry>
<entry>science numbers. Now not supported.</entry>
</row>
</tbody>
</tgroup>
......@@ -849,16 +866,65 @@
</para>
<para>
Note: A sign formatted via 'SG', 'PL' or 'MI' is not anchor in number;
to_char(-12, 'S9999') produce: <ProgramListing> ' -12' </ProgramListing>,
but to_char(-12, 'MI9999') produce: <ProgramListing> '- 12' </ProgramListing>.
The Oracle not allow use 'MI' ahead of '9', in the Oracle must be it always
after '9'.
Usage notes:
<itemizedlist>
<listitem>
<para>
A sign formatted using 'SG', 'PL' or 'MI' is not an anchor in
the number; for example,
to_char(-12, 'S9999') produces <literal>' -12'</literal>,
but to_char(-12, 'MI9999') produces <literal>'- 12'</literal>.
The Oracle implementation does not allow the use of
<literal>MI</literal> ahead of <literal>9</literal>, but rather
requires that <literal>9</literal> preceeds
<literal>MI</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>PL</literal>, <literal>SG</literal>, and
<literal>TH</literal> are <productname>Postgres</productname>
extensions.
</para>
</listitem>
<listitem>
<para>
<entry>9</entry>
<entry>value with the specified number of digits, and if digit is
not available use blank space</entry>
</row>
</para>
</listitem>
<listitem>
<para>
<literal>TH</literal> does not convert values less than zero
and does not convert decimal numbers. <literal>TH</literal> is
a <productname>Postgres</productname> extension.
</para>
</listitem>
<listitem>
<para>
<literal>V</literal> effectively
multiplies the input values by
<literal>10^<replaceable>n</replaceable></literal>, where
<replaceable>n</replaceable> is the number of digits following
<literal>V</literal>.
<function>to_char</function> does not support the use of
<literal>V</literal> combined with a decimal point
(e.g. "99.9V99" is not allowed).
</para>
</listitem>
</itemizedlist>
</para>
<para>
<table tocentry="1">
<title> The to_char() examples. </title>
<title><function>to_char</function> Examples</title>
<tgroup cols="2">
<thead>
<row>
......@@ -868,146 +934,144 @@
</thead>
<tbody>
<row>
<entry> to_char(now(), 'Day, HH12:MI:SS') </entry>
<entry><ProgramListing> 'Tuesday , 05:39:18' </ProgramListing></entry>
</row>
<entry>to_char(now(),'Day, HH12:MI:SS')</entry>
<entry><literal>'Tuesday , 05:39:18'</literal></entry>
</row>
<row>
<entry> to_char(now(), 'FMDay, HH12:MI:SS') </entry>
<entry><ProgramListing> 'Tuesday, 05:39:18' </ProgramListing></entry>
<entry>to_char(now(),'FMDay, HH12:MI:SS')</entry>
<entry><literal>'Tuesday, 05:39:18'</literal></entry>
</row>
<row>
<entry> to_char( -0.1, '99.99') </entry>
<entry><ProgramListing> ' -.10' </ProgramListing></entry>
<entry>to_char(-0.1,'99.99')</entry>
<entry><literal>' -.10'</literal></entry>
</row>
<row>
<entry> to_char( -0.1, 'FM9.99') </entry>
<entry><ProgramListing> '-.1' </ProgramListing></entry>
<entry>to_char(-0.1,'FM9.99')</entry>
<entry><literal>'-.1'</literal></entry>
</row>
<row>
<entry> to_char( 0.1, '0.9') </entry>
<entry><ProgramListing> ' 0.1' </ProgramListing></entry>
<entry>to_char(0.1,'0.9')</entry>
<entry><literal>' 0.1'</literal></entry>
</row>
<row>
<entry> to_char( 12, '9990999.9') </entry>
<entry><ProgramListing> ' 0012.0' </ProgramListing></entry>
<entry>to_char(12,'9990999.9')</entry>
<entry><literal>' 0012.0'</literal></entry>
</row>
<row>
<entry> to_char( 12, 'FM9990999.9') </entry>
<entry><ProgramListing> '0012' </ProgramListing></entry>
<entry>to_char(12,'FM9990999.9')</entry>
<entry><literal>'0012'</literal></entry>
</row>
<row>
<entry> to_char( 485, '999') </entry>
<entry><ProgramListing> ' 485' </ProgramListing></entry>
<entry>to_char(485,'999')</entry>
<entry><literal>' 485'</literal></entry>
</row>
<row>
<entry> to_char( -485, '999') </entry>
<entry><ProgramListing> '-485' </ProgramListing></entry>
<entry>to_char(-485,'999')</entry>
<entry><literal>'-485'</literal></entry>
</row>
<row>
<entry> to_char( 485, '9 9 9') </entry>
<entry><ProgramListing> ' 4 8 5' </ProgramListing></entry>
<entry>to_char(485,'9 9 9')</entry>
<entry><literal>' 4 8 5'</literal></entry>
</row>
<row>
<entry> to_char( 1485, '9,999') </entry>
<entry><ProgramListing> ' 1,485' </ProgramListing></entry>
<entry>to_char(1485,'9,999')</entry>
<entry><literal>' 1,485'</literal></entry>
</row>
<row>
<entry> to_char( 1485, '9G999') </entry>
<entry><ProgramListing> ' 1 485' </ProgramListing></entry>
<entry>to_char(1485,'9G999')</entry>
<entry><literal>' 1 485'</literal></entry>
</row>
<row>
<entry> to_char( 148.5, '999.999') </entry>
<entry><ProgramListing> ' 148.500' </ProgramListing></entry>
<entry>to_char(148.5,'999.999')</entry>
<entry><literal>' 148.500'</literal></entry>
</row>
<row>
<entry> to_char( 148.5, '999D999') </entry>
<entry><ProgramListing> ' 148,500' </ProgramListing></entry>
<entry>to_char(148.5,'999D999')</entry>
<entry><literal>' 148,500'</literal></entry>
</row>
<row>
<entry> to_char( 3148.5,'9G999D999') </entry>
<entry><ProgramListing> ' 3 148,500' </ProgramListing></entry>
<entry>to_char(3148.5,'9G999D999')</entry>
<entry><literal>' 3 148,500'</literal></entry>
</row>
<row>
<entry> to_char( -485, '999S') </entry>
<entry><ProgramListing> '485-' </ProgramListing></entry>
<entry>to_char(-485,'999S')</entry>
<entry><literal>'485-'</literal></entry>
</row>
<row>
<entry> to_char( -485, '999MI') </entry>
<entry><ProgramListing> '485-' </ProgramListing></entry>
<entry>to_char(-485,'999MI')</entry>
<entry><literal>'485-'</literal></entry>
</row>
<row>
<entry> to_char( 485, '999MI') </entry>
<entry><ProgramListing> '485' </ProgramListing></entry>
<entry>to_char(485,'999MI')</entry>
<entry><literal>'485'</literal></entry>
</row>
<row>
<entry> to_char( 485, 'PL999') </entry>
<entry><ProgramListing> '+485' </ProgramListing></entry>
<entry>to_char(485,'PL999')</entry>
<entry><literal>'+485'</literal></entry>
</row>
<row>
<entry> to_char( 485, 'SG999') </entry>
<entry><ProgramListing> '+485' </ProgramListing></entry>
<entry>to_char(485,'SG999')</entry>
<entry><literal>'+485'</literal></entry>
</row>
<row>
<entry> to_char( -485, 'SG999') </entry>
<entry><ProgramListing> '-485' </ProgramListing></entry>
<entry>to_char(-485,'SG999')</entry>
<entry><literal>'-485'</literal></entry>
</row>
<row>
<entry> to_char( -485, '9SG99') </entry>
<entry><ProgramListing> '4-85' </ProgramListing></entry>
<entry>to_char(-485,'9SG99')</entry>
<entry><literal>'4-85'</literal></entry>
</row>
<row>
<entry> to_char( -485, '999PR') </entry>
<entry><ProgramListing> '<485>' </ProgramListing></entry>
<entry>to_char(-485,'999PR')</entry>
<entry><literal>'&lt;485&gt;'</literal></entry>
</row>
<row>
<entry> to_char( 485, 'L999') </entry>
<entry><ProgramListing> 'DM 485' </ProgramListing></entry>
<entry>to_char(485,'L999')</entry>
<entry><literal>'DM 485</literal></entry>
</row>
<row>
<entry> to_char( 485, 'RN') </entry>
<entry><ProgramListing> ' CDLXXXV' </ProgramListing></entry>
<entry>to_char(485,'RN')</entry>
<entry><literal>' CDLXXXV'</literal></entry>
</row>
<row>
<entry> to_char( 485, 'FMRN') </entry>
<entry><ProgramListing> 'CDLXXXV' </ProgramListing></entry>
<entry>to_char(485,'FMRN')</entry>
<entry><literal>'CDLXXXV'</literal></entry>
</row>
<row>
<entry> to_char( 5.2, 'FMRN') </entry>
<entry><ProgramListing> 'V' </ProgramListing></entry>
<entry>to_char(5.2,'FMRN')</entry>
<entry><literal>V</literal></entry>
</row>
<row>
<entry> to_char( 482, '999th') </entry>
<entry><ProgramListing> ' 482nd' </ProgramListing></entry>
<entry>to_char(482,'999th')</entry>
<entry><literal>' 482nd'</literal></entry>
</row>
<row>
<entry> to_char( 485, '"Good number:"999') </entry>
<entry><ProgramListing> 'Good number: 485' </ProgramListing></entry>
<entry>to_char(485, '"Good number:"999')</entry>
<entry><literal>'Good number: 485'</literal></entry>
</row>
<row>
<entry> to_char( 485.8, '"Pre-decimal:"999" Post-decimal:" .999') </entry>
<entry><ProgramListing> 'Pre-decimal: 485 Post-decimal: .800' </ProgramListing></entry>
<entry>to_char(485.8,'"Pre-decimal:"999" Post-decimal:" .999')</entry>
<entry><literal>'Pre-decimal: 485 Post-decimal: .800'</literal></entry>
</row>
<row>
<entry> to_char( 12, '99V999') </entry>
<entry><ProgramListing> ' 12000' </ProgramListing></entry>
<entry>to_char(12,'99V999')</entry>
<entry><literal>' 12000'</literal></entry>
</row>
<row>
<entry> to_char( 12.4, '99V999') </entry>
<entry><ProgramListing> ' 12400' </ProgramListing></entry>
<entry>to_char(12.4,'99V999')</entry>
<entry><literal>' 12400'</literal></entry>
</row>
<row>
<entry> to_char( 12.45, '99V9') </entry>
<entry><ProgramListing> ' 125' </ProgramListing></entry>
<entry>to_char(12.45, '99V9')</entry>
<entry><literal>' 125'</literal></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</sect1>
<sect1>
<title>Geometric Functions</title>
......@@ -1030,106 +1094,97 @@
</thead>
<tbody>
<row>
<entry> area(box) </entry>
<entry> float8 </entry>
<entry> area of box </entry>
<entry> area('((0,0),(1,1))'::box) </entry>
</row>
<row>
<entry> area(circle) </entry>
<entry> float8 </entry>
<entry> area of circle </entry>
<entry> area('((0,0),2.0)'::circle) </entry>
</row>
<row>
<entry> box(box,box) </entry>
<entry> box </entry>
<entry> boxes to intersection box </entry>
<entry> box('((0,0),(1,1))','((0.5,0.5),(2,2))') </entry>
<entry>area(object)</entry>
<entry>float8</entry>
<entry>area of circle, ...</entry>
<entry>area(box '((0,0),(1,1))')</entry>
</row>
<row>
<entry> center(box) </entry>
<entry> point </entry>
<entry> center of object </entry>
<entry> center('((0,0),(1,2))'::box) </entry>
<entry>box(box,box)</entry>
<entry>box</entry>
<entry>boxes to intersection box</entry>
<entry>box(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')</entry>
</row>
<row>
<entry> center(circle) </entry>
<entry> point </entry>
<entry> center of object </entry>
<entry> center('((0,0),2.0)'::circle) </entry>
<entry>center(object)</entry>
<entry>point</entry>
<entry>center of circle, ...</entry>
<entry>center(box '((0,0),(1,2))')</entry>
</row>
<row>
<entry> diameter(circle) </entry>
<entry> float8 </entry>
<entry> diameter of circle </entry>
<entry> diameter('((0,0),2.0)'::circle) </entry>
<entry>diameter(circle)</entry>
<entry>float8</entry>
<entry>diameter of circle</entry>
<entry>diameter(circle '((0,0),2.0)')</entry>
</row>
<row>
<entry> height(box) </entry>
<entry> float8 </entry>
<entry> vertical size of box </entry>
<entry> height('((0,0),(1,1))'::box) </entry>
<entry>height(box)</entry>
<entry>float8</entry>
<entry>vertical size of box</entry>
<entry>height(box '((0,0),(1,1))')</entry>
</row>
<row>
<entry> isclosed(path) </entry>
<entry> bool </entry>
<entry> a closed path? </entry>
<entry> isclosed('((0,0),(1,1),(2,0))'::path) </entry>
<entry>isclosed(path)</entry>
<entry>bool</entry>
<entry>a closed path?</entry>
<entry>isclosed(path '((0,0),(1,1),(2,0))')</entry>
</row>
<row>
<entry> isopen(path) </entry>
<entry> bool </entry>
<entry> an open path? </entry>
<entry> isopen('[(0,0),(1,1),(2,0)]'::path) </entry>
<entry>isopen(path)</entry>
<entry>bool</entry>
<entry>an open path?</entry>
<entry>isopen(path '[(0,0),(1,1),(2,0)]')</entry>
</row>
<row>
<entry> length(lseg) </entry>
<entry> float8 </entry>
<entry> length of line segment </entry>
<entry> length('((-1,0),(1,0))'::lseg) </entry>
<entry>length(object)</entry>
<entry>float8</entry>
<entry>length of line segment, ...</entry>
<entry>length(path '((-1,0),(1,0))')</entry>
</row>
<row>
<entry> length(path) </entry>
<entry> float8 </entry>
<entry> length of path </entry>
<entry> length('((0,0),(1,1),(2,0))'::path) </entry>
<entry>length(path)</entry>
<entry>float8</entry>
<entry>length of path</entry>
<entry>length(path '((0,0),(1,1),(2,0))')</entry>
</row>
<row>
<entry> pclose(path) </entry>
<entry> path </entry>
<entry> convert path to closed </entry>
<entry> popen('[(0,0),(1,1),(2,0)]'::path) </entry>
<entry>pclose(path)</entry>
<entry>path</entry>
<entry>convert path to closed</entry>
<entry>popen(path '[(0,0),(1,1),(2,0)]')</entry>
</row>
<!--
Not defined by this name. Implements the intersection operator '#'
<row>
<entry> point(lseg,lseg) </entry>
<entry> point </entry>
<entry> intersection </entry>
<entry> point('((-1,0),(1,0))'::lseg,'((-2,-2),(2,2))'::lseg) </entry>
<entry>point(lseg,lseg)</entry>
<entry>point</entry>
<entry>intersection</entry>
<entry>point(lseg '((-1,0),(1,0))',lseg '((-2,-2),(2,2))')</entry>
</row>
-->
<row>
<entry> points(path) </entry>
<entry> int4 </entry>
<entry> number of points </entry>
<entry> points('[(0,0),(1,1),(2,0)]'::path) </entry>
<entry>npoint(path)</entry>
<entry>int4</entry>
<entry>number of points</entry>
<entry>npoints(path '[(0,0),(1,1),(2,0)]')</entry>
</row>
<row>
<entry> popen(path) </entry>
<entry> path </entry>
<entry> convert path to open </entry>
<entry> popen('((0,0),(1,1),(2,0))'::path) </entry>
<entry>popen(path)</entry>
<entry>path</entry>
<entry>convert path to open path</entry>
<entry>popen(path '((0,0),(1,1),(2,0))')</entry>
</row>
<row>
<entry> radius(circle) </entry>
<entry> float8 </entry>
<entry> radius of circle </entry>
<entry> radius('((0,0),2.0)'::circle) </entry>
<entry>radius(circle)</entry>
<entry>float8</entry>
<entry>radius of circle</entry>
<entry>radius(circle '((0,0),2.0)')</entry>
</row>
<row>
<entry> width(box) </entry>
<entry> float8 </entry>
<entry> horizontal size </entry>
<entry> width('((0,0),(1,1))'::box) </entry>
<entry>width(box)</entry>
<entry>float8</entry>
<entry>horizontal size</entry>
<entry>width(box '((0,0),(1,1))')</entry>
</row>
</tbody>
</tgroup>
......@@ -1150,94 +1205,94 @@
</thead>
<tbody>
<row>
<entry> box(circle) </entry>
<entry> box </entry>
<entry> convert circle to box </entry>
<entry> box('((0,0),2.0)'::circle) </entry>
<entry>box(circle)</entry>
<entry>box</entry>
<entry>convert circle to box</entry>
<entry>box('((0,0),2.0)'::circle)</entry>
</row>
<row>
<entry> box(point,point) </entry>
<entry> box </entry>
<entry> convert points to box </entry>
<entry> box('(0,0)'::point,'(1,1)'::point) </entry>
<entry>box(point,point)</entry>
<entry>box</entry>
<entry>convert points to box</entry>
<entry>box('(0,0)'::point,'(1,1)'::point)</entry>
</row>
<row>
<entry> box(polygon) </entry>
<entry> box </entry>
<entry> convert polygon to box </entry>
<entry> box('((0,0),(1,1),(2,0))'::polygon) </entry>
<entry>box(polygon)</entry>
<entry>box</entry>
<entry>convert polygon to box</entry>
<entry>box('((0,0),(1,1),(2,0))'::polygon)</entry>
</row>
<row>
<entry> circle(box) </entry>
<entry> circle </entry>
<entry> convert to circle </entry>
<entry> circle('((0,0),(1,1))'::box) </entry>
<entry>circle(box)</entry>
<entry>circle</entry>
<entry>convert to circle</entry>
<entry>circle('((0,0),(1,1))'::box)</entry>
</row>
<row>
<entry> circle(point,float8) </entry>
<entry> circle </entry>
<entry> convert to circle </entry>
<entry> circle('(0,0)'::point,2.0) </entry>
<entry>circle(point,float8)</entry>
<entry>circle</entry>
<entry>convert to circle</entry>
<entry>circle('(0,0)'::point,2.0)</entry>
</row>
<row>
<entry> lseg(box) </entry>
<entry> lseg </entry>
<entry> convert diagonal to lseg </entry>
<entry> lseg('((-1,0),(1,0))'::box) </entry>
<entry>lseg(box)</entry>
<entry>lseg</entry>
<entry>convert diagonal to lseg</entry>
<entry>lseg('((-1,0),(1,0))'::box)</entry>
</row>
<row>
<entry> lseg(point,point) </entry>
<entry> lseg </entry>
<entry> convert to lseg </entry>
<entry> lseg('(-1,0)'::point,'(1,0)'::point) </entry>
<entry>lseg(point,point)</entry>
<entry>lseg</entry>
<entry>convert to lseg</entry>
<entry>lseg('(-1,0)'::point,'(1,0)'::point)</entry>
</row>
<row>
<entry> path(polygon) </entry>
<entry> point </entry>
<entry> convert to path </entry>
<entry> path('((0,0),(1,1),(2,0))'::polygon) </entry>
<entry>path(polygon)</entry>
<entry>point</entry>
<entry>convert to path</entry>
<entry>path('((0,0),(1,1),(2,0))'::polygon)</entry>
</row>
<row>
<entry> point(circle) </entry>
<entry> point </entry>
<entry> convert to point (center) </entry>
<entry> point('((0,0),2.0)'::circle) </entry>
<entry>point(circle)</entry>
<entry>point</entry>
<entry>convert to point (center)</entry>
<entry>point('((0,0),2.0)'::circle)</entry>
</row>
<row>
<entry> point(lseg,lseg) </entry>
<entry> point </entry>
<entry> convert to point (intersection) </entry>
<entry> point('((-1,0),(1,0))'::lseg, '((-2,-2),(2,2))'::lseg) </entry>
<entry>point(lseg,lseg)</entry>
<entry>point</entry>
<entry>convert to point (intersection)</entry>
<entry>point('((-1,0),(1,0))'::lseg, '((-2,-2),(2,2))'::lseg)</entry>
</row>
<row>
<entry> point(polygon) </entry>
<entry> point </entry>
<entry> center of polygon </entry>
<entry> point('((0,0),(1,1),(2,0))'::polygon) </entry>
<entry>point(polygon)</entry>
<entry>point</entry>
<entry>center of polygon</entry>
<entry>point('((0,0),(1,1),(2,0))'::polygon)</entry>
</row>
<row>
<entry> polygon(box) </entry>
<entry> polygon </entry>
<entry> convert to polygon with 12 points </entry>
<entry> polygon('((0,0),(1,1))'::box) </entry>
<entry>polygon(box)</entry>
<entry>polygon</entry>
<entry>convert to polygon with 12 points</entry>
<entry>polygon('((0,0),(1,1))'::box)</entry>
</row>
<row>
<entry> polygon(circle) </entry>
<entry> polygon </entry>
<entry> convert to 12-point polygon </entry>
<entry> polygon('((0,0),2.0)'::circle) </entry>
<entry>polygon(circle)</entry>
<entry>polygon</entry>
<entry>convert to 12-point polygon</entry>
<entry>polygon('((0,0),2.0)'::circle)</entry>
</row>
<row>
<entry> polygon(<replaceable class="parameter">npts</replaceable>,circle) </entry>
<entry> polygon </entry>
<entry> convert to <replaceable class="parameter">npts</replaceable> polygon </entry>
<entry> polygon(12,'((0,0),2.0)'::circle) </entry>
<entry>polygon(<replaceable class="parameter">npts</replaceable>,circle)</entry>
<entry>polygon</entry>
<entry>convert to <replaceable class="parameter">npts</replaceable> polygon</entry>
<entry>polygon(12,'((0,0),2.0)'::circle)</entry>
</row>
<row>
<entry> polygon(path) </entry>
<entry> polygon </entry>
<entry> convert to polygon </entry>
<entry> polygon('((0,0),(1,1),(2,0))'::path) </entry>
<entry>polygon(path)</entry>
<entry>polygon</entry>
<entry>convert to polygon</entry>
<entry>polygon('((0,0),(1,1),(2,0))'::path)</entry>
</row>
</tbody>
</tgroup>
......@@ -1258,28 +1313,28 @@
</thead>
<tbody>
<row>
<entry> isoldpath(path) </entry>
<entry> path </entry>
<entry> test path for pre-v6.1 form </entry>
<entry> isoldpath('(1,3,0,0,1,1,2,0)'::path) </entry>
<entry>isoldpath(path)</entry>
<entry>path</entry>
<entry>test path for pre-v6.1 form</entry>
<entry>isoldpath('(1,3,0,0,1,1,2,0)'::path)</entry>
</row>
<row>
<entry> revertpoly(polygon) </entry>
<entry> polygon </entry>
<entry> convert pre-v6.1 polygon </entry>
<entry> revertpoly('((0,0),(1,1),(2,0))'::polygon) </entry>
<entry>revertpoly(polygon)</entry>
<entry>polygon</entry>
<entry>convert pre-v6.1 polygon</entry>
<entry>revertpoly('((0,0),(1,1),(2,0))'::polygon)</entry>
</row>
<row>
<entry> upgradepath(path) </entry>
<entry> path </entry>
<entry> convert pre-v6.1 path </entry>
<entry> upgradepath('(1,3,0,0,1,1,2,0)'::path) </entry>
<entry>upgradepath(path)</entry>
<entry>path</entry>
<entry>convert pre-v6.1 path</entry>
<entry>upgradepath('(1,3,0,0,1,1,2,0)'::path)</entry>
</row>
<row>
<entry> upgradepoly(polygon) </entry>
<entry> polygon </entry>
<entry> convert pre-v6.1 polygon </entry>
<entry> upgradepoly('(0,1,2,0,1,0)'::polygon) </entry>
<entry>upgradepoly(polygon)</entry>
<entry>polygon</entry>
<entry>convert pre-v6.1 polygon</entry>
<entry>upgradepoly('(0,1,2,0,1,0)'::polygon)</entry>
</row>
</tbody>
</tgroup>
......@@ -1304,40 +1359,40 @@
</thead>
<tbody>
<row>
<entry> broadcast(cidr) </entry>
<entry> text </entry>
<entry> construct broadcast address as text </entry>
<entry> broadcast('192.168.1.5/24') </entry>
<entry>broadcast(cidr)</entry>
<entry>text</entry>
<entry>construct broadcast address as text</entry>
<entry>broadcast('192.168.1.5/24')</entry>
</row>
<row>
<entry> broadcast(inet) </entry>
<entry> text </entry>
<entry> construct broadcast address as text </entry>
<entry> broadcast('192.168.1.5/24') </entry>
<entry>broadcast(inet)</entry>
<entry>text</entry>
<entry>construct broadcast address as text</entry>
<entry>broadcast('192.168.1.5/24')</entry>
</row>
<row>
<entry> host(inet) </entry>
<entry> text </entry>
<entry> extract host address as text </entry>
<entry> host('192.168.1.5/24') </entry>
<entry>host(inet)</entry>
<entry>text</entry>
<entry>extract host address as text</entry>
<entry>host('192.168.1.5/24')</entry>
</row>
<row>
<entry> masklen(cidr) </entry>
<entry> int4 </entry>
<entry> calculate netmask length </entry>
<entry> masklen('192.168.1.5/24') </entry>
<entry>masklen(cidr)</entry>
<entry>int4</entry>
<entry>calculate netmask length</entry>
<entry>masklen('192.168.1.5/24')</entry>
</row>
<row>
<entry> masklen(inet) </entry>
<entry> int4 </entry>
<entry> calculate netmask length </entry>
<entry> masklen('192.168.1.5/24') </entry>
<entry>masklen(inet)</entry>
<entry>int4</entry>
<entry>calculate netmask length</entry>
<entry>masklen('192.168.1.5/24')</entry>
</row>
<row>
<entry> netmask(inet) </entry>
<entry> text </entry>
<entry> construct netmask as text </entry>
<entry> netmask('192.168.1.5/24') </entry>
<entry>netmask(inet)</entry>
<entry>text</entry>
<entry>construct netmask as text</entry>
<entry>netmask('192.168.1.5/24')</entry>
</row>
</tbody>
</tgroup>
......
<Chapter Id="odbc">
<DocInfo>
<AuthorGroup>
<Author>
<FirstName>Tim</FirstName>
<Surname>Goeke</Surname>
</Author>
<Author>
<FirstName>Thomas</FirstName>
<Surname>Lockhart</Surname>
</Author>
</AuthorGroup>
<Date>1998-10-21</Date>
</DocInfo>
<Title>ODBC Interface</Title>
<Note>
<Para>
Background information originally by
<ULink url="mailto:tgoeke@xpressway.com">Tim Goeke</ULink>
</Para>
</Note>
<Para>
<acronym>ODBC</acronym> (Open Database Connectivity) is an abstract
<acronym>API</acronym>
which allows you to write applications which can interoperate
with various <acronym>RDBMS</acronym> servers.
<acronym>ODBC</acronym> provides a product-neutral interface
between frontend applications and database servers,
allowing a user or developer to write applications which are
transportable between servers from different manufacturers..
</Para>
<Sect1>
<Title>Background</Title>
<Para>
The <acronym>ODBC</acronym> <acronym>API</acronym> matches up
on the backend to an <acronym>ODBC</acronym>-compatible data source.
This could be anything from a text file to an Oracle or
<productname>Postgres</productname> <acronym>RDBMS</acronym>.
</Para>
<Para>
The backend access come from <acronym>ODBC</acronym> drivers,
or vendor specifc drivers that
allow data access. <productname>psqlODBC</productname> is such a driver,
along with others that are
available, such as the OpenLink <acronym>ODBC</acronym> drivers.
</Para>
<Para>
Once you write an <acronym>ODBC</acronym> application,
you <emphasis>should</emphasis> be able to connect to <emphasis>any</emphasis>
back end database, regardless of the vendor, as long as the database schema
is the same.
</Para>
<Para>
For example. you could have <productname>MS SQL Server</productname>
and <productname>Postgres</productname> servers which have
exactly the same data. Using <acronym>ODBC</acronym>,
your Windows application would make exactly the
same calls and the back end data source would look the same (to the Windows
app).
</Para>
<para>
<ulink url="http://www.insightdist.com/">Insight Distributors</ulink>
provides active and ongoing
support for the core <productname>psqlODBC</productname> distribution.
They provide a
<ulink url="http://www.insightdist.com/psqlodbc/"><acronym>FAQ</acronym></ulink>,
ongoing development on the code base, and actively participate on the
<ulink url="mailto:interfaces@postgresql.org">interfaces mailing list</ulink>.
</Para>
</sect1>
<sect1>
<title><productname>Windows</productname> Applications</title>
<Para>
In the real world, differences in drivers and the level of
<acronym>ODBC</acronym> support
lessens the potential of <acronym>ODBC</acronym>:
<ItemizedList Mark="bullet" Spacing="compact">
<ListItem>
<Para>
Access, Delphi, and Visual Basic all support <acronym>ODBC</acronym> directly.
</Para>
</listitem>
<ListItem>
<Para>
Under C++, such as Visual C++,
you can use the C++ <acronym>ODBC</acronym> <acronym>API</acronym>.
</Para>
</listitem>
<ListItem>
<Para>
In Visual C++, you can use the CRecordSet class, which wraps the
<acronym>ODBC</acronym> <acronym>API</acronym>
set within an MFC 4.2 class. This is the easiest route if you are doing
Windows C++ development under Windows NT.
</Para>
</listitem>
</ItemizedList>
</Para>
<sect2>
<title>Writing Applications</title>
<Para>
<quote>
If I write an application for <productname>Postgres</productname>
can I write it using <acronym>ODBC</acronym> calls
to the <productname>Postgres</productname> server,
or is that only when another database program
like MS SQL Server or Access needs to access the data?</quote>
</para>
<Para>
The <acronym>ODBC</acronym> <acronym>API</acronym>
is the way to go.
For <productname>Visual C++</productname> coding you can find out more at
Microsoft's web site or in your <productname>VC++</productname> docs.
</Para>
<Para>
Visual Basic and the other RAD tools have Recordset objects
that use <acronym>ODBC</acronym>
directly to access data. Using the data-aware controls, you can quickly
link to the <acronym>ODBC</acronym> back end database
(<Emphasis>very</Emphasis> quickly).
</Para>
<Para>
Playing around with MS Access will help you sort this out. Try using
<literal>File->Get External Data</literal>.
</Para>
<Tip>
<Para>
You'll have to set up a DSN first.
</Para>
</Tip>
<chapter id="odbc">
<docinfo>
<authorgroup>
<author>
<firstname>Tim</firstname>
<surname>Goeke</surname>
</author>
<author>
<firstname>Thomas</firstname>
<surname>Lockhart</surname>
</author>
</authorgroup>
<date>1998-10-21</date>
</docinfo>
<title>ODBC Interface</title>
<note>
<para>
Background information originally by
<ulink url="mailto:tgoeke@xpressway.com">Tim Goeke</ulink>
</para>
</note>
<para>
<acronym>ODBC</acronym> (Open Database Connectivity) is an abstract
<acronym>API</acronym>
which allows you to write applications which can interoperate
with various <acronym>RDBMS</acronym> servers.
<acronym>ODBC</acronym> provides a product-neutral interface
between frontend applications and database servers,
allowing a user or developer to write applications which are
transportable between servers from different manufacturers..
</para>
<sect1>
<title>Background</title>
<para>
The <acronym>ODBC</acronym> <acronym>API</acronym> matches up
on the backend to an <acronym>ODBC</acronym>-compatible data source.
This could be anything from a text file to an Oracle or
<productname>Postgres</productname> <acronym>RDBMS</acronym>.
</para>
<para>
The backend access come from <acronym>ODBC</acronym> drivers,
or vendor specifc drivers that
allow data access. <productname>psqlODBC</productname> is such a driver,
along with others that are
available, such as the OpenLink <acronym>ODBC</acronym> drivers.
</para>
<para>
Once you write an <acronym>ODBC</acronym> application,
you <emphasis>should</emphasis> be able to connect to <emphasis>any</emphasis>
back end database, regardless of the vendor, as long as the database schema
is the same.
</para>
<para>
For example. you could have <productname>MS SQL Server</productname>
and <productname>Postgres</productname> servers which have
exactly the same data. Using <acronym>ODBC</acronym>,
your Windows application would make exactly the
same calls and the back end data source would look the same (to the Windows
app).
</para>
<!--
<Para>
<Tip>
<Para>
The <productname>Postgres</productname> datetime type will break MS Access.
</Para>
</Tip>
<para>
<ulink url="http://www.insightdist.com/">Insight Distributors</ulink>
provides active and ongoing
support for the core <productname>psqlODBC</productname> distribution.
They provide a
<ulink url="http://www.insightdist.com/psqlodbc/"><acronym>FAQ</acronym></ulink>,
ongoing development on the code base, and actively participate on the
<ulink url="mailto:interfaces@postgresql.org">interfaces mailing list</ulink>.
</para>
-->
</sect2>
</sect1>
<sect1>
<title>Unix Installation</title>
<para>
<productname>ApplixWare</productname> has an
<acronym>ODBC</acronym> database interface
supported on at least some platforms.
<productname>ApplixWare</productname> v4.4.1 has been
demonstrated under Linux with <productname>Postgres</productname> v6.4
using the <productname>psqlODBC</productname>
driver contained in the <productname>Postgres</productname> distribution.
</Para>
<sect2>
<title>Building the Driver</title>
<para>
The first thing
to note about the <productname>psqlODBC</productname> driver
(or any <acronym>ODBC</acronym> driver) is that there must
exist a driver manager on the system where
the <acronym>ODBC</acronym> driver is to be
used. There exists a freeware <acronym>ODBC</acronym> driver for Unix
called <productname>iodbc</productname> which
can be obtained from various locations on the Net, including at
<ulink url="http://www.as220.org/FreeODBC/iodbc-2.12.shar.Z">AS200</ulink>.
Instructions for installing <productname>iodbc</productname>
are beyond the scope of this
document, but there is a <filename>README</filename>
that can be found inside the <productname>iodbc</productname> compressed
.shar file that should explain how to get it up and running.
</Para>
<para>
Having said that, any driver manager that you can find for your platform
should support the <productname>psqlODBC</productname> driver
or any <acronym>ODBC</acronym> driver.
</Para>
<para>
The Unix configuration files for <productname>psqlODBC</productname>
have recently been extensively
reworked to allow for easy building on supported platforms as
well as to allow for support of other Unix platforms in the future.
The new configuration and build files for the driver should make it
a simple process to build the driver on the supported platforms. Currently
these include Linux and FreeBSD but we are hoping other users will
contribute the necessary information to quickly expand the number of
platforms for which the driver can be built.
</Para>
<para>
There are actually two separate methods to build the driver depending on
how you received it and these differences come down to only where and how to
run <application>configure</application> and <application>make</application>.
The driver can be built in a standalone, client-only installation, or can be
built as a part of the main <productname>Postgres</productname> distribution.
The standalone installation is convenient if you have <acronym>ODBC</acronym>
client applications on multiple, heterogeneous platforms. The integrated
installation is convenient when the target client is the same as the
server, or when the client and server have similar runtime configurations.
</Para>
<para>
Specifically if you have received the <productname>psqlODBC</productname>
driver as part of the <productname>Postgres</productname> distribution
(from now on referred to as an "integrated" build) then you will
configure and make the <acronym>ODBC</acronym> driver
from the top level source directory
of the <productname>Postgres</productname> distribution
along with the rest of its libraries.
If you received the driver as a standalone package than you will run
configure and make from the directory in which you unpacked the
driver source.
</Para>
<procedure>
<title>Integrated Installation</title>
<para>
This installation procedure is appropriate for an integrated installation.
</Para>
<step performance="required">
<para>
Specify the <option>--with-odbc</option>
command-line argument for <application>src/configure</application>:
<programlisting>
% ./configure --with-odbc
% make
</programlisting>
</Para>
</step>
<step performance="required">
<para>
Rebuild the <productname>Postgres</productname> distribution:
<programlisting>
% make install
</programlisting>
</Para>
</step>
</procedure>
<para>
Once configured, the <acronym>ODBC</acronym> driver will be built and installed
into the areas defined for the other components of the
<productname>Postgres</productname> system. The installation-wide
<acronym>ODBC</acronym> configuration file will be placed into
the top directory of the Postgres target tree (<envar>POSTGRESDIR</envar>).
This can be overridden from the <application>make</application> command-line
as
<programlisting>
% make ODBCINST=<replaceable>filename</replaceable> install
</programlisting>
</Para>
<procedure>
<title>Pre-v6.4 Integrated Installation</title>
<para>
If you have a <productname>Postgres</productname> installation older than
v6.4, you have the original source tree available,
and you want to use the newest version of the <acronym>ODBC</acronym>
driver, then you may want to try this form of installation.
</Para>
<step performance="required">
<para>
Copy the output tar file to your target system and unpack it into a
clean directory.
</Para>
</step>
<step performance="required">
<para>
From the directory containing the
sources, type:
<programlisting>
% ./configure
% make
% make POSTGRESDIR=<replaceable class="parameter">PostgresTopDir</replaceable> install
</programlisting>
</Para>
</step>
<step performance="optional">
<para>
If you would like to install components into different trees,
then you can specify various destinations explicitly:
<programlisting>
% make BINDIR=bindir LIBDIR=libdir HEADERDIR=headerdir ODBCINST=instfile install
</programlisting>
</Para>
</step>
</procedure>
<procedure>
<title>Standalone Installation</title>
<para>
A standalone installation is not integrated with or built on the normal
<productname>Postgres</productname> distribution. It should be best suited
for building the <acronym>ODBC</acronym> driver for multiple, heterogeneous
clients who do not have a locally-installed <productname>Postgres</productname>
source tree.
</Para>
<para>
The default location for libraries and headers
for the standalone installation is <filename>/usr/local/lib</filename>
and <filename>/usr/local/include/iodbc</filename>, respectively.
There is another system wide configuration file that gets installed
as <filename>/share/odbcinst.ini</filename> (if <filename>/share</filename>
exists) or as <filename>/etc/odbcinst.ini</filename>
(if <filename>/share</filename> does not exist).
</Para>
<note>
<para>
Installation of files into <filename>/share</filename>
or <filename>/etc</filename> requires system root privileges.
Most installation steps for <productname>Postgres</productname> do not
have this requirement, and you can choose another destination which
is writable by your non-root <productname>Postgres</productname> superuser
account instead.
</Para>
</note>
<step performance="required">
<para>
The standalone installation distribution can be built from the
<productname>Postgres</productname> distribution or may be obtained from
<ulink url="http://www.insightdist.com/psqlodbc">Insight Distributors</ulink>,
the current maintainers of the non-Unix sources.
</Para>
<para>
Copy the zip
or gzipped tarfile to an empty directory. If using the zip package
unzip it with the command
<programlisting>
% unzip -a <replaceable>packagename</replaceable>
</programlisting>
The <option>-a</option> option
is necessary to get rid of <acronym>DOS</acronym>
CR/LF pairs in the source files.
</Para>
<para>
If you have the gzipped tar package than simply run
<programlisting>
tar -xzf <replaceable>packagename</replaceable>
</programlisting>
</Para>
<substeps>
<step performance="optional">
<para>
To create a tar file for a complete standalone installation
from the main <productname>Postgres</productname> source tree:
</Para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Configure the main <productname>Postgres</productname> distribution.
</Para>
</step>
<step performance="required">
<para>
Create the tar file:
<programlisting>
% cd interfaces/odbc
% make standalone
</programlisting>
</Para>
</step>
<step performance="required">
<para>
Copy the output tar file to your target system. Be sure to transfer as
a binary file if using <application>ftp</application>.
</Para>
</step>
<step performance="required">
<para>
Unpack the tar file into a clean
directory.
</Para>
</step>
<step performance="required">
<para>
Configure the standalone installation:
<programlisting>
% ./configure
</programlisting>
</Para>
<para>
The configuration can be done with options:
<programlisting>
% ./configure --prefix=<replaceable>rootdir</replaceable> --with-odbc=<replaceable>inidir</replaceable>
</programlisting>
where <option>--prefix</option> installs the libraries and headers in
the directories <filename><replaceable>rootdir</replaceable>/lib</filename> and
<filename><replaceable>rootdir</replaceable>/include/iodbc</filename>, and
<option>--with-odbc</option> installs <filename>odbcinst.ini</filename> in the
specified directory.
</Para>
<para>
Note that both of these options can also be used from the integrated build
but be aware that <emphasis>when used in the integrated build</emphasis>
<option>--prefix</option> will also apply to the rest of
your <productname>Postgres</productname> installation.
<option>--with-odbc</option> applies only to the configuration file
<filename>odbcinst.ini</filename>.
</Para>
</step>
<step performance="required">
<para>
Compile and link the source code:
<programlisting>
% make ODBCINST=<replaceable>instdir</replaceable>
</programlisting>
</Para>
<para>
You can also override the default location for installation on the
'make' command line. This only applies to the installation of the
library and header files. Since the driver needs to know the location
of the odbcinst.ini file attempting to override the enviroment variable
that specifies its installation directory will probably cause you
headaches. It is safest simply to allow the driver to install the
odbcinst.ini file in the default directory or the directory you specified
on the './configure' command line with --with-odbc.
</Para>
</step>
<!--
This doesn't currently work - thomas 1998-10-19
<tip>
<para>
<envar>ODBCINST</envar> can be specified during configuration or during
the compilation. It is not necessary to do so in both steps.
</tip>
-->
<step performance="required">
<para>
Install the source code:
<programlisting>
% make POSTGRESDIR=<replaceable>targettree</replaceable> install
</programlisting>
</Para>
<para>
To override the library and header installation directories separately
you need to pass the correct installation variables on the
<literal>make install</literal> command line. These variables are
<envar>LIBDIR</envar>, <envar>HEADERDIR</envar>
and <envar>ODBCINST</envar>.
Overriding <envar>POSTGRESDIR</envar> on the make command line will cause
<envar>LIBDIR</envar> and <envar>HEADERDIR</envar>
to be rooted at the new directory you specify.
<envar>ODBCINST</envar> is independent of <envar>POSTGRESDIR</envar>.
</Para>
<para>
Here is how you would specify the various destinations explicitly:
<programlisting>
% make BINDIR=<replaceable>bindir</replaceable> LIBDIR=<replaceable>libdir</replaceable> HEADERDIR=<replaceable>headerdir</replaceable> install
</programlisting>
</Para>
<para>
For example, typing
<programlisting>
% make POSTGRESDIR=/opt/psqlodbc install
</programlisting>
(after you've used
<application>./configure</application> and <application>make</application>)
will cause the libraries and headers to be installed in the directories
<filename>/opt/psqlodbc/lib</filename>
and <filename>/opt/psqlodbc/include/iodbc</filename> respectively.
</Para>
<para>
The command
<programlisting>
% make POSTGRESDIR=/opt/psqlodbc HEADERDIR=/usr/local install
</programlisting>
should cause the libraries to be installed in /opt/psqlodbc/lib and
the headers in /usr/local/include/iodbc. If this doesn't work as
expected please contact one of the maintainers.
</Para>
</step>
</procedure>
</sect2>
</sect1>
<sect1>
<title>Configuration Files</title>
<para>
<filename>~/.odbc.ini</filename> contains user-specified access information
for the <productname>psqlODBC</productname> driver.
The file uses conventions typical for <productname>Windows</productname>
Registry files, but despite this restriction can be made to work.
</Para>
<para>
The <filename>.odbc.ini</filename> file has three required sections.
The first is <literal>[ODBC Data Sources]</literal>
which is a list of arbitrary names and descriptions for each database
you wish to access. The second required section is the
Data Source Specification and there will be one of these sections
for each database.
Each section must be labeled with the name given in
<literal>[ODBC Data Sources]</literal> and must contain the following entries:
<programlisting>
Driver = <replaceable>POSTGRESDIR</replaceable>/lib/libpsqlodbc.so
Database=<replaceable>DatabaseName</replaceable>
Servername=localhost
Port=5432
</programlisting>
<tip>
<para>
Remember that the <productname>Postgres</productname> database name is
usually a single word, without path names of any sort.
The <productname>Postgres</productname> server manages the actual access
to the database, and you need only specify the name from the client.
</Para>
</tip>
Other entries may be inserted to control the format of the display.
The third required section is <literal>[ODBC]</literal>
which must contain the <literal>InstallDir</literal> keyword
and which may contain other options.
</Para>
<para>
Here is an example <filename>.odbc.ini</filename> file,
showing access information for three databases:
<programlisting>
</sect1>
<sect1>
<title><productname>Windows</productname> Applications</title>
<para>
In the real world, differences in drivers and the level of
<acronym>ODBC</acronym> support
lessens the potential of <acronym>ODBC</acronym>:
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<para>
Access, Delphi, and Visual Basic all support <acronym>ODBC</acronym> directly.
</para>
</listitem>
<listitem>
<para>
Under C++, such as Visual C++,
you can use the C++ <acronym>ODBC</acronym> <acronym>API</acronym>.
</para>
</listitem>
<listitem>
<para>
In Visual C++, you can use the CRecordSet class, which wraps the
<acronym>ODBC</acronym> <acronym>API</acronym>
set within an MFC 4.2 class. This is the easiest route if you are doing
Windows C++ development under Windows NT.
</para>
</listitem>
</itemizedlist>
</para>
<sect2>
<title>Writing Applications</title>
<para>
<quote>
If I write an application for <productname>Postgres</productname>
can I write it using <acronym>ODBC</acronym> calls
to the <productname>Postgres</productname> server,
or is that only when another database program
like MS SQL Server or Access needs to access the data?</quote>
</para>
<para>
The <acronym>ODBC</acronym> <acronym>API</acronym>
is the way to go.
For <productname>Visual C++</productname> coding you can find out more at
Microsoft's web site or in your <productname>VC++</productname> docs.
</para>
<para>
Visual Basic and the other RAD tools have Recordset objects
that use <acronym>ODBC</acronym>
directly to access data. Using the data-aware controls, you can quickly
link to the <acronym>ODBC</acronym> back end database
(<emphasis>very</emphasis> quickly).
</para>
<para>
Playing around with MS Access will help you sort this out. Try using
<literal>File->Get External Data</literal>.
</para>
<tip>
<para>
You'll have to set up a DSN first.
</para>
</tip>
<!--
<Para>
<Tip>
<Para>
The <productname>Postgres</productname> datetime type will break MS Access.
</Para>
</Tip>
-->
</sect2>
</sect1>
<sect1>
<title>Unix Installation</title>
<para>
<productname>ApplixWare</productname> has an
<acronym>ODBC</acronym> database interface
supported on at least some platforms.
<productname>ApplixWare</productname> v4.4.1 has been
demonstrated under Linux with <productname>Postgres</productname> v6.4
using the <productname>psqlODBC</productname>
driver contained in the <productname>Postgres</productname> distribution.
</para>
<sect2>
<title>Building the Driver</title>
<para>
The first thing
to note about the <productname>psqlODBC</productname> driver
(or any <acronym>ODBC</acronym> driver) is that there must
exist a driver manager on the system where
the <acronym>ODBC</acronym> driver is to be
used. There exists a freeware <acronym>ODBC</acronym> driver for Unix
called <productname>iodbc</productname> which
can be obtained from various locations on the Net, including at
<ulink url="http://www.as220.org/FreeODBC/iodbc-2.12.shar.Z">AS200</ulink>.
Instructions for installing <productname>iodbc</productname>
are beyond the scope of this
document, but there is a <filename>README</filename>
that can be found inside the <productname>iodbc</productname> compressed
.shar file that should explain how to get it up and running.
</para>
<para>
Having said that, any driver manager that you can find for your platform
should support the <productname>psqlODBC</productname> driver
or any <acronym>ODBC</acronym> driver.
</para>
<para>
The Unix configuration files for <productname>psqlODBC</productname>
have recently been extensively
reworked to allow for easy building on supported platforms as
well as to allow for support of other Unix platforms in the future.
The new configuration and build files for the driver should make it
a simple process to build the driver on the supported platforms. Currently
these include Linux and FreeBSD but we are hoping other users will
contribute the necessary information to quickly expand the number of
platforms for which the driver can be built.
</para>
<para>
There are actually two separate methods to build the driver depending on
how you received it and these differences come down to only where and how to
run <application>configure</application> and <application>make</application>.
The driver can be built in a standalone, client-only installation, or can be
built as a part of the main <productname>Postgres</productname> distribution.
The standalone installation is convenient if you have <acronym>ODBC</acronym>
client applications on multiple, heterogeneous platforms. The integrated
installation is convenient when the target client is the same as the
server, or when the client and server have similar runtime configurations.
</para>
<para>
Specifically if you have received the <productname>psqlODBC</productname>
driver as part of the <productname>Postgres</productname> distribution
(from now on referred to as an "integrated" build) then you will
configure and make the <acronym>ODBC</acronym> driver
from the top level source directory
of the <productname>Postgres</productname> distribution
along with the rest of its libraries.
If you received the driver as a standalone package than you will run
configure and make from the directory in which you unpacked the
driver source.
</para>
<procedure>
<title>Integrated Installation</title>
<para>
This installation procedure is appropriate for an integrated installation.
</para>
<step performance="required">
<para>
Specify the <option>--with-odbc</option>
command-line argument for <application>src/configure</application>:
<programlisting>
% ./configure --with-odbc
% make
</programlisting>
</para>
</step>
<step performance="required">
<para>
Rebuild the <productname>Postgres</productname> distribution:
<programlisting>
% make install
</programlisting>
</para>
</step>
</procedure>
<para>
Once configured, the <acronym>ODBC</acronym> driver will be built and installed
into the areas defined for the other components of the
<productname>Postgres</productname> system. The installation-wide
<acronym>ODBC</acronym> configuration file will be placed into
the top directory of the Postgres target tree (<envar>POSTGRESDIR</envar>).
This can be overridden from the <application>make</application> command-line
as
<programlisting>
% make ODBCINST=<replaceable>filename</replaceable> install
</programlisting>
</para>
<procedure>
<title>Pre-v6.4 Integrated Installation</title>
<para>
If you have a <productname>Postgres</productname> installation older than
v6.4, you have the original source tree available,
and you want to use the newest version of the <acronym>ODBC</acronym>
driver, then you may want to try this form of installation.
</para>
<step performance="required">
<para>
Copy the output tar file to your target system and unpack it into a
clean directory.
</para>
</step>
<step performance="required">
<para>
From the directory containing the
sources, type:
<programlisting>
% ./configure
% make
% make POSTGRESDIR=<replaceable class="parameter">PostgresTopDir</replaceable> install
</programlisting>
</para>
</step>
<step performance="optional">
<para>
If you would like to install components into different trees,
then you can specify various destinations explicitly:
<programlisting>
% make BINDIR=bindir LIBDIR=libdir HEADERDIR=headerdir ODBCINST=instfile install
</programlisting>
</para>
</step>
</procedure>
<procedure>
<title>Standalone Installation</title>
<para>
A standalone installation is not integrated with or built on the normal
<productname>Postgres</productname> distribution. It should be best suited
for building the <acronym>ODBC</acronym> driver for multiple, heterogeneous
clients who do not have a locally-installed <productname>Postgres</productname>
source tree.
</para>
<para>
The default location for libraries and headers
for the standalone installation is <filename>/usr/local/lib</filename>
and <filename>/usr/local/include/iodbc</filename>, respectively.
There is another system wide configuration file that gets installed
as <filename>/share/odbcinst.ini</filename> (if <filename>/share</filename>
exists) or as <filename>/etc/odbcinst.ini</filename>
(if <filename>/share</filename> does not exist).
</para>
<note>
<para>
Installation of files into <filename>/share</filename>
or <filename>/etc</filename> requires system root privileges.
Most installation steps for <productname>Postgres</productname> do not
have this requirement, and you can choose another destination which
is writable by your non-root <productname>Postgres</productname> superuser
account instead.
</para>
</note>
<step performance="required">
<para>
The standalone installation distribution can be built from the
<productname>Postgres</productname> distribution or may be obtained from
<ulink url="http://www.insightdist.com/psqlodbc">Insight Distributors</ulink>,
the current maintainers of the non-Unix sources.
</para>
<para>
Copy the zip
or gzipped tarfile to an empty directory. If using the zip package
unzip it with the command
<programlisting>
% unzip -a <replaceable>packagename</replaceable>
</programlisting>
The <option>-a</option> option
is necessary to get rid of <acronym>DOS</acronym>
CR/LF pairs in the source files.
</para>
<para>
If you have the gzipped tar package than simply run
<programlisting>
tar -xzf <replaceable>packagename</replaceable>
</programlisting>
</para>
<substeps>
<step performance="optional">
<para>
To create a tar file for a complete standalone installation
from the main <productname>Postgres</productname> source tree:
</para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Configure the main <productname>Postgres</productname> distribution.
</para>
</step>
<step performance="required">
<para>
Create the tar file:
<programlisting>
% cd interfaces/odbc
% make standalone
</programlisting>
</para>
</step>
<step performance="required">
<para>
Copy the output tar file to your target system. Be sure to transfer as
a binary file if using <application>ftp</application>.
</para>
</step>
<step performance="required">
<para>
Unpack the tar file into a clean
directory.
</para>
</step>
<step performance="required">
<para>
Configure the standalone installation:
<programlisting>
% ./configure
</programlisting>
</para>
<para>
The configuration can be done with options:
<programlisting>
% ./configure --prefix=<replaceable>rootdir</replaceable>
--with-odbc=<replaceable>inidir</replaceable>
</programlisting>
where <option>--prefix</option> installs the libraries and headers in
the directories <filename><replaceable>rootdir</replaceable>/lib</filename> and
<filename><replaceable>rootdir</replaceable>/include/iodbc</filename>, and
<option>--with-odbc</option> installs <filename>odbcinst.ini</filename> in the
specified directory.
</para>
<para>
Note that both of these options can also be used from the integrated build
but be aware that <emphasis>when used in the integrated build</emphasis>
<option>--prefix</option> will also apply to the rest of
your <productname>Postgres</productname> installation.
<option>--with-odbc</option> applies only to the configuration file
<filename>odbcinst.ini</filename>.
</para>
</step>
<step performance="required">
<para>
Compile and link the source code:
<programlisting>
% make ODBCINST=<replaceable>instdir</replaceable>
</programlisting>
</para>
<para>
You can also override the default location for installation on the
'make' command line. This only applies to the installation of the
library and header files. Since the driver needs to know the location
of the odbcinst.ini file attempting to override the enviroment variable
that specifies its installation directory will probably cause you
headaches. It is safest simply to allow the driver to install the
odbcinst.ini file in the default directory or the directory you specified
on the './configure' command line with --with-odbc.
</para>
</step>
<!--
This doesn't currently work - thomas 1998-10-19
<tip>
<para>
<envar>ODBCINST</envar> can be specified during configuration or during
the compilation. It is not necessary to do so in both steps.
</tip>
-->
<step performance="required">
<para>
Install the source code:
<programlisting>
% make POSTGRESDIR=<replaceable>targettree</replaceable> install
</programlisting>
</para>
<para>
To override the library and header installation directories separately
you need to pass the correct installation variables on the
<literal>make install</literal> command line. These variables are
<envar>LIBDIR</envar>, <envar>HEADERDIR</envar>
and <envar>ODBCINST</envar>.
Overriding <envar>POSTGRESDIR</envar> on the make command line will cause
<envar>LIBDIR</envar> and <envar>HEADERDIR</envar>
to be rooted at the new directory you specify.
<envar>ODBCINST</envar> is independent of <envar>POSTGRESDIR</envar>.
</para>
<para>
Here is how you would specify the various destinations explicitly:
<programlisting>
% make BINDIR=<replaceable>bindir</replaceable>
LIBDIR<replaceable>>libdi</replaceable>>
HEADERDIR=<replaceable>headerdir</replaceable> install
</programlisting>
</para>
<para>
For example, typing
<programlisting>
% make POSTGRESDIR=/opt/psqlodbc install
</programlisting>
(after you've used
<application>./configure</application> and <application>make</application>)
will cause the libraries and headers to be installed in the directories
<filename>/opt/psqlodbc/lib</filename>
and <filename>/opt/psqlodbc/include/iodbc</filename> respectively.
</para>
<para>
The command
<programlisting>
% make POSTGRESDIR=/opt/psqlodbc HEADERDIR=/usr/local install
</programlisting>
should cause the libraries to be installed in /opt/psqlodbc/lib and
the headers in /usr/local/include/iodbc. If this doesn't work as
expected please contact one of the maintainers.
</para>
</step>
</procedure>
</sect2>
</sect1>
<sect1>
<title>Configuration Files</title>
<para>
<filename>~/.odbc.ini</filename> contains user-specified access information
for the <productname>psqlODBC</productname> driver.
The file uses conventions typical for <productname>Windows</productname>
Registry files, but despite this restriction can be made to work.
</para>
<para>
The <filename>.odbc.ini</filename> file has three required sections.
The first is <literal>[ODBC Data Sources]</literal>
which is a list of arbitrary names and descriptions for each database
you wish to access. The second required section is the
Data Source Specification and there will be one of these sections
for each database.
Each section must be labeled with the name given in
<literal>[ODBC Data Sources]</literal> and must contain the following entries:
<programlisting>
Driver = <replaceable>POSTGRESDIR</replaceable>/lib/libpsqlodbc.so
Database=<replaceable>DatabaseName</replaceable>
Servername=localhost
Port=5432
</programlisting>
<tip>
<para>
Remember that the <productname>Postgres</productname> database name is
usually a single word, without path names of any sort.
The <productname>Postgres</productname> server manages the actual access
to the database, and you need only specify the name from the client.
</para>
</tip>
Other entries may be inserted to control the format of the display.
The third required section is <literal>[ODBC]</literal>
which must contain the <literal>InstallDir</literal> keyword
and which may contain other options.
</para>
<para>
Here is an example <filename>.odbc.ini</filename> file,
showing access information for three databases:
<programlisting>
[ODBC Data Sources]
DataEntry = Read/Write Database
QueryOnly = Read-only Database
......@@ -620,465 +625,468 @@ Driver = /opt/postgres/current/lib/libpsqlodbc.so
[ODBC]
InstallDir = /opt/applix/axdata/axshlib
</programlisting>
</Para>
</sect1>
<sect1>
<title>ApplixWare</title>
<sect2>
<title>Configuration</title>
<para>
<productname>ApplixWare</productname> must be configured correctly
in order for it to
be able to access the <productname>Postgres</productname>
<acronym>ODBC</acronym> software drivers.
</Para>
<procedure>
<title>Enabling ApplixWare Database Access</title>
<para>
These instructions are for the 4.4.1 release of
<productname>ApplixWare</productname> on <productname>Linux</productname>.
Refer to the <citetitle>Linux Sys Admin</citetitle> on-line book
for more detailed information.
</Para>
<step performance="required">
<para>
You must modify <filename>axnet.cnf</filename> so that
<filename>elfodbc</filename> can
find <filename>libodbc.so</filename>
(the <acronym>ODBC</acronym> driver manager) shared library.
This library is included with the ApplixWare distribution,
but <filename>axnet.cnf</filename> needs to be modified to point to the
correct location.
</Para>
<para>
As root, edit the file
<filename><replaceable>applixroot</replaceable>/applix/axdata/axnet.cnf</filename>.
</Para>
<substeps>
<step performance="required">
<para>
At the bottom of <filename>axnet.cnf</filename>,
find the line that starts with
<programlisting>
#libFor elfodbc /ax/<replaceable>...</replaceable>
</programlisting>
</Para>
</step>
<step performance="required">
<para>
Change line to read
<programlisting>
libFor elfodbc <replaceable>applixroot</replaceable>/applix/axdata/axshlib/lib
</programlisting>
which will tell elfodbc to look in this directory
for the <acronym>ODBC</acronym> support library.
If you have installed applix somewhere else,
change the path accordingly.
</Para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Create <filename>.odbc.ini</filename> as
described above. You may also want to add the flag
<programlisting>
TextAsLongVarchar=0
</programlisting>
to the database-specific portion of <filename>.odbc.ini</filename>
so that text fields will not be shown as <literal>**BLOB**</literal>.
</Para>
</step>
</procedure>
<procedure>
<title>Testing ApplixWare ODBC Connections</title>
<step performance="required">
<para>
Bring up <application>Applix Data</application>
</Para>
</step>
<step performance="required">
<para>
Select the <productname>Postgres</productname> database of interest.
</Para>
<substeps>
<step performance="required">
<para>
Select <command>Query->Choose Server</command>.
</Para>
</step>
<step performance="required">
<para>
Select <acronym>ODBC</acronym>, and click <command>Browse</command>.
The database you configured in <filename>.odbc.ini</filename>
should be shown. Make sure that the <option>Host: field</option>
is empty (if it is not, axnet will try to contact axnet on another machine
to look for the database).
</Para>
</step>
<step performance="required">
<para>
Select the database in the box that was launched by <command>Browse</command>,
then click <command>OK</command>.
</Para>
</step>
<step performance="required">
<para>
Enter username and password in the login identification dialog,
and click <command>OK</command>.
</Para>
</step>
</substeps>
<para>
You should see <quote>Starting elfodbc server</quote>
in the lower left corner of the
data window. If you get an error dialog box, see the debugging section
below.
</Para>
</step>
<step performance="required">
<para>
The 'Ready' message will appear in the lower left corner of the data
window. This indicates that you can now enter queries.
</Para>
</step>
<step performance="required">
<para>
Select a table from Query->Choose tables, and then select Query->Query
to access the database. The first 50 or so rows from the table should
appear.
</Para>
</step>
</procedure>
</sect2>
<sect2>
<title>Common Problems</title>
<para>
The following messages can appear while trying to make an
<acronym>ODBC</acronym> connection through
<productname>Applix Data</productname>:
<variablelist>
<varlistentry>
<term>
Cannot launch gateway on server
</term>
<listitem>
<para>
<literal>elfodbc</literal> can't find <filename>libodbc.so</filename>.
Check your <filename>axnet.cnf</filename>.
</Para>
</listitem>
</varlistentry>
<varlistentry>
<term>
Error from ODBC Gateway:
IM003::[iODBC][Driver Manager]Specified driver could not be loaded
</term>
<listitem>
<para>
<filename>libodbc.so</filename> cannot find the driver listed in
<filename>.odbc.ini</filename>. Verify the settings.
</Para>
</listitem>
</varlistentry>
<varlistentry>
<term>
Server: Broken Pipe
</term>
<listitem>
<para>
</programlisting>
</para>
</sect1>
<sect1>
<title>ApplixWare</title>
<sect2>
<title>Configuration</title>
<para>
<productname>ApplixWare</productname> must be configured correctly
in order for it to
be able to access the <productname>Postgres</productname>
<acronym>ODBC</acronym> software drivers.
</para>
<procedure>
<title>Enabling ApplixWare Database Access</title>
<para>
These instructions are for the <literal>4.4.2</literal> release of
<productname>ApplixWare</productname> on <productname>Linux</productname>.
Refer to the <citetitle>Linux Sys Admin</citetitle> on-line book
for more detailed information.
</para>
<step performance="required">
<para>
You must modify <filename>axnet.cnf</filename> so that
<filename>elfodbc</filename> can
find <filename>libodbc.so</filename>
(the <acronym>ODBC</acronym> driver manager) shared library.
This library is included with the ApplixWare distribution,
but <filename>axnet.cnf</filename> needs to be modified to point to the
correct location.
</para>
<para>
As root, edit the file
<filename><replaceable>applixroot</replaceable>/applix/axdata/axnet.cnf</filename>.
</para>
<substeps>
<step performance="required">
<para>
At the bottom of <filename>axnet.cnf</filename>,
find the line that starts with
<programlisting>
#libFor elfodbc /ax/<replaceable>...</replaceable>
</programlisting>
</para>
</step>
<step performance="required">
<para>
Change line to read
<programlisting>
libFor elfodbc <replaceable>applixroot</replaceable>/applix/axdata/axshlib/lib
</programlisting>
which will tell elfodbc to look in this directory
for the <acronym>ODBC</acronym> support library.
Typically <productname>Applix</productname> is installed in
<filename>/opt</filename> so the full path would be
<filename>/opt/applix/axdata/axshlib/lib</filename>,
but if you have installed applix somewhere else then
change the path accordingly.
</para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Create <filename>.odbc.ini</filename> as
described above. You may also want to add the flag
<programlisting>
TextAsLongVarchar=0
</programlisting>
to the database-specific portion of <filename>.odbc.ini</filename>
so that text fields will not be shown as <literal>**BLOB**</literal>.
</para>
</step>
</procedure>
<procedure>
<title>Testing ApplixWare ODBC Connections</title>
<step performance="required">
<para>
Bring up <application>Applix Data</application>
</para>
</step>
<step performance="required">
<para>
Select the <productname>Postgres</productname> database of interest.
</para>
<substeps>
<step performance="required">
<para>
Select <command>Query->Choose Server</command>.
</para>
</step>
<step performance="required">
<para>
Select <acronym>ODBC</acronym>, and click <command>Browse</command>.
The database you configured in <filename>.odbc.ini</filename>
should be shown. Make sure that the <option>Host: field</option>
is empty (if it is not, axnet will try to contact axnet on another machine
to look for the database).
</para>
</step>
<step performance="required">
<para>
Select the database in the box that was launched by <command>Browse</command>,
then click <command>OK</command>.
</para>
</step>
<step performance="required">
<para>
Enter username and password in the login identification dialog,
and click <command>OK</command>.
</para>
</step>
</substeps>
<para>
You should see <quote>Starting elfodbc server</quote>
in the lower left corner of the
data window. If you get an error dialog box, see the debugging section
below.
</para>
</step>
<step performance="required">
<para>
The 'Ready' message will appear in the lower left corner of the data
window. This indicates that you can now enter queries.
</para>
</step>
<step performance="required">
<para>
Select a table from Query->Choose tables, and then select Query->Query
to access the database. The first 50 or so rows from the table should
appear.
</para>
</step>
</procedure>
</sect2>
<sect2>
<title>Common Problems</title>
<para>
The following messages can appear while trying to make an
<acronym>ODBC</acronym> connection through
<productname>Applix Data</productname>:
<variablelist>
<varlistentry>
<term>
Cannot launch gateway on server
</term>
<listitem>
<para>
<literal>elfodbc</literal> can't find <filename>libodbc.so</filename>.
Check your <filename>axnet.cnf</filename>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
Error from ODBC Gateway:
IM003::[iODBC][Driver Manager]Specified driver could not be loaded
</term>
<listitem>
<para>
<filename>libodbc.so</filename> cannot find the driver listed in
<filename>.odbc.ini</filename>. Verify the settings.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
Server: Broken Pipe
</term>
<listitem>
<para>
The driver process has terminated due to some other
problem. You might not have an up-to-date version
of the <productname>Postgres</productname>
<acronym>ODBC</acronym> package.
</Para>
</listitem>
</varlistentry>
<varlistentry>
<term>
setuid to 256: failed to launch gateway
</term>
<listitem>
<para>
The September release of ApplixWare v4.4.1 (the first release with official
<acronym>ODBC</acronym> support under Linux) shows problems when usernames
exceed eight (8) characters in length.
Problem description ontributed by
<ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink>.
</Para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<note>
<title>Author</title>
<para>
Contributed by
<ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink> on
1998-10-20.
</para>
</note>
The <application>axnet</application> program's security system
seems a little suspect. <application>axnet</application> does things
on behalf of the user and on a true
multiple user system it really should be run with root security
(so it can read/write in each user's directory).
I would hesitate to recommend this, however, since we have no idea what
security holes this creates.
</para>
</sect2>
<sect2>
<title>Debugging ApplixWare ODBC Connections</title>
<para>
One good tool for debugging connection problems uses the Unix system
utility <application>strace</application>.
</para>
<procedure>
<title>Debugging with strace</title>
<step performance="required">
<para>
Start applixware.
</para>
</step>
<step performance="required">
<para>
Start an <application>strace</application> on
the axnet process. For example, if
<programlisting>
ps -aucx | grep ax
</programlisting>
shows
<programlisting>
cary 10432 0.0 2.6 1740 392 ? S Oct 9 0:00 axnet
cary 27883 0.9 31.0 12692 4596 ? S 10:24 0:04 axmain
</programlisting>
</para>
<para>
Then run
<programlisting>
strace -f -s 1024 -p 10432
</programlisting>
</para>
</step>
<step performance="required">
<para>
Check the strace output.
</para>
<note>
<title>Note from Cary</title>
<para>
Many of the error messages from <productname>ApplixWare</productname>
go to <filename>stderr</filename>,
but I'm not sure where <filename>stderr</filename>
is sent, so <application>strace</application> is the way to find out.
</para>
</note>
</step>
</procedure>
<para>
For example, after getting
a <quote>Cannot launch gateway on server</quote>,
I ran strace on axnet and got
<programlisting>
[pid 27947] open("/usr/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] open("/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] write(2, "/usr2/applix/axdata/elfodbc:
can't load library 'libodbc.so'\n", 61) = -1 EIO (I/O error)
</programlisting>
So what is happening is that applix elfodbc is searching for libodbc.so, but it
can't find it. That is why axnet.cnf needed to be changed.
</para>
</sect2>
<sect2>
<title>Running the ApplixWare Demo</title>
<para>
In order to go through the
<citetitle>ApplixWare Data Tutorial</citetitle>, you need to create
the sample tables that the Tutorial refers to. The ELF Macro used to
create the tables tries to use a NULL condition
on many of the database columns,
and <productname>Postgres</productname> does not currently allow this option.
</para>
<para>
To get around this problem, you can do the following:
</para>
<procedure>
<title>Modifying the ApplixWare Demo</title>
<step performance="required">
<para>
Copy <filename>/opt/applix/axdata/eng/Demos/sqldemo.am</filename>
to a local directory.
</para>
</step>
<step performance="required">
<para>
Edit this local copy of <filename>sqldemo.am</filename>:
</para>
<substeps>
<step performance="required">
<para>
Search for 'null_clause = "NULL"
</para>
</step>
<step performance="required">
<para>
Change this to null_clause = ""
</para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Start <application>Applix Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Open the sqldemo.am file from the <application>Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Select <command>File->Compile and Save</command>.
</para>
</step>
<step performance="required">
<para>
Exit <application>Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Start <application>Applix Data</application>.
</para>
</step>
<step performance="required">
<para>
Select <command>*->Run Macro</command>
</para>
</step>
<step performance="required">
<para>
Enter the value <quote>sqldemo</quote>, then click <command>OK</command>.
</para>
<para>
You should see the progress in the status line of the data window
(in the lower left corner).
</para>
</step>
<step performance="required">
<para>
You should now be able to access the demo tables.
</para>
</step>
</procedure>
</sect2>
<sect2>
<title>Useful Macros</title>
<para>
You can add information about your
database login and password to the standard Applix startup
macro file. This is an example
<filename>~/axhome/macros/login.am</filename> file:
<programlisting>
macro login
set_set_system_var@("sql_username@","tgl")
set_system_var@("sql_passwd@","no$way")
endmacro
</programlisting>
<caution>
<para>
You should be careful about the file protections on any file containing
username and password information.
</para>
</caution>
</para>
</sect2>
<sect2>
<title>Supported Platforms</title>
<para>
<productname>psqlODBC</productname> has been built and tested
on <productname>Linux</productname>. There have been reports of success
with FreeBSD and with Solaris. There are no known restrictions
on the basic code for other platforms which already support
<productname>Postgres</productname>.
</para>
</sect2>
</sect1>
</Chapter>
<acronym>ODBC</acronym> package.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
setuid to 256: failed to launch gateway
</term>
<listitem>
<para>
The September release of ApplixWare v4.4.1 (the first release with official
<acronym>ODBC</acronym> support under Linux) shows problems when usernames
exceed eight (8) characters in length.
Problem description ontributed by
<ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<note>
<title>Author</title>
<para>
Contributed by
<ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink> on
1998-10-20.
</para>
</note>
The <application>axnet</application> program's security system
seems a little suspect. <application>axnet</application> does things
on behalf of the user and on a true
multiple user system it really should be run with root security
(so it can read/write in each user's directory).
I would hesitate to recommend this, however, since we have no idea what
security holes this creates.
</para>
</sect2>
<sect2>
<title>Debugging ApplixWare ODBC Connections</title>
<para>
One good tool for debugging connection problems uses the Unix system
utility <application>strace</application>.
</para>
<procedure>
<title>Debugging with strace</title>
<step performance="required">
<para>
Start applixware.
</para>
</step>
<step performance="required">
<para>
Start an <application>strace</application> on
the axnet process. For example, if
<programlisting>
ps -aucx | grep ax
</programlisting>
shows
<programlisting>
cary 10432 0.0 2.6 1740 392 ? S Oct 9 0:00 axnet
cary 27883 0.9 31.0 12692 4596 ? S 10:24 0:04 axmain
</programlisting>
</para>
<para>
Then run
<programlisting>
strace -f -s 1024 -p 10432
</programlisting>
</para>
</step>
<step performance="required">
<para>
Check the strace output.
</para>
<note>
<title>Note from Cary</title>
<para>
Many of the error messages from <productname>ApplixWare</productname>
go to <filename>stderr</filename>,
but I'm not sure where <filename>stderr</filename>
is sent, so <application>strace</application> is the way to find out.
</para>
</note>
</step>
</procedure>
<para>
For example, after getting
a <quote>Cannot launch gateway on server</quote>,
I ran strace on axnet and got
<programlisting>
[pid 27947] open("/usr/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] open("/lib/libodbc.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
[pid 27947] write(2, "/usr2/applix/axdata/elfodbc:
can't load library 'libodbc.so'\n", 61) = -1 EIO (I/O error)
</programlisting>
So what is happening is that applix elfodbc is searching for libodbc.so, but it
can't find it. That is why axnet.cnf needed to be changed.
</para>
</sect2>
<sect2>
<title>Running the ApplixWare Demo</title>
<para>
In order to go through the
<citetitle>ApplixWare Data Tutorial</citetitle>, you need to create
the sample tables that the Tutorial refers to. The ELF Macro used to
create the tables tries to use a NULL condition
on many of the database columns,
and <productname>Postgres</productname> does not currently allow this option.
</para>
<para>
To get around this problem, you can do the following:
</para>
<procedure>
<title>Modifying the ApplixWare Demo</title>
<step performance="required">
<para>
Copy <filename>/opt/applix/axdata/eng/Demos/sqldemo.am</filename>
to a local directory.
</para>
</step>
<step performance="required">
<para>
Edit this local copy of <filename>sqldemo.am</filename>:
</para>
<substeps>
<step performance="required">
<para>
Search for 'null_clause = "NULL"
</para>
</step>
<step performance="required">
<para>
Change this to null_clause = ""
</para>
</step>
</substeps>
</step>
<step performance="required">
<para>
Start <application>Applix Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Open the sqldemo.am file from the <application>Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Select <command>File->Compile and Save</command>.
</para>
</step>
<step performance="required">
<para>
Exit <application>Macro Editor</application>.
</para>
</step>
<step performance="required">
<para>
Start <application>Applix Data</application>.
</para>
</step>
<step performance="required">
<para>
Select <command>*->Run Macro</command>
</para>
</step>
<step performance="required">
<para>
Enter the value <quote>sqldemo</quote>, then click <command>OK</command>.
</para>
<para>
You should see the progress in the status line of the data window
(in the lower left corner).
</para>
</step>
<step performance="required">
<para>
You should now be able to access the demo tables.
</para>
</step>
</procedure>
</sect2>
<sect2>
<title>Useful Macros</title>
<para>
You can add information about your
database login and password to the standard Applix startup
macro file. This is an example
<filename>~/axhome/macros/login.am</filename> file:
<programlisting>
macro login
set_set_system_var@("sql_username@","tgl")
set_system_var@("sql_passwd@","no$way")
endmacro
</programlisting>
<caution>
<para>
You should be careful about the file protections on any file containing
username and password information.
</para>
</caution>
</para>
</sect2>
<sect2>
<title>Supported Platforms</title>
<para>
<productname>psqlODBC</productname> has been built and tested
on <productname>Linux</productname>. There have been reports of success
with FreeBSD and with Solaris. There are no known restrictions
on the basic code for other platforms which already support
<productname>Postgres</productname>.
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
mode:sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
......@@ -1088,7 +1096,7 @@ sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/CATALOG"
sgml-local-catalogs:("/usr/lib/sgml/CATALOG")
sgml-local-ecat-files:nil
End:
-->
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/abort.sgml,v 1.6 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/abort.sgml,v 1.7 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -129,7 +129,7 @@ ABORT WORK;
SQL92
</title>
<para>
This command is a <productname>PostgreSQL</productname> extension present
This command is a <productname>Postgres</productname> extension present
for historical reasons. <command>ROLLBACK</command> is the <acronym>SQL92</acronym>
equivalent command.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.10 2000/01/29 16:58:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.11 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -247,7 +247,7 @@ ALTER TABLE distributors RENAME TO suppliers;
<para>
SQL92 specifies some additional capabilities for <command>ALTER TABLE</command>
statement which are not yet directly supported by <productname>PostgreSQL</productname>:
statement which are not yet directly supported by <productname>Postgres</productname>:
<variablelist>
<varlistentry>
......@@ -308,8 +308,8 @@ DROP TABLE temp;
</para>
<para>
The clauses to rename columns and tables are <productname>PostgreSQL</productname>
extensions. SQL92 does not provide for them.
The clauses to rename columns and tables are <productname>Postgres</productname>
extensions from SQL92.
</para>
</refsect2>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_user.sgml,v 1.10 2000/01/14 22:11:32 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_user.sgml,v 1.11 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -138,7 +138,7 @@ ERROR: ALTER USER: user "username" does not exist
</title>
<para>
<command>ALTER USER</command> is used to change the attributes of a user's
<productname>PostgreSQL</productname> account. Only a database superuser
<productname>Postgres</productname> account. Only a database superuser
can change privileges and password expiration with this command. Ordinary
users can only change their own password.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.10 2000/01/29 16:58:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.11 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -95,7 +95,7 @@ NOTICE: BEGIN: already a transaction in progress
</title>
<para>
By default, <productname>PostgreSQL</productname> executes transactions
By default, <productname>Postgres</productname> executes transactions
in <firstterm>unchained mode</firstterm>
(also known as <quote>autocommit</quote> in other database
systems).
......@@ -116,7 +116,7 @@ NOTICE: BEGIN: already a transaction in progress
<para>
The default transaction isolation level in
<productname>PostgreSQL</productname>
<productname>Postgres</productname>
is READ COMMITTED, where queries inside the transaction see only changes
committed before query execution. So, you have to use
<command>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE</command>
......@@ -128,7 +128,7 @@ NOTICE: BEGIN: already a transaction in progress
</para>
<para>
If the transaction is committed, <productname>PostgreSQL</productname>
If the transaction is committed, <productname>Postgres</productname>
will ensure either that all updates are done or else that none of
them are done. Transactions have the standard <acronym>ACID</acronym>
(atomic, consistent, isolatable, and durable) property.
......@@ -185,7 +185,7 @@ BEGIN WORK;
<para>
<command>BEGIN</command>
is a <productname>PostgreSQL</productname> language extension.
is a <productname>Postgres</productname> language extension.
There is no explicit <command>BEGIN</command>
command in <acronym>SQL92</acronym>;
transaction initiation is always implicit and it terminates either
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_database.sgml,v 1.12 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_database.sgml,v 1.13 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -157,7 +157,7 @@ CREATE DATABASE <replaceable class="PARAMETER">name</replaceable> [ WITH LOCATIO
</title>
<para>
<command>CREATE DATABASE</command> creates a new
<productname>PostgreSQL</productname> database.
<productname>Postgres</productname> database.
The creator becomes the owner of the new database.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_function.sgml,v 1.12 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_function.sgml,v 1.13 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -20,26 +20,24 @@ Postgres documentation
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
<date>1999-10-02</date>
<date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE FUNCTION <replaceable class="parameter">name</replaceable> ( [ <replaceable class="parameter">ftype</replaceable> [, ...] ] )
RETURNS <replaceable class="parameter">rtype</replaceable>
[ WITH ( <replaceable class="parameter">attribute</replaceable> [, ...] ) ]
AS <replaceable class="parameter">definition</replaceable>
LANGUAGE '<replaceable class="parameter">langname</replaceable>'
[ WITH ( <replaceable class="parameter">attribute</replaceable> [, ...] ) ]
CREATE FUNCTION <replaceable class="parameter">name</replaceable> ( [ <replaceable class="parameter">ftype</replaceable> [, ...] ] )
RETURNS <replaceable class="parameter">rtype</replaceable>
[ WITH ( <replaceable class="parameter">attribute</replaceable> [, ...] ) ]
AS <replaceable class="parameter">obj_file</replaceable> , <replaceable class="parameter">link_symbol</replaceable>
LANGUAGE 'C'
[ WITH ( <replaceable class="parameter">attribute</replaceable> [, ...] ) ]
</synopsis>
<refsect2 id="R2-SQL-CREATEFUNCTION-1">
<refsect2info>
<date>1998-09-09</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Inputs
......@@ -143,7 +141,7 @@ CREATE FUNCTION <replaceable class="parameter">name</replaceable> ( [ <replaceab
<refsect2 id="R2-SQL-CREATEFUNCTION-2">
<refsect2info>
<date>1998-09-09</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Outputs
......@@ -168,7 +166,7 @@ CREATE
<refsect1 id="R1-SQL-CREATEFUNCTION-1">
<refsect1info>
<date>1998-09-09</date>
<date>2000-03-25</date>
</refsect1info>
<title>
Description
......@@ -177,28 +175,29 @@ CREATE
<command>CREATE FUNCTION</command> allows a
<productname>Postgres</productname> user
to register a function
with a database. Subsequently, this user is treated as the
with a database. Subsequently, this user is considered the
owner of the function.
</para>
<refsect2 id="R2-SQL-CREATEFUNCTION-3">
<refsect2info>
<date>1998-09-09</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Notes
</title>
<para>
Refer to the chapter in
the <citetitle>PostgreSQL Programmer's Guide</citetitle>
on extending
Refer to the chapter in the
<citetitle>PostgreSQL Programmer's Guide</citetitle>
on the topic of extending
<productname>Postgres</productname> via functions
for further information on writing external functions.
</para>
<para>
Use <command>DROP FUNCTION</command>
to drop user-defined functions.
to remove user-defined functions.
</para>
<para>
......@@ -207,7 +206,17 @@ CREATE
so long as they have distinct argument types. This facility must
be used with caution for <literal>internal</literal> and
C-language functions, however.
</para>
</para>
<para>
The full <acronym>SQL92</acronym> type syntax is allowed for
input arguments and return value. However, some details of the
type specification (e.g. the precision field for
<type>numeric</type> types) are the responsibility of the
underlying function implementation and are silently swallowed
(e.g. not recognized or
enforced) by the <command>CREATE FUNCTION</command> command.
</para>
<para>
Two <literal>internal</literal>
......@@ -242,18 +251,18 @@ CREATE
<para>
To create a simple SQL function:
<programlisting>
<programlisting>
CREATE FUNCTION one() RETURNS int4
AS 'SELECT 1 AS RESULT'
LANGUAGE 'sql';
SELECT one() AS answer;
<computeroutput>
<computeroutput>
answer
--------
1
</computeroutput>
</programlisting>
</computeroutput>
</programlisting>
</para>
<para>
......@@ -317,7 +326,7 @@ Point * complex_to_point (Complex *z)
<refsect2 id="R2-SQL-CREATEFUNCTION-4">
<refsect2info>
<date>1998-04-15</date>
<date>2000-03-25</date>
</refsect2info>
<title>
SQL92
......@@ -331,7 +340,7 @@ Point * complex_to_point (Complex *z)
<refsect2 id="R2-SQL-CREATEFUNCTION-5">
<refsect2info>
<date>1998-09-09</date>
<date>2000-03-25</date>
</refsect2info>
<title>
SQL/PSM
......@@ -364,7 +373,7 @@ CREATE FUNCTION <replaceable class="parameter">name</replaceable>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
......@@ -374,7 +383,7 @@ sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.1 2000/01/14 22:11:32 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.2 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -53,7 +53,7 @@ CREATE GROUP <replaceable class="PARAMETER">name</replaceable>
<listitem>
<para>
The <literal>SYSID</literal> clause can be used to choose
the <productname>PostgreSQL</productname> group id of the new
the <productname>Postgres</productname> group id of the new
group. It is not necessary to do so, however.
</para>
<para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_operator.sgml,v 1.12 2000/03/18 18:03:12 tgl Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_operator.sgml,v 1.13 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -20,7 +20,7 @@ Postgres documentation
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
<date>1999-07-20</date>
<date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE OPERATOR <replaceable>name</replaceable> ( PROCEDURE = <replaceable class="parameter">func_name</replaceable>
......@@ -32,7 +32,7 @@ CREATE OPERATOR <replaceable>name</replaceable> ( PROCEDURE = <replaceable class
<refsect2 id="R2-SQL-CREATEOPERATOR-1">
<refsect2info>
<date>1999-04-14</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Inputs
......@@ -138,7 +138,7 @@ CREATE OPERATOR <replaceable>name</replaceable> ( PROCEDURE = <replaceable class
<refsect2 id="R2-SQL-CREATEOPERATOR-2">
<refsect2info>
<date>1999-04-14</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Outputs
......@@ -162,7 +162,7 @@ CREATE
<refsect1 id="R1-SQL-CREATEOPERATOR-1">
<refsect1info>
<date>1999-04-14</date>
<date>2000-03-25</date>
</refsect1info>
<title>
Description
......@@ -248,13 +248,13 @@ CREATE
Hence, the query optimizer could freely convert:
<programlisting>
"0,0,1,1"::box &gt;&gt;&gt; MYBOXES.description
box '((0,0),(1,1))' &gt;&gt;&gt; MYBOXES.description
</programlisting>
to
<programlisting>
MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
MYBOXES.description &lt;&lt;&lt; box '((0,0),(1,1))'
</programlisting>
</para>
<para>
......@@ -269,11 +269,11 @@ MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
equal, !==.
The negator link allows the query optimizer to simplify
<programlisting>
NOT MYBOXES.description === "0,0,1,1"::box
NOT MYBOXES.description === box '((0,0),(1,1))'
</programlisting>
to
<programlisting>
MYBOXES.description !== "0,0,1,1"::box
MYBOXES.description !== box '((0,0),(1,1))'
</programlisting>
</para>
<para>
......@@ -331,7 +331,7 @@ MYBOXES.description !== "0,0,1,1"::box
The RESTRICT and JOIN options assist the query optimizer in estimating
result sizes. If a clause of the form:
<programlisting>
MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
MYBOXES.description &lt;&lt;&lt; box '((0,0),(1,1))'
</programlisting>
is present in the qualification,
then <productname>Postgres</productname> may have to
......@@ -342,7 +342,7 @@ MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
<command>CREATE FUNCTION</command>) which accepts arguments of the correct
data types and returns a floating point number. The
query optimizer simply calls this function, passing the
parameter "0,0,1,1" and multiplies the result by the relation
parameter <literal>((0,0),(1,1))</literal> and multiplies the result by the relation
size to get the expected number of instances.
</para>
<para>
......@@ -356,11 +356,11 @@ MYBOXES.description &lt;&lt;&lt; "0,0,1,1"::box
<para>
The difference between the function
<programlisting>
my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)
my_procedure_1 (MYBOXES.description, box '((0,0),(1,1))')
</programlisting>
and the operator
<programlisting>
MYBOXES.description === "0,0,1,1"::box
MYBOXES.description === box '((0,0),(1,1))'
</programlisting>
is that <productname>Postgres</productname>
attempts to optimize operators and can
......@@ -373,7 +373,7 @@ MYBOXES.description === "0,0,1,1"::box
<refsect2 id="R2-SQL-CREATEOPERATOR-3">
<refsect2info>
<date>1999-04-14</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Notes
......@@ -418,7 +418,7 @@ CREATE OPERATOR === (
<refsect2 id="R2-SQL-CREATEOPERATOR-4">
<refsect2info>
<date>1999-04-14</date>
<date>2000-03-25</date>
</refsect2info>
<title>
SQL92
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table.sgml,v 1.17 1999/07/22 15:09:08 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table.sgml,v 1.18 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -20,7 +20,7 @@ Postgres documentation
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
<date>1999-07-20</date>
<date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE [ TEMPORARY | TEMP ] TABLE <replaceable class="PARAMETER">table</replaceable> (
......@@ -35,9 +35,6 @@ CREATE [ TEMPORARY | TEMP ] TABLE <replaceable class="PARAMETER">table</replacea
</synopsis>
<refsect2 id="R2-SQL-CREATETABLE-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Inputs
</title>
......@@ -158,9 +155,6 @@ CREATE [ TEMPORARY | TEMP ] TABLE <replaceable class="PARAMETER">table</replacea
</refsect2>
<refsect2 id="R2-SQL-CREATETABLE-2">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Outputs
</title>
......@@ -212,9 +206,6 @@ ERROR: DEFAULT: type mismatched
</refsynopsisdiv>
<refsect1 id="R1-SQL-CREATETABLE-1">
<refsect1info>
<date>1998-09-11</date>
</refsect1info>
<title>
Description
</title>
......@@ -272,9 +263,6 @@ ERROR: DEFAULT: type mismatched
</refsect1>
<refsect1 id="R1-SQL-DEFAULTCLAUSE-1">
<refsect1info>
<date>1998-09-11</date>
</refsect1info>
<title id="R1-SQL-DEFAULTCLAUSE-1-TITLE">
DEFAULT Clause
</title>
......@@ -284,9 +272,6 @@ DEFAULT <replaceable class="PARAMETER">value</replaceable>
</synopsis>
</para>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Inputs
</title>
......@@ -323,9 +308,6 @@ DEFAULT <replaceable class="PARAMETER">value</replaceable>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-2">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Outputs
</title>
......@@ -335,9 +317,6 @@ DEFAULT <replaceable class="PARAMETER">value</replaceable>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-3">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Description
</title>
......@@ -415,7 +394,7 @@ DEFAULT <replaceable class="PARAMETER">value</replaceable>
</para>
<para>
In the current release (v6.5), <productname>Postgres</productname>
In the current release (v7.0), <productname>Postgres</productname>
evaluates all default expressions at the time the table is defined.
Hence, functions which are "non-cacheable" such as
<function>CURRENT_TIMESTAMP</function> may not produce the desired
......@@ -431,9 +410,6 @@ DEFAULT <replaceable class="PARAMETER">value</replaceable>
</para>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-4">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Usage
</title>
......@@ -467,9 +443,6 @@ CREATE TABLE distributors (
</refsect1>
<refsect1 id="R1-SQL-COLUMNCONSTRAINT-1">
<refsect1info>
<date>1998-09-11</date>
</refsect1info>
<title id="R1-SQL-COLUMNCONSTRAINT-1-TITLE">
Column CONSTRAINT Clause
</title>
......@@ -482,9 +455,6 @@ CREATE TABLE distributors (
</para>
<refsect2 id="R2-SQL-COLUMNCONSTRAINT-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Inputs
</title>
......@@ -561,9 +531,6 @@ CREATE TABLE distributors (
</refsect2>
<refsect2 id="R2-SQL-COLUMNCONSTRAINT-2">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Description
</title>
......@@ -601,21 +568,19 @@ CREATE TABLE distributors (
<member>UNIQUE</member>
<member>CHECK</member>
<member>NOT NULL</member>
</simplelist></para>
</simplelist>
</para>
<note>
<para>
<productname>Postgres</productname> does not yet
(at release 6.5) support
REFERENCES integrity constraints. The parser
accepts the REFERENCES syntax but ignores the clause.
<productname>Postgres</productname> now
(new for v7.0) supports
REFERENCES integrity constraints.
</para>
</note>
</refsect2>
<refsect2 id="R2-SQL-NOTNULL-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
NOT NULL Constraint
</title>
......@@ -630,9 +595,6 @@ CREATE TABLE distributors (
</para>
<refsect3 id="R3-SQL-NOTNULL-1">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
Outputs
</title>
......@@ -663,9 +625,6 @@ ERROR: ExecAppend: Fail to add null value in not null attribute "<replaceable c
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-2">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
Description
</title>
......@@ -674,9 +633,6 @@ ERROR: ExecAppend: Fail to add null value in not null attribute "<replaceable c
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-3">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
Usage
</title>
......@@ -697,9 +653,6 @@ CREATE TABLE distributors (
</refsect2>
<refsect2 id="R2-SQL-UNIQUECLAUSE-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
UNIQUE Constraint
</title>
......@@ -813,9 +766,6 @@ CREATE TABLE distributors (
</refsect2>
<refsect2 id="R2-SQL-CHECK-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
The CHECK Constraint
</title>
......@@ -849,9 +799,6 @@ CREATE TABLE distributors (
</refsect3>
<refsect3 id="R3-SQL-CHECK-2">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
Outputs
</title>
......@@ -900,9 +847,6 @@ ERROR: ExecAppend: rejected due to CHECK constraint "<replaceable class="parame
</refsect2>
<refsect2 id="R2-SQL-PRIMARYKEY-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
PRIMARY KEY Constraint
</title>
......@@ -958,9 +902,6 @@ ERROR: Cannot insert a duplicate key into a unique index.
</refsect3>
<refsect3 id="R3-SQL-PRIMARYKEY-3">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
Notes
</title>
......@@ -982,9 +923,6 @@ ERROR: Cannot insert a duplicate key into a unique index.
</refsect1>
<refsect1 id="R1-SQL-TABLECONSTRAINT-1">
<refsect1info>
<date>1998-09-11</date>
</refsect1info>
<title>
Table CONSTRAINT Clause
</title>
......@@ -995,9 +933,6 @@ ERROR: Cannot insert a duplicate key into a unique index.
</synopsis>
</para>
<refsect2 id="R2-SQL-TABLECONSTRAINT-1">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Inputs
</title>
......@@ -1035,9 +970,6 @@ ERROR: Cannot insert a duplicate key into a unique index.
</refsect2>
<refsect2 id="R2-SQL-TABLECONSTRAINT-2">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Outputs
</title>
......@@ -1049,9 +981,6 @@ ERROR: Cannot insert a duplicate key into a unique index.
</refsect2>
<refsect2 id="R2-SQL-TABLECONSTRAINT-3">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Description
</title>
......@@ -1067,22 +996,17 @@ ERROR: Cannot insert a duplicate key into a unique index.
<member>FOREIGN KEY</member>
</simplelist>
</para>
<note>
<para>
<productname>Postgres</productname> does not yet
(as of version 6.5) support FOREIGN KEY
integrity constraints. The parser understands the FOREIGN KEY syntax,
but only prints a notice and otherwise ignores the clause.
Foreign keys may be partially emulated by triggers (See the CREATE TRIGGER
statement).
<productname>Postgres</productname> now
supports FOREIGN KEY
integrity constraints (new for release 7.0).
</para>
</note>
</refsect2>
<refsect2 id="R2-SQL-UNIQUECLAUSE-4">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
UNIQUE Constraint
</title>
......@@ -1174,9 +1098,6 @@ CREATE TABLE distributors (
</refsect2>
<refsect2 id="R2-SQL-PRIMARYKEY-4">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
PRIMARY KEY Constraint
</title>
......@@ -1375,9 +1296,6 @@ CREATE TABLE distributors (
</para>
<refsect2 id="R2-SQL-CREATETABLE-3">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
Notes
</title>
......@@ -1395,9 +1313,6 @@ CREATE TABLE distributors (
</title>
<refsect2 id="R2-SQL-CREATETABLE-4">
<refsect2info>
<date>1998-09-11</date>
</refsect2info>
<title>
SQL92
</title>
......@@ -1436,9 +1351,6 @@ CREATE TEMPORARY TABLE actors (
</para>
<refsect3 id="R3-SQL-UNIQUECLAUSE-1">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
UNIQUE clause
</title>
......@@ -1467,9 +1379,6 @@ CREATE TEMPORARY TABLE actors (
</refsect3>
<refsect3 id="R3-SQL-NULL-1">
<refsect3info>
<date>1998-12-24</date>
</refsect3info>
<title>
NULL clause
</title>
......@@ -1485,9 +1394,6 @@ CREATE TEMPORARY TABLE actors (
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-4">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
NOT NULL clause
</title>
......@@ -1510,9 +1416,6 @@ the column. Not our problem...
- Thomas 1998-08-16
<REFSECT3 ID="R3-SQL-DEFAULTCLAUSE-1">
<REFSECT3INFO>
<DATE>1998-09-11</DATE>
</REFSECT3INFO>
<TITLE>
DEFAULT clause
</TITLE>
......@@ -1530,9 +1433,6 @@ the column. Not our problem...
-->
<refsect3 id="R3-SQL-CONSTRAINT-3">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
CONSTRAINT clause
</title>
......@@ -1647,9 +1547,6 @@ CREATE ASSERTION name CHECK ( condition )
<refsect3 id="R3-SQL-CHECK-4">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
CHECK clause
</title>
......@@ -1709,9 +1606,6 @@ ALTER DOMAIN cities
</refsect3>
<refsect3 id="R3-SQL-PRIMARYKEY-1">
<refsect3info>
<date>1998-09-11</date>
</refsect3info>
<title>
PRIMARY KEY clause
</title>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_trigger.sgml,v 1.8 1999/07/22 15:09:08 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_trigger.sgml,v 1.9 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -20,7 +20,7 @@ Postgres documentation
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
<date>1999-07-20</date>
<date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTER } { <replaceable class="PARAMETER">event</replaceable> [OR ...] }
......@@ -152,7 +152,7 @@ CREATE
Only the relation owner may create a trigger on this relation.
</para>
<para>
As of the current release (v6.4), STATEMENT triggers are not implemented.
As of the current release (v7.0), STATEMENT triggers are not implemented.
</para>
<para>
Refer to <command>DROP TRIGGER</command> for information on how to
......@@ -217,11 +217,6 @@ CREATE TABLE distributors (
);
</programlisting>
</para>
<para>
However, foreign keys are not yet implemented (as of version 6.5) in
<productname>Postgres</productname>.
</para>
</refsect2>
</refsect1>
</refentry>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_type.sgml,v 1.11 1999/08/06 13:50:30 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_type.sgml,v 1.12 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -289,8 +289,8 @@ CREATE
A "regular" Postgres type can only be 8192 bytes in
length. If you need a larger type you must create a Large
Object type. The interface for these types is discussed
at length in
<citetitle>The PostgreSQL Programmer's Guide</citetitle>.
at length in the
<citetitle>PostgreSQL Programmer's Guide</citetitle>.
The length of all large object types is always VARIABLE.
</para>
</refsect2>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_user.sgml,v 1.13 2000/01/14 22:11:32 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_user.sgml,v 1.14 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -56,7 +56,7 @@ CREATE USER <replaceable class="PARAMETER">username</replaceable>
<listitem>
<para>
The <literal>SYSID</literal> clause can be used to choose
the <productname>PostgreSQL</productname> user id of the user
the <productname>Postgres</productname> user id of the user
that is being created. It is not at all necessary that those
match the <acronym>UNIX</acronym> user ids, but some people
choose to keep the numbers the same.
......@@ -164,7 +164,7 @@ CREATE USER <replaceable class="PARAMETER">username</replaceable>
</title>
<para>
CREATE USER will add a new user to an instance of
<productname>PostgreSQL</productname>. Refer to the adminstrator's
<productname>Postgres</productname>. Refer to the adminstrator's
guide for information about managing users and authentication.
You must be a database superuser to use this command.
</para>
......@@ -173,7 +173,7 @@ CREATE USER <replaceable class="PARAMETER">username</replaceable>
to change a user's password and privileges, and <xref linkend="SQL-DROPUSER"
endterm="SQL-DROPUSER-title"> to remove a user.
Use <command>ALTER GROUP</command> to add or remove the user from other groups.
<productname>PostgreSQL</productname>
<productname>Postgres</productname>
comes with a script <xref linkend="APP-CREATEUSER"
endterm="APP-CREATEUSER-title">
which has the same functionality as this command (in fact, it calls this command)
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_view.sgml,v 1.8 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_view.sgml,v 1.9 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -20,15 +20,15 @@ Postgres documentation
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
<date>1999-07-20</date>
<date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE VIEW <replaceable class="PARAMETER">view</replaceable> AS SELECT <replaceable class="PARAMETER">query</replaceable>
</synopsis>
<refsect2 id="R2-SQL-CREATEVIEW-1">
<refsect2info>
<date>1998-09-21</date>
<refsect2info>
<date>2000-03-25</date>
</refsect2info>
<title>
Inputs
......@@ -62,7 +62,7 @@ CREATE VIEW <replaceable class="PARAMETER">view</replaceable> AS SELECT <replace
<refsect2 id="R2-SQL-CREATEVIEW-2">
<refsect2info>
<date>1998-09-21</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Outputs
......@@ -97,13 +97,15 @@ NOTICE create: attribute named "<replaceable class="parameter">column</replaceab
<para>
The view will be created having a column with an unknown type
if you do not specify it. For example, the following command gives
an error:
a warning:
<programlisting>
CREATE VIEW vista AS SELECT 'Hello World'
</programlisting>
whereas this command does not:
<programlisting>
CREATE VIEW vista AS SELECT 'Hello World'::text
CREATE VIEW vista AS SELECT text 'Hello World'
</programlisting>
</para>
</listitem>
......@@ -115,7 +117,7 @@ CREATE VIEW vista AS SELECT 'Hello World'::text
<refsect1 id="R1-SQL-CREATEVIEW-1">
<refsect1info>
<date>1998-09-21</date>
<date>2000-03-25</date>
</refsect1info>
<title>
Description
......@@ -129,7 +131,7 @@ CREATE VIEW vista AS SELECT 'Hello World'::text
<refsect2 id="R2-SQL-CREATEVIEW-3">
<refsect2info>
<date>1998-09-21</date>
<date>2000-03-25</date>
</refsect2info>
<title>
Notes
......@@ -176,7 +178,7 @@ SELECT * FROM kinds;
<refsect2 id="R2-SQL-CREATEVIEW-5">
<refsect2info>
<date>1998-09-21</date>
<date>2000-03-25</date>
</refsect2info>
<title>
SQL92
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createdb.sgml,v 1.9 2000/02/10 20:08:55 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createdb.sgml,v 1.10 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>createdb</application>
</refname>
<refpurpose>
Create a new <productname>PostgreSQL</productname> database
Create a new <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -120,7 +120,7 @@ createdb [ <replaceable class="parameter">options</replaceable> ] <replaceable c
<listitem>
<para>
Specifies the name of the database to be created. The name must be
unique among all <productname>PostgreSQL</productname> databases in this installation.
unique among all <productname>Postgres</productname> databases in this installation.
The default is to create a database with the same name as the
current system user.
</para>
......@@ -196,7 +196,7 @@ createdb [ <replaceable class="parameter">options</replaceable> ] <replaceable c
Description
</title>
<para>
<application>createdb</application> creates a new <productname>PostgreSQL</productname>
<application>createdb</application> creates a new <productname>Postgres</productname>
database. The user who executes this command becomes the database owner.
</para>
......@@ -204,7 +204,7 @@ createdb [ <replaceable class="parameter">options</replaceable> ] <replaceable c
<application>createdb</application> is a shell script wrapper around the
<acronym>SQL</acronym> command
<xref linkend="SQL-CREATEDATABASE" endterm="SQL-CREATEDATABASE-title"> via
the <productname>PostgreSQL</productname> interactive terminal
the <productname>Postgres</productname> interactive terminal
<xref linkend="APP-PSQL" endterm="APP-PSQL-title">. Thus, there is nothing
special about creating databases via this or other methods. This means
that the <application>psql</application> must be found by the script and that
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createlang.sgml,v 1.4 2000/01/19 20:08:22 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createlang.sgml,v 1.5 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>createlang</application>
</refname>
<refpurpose>
Add a new programming language to a <productname>PostgreSQL</productname> database
Add a new programming language to a <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -145,7 +145,7 @@ createlang [ <replaceable class="parameter">connection options</replaceable> ] -
<para>
<application>createlang</application> is a utility for adding a new
programming language to a <productname>PostgreSQL</productname> database.
programming language to a <productname>Postgres</productname> database.
<application>createlang</application> currently accepts two
languages, <literal>plsql</literal> and <literal>pltcl</literal>.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createuser.sgml,v 1.8 2000/01/12 19:36:34 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/createuser.sgml,v 1.9 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>createuser</application>
</refname>
<refpurpose>
Create a new <productname>PostgreSQL</productname> user
Create a new <productname>Postgres</productname> user
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -139,8 +139,8 @@ createuser [ <replaceable class="parameter">options</replaceable> ] [ <replaceab
<term><replaceable class="parameter">username</replaceable></term>
<listitem>
<para>
Specifies the name of the <productname>PostgreSQL</productname> user to be created.
This name must be unique among all <productname>PostgreSQL</productname> users.
Specifies the name of the <productname>Postgres</productname> user to be created.
This name must be unique among all <productname>Postgres</productname> users.
</para>
</listitem>
</varlistentry>
......@@ -203,7 +203,7 @@ createuser [ <replaceable class="parameter">options</replaceable> ] [ <replaceab
</title>
<para>
<application>createuser</application> creates a
new <productname>PostgreSQL</productname> user.
new <productname>Postgres</productname> user.
Only users with <literal>usesuper</literal> set in
the <literal>pg_shadow</literal> class can create
new <productname>Postgres</productname> users.
......@@ -213,7 +213,7 @@ createuser [ <replaceable class="parameter">options</replaceable> ] [ <replaceab
<application>createuser</application> is a shell script wrapper around the
<acronym>SQL</acronym> command
<xref linkend="SQL-CREATEUSER" endterm="SQL-CREATEUSER-title"> via
the <productname>PostgreSQL</productname> interactive terminal
the <productname>Postgres</productname> interactive terminal
<xref linkend="APP-PSQL" endterm="APP-PSQL-title">. Thus, there is nothing
special about creating users via this or other methods. This means
that the <application>psql</application> must be found by the script and that
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_user.sgml,v 1.10 2000/01/14 22:11:32 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_user.sgml,v 1.11 2000/03/27 17:14:42 thomas Exp $
Postgres documentation
-->
......@@ -109,7 +109,7 @@ DROP USER: user "<replaceable class="parameter">name</replaceable>" owns databas
Use <xref linkend="SQL-CREATEUSER" endterm="SQL-CREATEUSER-title">
to add new users, and <xref linkend="SQL-ALTERUSER"
endterm="SQL-ALTERUSER-title"> to change a user's properties.
<productname>PostgreSQL</productname>
<productname>Postgres</productname>
comes with a script <xref linkend="APP-DROPUSER"
endterm="APP-DROPUSER-title">
which has the same functionality as this command (in fact, it calls this command)
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/dropdb.sgml,v 1.2 1999/12/07 22:41:41 momjian Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/dropdb.sgml,v 1.3 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>dropdb</application>
</refname>
<refpurpose>
Remove an existing <productname>PostgreSQL</productname> database
Remove an existing <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -109,7 +109,7 @@ dropdb [ <replaceable class="parameter">options</replaceable> ] <replaceable cla
<listitem>
<para>
Specifies the name of the database to be removed. The database
must be one of the existing <productname>PostgreSQL</productname> databases
must be one of the existing <productname>Postgres</productname> databases
in this installation.
</para>
</listitem>
......@@ -165,7 +165,7 @@ dropdb [ <replaceable class="parameter">options</replaceable> ] <replaceable cla
</title>
<para>
<application>dropdb</application> destroys an existing
<productname>PostgreSQL</productname> database.
<productname>Postgres</productname> database.
The user who executes this command must be a database
superuser or the owner of the database.
</para>
......@@ -174,7 +174,7 @@ dropdb [ <replaceable class="parameter">options</replaceable> ] <replaceable cla
<application>dropdb</application> is a shell script wrapper around the
<acronym>SQL</acronym> command
<xref linkend="SQL-DROPDATABASE" endterm="SQL-DROPDATABASE-title"> via
the <productname>PostgreSQL</productname> interactive terminal
the <productname>Postgres</productname> interactive terminal
<xref linkend="APP-PSQL" endterm="APP-PSQL-title">. Thus, there is nothing
special about dropping databases via this or other methods. This means
that the <application>psql</application> must be found by the script and that
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/droplang.sgml,v 1.2 2000/01/19 20:08:22 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/droplang.sgml,v 1.3 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>droplang</application>
</refname>
<refpurpose>
Remove a programming language from a <productname>PostgreSQL</productname> database
Remove a programming language from a <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -146,7 +146,7 @@ droplang [ <replaceable class="parameter">connection options</replaceable> ] --l
<para>
<application>droplang</application> is a utility for removing an
existing programming language from a
<productname>PostgreSQL</productname> database.
<productname>Postgres</productname> database.
<application>droplang</application> currently accepts two
languages, <literal>plsql</literal> and <literal>pltcl</literal>.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/dropuser.sgml,v 1.3 2000/01/12 19:36:34 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/dropuser.sgml,v 1.4 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -90,7 +90,7 @@ dropuser [ <replaceable class="parameter">options</replaceable> ] [ <replaceable
<term><replaceable class="parameter">username</replaceable></term>
<listitem>
<para>
Specifies the name of the <productname>PostgreSQL</productname> user to be removed.
Specifies the name of the <productname>Postgres</productname> user to be removed.
This name must exist in the <productname>Postgres</productname> installation.
You will be prompted for a name if none is specified on the command line.
</para>
......@@ -153,18 +153,18 @@ dropuser [ <replaceable class="parameter">options</replaceable> ] [ <replaceable
</title>
<para>
<application>dropuser</application> removes an existing
<productname>PostgreSQL</productname> user
<productname>Postgres</productname> user
<emphasis>and</emphasis> the databases which that user owned.
Only users with <literal>usesuper</literal> set in
the <literal>pg_shadow</literal> class can destroy
<productname>PostgreSQL</productname> users.
<productname>Postgres</productname> users.
</para>
<para>
<application>dropuser</application> is a shell script wrapper around the
<acronym>SQL</acronym> command
<xref linkend="SQL-DROPUSER" endterm="SQL-DROPUSER-title"> via
the <productname>PostgreSQL</productname> interactive terminal
the <productname>Postgres</productname> interactive terminal
<xref linkend="APP-PSQL" endterm="APP-PSQL-title">. Thus, there is nothing
special about removing users via this or other methods. This means
that the <application>psql</application> must be found by the script and that
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/end.sgml,v 1.2 2000/01/29 16:58:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/end.sgml,v 1.3 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -94,8 +94,8 @@ NOTICE: COMMIT: no transaction in progress
</title>
<para>
<command>END</command> is a <productname>PostgreSQL</productname>
synonym for
<command>END</command> is a <productname>Postgres</productname>
extension, and is a synonym for the SQL92-compatible
<xref linkend="sql-commit-title" endterm="sql-commit-title">.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.9 2000/01/20 21:50:54 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/initdb.sgml,v 1.10 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>initdb</application>
</refname>
<refpurpose>
Create a new <productname>PostgreSQL</productname> database installation
Create a new <productname>Postgres</productname> database installation
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -129,7 +129,7 @@ initdb [ --pgdata|-D <replaceable class="parameter">dbdir</replaceable> ]
database in an existing database system, and don't touch anything else.
This is useful when you need to upgrade your <literal>template1</literal>
database using <application>initdb</application>
from a newer release of <productname>PostgreSQL</productname>,
from a newer release of <productname>Postgres</productname>,
or when your <literal>template1</literal>
database has become corrupted by some system problem. Normally the
contents of <literal>template1</literal>
......@@ -199,7 +199,7 @@ initdb [ --pgdata|-D <replaceable class="parameter">dbdir</replaceable> ]
</title>
<para>
<application>initdb</application> creates a new
<productname>PostgreSQL</productname> database system.
<productname>Postgres</productname> database system.
A database system is a
collection of databases that are all administered by the same Unix user
and managed by a single postmaster.
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/initlocation.sgml,v 1.6 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/initlocation.sgml,v 1.7 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>initlocation</application>
</refname>
<refpurpose>
Create a secondary <productname>PostgreSQL</productname> database storage area
Create a secondary <productname>Postgres</productname> database storage area
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -72,7 +72,7 @@ initlocation <replaceable class="parameter">directory</replaceable>
</title>
<para>
<application>initlocation</application>
creates a new <productname>PostgreSQL</productname> secondary database storage area.
creates a new <productname>Postgres</productname> secondary database storage area.
See the discussion under <xref linkend="SQL-CREATEDATABASE" endterm="SQL-CREATEDATABASE-title">
about how to manage and use secondary storage areas. If the argument does not contain
a slash and is not valid as a path, it is assumed to be an environment variable,
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/insert.sgml,v 1.6 1999/07/22 15:09:12 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/insert.sgml,v 1.7 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -193,8 +193,8 @@ INSERT INTO films SELECT * FROM tmp;
</para>
<para>
Insert into arrays (refer to
<citetitle>The PostgreSQL User's Guide</citetitle> for further
Insert into arrays (refer to the
<citetitle>PostgreSQL User's Guide</citetitle> for further
information about arrays):
<programlisting>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.14 2000/01/24 19:34:13 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.15 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -99,7 +99,8 @@ pg_dump [ -h <replaceable class="parameter">host</replaceable> ] [ -p <replaceab
Suppress double quotes around identifiers unless absolutely necessary.
This may cause trouble loading this dumped data if there are reserved words
used for identifiers.
This was the default behavior in pre-v6.4 <application>pg_dump</application>.
This was the default behavior for
<application>pg_dump</application> prior to v6.4.
</para>
</listitem>
</varlistentry>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pg_upgrade.sgml,v 1.8 1999/09/28 15:59:10 momjian Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pg_upgrade.sgml,v 1.9 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -38,7 +38,7 @@ pg_upgrade [ -f <replaceable class="parameter">filename</replaceable> ] <replace
<para>
<application>pg_upgrade</application>
is a utility for upgrading from a previous
PostgreSQL release without reloading all the data.
Postgres release without reloading all the data.
Not all <productname>Postgres</productname> release transitions can be
handled this way. Check the release notes for details on your installation.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pgadmin-ref.sgml,v 1.5 2000/02/02 16:19:54 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/Attic/pgadmin-ref.sgml,v 1.6 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -41,7 +41,7 @@ pgadmin [ <replaceable class="parameter">datasourcename</replaceable> [ <replace
<term><replaceable class="PARAMETER">datasourcename</replaceable></term>
<listitem>
<para>
The name of an existing PostgreSQL ODBC System or User Data
The name of an existing <productname>Postgres</productname> ODBC System or User Data
Source.
</para>
</listitem>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/postgres-ref.sgml,v 1.6 1999/08/06 13:50:31 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/postgres-ref.sgml,v 1.7 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -190,7 +190,7 @@ postgres [ -B <replaceable class="parameter">nBuffers</replaceable> ] [ -C ] [ -
Dates are accepted by the backend in a wide variety of formats,
and for input dates this switch mostly affects the interpretation
for ambiguous cases.
See <citetitle>The PostgreSQL User's Guide</citetitle>
See the <citetitle>PostgreSQL User's Guide</citetitle>
for more information.
</para>
</listitem>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.29 2000/03/21 01:52:12 momjian Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.30 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -16,7 +16,7 @@ Postgres documentation
<application>psql</application>
</refname>
<refpurpose>
<productname>PostgreSQL</productname> interactive terminal
<productname>Postgres</productname> interactive terminal
</refpurpose>
</refnamediv>
......@@ -36,8 +36,8 @@ Postgres documentation
<para>
<application>psql</application> is a terminal-based front-end to
<productname>PostgreSQL</productname>. It enables you to type in queries
interactively, issue them to <productname>PostgreSQL</productname>, and see
<productname>Postgres</productname>. It enables you to type in queries
interactively, issue them to <productname>Postgres</productname>, and see
the query results. Alternatively, input can be from a file.
In addition, it provides a number of meta-commands and
various shell-like features to facilitate writing scripts and automating a wide
......@@ -63,7 +63,7 @@ Postgres documentation
<title>Connecting To A Database</title>
<para>
<application>psql</application> is a regular <productname>PostgreSQL</productname>
<application>psql</application> is a regular <productname>Postgres</productname>
client application. In order to connect to a database you need to know the
name of your target database, the hostname and port number of the server
and what user name you want to connect as. <application>psql</application> can be
......@@ -316,7 +316,7 @@ testdb=>
<term><literal>\copyright</literal></term>
<listitem>
<para>
Shows the copyright and distribution terms of <application>PostgreSQL</application>.
Shows the copyright and distribution terms of <application>Postgres</application>.
</para>
</listitem>
</varlistentry>
......@@ -387,7 +387,7 @@ testdb=>
<note>
<para>
<productname>PostgreSQL</productname> stores the object descriptions in the
<productname>Postgres</productname> stores the object descriptions in the
pg_description system table.
</para>
</note>
......@@ -637,7 +637,7 @@ Tue Oct 26 21:40:57 CEST 1999
<para>
List all the databases in the server as well as their owners. Append a
<quote>+</quote> to the command name to see any descriptions
for the databases as well. If your <productname>PostgreSQL</productname>
for the databases as well. If your <productname>Postgres</productname>
installation was
compiled with multibyte encoding support, the encoding scheme of each
database is shown as well.
......@@ -677,7 +677,7 @@ Tue Oct 26 21:40:57 CEST 1999
<listitem>
<para>
Stores the file into a <productname>PostgreSQL</productname> <quote>large object</quote>.
Stores the file into a <productname>Postgres</productname> <quote>large object</quote>.
Optionally, it associates the given comment with the object. Example:
<programlisting>
foo=> <userinput>\lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'</userinput>
......@@ -709,7 +709,7 @@ lo_import 152801
<term><literal>\lo_list</literal></term>
<listitem>
<para>
Shows a list of all <productname>PostgreSQL</productname> <quote>large
Shows a list of all <productname>Postgres</productname> <quote>large
objects</quote> currently stored in the database along with their owners.
</para>
</listitem>
......@@ -1674,7 +1674,7 @@ bar
<listitem>
<para>
When this variable is set and a backslash command queries the database, the query
is first shown. This way you can study the <productname>PostgreSQL</productname>
is first shown. This way you can study the <productname>Postgres</productname>
internals and provide similar functionality in your own programs. If you set the
variable to the value <quote>noexec</quote>, the queries are just shown but are
not actually sent to the backend and executed.
......@@ -1770,7 +1770,7 @@ bar
<term><envar>LO_TRANSACTION</envar></term>
<listitem>
<para>
If you use the <productname>PostgreSQL</productname> large object
If you use the <productname>Postgres</productname> large object
interface to specially store data that does not fit into one tuple,
all the operations must be contained in a transaction block. (See the
documentation of the large object interface for more information.) Since
......@@ -1939,7 +1939,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
case you can escape a colon with a backslash to protect it from interpretation.
(The colon syntax for variables is standard <acronym>SQL</acronym> for embedded
query languages, such as <application>ecpg</application>. The colon syntax for
array slices and type casts are <productname>PostgreSQL</productname> extensions,
array slices and type casts are <productname>Postgres</productname> extensions,
hence the conflict.)
</para>
......@@ -2111,7 +2111,7 @@ $endif
<para>
If you have the readline library installed but <application>psql</application>
does not seem to use it, you must make sure that <productname>PostgreSQL</productname>'s
does not seem to use it, you must make sure that <productname>Postgres</productname>'s
top-level <filename>configure</filename> script finds it. <filename>configure</filename>
needs to find both the library <filename>libreadline.a</filename>
(or a shared library equivalent)
......@@ -2145,7 +2145,7 @@ $ ./configure --with-includes=/opt/gnu/include --with-libs=/opt/gnu/lib ...
<para>
This section only shows a few examples specific to <application>psql</application>.
If you want to learn <acronym>SQL</acronym> or get familiar with
<productname>PostgreSQL</productname>, you might wish to read the Tutorial that
<productname>Postgres</productname>, you might wish to read the Tutorial that
is included in the distribution.
</para>
</note>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.27 2000/03/26 18:32:27 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.28 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -419,13 +419,15 @@ SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen;
</programlisting></para>
<para>
From release 6.4 of PostgreSQL, it is also possible to ORDER BY
arbitrary expressions, including fields that do not appear in the
It is also possible to ORDER BY
arbitrary expressions (an extension to SQL92),
including fields that do not appear in the
SELECT result list.
Thus the following statement is now legal:
Thus the following statement is legal:
<programlisting>
SELECT name FROM distributors ORDER BY code;
</programlisting>
Note that if an ORDER BY item is a simple name that matches both
a result column name and an input column name, ORDER BY will interpret
it as the result column name. This is the opposite of the choice that
......@@ -581,7 +583,7 @@ SELECT name FROM distributors ORDER BY code;
</para>
<para>
As of PostgreSQL 7.0, the
As of <productname>Postgres</productname> 7.0, the
query optimizer takes LIMIT into account when generating a query plan,
so you are very likely to get different plans (yielding different row
orders) depending on what you give for LIMIT and OFFSET. Thus, using
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.7 1999/12/18 08:34:49 momjian Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.8 2000/03/27 17:14:43 thomas Exp $
Postgres documentation
-->
......@@ -15,7 +15,7 @@ Postgres documentation
<application>vacuumdb</application>
</refname>
<refpurpose>
Clean and analyze a <productname>PostgreSQL</productname> database
Clean and analyze a <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
......@@ -210,7 +210,7 @@ vacuumdb [ <replaceable class="parameter">connection options</replaceable> ] [ -
<para>
<application>vacuumdb</application> is a utility for cleaning a
<productname>PostgreSQL</productname> database.
<productname>Postgres</productname> database.
<application>vacuumdb</application> will also generate internal statistics
used by the <productname>Postgres</productname> query optimizer.
</para>
......@@ -219,7 +219,7 @@ vacuumdb [ <replaceable class="parameter">connection options</replaceable> ] [ -
<application>vacuumdb</application> is a shell script wrapper around the
backend command
<xref linkend="SQL-VACUUM" endterm="SQL-VACUUM-title"> via
the <productname>PostgreSQL</productname> interactive terminal
the <productname>Postgres</productname> interactive terminal
<xref linkend="APP-PSQL" endterm="APP-PSQL-title">. There is no effective
difference between vacuuming databases via this or other methods.
<application>psql</application> must be found by the script and
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment