Use "generic functions" for math and other routines.
Use SQL92 "type 'literal'" syntax rather than Postgres "'literal'::type".
<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>
<!-- 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
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:
-->
</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>
</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>
</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>
</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>
</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>
</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>
`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>
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>
</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>
</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>
</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>
</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>
</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>
</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>'<485>'</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>
</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>
</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>
</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>
</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
[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
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
-->
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
-->
<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>
</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
-->
</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
-->
</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).
<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>
</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.
<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
-->
</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
-->
</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
<refsect2 id="R2-SQL-CREATEFUNCTION-2">
<refsect2info>
- <date>1998-09-09</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Outputs
<refsect1 id="R1-SQL-CREATEFUNCTION-1">
<refsect1info>
- <date>1998-09-09</date>
+ <date>2000-03-25</date>
</refsect1info>
<title>
Description
<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>
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>
<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>
<refsect2 id="R2-SQL-CREATEFUNCTION-4">
<refsect2info>
- <date>1998-04-15</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
SQL92
<refsect2 id="R2-SQL-CREATEFUNCTION-5">
<refsect2info>
- <date>1998-09-09</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
SQL/PSM
<!-- 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
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
-->
<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
-->
</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>
<refsect2 id="R2-SQL-CREATEOPERATOR-1">
<refsect2info>
- <date>1999-04-14</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Inputs
<refsect2 id="R2-SQL-CREATEOPERATOR-2">
<refsect2info>
- <date>1999-04-14</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Outputs
<refsect1 id="R1-SQL-CREATEOPERATOR-1">
<refsect1info>
- <date>1999-04-14</date>
+ <date>2000-03-25</date>
</refsect1info>
<title>
Description
Hence, the query optimizer could freely convert:
<programlisting>
-"0,0,1,1"::box >>> MYBOXES.description
+box '((0,0),(1,1))' >>> MYBOXES.description
</programlisting>
to
<programlisting>
-MYBOXES.description <<< "0,0,1,1"::box
+MYBOXES.description <<< box '((0,0),(1,1))'
</programlisting>
</para>
<para>
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>
The RESTRICT and JOIN options assist the query optimizer in estimating
result sizes. If a clause of the form:
<programlisting>
-MYBOXES.description <<< "0,0,1,1"::box
+MYBOXES.description <<< box '((0,0),(1,1))'
</programlisting>
is present in the qualification,
then <productname>Postgres</productname> may have to
<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>
<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
<refsect2 id="R2-SQL-CREATEOPERATOR-3">
<refsect2info>
- <date>1999-04-14</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Notes
<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
-->
</refnamediv>
<refsynopsisdiv>
<refsynopsisdivinfo>
- <date>1999-07-20</date>
+ <date>2000-03-25</date>
</refsynopsisdivinfo>
<synopsis>
CREATE [ TEMPORARY | TEMP ] TABLE <replaceable class="PARAMETER">table</replaceable> (
</synopsis>
<refsect2 id="R2-SQL-CREATETABLE-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Inputs
</title>
</refsect2>
<refsect2 id="R2-SQL-CREATETABLE-2">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Outputs
</title>
</refsynopsisdiv>
<refsect1 id="R1-SQL-CREATETABLE-1">
- <refsect1info>
- <date>1998-09-11</date>
- </refsect1info>
<title>
Description
</title>
</refsect1>
<refsect1 id="R1-SQL-DEFAULTCLAUSE-1">
- <refsect1info>
- <date>1998-09-11</date>
- </refsect1info>
<title id="R1-SQL-DEFAULTCLAUSE-1-TITLE">
DEFAULT Clause
</title>
</synopsis>
</para>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Inputs
</title>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-2">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Outputs
</title>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-3">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Description
</title>
</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
</para>
</refsect2>
<refsect2 id="R2-SQL-DEFAULTCLAUSE-4">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Usage
</title>
</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>
</para>
<refsect2 id="R2-SQL-COLUMNCONSTRAINT-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Inputs
</title>
</refsect2>
<refsect2 id="R2-SQL-COLUMNCONSTRAINT-2">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Description
</title>
<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>
</para>
<refsect3 id="R3-SQL-NOTNULL-1">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
Outputs
</title>
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-2">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
Description
</title>
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-3">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
Usage
</title>
</refsect2>
<refsect2 id="R2-SQL-UNIQUECLAUSE-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
UNIQUE Constraint
</title>
</refsect2>
<refsect2 id="R2-SQL-CHECK-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
The CHECK Constraint
</title>
</refsect3>
<refsect3 id="R3-SQL-CHECK-2">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
Outputs
</title>
</refsect2>
<refsect2 id="R2-SQL-PRIMARYKEY-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
PRIMARY KEY Constraint
</title>
</refsect3>
<refsect3 id="R3-SQL-PRIMARYKEY-3">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
Notes
</title>
</refsect1>
<refsect1 id="R1-SQL-TABLECONSTRAINT-1">
- <refsect1info>
- <date>1998-09-11</date>
- </refsect1info>
<title>
Table CONSTRAINT Clause
</title>
</synopsis>
</para>
<refsect2 id="R2-SQL-TABLECONSTRAINT-1">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Inputs
</title>
</refsect2>
<refsect2 id="R2-SQL-TABLECONSTRAINT-2">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Outputs
</title>
</refsect2>
<refsect2 id="R2-SQL-TABLECONSTRAINT-3">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Description
</title>
<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>
</refsect2>
<refsect2 id="R2-SQL-PRIMARYKEY-4">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
PRIMARY KEY Constraint
</title>
</para>
<refsect2 id="R2-SQL-CREATETABLE-3">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
Notes
</title>
</title>
<refsect2 id="R2-SQL-CREATETABLE-4">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
<title>
SQL92
</title>
</para>
<refsect3 id="R3-SQL-UNIQUECLAUSE-1">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
UNIQUE clause
</title>
</refsect3>
<refsect3 id="R3-SQL-NULL-1">
- <refsect3info>
- <date>1998-12-24</date>
- </refsect3info>
<title>
NULL clause
</title>
</refsect3>
<refsect3 id="R3-SQL-NOTNULL-4">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
NOT NULL clause
</title>
- Thomas 1998-08-16
<REFSECT3 ID="R3-SQL-DEFAULTCLAUSE-1">
- <REFSECT3INFO>
- <DATE>1998-09-11</DATE>
- </REFSECT3INFO>
<TITLE>
DEFAULT clause
</TITLE>
-->
<refsect3 id="R3-SQL-CONSTRAINT-3">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
CONSTRAINT clause
</title>
<refsect3 id="R3-SQL-CHECK-4">
- <refsect3info>
- <date>1998-09-11</date>
- </refsect3info>
<title>
CHECK clause
</title>
</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
-->
</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 ...] }
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
);
</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
-->
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
-->
<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.
</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>
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
-->
</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
<refsect2 id="R2-SQL-CREATEVIEW-2">
<refsect2info>
- <date>1998-09-21</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Outputs
<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>
<refsect1 id="R1-SQL-CREATEVIEW-1">
<refsect1info>
- <date>1998-09-21</date>
+ <date>2000-03-25</date>
</refsect1info>
<title>
Description
<refsect2 id="R2-SQL-CREATEVIEW-3">
<refsect2info>
- <date>1998-09-21</date>
+ <date>2000-03-25</date>
</refsect2info>
<title>
Notes
<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
-->
<application>createdb</application>
</refname>
<refpurpose>
- Create a new <productname>PostgreSQL</productname> database
+ Create a new <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<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>
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>
<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
-->
<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>
<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
-->
<application>createuser</application>
</refname>
<refpurpose>
- Create a new <productname>PostgreSQL</productname> user
+ Create a new <productname>Postgres</productname> user
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<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>
</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.
<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
-->
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
-->
<application>dropdb</application>
</refname>
<refpurpose>
- Remove an existing <productname>PostgreSQL</productname> database
+ Remove an existing <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<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>
</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>
<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
-->
<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>
<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
-->
<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>
</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
-->
</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
-->
<application>initdb</application>
</refname>
<refpurpose>
- Create a new <productname>PostgreSQL</productname> database installation
+ Create a new <productname>Postgres</productname> database installation
</refpurpose>
</refnamediv>
<refsynopsisdiv>
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>
</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
-->
<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>
</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
-->
</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
-->
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
-->
<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
-->
<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
-->
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
-->
<application>psql</application>
</refname>
<refpurpose>
- <productname>PostgreSQL</productname> interactive terminal
+ <productname>Postgres</productname> interactive terminal
</refpurpose>
</refnamediv>
<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
<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
<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>
<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>
<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.
<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>
<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>
<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.
<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
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>
<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)
<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
-->
</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
</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
-->
<application>vacuumdb</application>
</refname>
<refpurpose>
- Clean and analyze a <productname>PostgreSQL</productname> database
+ Clean and analyze a <productname>Postgres</productname> database
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<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>
<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