]> granicus.if.org Git - postgresql/commitdiff
Update psql with man pages and new version of help.
authorBruce Momjian <bruce@momjian.us>
Thu, 4 Nov 1999 22:07:57 +0000 (22:07 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 4 Nov 1999 22:07:57 +0000 (22:07 +0000)
doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/sql_help.h

index 888aaa676e9cde17c2d7334ba2604a0bf879951c..3558b6eddae12c911690f57b182644e84f745cee 100644 (file)
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.13 1999/10/26 04:40:56 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.14 1999/11/04 22:07:56 momjian Exp $
 Postgres documentation
 -->
 
 <refentry id="APP-PSQL">
- <refmeta>
-  <refentrytitle id="app-psql-title">
-   <application>psql</application>
-  </refentrytitle>
-  <refmiscinfo>Application</refmiscinfo>
- </refmeta>
- <refnamediv>
-  <refname>
-   <application>psql</application>
-  </refname>
-  <refpurpose>
-   <productname>Postgres</productname> interactive client
-  </refpurpose>
- </refnamediv>
- <refsynopsisdiv>
-  <refsynopsisdivinfo>
-   <date>1999-07-20</date>
-  </refsynopsisdivinfo>
-  <synopsis>
-psql [ <replaceable class="parameter">dbname</replaceable> ]
-psql -A [ -c <replaceable class="parameter">query</replaceable> ] [ -d <replaceable class="parameter">dbname</replaceable> ]
-    -e -E [ -f <replaceable class="parameter">filename</replaceable> ] [ -F <replaceable class="parameter">separator</replaceable> ]
-    [ -h <replaceable class="parameter">hostname</replaceable> ] -Hln [ -o <replaceable class="parameter">filename</replaceable> ]
-    [ -p <replaceable class="parameter">port</replaceable> ] -qsSt [ -T <replaceable class="parameter">table_o</replaceable> ] -ux
-    [ <replaceable class="parameter">dbname</replaceable> ]
-  </synopsis>
+  <refmeta>
+    <refentrytitle id="app-psql-title">
+        <application>psql</application>
+    </refentrytitle>
+    <refmiscinfo>Application</refmiscinfo>
+  </refmeta>
+
+  <refnamediv>
+    <refname>
+      <application>psql</application>
+    </refname>
+    <refpurpose>
+      <productname>PostgreSQL</productname> interactive terminal
+    </refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <refsynopsisdivinfo>
+      <date>1999-10-26</date>
+    </refsynopsisdivinfo>
+
+    <synopsis>psql [ <replaceable class="parameter">options</replaceable> ] [ <replaceable class="parameter">dbname</replaceable> [ <replaceable class="parameter">user</replaceable> ] ]</synopsis>
 
   <refsect2 id="R2-APP-PSQL-1">
-   <refsect2info>
-    <date>1998-09-26</date>
-   </refsect2info>
-   <title>
-    Inputs
-   </title>
-   <para>
+    <refsect2info>
+      <date>1998-09-26</date>
+    </refsect2info>
+
+    <title>Input</title>
+    <para>
     <application>psql</application> accepts many command-line arguments,
     a rich set of meta-commands, and the full <acronym>SQL</acronym> language
-    supported by <productname>Postgres</productname>. The most common
-    command-line arguments are:
-
-    <variablelist>
-     <varlistentry>
-      <term><replaceable class="PARAMETER">dbname</replaceable></term>
-      <listitem>
-       <para>
-       The name of an existing database to access.
-       <replaceable class="parameter">dbname</replaceable>
-       defaults to the value of the
-       <envar>USER</envar>
-       environment variable or, if that's not set, to the Unix account name of the
-       current user.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term>-c <replaceable class="parameter">query</replaceable></term>
-      <listitem>
-       <para>
-       A single query to run. <application>psql</application> will exit on completion.
-       </para>
-      </listitem>
-     </varlistentry>
-    </variablelist>
-   </para>
-
-   <para>
-    The full set of command-line arguments and meta-commands are described in a subsequent
-    section.
-   </para>
-
-   <para>
-    There are some environment variables which can be used in liu of
-    command line arguments. 
-    Additionally, the <productname>Postgres</productname> frontend library used by 
-    the <application>psql</application> application
-    looks for other optional environment variables to configure, for example,
-    the style of date/time representation and the local time zone. Refer
-    to the chapter on <filename>libpq</filename> in the
-    <citetitle>Programmer's Guide</citetitle> for more details.
-   </para>
-   <para>
-    You may set any of the following environment variables to avoid
-    specifying command-line options:
-       
-    <variablelist>
-     <varlistentry>
-      <term><envar>PGHOST</envar></term>
-      <listitem>
-       <para>
-       The <acronym>DNS</acronym> host name of the database server.
-       Setting <envar>PGHOST</envar> to a non-zero-length string causes
-       <acronym>TCP/IP</acronym> communication
-       to be used, rather than the default local Unix domain sockets.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><envar>PGPORT</envar></term>
-      <listitem>
-       <para>
-       The port number on which a <productname>Postgres</productname> server is listening.
-       Defaults to <literal>5432</literal>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><envar>PGTTY</envar></term>
-      <listitem>
-       <para>
-       The target for display of messages from the client support library.
-       Not required.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><envar>PGOPTION</envar></term>
-      <listitem>
-       <para>
-       If <envar>PGOPTION</envar>
-       is specified, then the options it contains are parsed
-       <emphasis>before</emphasis>
-       any command-line options.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><envar>PGREALM</envar></term>
-      <listitem>
-       <para>
-       <envar>PGREALM</envar>
-       only applies if
-       <productname>Kerberos</productname>
-       authentication is in use.  
-       If this environment variable is set, <productname>Postgres</productname>
-       will attempt authentication with servers for this realm and will use
-       separate ticket files to avoid conflicts with local ticket files.
-       See the <citetitle>PostgreSQL Administrator's Guide</citetitle>
-       for additional information on
-       <productname>Kerberos</productname>.
-       </para>
-      </listitem>
-     </varlistentry>
-    </variablelist>
-   </para>
+    supported by <productname>PostgreSQL</productname>.
+    </para>
   </refsect2>
 
   <refsect2 id="R2-APP-PSQL-2">
-   <refsect2info>
-    <date>1998-09-26</date>
-   </refsect2info>
-   <title>
-    Outputs
-   </title>
-   <para>
-    <application>psql</application>
-    returns 0 to the shell on successful completion of all queries,
-    1 for errors, 2 for abrupt disconnection from the backend.
-    <application>psql</application>
-    will also return 1 if the connection to a database could not be made for
-    any reason.
-   </para>
-   <para>
-    The default TAB delimiter is used.
-   </para>
+    <refsect2info>
+      <date>1998-10-26</date>
+     </refsect2info>
+   
+    <title>Output</title>
+    <para>
+    <application>psql</application> returns 0 to the shell on successful
+    completion of all queries, 1 for fatal errors, 2 for abrupt disconnection
+    from the backend, and 3 if a non-interactive script stopped because an <acronym>SQL</acronym>
+    command or psql meta-command resulted in an error.
+    </para>
   </refsect2>
- </refsynopsisdiv>
+</refsynopsisdiv>
 
- <refsect1 id="R1-APP-PSQL-1">
+<refsect1 id="R1-APP-PSQL-1">
   <refsect1info>
-   <date>1998-09-26</date>
+    <date>1998-10-26</date>
   </refsect1info>
-  <title>
-   Description
-  </title>
+
+  <title>Description</title>
+
   <para>
-   <application>psql</application> is a character-based front-end to 
-   <productname>Postgres</productname>.
-   It enables you to
-   type in queries interactively, issue them to <productname>Postgres</productname>, 
-   and see the query
-   results.
+  <application>psql</application> is a character-based front-end to 
+  <productname>PostgreSQL</productname>. It enables you to type in queries
+  interactively, issue them to <productname>PostgreSQL</productname>, and see
+  the query results. In addition, it provides a number of meta-commands and
+  various shell-like features to facilitate writing scripts and automating a wide
+  variety of tasks.
   </para>
+
   <para>
-   <application>psql</application>
-   is a <productname>Postgres</productname> client application.  Hence, a
-   <application>postmaster</application> process
-   must be running on the database server host before
-   <application>psql</application>
-   is executed.  In addition, the correct parameters to identify
-   the database server, such as the
-   <application>postmaster</application> host name,
-   may need to be specified
-   as described below.
+  <application>psql</application> is a regular
+  <productname>PostgreSQL</productname> client application. Hence, a
+  <application>postmaster</application> process must be running on the database
+  server host before <application>psql</application> is executed.  In addition,
+  the correct parameters to identify the database server, such as the
+  <application>postmaster</application> host name, may need to be specified as
+  described below.
   </para>
+
   <para>
-   When
-   <application>psql</application>
-   starts, it reads SQL commands from
-   <filename>/etc/psqlrc</filename>
-   and then from
-   <filename>$(<envar>HOME</envar>)/.psqlrc</filename>
-   This allows SQL commands like
-   <command>SET</command>
-   which can be used to set the date style to be run at the start of
-   every session.
+  When <application>psql</application> starts, it reads <acronym>SQL</acronym> and psql commands
+  from <filename>/etc/psqlrc</filename> and then from
+  <filename>$<envar>HOME</envar>/.psqlrc</filename>
+  This allows commands like <command>\set</command> or the <acronym>SQL</acronym> command
+  <xref linkend="SQL-SET" endterm="SQL-SET-title">, which can be used to set a variety of options,
+  to be run at the start of every session.
   </para>
 
   <refsect2 id="R2-APP-PSQL-3">
-   <refsect2info>
-    <date>1998-09-26</date>
-   </refsect2info>
-   <title>
-    Connecting To A Database
-   </title>
-   <para>
-    <application>psql</application>
-    attempts to make a connection to the database at the hostname and
-    port number specified on the command line.   If the connection could not
-    be made for any reason (e.g. insufficient privileges, postmaster is not
-    running on the server, etc)
-    .IR <application>psql</application>
-    will return an error that says
-    <programlisting>
-     Connection to database failed.
-    </programlisting>
-    The reason for the connection failure is not provided.
-   </para>
+    <refsect2info>
+      <date>1998-09-26</date>
+    </refsect2info>
+   
+    <title>Connecting To A Database</title>
+
+    <para>
+    <application>psql</application> attempts to make a connection to the
+    database name at the hostname and port number, and with the user name
+    specified on the command line. If any of these are omitted, the
+    <application>libpq</application> client library, upon which
+    <application>psql</application> is built, will choose defaults.
+    (This will usually mean the environment variables <envar>PGDATABASE</envar>,
+    <envar>PGHOST</envar>, <envar>PGPORT</envar>, <envar>PQUSER</envar>,
+    respectively, if they are set. Otherwise the default host is the local host
+    via Unix domain sockets, the default port is decided at compile time,
+    the default user is the system user name, and the default database is
+    the one with the same name as the user.)
+    </para>
+
+    <para>
+    If the connection could not be made for any reason (e.g., insufficient
+    privileges, postmaster is not running on the server, etc.),
+    <application>psql</application> will return an error and terminate.
+    </para>
   </refsect2>
 
   <refsect2 id="R2-APP-PSQL-4">
-   <refsect2info>
-    <date>1998-09-26</date>
-   </refsect2info>
-   <title>
-    Entering Queries
-   </title>
-   <para>
-    In normal operation, 
-    <application>psql</application> provides a prompt with the name of the
-    database that <application>psql</application> is current connected to 
-    followed by the string "=>".
-    For example,
+    <refsect2info>
+      <date>1998-09-26</date>
+    </refsect2info>
+
+    <title>Entering Queries</title>
+
+    <para>
+    In normal operation, <application>psql</application> provides a prompt with
+    the name of the database that <application>psql</application> is currently
+    connected to followed by the string "=>". For example,
     <programlisting>
 $ <userinput>psql testdb</userinput>
-Welcome to the POSTGRESQL interactive sql monitor:
-  Please read the file COPYRIGHT for copyright terms of POSTGRESQL
-[PostgreSQL 6.5.0 on i686-pc-linux-gnu, compiled by gcc 2.7.2.3]
-
-   type \? for help on slash commands
-   type \q to quit
-   type \g or terminate with semicolon to execute query
- You are currently connected to the database: testdb
-         
+Welcome to psql, the PostgreSQL interactive terminal.
+(Please type \copyright to see the distribution terms of PostgreSQL.)
+Type \h for help with SQL commands,
+     \? for help on internal slash commands,
+     \q to quit,
+     \g or terminate with semicolon to execute query.
 testdb=>
     </programlisting>
-   </para>
-   <para>
+    </para>
+
+    <para>
     At the prompt, the user may type in <acronym>SQL</acronym> queries.  
-    Unless the -S option
-    is set, input lines are sent to the backend when a query-terminating
-    semicolon is reached.
-   </para>
-   <para>
-    Whenever a query is executed, 
-    <application>psql</application> also polls for asynchronous notification
-    events generated by <command>LISTEN</command> and <command>NOTIFY</command>.
-   </para>
-   <para>
-    <application>psql</application>
-    can be used in a pipe sequence, and automatically detects when it
-    is not listening or talking to a real tty.
-   </para>
+    Ordinarily, input lines are sent to the backend when a query-terminating
+    semicolon is reached. If the database server reports success, the query
+    results are displayed on the screen.
+    </para>
+
+    <para>
+    Whenever a query is executed, <application>psql</application> also polls
+    for asynchronous notification events generated by
+    <xref linkend="SQL-LISTEN" endterm="SQL-LISTEN-title"> and
+    <xref linkend="SQL-NOTIFY" endterm="SQL-NOTIFY-title">.
+    </para>
+
+    <para>
+    <application>psql</application> can be used in a pipe sequence, and
+    automatically detects when it is not used interactively.
+    </para>
   </refsect2>
+</refsect1>
+
+<refsect1 id="R1-APP-PSQL-2">
+    <refsect1info>
+      <date>1998-09-26</date>
+    </refsect1info>
 
-  <refsect2 id="R2-APP-PSQL-5">
-   <title>Paging To Screen</title>
+    <title><application>psql</application> Meta-Commands</title>
 
-   <note>
-    <title>Author</title>
     <para>
-     From Brett McCormick on the mailing list 1998-04-04.
+    Anything you enter in <application>psql</application> that begins with an
+    unquoted backslash is a <application>psql</application> meta-command.
+    Anything else is <acronym>SQL</acronym> and simply goes into the current
+    query buffer (and once you have at least one complete query, it gets
+    automatically submitted to the backend). For this reason,
+    <application>psql</application> meta-commands are more commonly called
+    slash or backslash commands.
     </para>
-   </note>
 
-   <para>
-    To affect the paging behavior of your <command>psql</command> output,
-    set or unset your PAGER environment variable.  I always have to set mine
-    before it will pause.  And of course you have to do this before
-    starting the program.
-   </para>
+    <para>
+    The format of a <application>psql</application> command is the backslash, 
+    followed immediately by a command verb, then any arguments. The arguments
+    are separated from the command verb and each other by any number of white
+    space characters.
+    </para>
 
-   <para>
-    In csh/tcsh or other C shells:
+    <para>
+    To include whitespace into an argument you must quote it with either single
+    or double quotes. Anything contained in single quotes (except for a
+    backslash-escaped single quote itself) is taken literally as the argument.
+    Anything contained in double quotes is furthermore subject to C-like
+    substitutions for <literal>\n</literal> (new line), <literal>\t</literal> (tab),
+    <literal>\</literal><replaceable>digits</replaceable>,
+    <literal>\0</literal><replaceable>digits</replaceable>, and
+    <literal>\0x</literal><replaceable>digits</replaceable>
+    (the character with the given decimal, octal, or hexadecimal code).
+    </para>
 
-    <programlisting>
-% unsetenv PAGER
-    </programlisting>
+    <para>
+    If an unquoted argument begins with a dollar sign (<literal>$</literal>),
+    it is taken as a variable and the value of the variable is taken as the
+    argument instead. Inside double quotes, variable values can be substituted
+    by enclosing the name in a <literal>${...}</literal> sequence. See also under
+    <quote><xref linkend="APP-PSQL-variables" endterm="APP-PSQL-variables-title"></quote>.
+    </para>
 
-    while in sh/bash or other Bourne shells:
+    <para>
+    Arguments that are quoted in <quote>back-ticks</quote> (<literal>`</literal>)
+    are taken as a command line
+    that is passed to the shell. The output of the command (with a trailing
+    newline removed) is taken as the argument value. Back-ticks are subject to
+    the same substitution rules as double-quotes.
+    </para>
 
-    <programlisting>
-% unset PAGER
-    </programlisting>
-   </para>
-  </refsect2>
- </refsect1>
+    <para>
+    Parsing for arguments stops when another unquoted backslash occurs. This
+    is taken as the beginning of a new meta-command. The special sequence
+    <literal>\\</literal>
+    (two backslashes) marks the end of arguments and continues parsing
+    <acronym>SQL</acronym> queries, if any. That way <acronym>SQL</acronym> and
+    <application>psql</application> commands can be freely mixed on a line.
+    In any case, the arguments of a meta-command cannot continue beyond the end
+    of the line. 
+    </para>
+
+    <para>
+    The following meta-commands are defined:
+
+    <variablelist>
+      <varlistentry>
+        <term><literal>\a</literal></term>
+        <listitem>
+        <para>
+       If the current table output format is unaligned, switch to aligned.
+       If it is not unaligned, set it to unaligned. This command is
+       kept for backwards compatibility. See <command>\pset</command> for a
+       general solution.
+        </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\C</literal> [ <replaceable class="parameter">title</replaceable> ]</term>
+        <listitem>
+        <para>
+        Set the title of any tables being printed as the result of a query or
+        unset any such title. This command is equivalent to
+        <literal>\pset title <replaceable class="parameter">title</replaceable></literal>.
+        (The name of this
+        command derives from <quote>caption</quote>, as it was previously only
+       used to set the caption in an <acronym>HTML</acronym> table.)
+        </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\connect</literal> (or <literal>\c</literal>) [ <replaceable class="parameter">dbname</replaceable> [ <replaceable class="parameter">username</replaceable> ] ]</term>
+        <listitem>
+        <para>
+       Establishes a connection to a new database and/or under a user name. The
+       previous connection is closed.
+       If <replaceable class="parameter">dbname</replaceable> is <literal>-</literal>
+       the current database name is assumed.
+       </para>
+
+       <para>
+       If <replaceable class="parameter">username</replaceable> is omitted or
+       <literal>-</literal> the current user name is assumed. If
+       <replaceable class="parameter">username</replaceable> is <literal>?</literal>
+       <application>psql</application> will prompt for the new user name
+       interactively.
+       </para>
+
+       <para>
+       As a special rule, <command>\connect</command> without any arguments will connect
+       to the default database as the default user (as you would have gotten
+       by starting <application>psql</application> without any arguments).
+       </para>
+
+       <para>
+       If the connection attempt failed (wrong username, access denied, etc.) the
+       previous connection will be kept, if and only if <application>psql</application> is
+       in interactive mode. When executing a non-interactive script, processing
+       will immediately stop with an error. This distinction was chosen as a user
+       convenience against typos on the one hand, and a safety mechanism that
+       scripts are not accidentally acting on the wrong database on the other hand.
+       </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\copy</literal> [ <literal>binary</literal> ] <replaceable class="parameter">table</replaceable>
+        [ <literal>with oids</literal> ] { <literal>from</literal> | <literal>to</literal> }
+       <replaceable class="parameter">filename</replaceable> [ <literal>with delimiters</literal>
+       '<replaceable class="parameter">character</replaceable>' ]
+        </term>
+
+        <listitem>
+        <para>
+        Performs a frontend (client) copy. This is an operation that runs an
+       <acronym>SQL</acronym> <xref linkend="SQL-COPY" endterm="SQL-COPY-title"> command,
+        but instead of the backend reading or writing the specified file, and 
+        consequently requiring backend access and special user privilege, 
+       as well as being bound to the file system accessible by the backend,
+        <application>psql</application> reads or writes the 
+        file and routes the data to or from the backend onto the local file system.
+       </para>
+
+       <para>
+       The syntax of the command is in analogy to the <acronym>SQL</acronym>
+       <command>COPY</command> command, see its description for the details.
+       Note that because of this, special parsing rules apply to the
+       <command>\copy</command> command. In particular, the variable
+       substitution rules and backslash escapes do not apply.
+       </para>
+
+        <tip>
+        <para>
+       This operation is not as efficient as the <acronym>SQL</acronym> 
+       <command>COPY</command> command because all data must pass through the
+       client/server IP or socket connection. For large amounts of data this other
+       technique may be preferable.
+        </para>
+        </tip>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\copyright</literal></term>
+        <listitem>
+        <para>
+        Shows the copyright and distribution terms of <application>PostgreSQL</application>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\d</literal> <replaceable class="parameter">relation</replaceable> </term>
+
+        <listitem>
+        <para>
+       Shows all column of <replaceable class="parameter">relation</replaceable>
+       (which could be a table, view, index, or sequence),
+       their types, and any special attributes such as <literal>NOT NULL</literal>
+       or defaults, if any.
+       </para>
+
+       <para>
+       If the relation is, in fact, a table, any defined indices are also listed.
+       If the relation is a view, the view definition is also shown.
+       If the variable <envar>description</envar> is set, any comments associated
+       with a table columns are shown as well.
+       </para>
+
+       <note>
+       <para>
+       If <command>\d</command> is called without any arguments, it is
+       equivalent to <command>\dtvs</command> which will show a list
+       of all tables, views, and sequences. This is purely a convenience
+       measure.
+       </para>
+       </note>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\da</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term>
+
+        <listitem>
+        <para>
+        Lists all available aggregate functions, together with the data type they operate on.
+       If <replaceable class="parameter">pattern</replaceable>
+       (a regular expression) is specified, only matching aggregates are shown.
+       If the variable <envar>description</envar> is set, comments are listed for
+       each function as well.
+        </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\dd</literal> [ <replaceable class="parameter">object</replaceable> ]</term>
+        <listitem>
+        <para>
+        Shows the descriptions of <replaceable class="parameter">object</replaceable>
+        (which can be a regular expression), or of all objects if no argument is given.
+        (<quote>Object</quote> covers aggregates, functions, operators, types, relations
+        (tables, views, indices, sequences, large objects), rules, and triggers.) For example:
+        <programlisting>
+=> <userinput>\dd version</userinput>
+              Object descriptions
+  Name   |   What   |        Description
+---------+----------+---------------------------
+ version | function | PostgreSQL version string
+(1 row)
+        </programlisting>                                                                                      
+        </para>
+
+        <para>
+        Descriptions for objects can be generated with the <command>COMMENT ON</command>
+        <acronym>SQL</acronym> command.
+       </para>
+
+        <note>
+        <para>
+        <productname>PostgreSQL</productname> stores the object descriptions in the
+        pg_description system table.
+        </para>
+        </note>
+
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\df [ <replaceable class="parameter">pattern</replaceable> ]</literal></term>
+
+        <listitem>
+        <para>
+        Lists available functions, together with their argument and return types.
+        If <replaceable class="parameter">pattern</replaceable>
+        (a regular expression) is specified, only matching functions are shown.
+        If the variable <envar>description</envar> is set, comments are listed for
+        each function as well. 
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\distvS [ <replaceable class="parameter">pattern</replaceable> ]</literal></term>
+
+       <listitem>
+       <para>
+       This is not the actual command name: The letters i, s, t, v, S stand for
+       index, sequence, table, view, and system table, respectively. You can specify
+       any or all of them in any order to obtain a listing of them, together with
+       who the owner is.
+       </para>
+
+       <para>
+       If <replaceable class="parameter">pattern</replaceable> is specified,
+       it is a regular expression restricts the listing to those objects
+       whose name matches. If the variable <envar>description</envar> is set,
+       each object is listed with its associated description, if any.
+       </para>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\dl</literal></term>
+       <listitem>
+       <para>
+       This is an alias for <command>\lo_list</command>, which shows a list of large objects.
+       </para>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\do [ <replaceable class="parameter">name</replaceable> ]</literal></term>
+        <listitem>
+        <para>
+        Lists available operators with their operand and return types.
+        If <replaceable class="parameter">name</replaceable>
+        is specified, only operators with that name will be shown.
+        (Note that, unlike with similar commands, this is not a regular expression
+        because operator names were likely to interfere with regular expression
+        meta-characters.)
+        </para>
+        <para>
+        If the variable <envar>description</envar> is set, comments are listed for
+        each operator.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\dp</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term>
+       <listitem>
+       <para>
+       This is an alias for <command>\z</command> which was included for its
+       greater mnemonic value (<quote>display permissions</quote>).
+       </para>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\dT [ <replaceable class="parameter">pattern</replaceable> ]</literal></term>
+        <listitem>
+        <para>
+        List all data types or only those that match <replaceable class="parameter">pattern</replaceable>.
+        If the variable <envar>description</envar> is set, each type is listed with
+       its associated description.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\edit</literal> (or <literal>\e</literal>) [ <replaceable class="parameter">filename</replaceable> ]</term>
+
+        <listitem>
+        <para>
+        If <replaceable class="parameter">filename</replaceable> is specified,
+        the file is edited and after the editor exit its content is copied
+        back to the query buffer. If no argument is given, the current query
+        buffer is copied to a temporary file which is then edited in the same
+        fashion.
+        </para>
+
+        <para>
+        The new query buffer is then re-parsed according to the normal rules of
+        <application>psql</application>, where the whole buffer is treated as
+        a single line. (Thus you cannot make <quote>scripts</quote> this way,
+        use <command>\i</command> for that.) In particular, this means that
+        if the query ends (or rather contains) a semicolon, it is immediately
+        executed. In other cases it will merely wait in the query buffer.
+        </para>
+
+        <tip>
+        <para>
+        <application>psql</application> searches the environment variables
+        <envar>PSQL_EDITOR</envar>, <envar>EDITOR</envar>, and <envar>VISUAL</envar>
+        (in that order) for an editor to use. If all of them are unset,
+        <filename>/bin/vi</filename> is run.
+        </para>
+        </tip>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\echo</literal> <replaceable class="parameter">text</replaceable> [ ... ]</term>
+        <listitem>
+       <para>
+        Prints the arguments to the standard output. This can be useful to
+        intersperse information in the output of scripts. For example:
+        <programlisting>
+=> <userinput>\echo `date`</userinput>
+Tue Oct 26 21:40:57 CEST 1999
+        </programlisting>
+       </para>
+
+       <tip>
+       <para>
+       If you use the <command>\o</command> command to redirect your query output
+       you may wish to use <command>\qecho</command> instead of this command.
+       </para>
+       </tip>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\f</literal> [ <replaceable class="parameter">string</replaceable> ]</term>
+
+        <listitem>
+        <para>
+        Sets the field separator for unaligned query output. The default is <quote><literal>|</literal></quote>
+       (a <quote>pipe</quote> symbol). See also <command>\pset</command> for a generic way
+       of setting output options.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\g</literal> [ { <replaceable class="parameter">filename</replaceable> | <literal>|</literal><replaceable class="parameter">command</replaceable> } ]</term>
+
+        <listitem>
+        <para>
+        Sends the current query input buffer to the backend and optionally
+        saves the output in <replaceable class="parameter">filename</replaceable>
+        or pipes the output into a separate Unix shell to execute
+        <replaceable class="parameter">command</replaceable>. A blank <literal>\g</literal>
+       is virtually equivalent to a semicolon. A <literal>\g</literal> with argument
+       is a <quote>one-shot</quote> alternative to the <command>\o</command> command.
+        </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\help</literal> (or <literal>\h</literal>) [ <replaceable class="parameter">command</replaceable> ]</term>
+        <listitem>
+        <para>
+        Give syntax help on the specified <acronym>SQL</acronym> command.  
+        If <replaceable class="parameter">command</replaceable> is not a defined <acronym>SQL</acronym> command
+        or if <replaceable class="parameter">command</replaceable> is not specified,
+        then <application>psql</application> will 
+        list all the commands for which syntax help is
+        available.  If <replaceable class="parameter">command</replaceable>
+        is an asterisk (<quote>*</quote>), then
+        syntax help on all <acronym>SQL</acronym> commands is shown.
+        </para>
+
+       <note>
+       <para>
+       To simplify typing, commands that consists of several words do not have to be quoted.
+       Thus it is fine to type <userinput>\help alter table</userinput>.
+       </para>
+       </note> 
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\H</literal></term>
+        <listitem>
+        <para>
+       Turns on <acronym>HTML</acronym> query output format. If the <acronym>HTML</acronym>
+       format is already on, it is switched back to the default aligned text format. This
+       command is for compatibility and convenience, but see <command>\pset</command> about
+       setting other output options.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\i</literal> <replaceable class="parameter">filename</replaceable></term>
+        <listitem>
+        <para>
+        Reads input from the file <replaceable class="parameter">filename</replaceable>
+       and executes it as though it has been typed on the keyboard.
+        </para>
+       <note>
+       <para>
+       If you want to see the lines on the screen as they are read you must set
+       the variable <envar>echo</envar>.
+       </para>
+       </note>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\l</literal> (or <literal>\list</literal>)</term>
+        <listitem>
+        <para>
+        List all the databases in the server as well as their owners. If the
+       variable <envar>description</envar> is set, any descriptions for
+       the databases are shown as well. If your <productname>PostgreSQL</productname>
+       installation was
+       compiled with multibyte encoding support, the encoding scheme of each
+       database is shown as well.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\lo_export</literal> <replaceable class="parameter">loid</replaceable> <replaceable class="parameter">filename</replaceable></term>
+
+       <listitem>
+       <para>
+       Reads the large object with <acronym>OID</acronym> <replaceable class="parameter">loid</replaceable>
+       from the database and writes it to <replaceable class="parameter">filename</replaceable>.
+       Note that this is subtly different from the server function <function>lo_export</function>,
+       which acts with the permissions of the user that the database server runs as and
+       on the server's file system.
+       </para>
+       <tip>
+       <para>
+       Use <command>\lo_list</command> to find out the large object's <acronym>OID</acronym>.
+       </para>
+       </tip>
+       <note>
+       <para>
+       See the description of the <envar>lo_transaction</envar> variable for
+       important information concerning all large object operations.
+       </para>
+       </note>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\lo_import</literal> <replaceable class="parameter">filename</replaceable> [ <replaceable class="parameter">comment</replaceable> ]</term>
+
+       <listitem>
+       <para>
+       Stores the file into a <productname>PostgreSQL</productname> <quote>large object</quote>.
+       Optionally, it associates the given comment with the object. Example:
+       <programlisting>
+foo=> <userinput>\lo_import '/home/me/pictures/photo.xcf' 'a picture of me'</userinput>
+lo_import 152801
+        </programlisting>
+       The response indicates that the large object received object id 152801
+       which one ought to remember if one wants to access the object every again.
+       For that reason it is recommended to always associate a human-readable
+       comment with every object. Those can then be seen with the
+       <command>\lo_list</command> command.
+       </para>
+
+       <para>
+       Note that this command is subtly different from the server-side <function>lo_import</function>
+       because it acts as the local user on the local file system, rather than the server's
+       user and file system.
+       </para>
+
+       <note>
+       <para>
+       See the description of the <envar>lo_transaction</envar> variable for
+       important information concerning all large object operations.
+       </para>
+       </note>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\lo_list</literal></term>
+       <listitem>
+       <para>
+       Shows a list of all <productname>PostgreSQL</productname> <quote>large
+       objects</quote> currently stored in the database along with their owners.
+       If the variable <envar>description</envar> is set, the associated
+       comments are shown as well.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>\lo_unlink</literal> <replaceable class="parameter">loid</replaceable></term>
+
+       <listitem>
+       <para>
+       Deletes the large object with <acronym>OID</acronym> <replaceable class="parameter">loid</replaceable>
+       from the database.
+       </para>
+
+       <tip>
+       <para>
+       Use <command>\lo_list</command> to find out the large object's <acronym>OID</acronym>.
+       </para>
+       </tip>
+       <note>
+       <para>
+       See the description of the <envar>lo_transaction</envar> variable for
+       important information concerning all large object operations.
+       </para>
+       </note>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\o</literal> [ {<replaceable class="parameter">filename</replaceable> | <literal>|</literal><replaceable class="parameter">command</replaceable>} ]</term>
+
+        <listitem>
+        <para>
+        Saves future query results to the file
+       <replaceable class="parameter">filename</replaceable> or pipe future
+        results into a separate Unix shell to execute
+       <replaceable class="parameter">command</replaceable>.
+        If no arguments are specified, the query output will be reset to
+        <filename>stdout</filename>.
+        </para>
+
+       <para>
+       <quote>Query results</quote> includes all tables and notices obtained
+       from the database server, as well as output of various backslash
+       commands that query the database (such as <command>\d</command>).
+       </para>
+
+       <tip>
+       <para>
+       To intersperse text output in between query results, use <command>\qecho</command>.
+       </para>
+       </tip>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\p</literal></term>
+        <listitem>
+        <para>
+        Print the current query buffer to the standard output.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\pset</literal> <replaceable class="parameter">parameter</replaceable> [ <replaceable class="parameter">value</replaceable> ]</term>
+
+       <listitem>
+       <para>
+       This command sets options affecting the output of query result tables.
+       <replaceable class="parameter">parameter</replaceable> describes which option
+       is to be set. The semantics of <replaceable class="parameter">value</replaceable>
+       depend thereon.
+       </para>
+
+       <para>
+       Adjustable printing options are:
+       <variablelist>
+         <varlistentry>
+         <term><literal>format</literal></term>
+         <listitem>
+         <para>
+         Sets the output format to one of <literal>unaligned</literal>,
+         <literal>aligned</literal>, <literal>html</literal>, or <literal>latex</literal>.
+         Unique abbreviations are allowed. (That would mean one letter is enough.)
+         </para>
+
+         <para>
+         <quote>Unaligned</quote> writes all fields of a tuple on a line, separated
+         by the currently active field separator. This is intended to create output
+         that might be intended to be read in by other programs (tab-separated,
+         comma-separated).
+         <quote>Aligned</quote> mode is the
+         standard, human-readable, nicely formatted text output that is default.
+         The <quote><acronym>HTML</acronym></quote> and <quote>LaTeX</quote> modes
+         put out tables that are intended to be included in documents using the
+         respective mark-up language. They are not complete documents! (This might
+         not be so dramatic in <acronym>HTML</acronym>, but in LaTeX you must
+         have a complete document wrapper.)
+         </para>
+         </listitem>
+          </varlistentry>
+
+         <varlistentry>
+         <term><literal>border</literal></term>
+         <listitem>
+         <para>
+         The second argument must be a number. In general, the higher the number
+         the more borders and lines the tables will have, but this depends on
+         the particular format. In <acronym>HTML</acronym> mode, this will
+         translate directly into the <literal>border=...</literal> attribute, in
+         the others only values 0 (no border), 1 (internal dividing lines), and 2
+         (table frame) make sense.
+         </para>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>expanded</literal> (or <literal>x</literal>)</term>
+         <listitem>
+         <para>
+         Toggles between regular and expanded format. When expanded format is
+         enabled, all output has two columns with the field name on the left
+         and the data on the right. This mode is useful if the data wouldn't
+         fit on the screen in the normal <quote>horizontal</quote> mode.
+         </para>
+
+         <para>
+         Expanded mode is support by all four output modes.
+         </para>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>null</literal></term>
+         <listitem>
+         <para>
+         The second argument is a string that should be printed whenever a field
+         is null. The default is not to print anything, which can easily be mistaken
+         for, say, an empty string. There one might choose to write
+         <literal>\pset null "(null)"</literal>.
+         </para>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>fieldsep</literal></term>
+         <listitem>
+         <para>
+         Specifies the field separator to be used in unaligned output mode. That way
+         one can create, for example, tab- or comma-separated output, which other
+         programs might prefer. To set a tab as field separator, type
+         <literal>\pset fieldsep "\t"</literal>. The default field separator is
+         <quote><literal>|</literal></quote> (a <quote>pipe</quote> symbol).
+         </para>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>tuples_only</literal> (or <literal>t</literal>)</term>
+         <listitem>
+         <para>
+         Toggles between tuples only and full display. Full display may show
+         extra information such as column headers, titles, and various footers.
+         In tuples only mode, only actual table data is shown.
+         </para>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>title</literal> [ <replaceable class="parameter">text</replaceable> ]</term>
+         <listitem>
+         <para>
+         Sets the table title for any subsequently printed tables. This can be
+         used to give your output descriptive tags. If no argument is given,
+         the title is unset.
+         </para>
+
+         <note>
+         <para>
+         This formerly only affected <acronym>HTML</acronym> mode. You can now
+         set titles in any output format.
+         </para>
+         </note>
+         </listitem>
+         </varlistentry>
+
+         <varlistentry>
+         <term><literal>tableattr</literal> (or <literal>T</literal>) [ <replaceable class="parameter">text</replaceable> ]</term>
+         <listitem>
+         <para>
+         Allows you to specify any attributes to be places inside the <acronym>HTML</acronym>
+         <sgmltag>table</sgmltag> tag. This could for example be
+         <literal>cellpadding</literal> or <literal>bgcolor</literal>. Note that you
+         probably don't want to specify <literal>border</literal> here, as
+         that is already taken care of by <literal>\pset border</literal>.
+         </para>
+         </listitem>
+         </varlistentry>
+
+
+         <varlistentry>
+         <term><literal>pager</literal></term>
+         <listitem>
+         <para>
+         Toggles the list of a pager to do table output. If the environment variable
+         <envar>PAGER</envar> is set, the output is piped to the specified program.
+         Otherwise <filename>/bin/more</filename> is assumed.
+         </para>
+
+         <para>
+         In any case, <application>psql</application> only uses the pager if it
+         seems appropriate. That means among other things that the output is to
+         a terminal and that the table would normally not fit on the screen.
+         Because of the modular nature of the printing routines it is not always
+         possible to predict the number of lines that will actually be printed.
+         For that reason <application>psql</application> might not appear very
+         discriminating about when to use the pager and when not to.
+         </para>
+         </listitem>
+         </varlistentry>
+       </variablelist>
+       Illustrations on how these different formats look can be seen in
+       the <xref linkend="APP-PSQL-examples" endterm="APP-PSQL-examples-title"> section.
+       </para>
+
+       <tip>
+       <para>
+       There are various shortcut commands for <command>\pset</command>. See
+       <command>\a</command>, <command>\C</command>, <command>\H</command>,
+       <command>\t</command>, <command>\T</command>, and <command>\x</command>.
+       </para>
+       </tip>
+
+       <note>
+       <para>
+       It is an error to call <command>\pset</command> without arguments. In the future
+       this call might show the current status of all printing options.
+       </para>
+       </note>
+
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\q</literal></term>
+        <listitem>
+        <para>
+        Quit the <application>psql</application> program.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\qecho</literal> <replaceable class="parameter">text</replaceable> [ ... ] </term>
+        <listitem>
+        <para>
+       This command is identical to <command>\echo</command> except that
+       all output will be written to the query output channel, as set by
+       <command>\o</command>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\r</literal></term>
+        <listitem>
+        <para>
+        Resets (clears) the query buffer.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\s</literal> [ <replaceable class="parameter">filename</replaceable> ]</term>
+        <listitem>
+        <para>
+        Print or save the command line history to 
+        <replaceable class="parameter">filename</replaceable>.
+        If <replaceable class="parameter">filename</replaceable> is omitted,
+       the history is written to the standard output.
+        This option is only available if <application>psql</application> is
+        configured to use the <acronym>GNU</acronym> history library.
+        </para>
+
+       <note>
+       <para>
+       As of <application>psql</application> version 6.6 it is no longer
+       necessary, in fact, to save the command history as that will be done
+       automatically on program termination. The history is then
+       also automatically loaded every time <application>psql</application>
+       starts up.
+       </para>
+       </note>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\set</literal> [ <replaceable class="parameter">name</replaceable> [ <replaceable class="parameter">value</replaceable> ]]</term>
+
+       <listitem>
+       <para>
+       Sets the internal variable <replaceable class="parameter">name</replaceable>
+       to <replaceable class="parameter">value</replaceable>. If no second argument
+       is given, the variable is unset (which is different from setting it to,
+       for example, and empty string: <literal>\set foo ''</literal>). If no
+       arguments are given, all currently defined variables are listed with their
+       values.
+       </para>
+
+       <para>
+       Valid variable names can contain lower-case characters, digits, and
+       underscores. In particular, no upper-case characters are allowed, as
+       those are reserved for certain <quote>magic</quote> variables and
+       environment variables. See the section about <application>psql</application>
+       variables for details.
+       </para>
+
+       <para>
+       Although you are welcome to set any variable to anything you want to,
+       <application>psql</application> treats several variables special.
+       They are documented in the section about variables.
+       </para>
+
+       <note>
+       <para>
+       This command is totally separate from the <acronym>SQL</acronym> command
+       <xref linkend="SQL-SET" endterm="SQL-SET-title">.
+       </para>
+       </note>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\t</literal></term>
+        <listitem>
+        <para>
+        Toggles the display of output column name headings and row count footer.
+       This command is equivalent to <literal>\pset tuples_only</literal> and
+       is provided for convenience.    
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\T</literal> <replaceable class="parameter">table_options</replaceable></term>
+        <listitem>
+        <para>
+        Allows you to specify options to be placed within the <sgmltag>table</sgmltag>
+       tag in <acronym>HTML</acronym> tabular output mode. This command is
+       equivalent to <literal>\pset tableattr <replaceable class="parameter">table_options</replaceable></literal>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\w</literal> {<replaceable class="parameter">filename</replaceable> | <replaceable class="parameter">|command</replaceable>}</term>
+        <listitem>
+        <para>
+        Outputs the current query buffer to the file <replaceable class="parameter">filename</replaceable>
+       or pipes it to the Unix command <replaceable class="parameter">command</replaceable>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\x</literal></term>
+        <listitem>
+        <para>
+        Toggles extended row format mode. As such it is equivalent to
+       <literal>\pset expanded</literal>.
+       </para>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\z</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term>
+        <listitem>
+        <para>
+        Produces a list of all tables in the database with their appropriate
+       access permissions listed. If an argument is given it is taken as a regular
+       expression which limits the listing to those tables which match it.
+        </para>
+
+       <para>
+       <programlisting>
+test=> <userinput>\z</userinput>
+Access permissions for database "test"
+ Relation |           Access permissions
+----------+-------------------------------------
+ my_table | {"=r","joe=arwR", "group staff=ar"}
+(1 row )
+        </programlisting>
+        Read this as follows:
+
+       <itemizedlist>
+          <listitem>
+          <para>
+          <literal>"=r"</literal>: <literal>PUBLIC</literal> has read
+         (<command>SELECT</command>) permission on the table.
+         </para>
+         </listitem>
+
+         <listitem>
+         <para>
+         <literal>"joe=arwR"</literal>: User <literal>joe</literal> has read,
+         write (<command>UPDATE</command>, <command>DELETE</command>),
+         <quote>append</quote> (<command>INSERT</command>) permissions,
+         and permission to create rules on the table.
+         </para>
+         </listitem>
+
+         <listitem>
+         <para>
+         <literal>"group staff=ar"</literal>: Group <literal>staff</literal>
+         has <command>SELECT</command> and <command>INSERT</command> permission.
+         </para>
+         </listitem>
+       </itemizedlist>
+       </para>
+
+       <para>
+       The commands <xref linkend="SQL-GRANT" endterm="SQL-GRANT-title"> and
+       <xref linkend="SQL-REVOKE" endterm="SQL-REVOKE-title">
+       are used to set access permissions.
+       </para>
+
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\!</literal> [ <replaceable class="parameter">command</replaceable> ]</term>
+        <listitem>
+        <para>
+        Escapes to a separate Unix shell or executes the Unix command
+        <replaceable class="parameter">command</replaceable>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term><literal>\?</literal></term>
+        <listitem>
+        <para>
+        Get help information about the slash (<quote>\</quote>) commands.
+        </para>
+        </listitem>
+      </varlistentry>
 
- <refsect1 id="R1-APP-PSQL-2">
+    </variablelist>
+  </para>
+</refsect1>
+
+
+
+<refsect1 id="R1-APP-PSQL-3">
   <refsect1info>
-   <date>1998-09-26</date>
+    <date>1998-09-26</date>
   </refsect1info>
-  <title>
-   Command-line Options
-  </title>
+
+  <title>Command-line Options</title>
+
   <para>
-   <application>psql</application>
-   understands the following command-line options:
+  If so configured, <application>psql</application> understands both standard
+  Unix short options, and <acronym>GNU</acronym>-style long options. Since the
+  latter are not available on all systems, you are advised to consider carefully
+  whether to use them, if you are writing scripts, etc. For support on the
+  <productname>PostgreSQL</productname> mailing lists, you are asked to only
+  use the standard short options.
+  </para>
 
-   <variablelist>
+  <para>
+  Many command line options are equivalent to an internal slash command or to
+  setting some variable. Those will not be explained in detail here. Instead,
+  you are asked to look them up in the respective section.
+  </para>
+
+  <para>
+  <variablelist>
     <varlistentry>
-     <term>-A</term>
-     <listitem>
+      <term>-A, --no-align</term>
+      <listitem>
       <para>
-       Turn off fill justification when printing out table elements.
+      Switches to unaligned output mode. (The default output mode is otherwise
+      aligned.)
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
+
        
     <varlistentry>
-     <term>-c <replaceable class="parameter">query</replaceable></term>
-     <listitem>
+      <term>-c, --command <replaceable class="parameter">query</replaceable></term>
+      <listitem>
       <para>
-       Specifies that
-       <application>psql</application>
-       is to execute one query string,
-       <replaceable class="parameter">query</replaceable>,
-       and then exit.  This is useful for shell scripts, typically in
-       conjunction with the <option>-q</option> option in shell scripts.
+      Specifies that <application>psql</application>
+      is to execute one query string, <replaceable class="parameter">query</replaceable>,
+      and then exit.  This is useful for shell scripts, typically in
+      conjunction with the <option>-q</option> option.
       </para>
-     </listitem>
-    </varlistentry>
-
-    <varlistentry>
-     <term>-d <replaceable class="parameter">dbname</replaceable></term>
-     <listitem>
       <para>
-       Specifies the name of the database to connect to. This is equivalent to specifying
-       <replaceable class="parameter">dbname</replaceable> as the last field in the
-       command line.
+      <replaceable class="parameter">query</replaceable> must be either a query string
+      that is completely parseable by the backend (i.e., it contains no <application>psql</application>
+      specific features), or it is a single backslash command. Thus
+      you cannot mix <acronym>SQL</acronym> and <application>psql</application>
+      meta-commands. To achieve this you could pipe the string into
+      <application>psql</application> and finish it with a a <literal>\q</literal>,
+      like so: <literal>echo "select * from foo; \q" | psql</literal>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-e</term>
-     <listitem>
-      <para>
-       Echo the query sent to the backend
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-E</term>
-     <listitem>
+      <term>-d, --dbname <replaceable class="parameter">dbname</replaceable></term>
+      <listitem>
       <para>
-       Echo the actual query generated by \d and other backslash commands
+      Specifies the name of the database to connect to. This is equivalent to specifying
+      <replaceable class="parameter">dbname</replaceable> as the first non-option
+      argument on the command line.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-f <replaceable class="parameter">filename</replaceable></term>
-     <listitem>
-      <para>
-       Use the file <replaceable class="parameter">filename</replaceable>
-       as the source of queries instead of reading queries interactively.
-       This file must be specified for and visible to the client frontend.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-F <replaceable class="parameter">separator</replaceable></term>
-     <listitem>
+      <term>-e, --echo</term>
+      <listitem>
       <para>
-       Use <replaceable class="parameter">separator</replaceable>
-       as the field separator.
-       The default is an ASCII vertical bar ("|").
+      In non-interactive mode, all lines are printed to the screen as they are read.
+      This is equivalent to setting the variable <envar>echo</envar>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-h <replaceable class="parameter">hostname</replaceable></term>
-     <listitem>
-      <para>
-       Specifies the host name of the machine on which the
-       <application>postmaster</application>
-       is running.
-       Without this option, communication is performed using
-       local Unix domain sockets.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-H</term>
-     <listitem>
+      <term>-E, --echo-all</term>
+      <listitem>
       <para>
-       Turns on
-       <acronym>HTML 3.0</acronym>
-       tabular output.
+      Echos the actual queries generated by \d and other backslash commands.
+      You can use this if you wish to include similar functionality into
+      your own programs. This is equivalent to setting the variable
+      <envar>echo_secret</envar> from within <application>psql</application>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-l</term>
-     <listitem>
-      <para>
-       Lists all available databases, then exit. Other non-connection options are ignored.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-n</term>
-     <listitem>
+      <term>-f, --file <replaceable class="parameter">filename</replaceable></term>
+      <listitem>
       <para>
-       Do not use the readline library for input line editing and command history.
+      Use the file <replaceable class="parameter">filename</replaceable>
+      as the source of queries instead of reading queries interactively.
+      After the file is processed, <application>terminates</application>.
+      This in many ways equivalent to the internal command <command>\i</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-o <replaceable class="parameter">filename</replaceable></term>
-     <listitem>
-      <para>
-       Put all output into file <replaceable class="parameter">filename</replaceable>.
-       The path must be writable by the client.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-p <replaceable class="parameter">port</replaceable></term>
-     <listitem>
+      <term>-F, --field-sep <replaceable class="parameter">separator</replaceable></term>
+      <listitem>
       <para>
-       Specifies the TCP/IP port or, by omission, the local Unix domain socket file
-       extension on which the
-       <application>postmaster</application>
-       is listening for connections.  Defaults to the value of the
-       <envar>PGPORT</envar>
-       environment variable, if set, or to 5432.
+      Use <replaceable class="parameter">separator</replaceable> as the field separator.
+      This is equivalent to <command>\pset fieldsep</command> or <command>\f</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-q</term>
-     <listitem>
-      <para>
-       Specifies that
-       <application>psql</application>
-       should do its work quietly.  By default, it
-       prints welcome and exit messages and prompts for each query.
-       If this option is used, none of this happens. This is useful with the
-       <option>-c</option> option.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-s</term>
-     <listitem>
+      <term>-h, --host <replaceable class="parameter">hostname</replaceable></term>
+      <listitem>
       <para>
-       Run in single-step mode where the user is prompted for each query before
-       it is sent to the backend.
+      Specifies the host name of the machine on which the
+      <application>postmaster</application> is running.
+      Without this option, communication is performed using
+      local Unix domain sockets.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-S</term>
-     <listitem>
-      <para>
-       Runs in single-line mode where each query is terminated by a newline,
-       instead of a semicolon.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-t</term>
-     <listitem>
+      <term>-H, --html</term>
+      <listitem>
       <para>
-       Turn off printing of column names and result row count.
-       This is useful with the
-       <option>-c</option>
-       option in shell scripts.
+      Turns on <acronym>HTML</acronym> tabular output. This is equivalent
+      to <literal>\pset format html</literal> or the <command>\H</command>
+      command.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
     <varlistentry>
-     <term>-T <replaceable class="parameter">table_options</replaceable></term>
-     <listitem>
+      <term>-l, --list</term>
+      <listitem>
       <para>
-       Allows you to specify options to be placed within the
-       <sgmltag>table ...</sgmltag> tag for <acronym>HTML 3.0</acronym>
-       tabular output.For example, <literal>border</literal>
-       will give you tables with borders.
-       This must be used in conjunction with the <option>-H</option> option.
+      Lists all available databases, then exits. Other non-connection options
+      are ignored. This is similar to the internal command <command>\list</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term>-u</term>
-     <listitem>
-      <para>
-       Asks the user for the user name and password before connecting to the database.
-       If the database does not require password authentication then these are
-       ignored.  If the option is not used (and the PGPASSWORD environment variable
-       is not set) and the database requires password authentication, then the
-       connection will fail.  The user name is ignored anyway.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term>-x</term>
-     <listitem>
+      <term>-n, --no-readline</term>
+      <listitem>
       <para>
-       Turns on extended row format mode. When enabled each row will have its column
-       names printed on the left with the column values printed on the right.
-       This is useful for rows which are otherwise too long to fit into
-       one screen line. HTML row output supports this mode also.
+      Do not use the readline library for input line editing and command history.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
-   </variablelist>
-  </para>
-  <para>
-   You may set environment variables to avoid typing some of the above
-   options.  See the section on environment variables below.
-  </para>
- </refsect1>
 
- <refsect1 id="R1-APP-PSQL-3">
-  <refsect1info>
-   <date>1998-09-26</date>
-  </refsect1info>
-  <title>
-   <application>psql</application> Meta-Commands
-  </title>
-  <para>
-   Anything you enter in <application>psql</application> 
-   that begins with an unquoted backslash is a <application>psql</application>
-   meta-command.  Anything else is <acronym>SQL</acronym>
-   and simply goes into the current query buffer
-   (and once you have at least one complete query, it gets automatically 
-   submitted to the backend).  
-   <application>psql</application> meta-commands are also called slash commands.
-  </para>
-  <para>
-   The format of a <application>psql</application> command is the backslash, 
-   followed immediately by
-   a command verb, then any arguments.  The arguments are separated from the
-   command verb and each other by any number of white space characters.
-  </para>
-  <para>
-   With single character command verbs, you don't actually need to separate the
-   command verb from the argument with white space, for historical reasons.
-   You should anyway.
-  </para>
-  <para>
-   The following meta-commands are defined:
 
-   <variablelist>
     <varlistentry>
-     <term><literal>\a</literal></term>
-     <listitem>
+      <term>-o, --out <replaceable class="parameter">filename</replaceable></term>
+      <listitem>
       <para>
-       Toggle field alignment when printing out table elements.
+      Put all query output into file <replaceable class="parameter">filename</replaceable>.
+      This is equivalent to the command <command>\o</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\C</literal> <replaceable class="parameter">caption</replaceable></term>
-     <listitem>
-      <para>
-       Set the HTML3.0 table caption to 
-       <quote><replaceable class="parameter">caption</replaceable></quote>.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\connect</literal> <replaceable class="parameter">meter"</replaceable>ceable> [ <replaceable class="parameter">username</replaceable> ]</term>
-     <listitem>
+      <term>-p, --port <replaceable class="parameter">port</replaceable></term>
+      <listitem>
       <para>
-       Establish a connection to a new database, using the default 
-       <replaceable class="parameter">username</replaceable> if none is specified.
-       The previous connection is closed.
+      Specifies the TCP/IP port or, by omission, the local Unix domain socket file
+      extension on which the <application>postmaster</application>
+      is listening for connections.  Defaults to the value of the
+      <envar>PGPORT</envar> environment variable or, if not set, to the port
+      specified at compile time, usually 5432.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\copy</literal> <replaceable class="parameter">meter"</replaceable>ceable> { FROM | TO } <replaceable class="parameter">filename</replaceable>
-     </term>
-     <listitem>
-      <para>
-       Perform a frontend (client) copy.  This is an operation that runs a SQL COPY command,
-       but instead of the backend reading or writing the specified file, and 
-       consequently requiring backend access and special user privilege, 
-       <application>psql</application> reads or writes the 
-       file and routes the data to or from the backend.  The default
-       <literal>tab</literal>
-       delimiter is used.
-      </para>
-      <tip>
-       <para>
-       This operation is not as efficient as the <acronym>SQL</acronym> 
-       <command>COPY</command> command because all data must pass through the
-       client/server IP or socket connection. For large amounts of data this other
-       technique may be preferable.
-       </para>
-      </tip>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\d</literal> [ <replaceable class="parameter">table</replaceable> ]</term>
-     <listitem>
+      <term>-P, --pset <replaceable class="parameter">assignment</replaceable></term>
+      <listitem>
       <para>
-       List tables in the database, or if <replaceable
-       class="parameter">table</replaceable>
-       is specified, list the columns in that table.
-       If table name is specified as an asterisk (<quote>*</quote>),
-       list all tables and column information for each tables.
+      Allows you to specify printing options in the style of <command>\pset</command>
+      on the command line. Note that here you have to separate name and value with
+      an equal sign instead of a space. Thus to set the output format to LaTeX, you
+      could write <literal>-P format=latex</literal>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\da</literal></term>
-     <listitem>
-      <para>
-       List all available aggregates.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\dd</literal> <replaceable class="parameter">object</replaceable></term>
-     <listitem>
+      <term>-q</term>
+      <listitem>
       <para>
-       List the description from <literal>pg_description</literal>
-       of the specified object.
+      Specifies that <application>psql</application> should do its work quietly.
+      By default, it prints welcome messages, various informational output and
+      prompts for each query.
+      If this option is used, none of this happens. This is useful with the
+      <option>-c</option> option. Within <application>psql</application> you can
+      also set the <envar>quiet</envar> variable to achieve the same effect.
       </para>
-      <tip>
-       <para>
-       Not all objects have a description in <literal>pg_description</literal>.
-       This meta-command can be useful to get a quick description of a native
-       <productname>Postgres</productname> feature.
-       </para>
-      </tip>
-     </listitem>
+      </listitem>
     </varlistentry>
 
     <varlistentry>
-     <term><literal>\df</literal></term>
-     <listitem>
+      <term>-s, --single-step</term>
+      <listitem>
       <para>
-       List functions.
+      Run in single-step mode. That means the user is prompted before each query
+      is sent to the backend, with the option to cancel execution as well.
+      Use this to debug scripts.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\di</literal></term>
-     <listitem>
-      <para>
-       List only indexes.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\do</literal></term>
-     <listitem>
+      <term>-S, --single-line</term>
+      <listitem>
       <para>
-       List only operators.
+      Runs in single-line mode where a newline sends a query, in addition to a semicolon.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\ds</literal></term>
-     <listitem>
+      <note>
       <para>
-       List only sequences.
+      This mode is provided for those who insist on it, but you are not necessarily
+      encouraged to use it. In particular, if you mix <acronym>SQL</acronym> and
+      meta-commands on a line the order of execution might not always be clear to
+      the unexperienced user. Moral: Unless you exclusively type short queries,
+      avoid using this mode.
       </para>
-     </listitem>
+      </note>
+      </listitem>
     </varlistentry>
 
+
     <varlistentry>
-     <term><literal>\dS</literal></term>
-     <listitem>
+      <term>-t, --tuples-only</term>
+      <listitem>
       <para>
-       List system tables and indexes.
+      Turn off printing of column names and result row count footers, etc.
+      It is completely equivalent to the <command>\t</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
+
     <varlistentry>
-     <term><literal>\dt</literal></term>
-     <listitem>
+      <term>-T, --table-attr <replaceable class="parameter">table_options</replaceable></term>
+      <listitem>
       <para>
-       List only non-system tables.
+      Allows you to specify options to be placed within the <acronym>HTML</acronym>
+      <sgmltag>table</sgmltag> tag. See <command>\pset</command> for details.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
     <varlistentry>
-     <term><literal>\dT</literal></term>
-     <listitem>
+      <term>-u</term>
+      <listitem>
       <para>
-       List types.
+      Makes <application>psql</application> prompt for the user name and password
+      before connecting to the database.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry><term>
-      <literal>\e</literal> [ <replaceable class="parameter">filename</replaceable> ]</term>
-     <listitem>
       <para>
-       Edit the current query buffer or the contents of the file
-       <replaceable class="parameter">filename</replaceable>.
+      This option is deprecated, as it is conceptually flawed. (Prompting for
+      a non-default user name and prompting for a password because the
+      backend requires it are really two different things.) You are encouraged
+      to look at the <option>-U</option> and <option>-W</option> options instead.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\E</literal> [ <replaceable class="parameter">filename</replaceable> ]</term>
-     <listitem>
-      <para>
-       Edit the current query buffer or the contents of the file
-       <replaceable class="parameter">filename</replaceable>
-       and execute it upon editor exit.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\f</literal> [ <replaceable class="parameter">separator</replaceable> ]</term>
-     <listitem>
+      <term>-U, --username <replaceable class="parameter">username</replaceable></term>
+      <listitem>
       <para>
-       Set the field separator.  Default is a single blank space.
-      </para>
-     </listitem>
+      Connects to the database as the user <replaceable class="parameter">username</replaceable>
+      instead of the default. (You must have permission to do so, of course.) If
+      <replaceable class="parameter">username</replaceable> is <quote>?</quote>, <application>psql</application>
+      issues an interactive prompt for the user name.
+      </para> 
+      </listitem>
     </varlistentry>
 
+
     <varlistentry>
-     <term><literal>\g</literal> [ { <replaceable class="parameter">filename</replaceable> | <literal>|</literal><replaceable class="parameter">command</replaceable> } ]</term>
-     <listitem>
+      <term>-v, --variable, --set <replaceable class="parameter">assignment</replaceable></term>
+      <listitem>
       <para>
-       Send the current query input buffer to the backend and optionally
-       save the output in <replaceable class="parameter">filename</replaceable>
-       or pipe the output into a separate Unix shell to execute
-       <replaceable class="parameter">command</replaceable>.
+      Performs a variable assignment, like the <command>\set</command> internal command.
+      Note that you must separate name and value, if any, by an equal sign on the command
+      line.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\h</literal> [ <replaceable class="parameter">command</replaceable> ]</term>
-     <listitem>
-      <para>
-       Give syntax help on the specified SQL command.  
-       If <replaceable class="parameter">command</replaceable> is not a defined SQL command
-       (or is not documented in <application>psql</application>), or if
-       <replaceable class="parameter">command</replaceable> is not specified,
-       then <application>psql</application> will 
-       list all the commands for which syntax help is
-       available.  If <replaceable class="parameter">command</replaceable>
-       is an asterisk (<quote>*</quote>), then
-       give syntax help on all SQL commands.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\H</literal></term>
-     <listitem>
+      <term>-V, --version</term>
+      <listitem>
       <para>
-       Toggle <acronym>HTML3</acronym> output. This is equivalent to
-       the <option>-H</option>
-       command-line option.
+      Shows version information about <application>psql</application> and your
+      <productname>PostgreSQL</productname> database server, if it could be reached.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\i</literal> <replaceable class="parameter">filename</replaceable></term>
-     <listitem>
       <para>
-       Read queries from the file <replaceable class="parameter">filename</replaceable>
-       into the query input buffer.
+      The output looks similar to this:
+      <programlisting>
+~$ <userinput>psql -V</userinput>
+Server: PostgreSQL 6.5.2 on i586-pc-linux-gnu, compiled by egcs
+psql 6.6.0 on i586-pc-linux-gnu, compiled by gcc 2.8.1 (Oct 27 1999 15:15:04), long options,
+readline, history, locale, assert checks
+      </programlisting>
+      The <quote>Server</quote> line is identical to the one returned by the
+      backend function <function>version()</function> and thus might vary
+      if you query different servers by using different connection
+      options.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\l</literal></term>
-     <listitem>
       <para>
-       List all the databases in the server.
+      The <quote>psql</quote> line is compiled into the <application>psql</application>
+      binary. It shows you which <productname>PostgreSQL</productname> release
+      it was distributed with and what optional features were compiled into it.
+      Although in general (as in the example above) you can use <application>psql</application>
+      and database servers from different versions (if they don't differ too much)
+      this is not recommended or
+      even necessary. The optional features indicate only <application>psql</application>'s
+      capabilities but if <application>psql</application> was configured with
+      the same source tree as the rest of the distribution, it gives you an
+      indication about other parts of the installation as well.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\m</literal></term>
-     <listitem>
-      <para>
-       Toggle the old monitor-like table display, which includes border characters
-       surrounding the table.
-       This is standard SQL output.
-       By default, <application>psql</application> includes only field separators
-       between columns.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\o</literal> [ { <replaceable class="parameter">filename</replaceable> | <literal>|</literal><replaceable class="parameter">command</replaceable> } ]</term>
-     <listitem>
+      <term>-W</term>
+      <listitem>
       <para>
-       Save future query results to the file
-       <replaceable class="parameter">filename</replaceable> or pipe future
-       results into a separate Unix shell to execute
-       <replaceable class="parameter">command</replaceable>.
-       If no arguments are specified, send query results to
-       <filename>stdout</filename>.
+      Requests that <application>psql</application> should prompt for a password
+      before connecting to a database. This will remain set for the entire
+      session, even if you change the database connection with the meta-command
+      <command>\connect</command>.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\p</literal></term>
-     <listitem>
       <para>
-       Print the current query buffer.
+      As of version 6.6, <application>psql</application> automatically issues a
+      password prompt whenever the backend requests password authentication.
+      Because this is currently based on a <quote>hack</quote> the automatic
+      recognition might mysteriously fail, hence this option to force a prompt.
+      If no password prompt is issued and the backend requires password authentication
+      the content of the environment variable <envar>PGPASSWORD</envar> is
+      taken. If this is not set, the connection attempt will fail.
       </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\q</literal></term>
-     <listitem>
+      <caution>
       <para>
-       Quit the <application>psql</application> program.
+      If you are considering setting the variable <envar>PGPASSWORD</envar> to do
+      authentication, you have a problem.
       </para>
-     </listitem>
+      </caution>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\r</literal></term>
-     <listitem>
-      <para>
-       Reset(clear) the query buffer.
-      </para>
-     </listitem>
-    </varlistentry>
 
     <varlistentry>
-     <term><literal>\s</literal> [ <replaceable class="parameter">filename</replaceable> ]</term>
-     <listitem>
+      <term>-x</term>
+      <listitem>
       <para>
-       Print or save the command line history to 
-       <replaceable class="parameter">filename</replaceable>.
-       If <replaceable class="parameter">filename</replaceable> is omitted,
-       do not save subsequent commands to a history file.
-       This option is only available if <application>psql</application> is
-       configured to use readline.
+      Turns on extended row format mode. This is equivalent to the command
+      <command>\x</command>.
       </para>
-     </listitem>
+      </listitem>
     </varlistentry>
 
-    <varlistentry>
-     <term><literal>\t</literal></term>
-     <listitem>
-      <para>
-       Toggle display of output column name headings and row count footer (defaults to on).
-      </para>
-     </listitem>
-    </varlistentry>
+  </variablelist>
+  </para>
 
-    <varlistentry>
-     <term><literal>\T</literal> <replaceable class="parameter">table_options</replaceable></term>
-     <listitem>
-      <para>
-       Allows you to specify options to be placed within the
-       <sgmltag>table ...</sgmltag> tag
-       for <acronym>HTML 3.0</acronym>
-       tabular output.For example, <literal>border</literal>
-       will give you tables with borders.
-       This must be used in conjunction with the <command>\H</command> meta-command.
-      </para>
-     </listitem>
-    </varlistentry>
+  <para>
+  You may set environment variables to avoid typing some of the above
+  options.  See the section <quote>Connection To A Database</quote> above
+  and in particular the documentation of the <application>libpq</application>
+  client library.
+  </para>
+</refsect1>
 
-    <varlistentry>
-     <term><literal>\x</literal></term>
-     <listitem>
-      <para>
-       Toggles extended row format mode. When enabled each row will have its column
-       names printed on the left with the column values printed on the right.
-       This is useful for rows which are otherwise too long to fit into
-       one screen line. <acronym>HTML</acronym> row output mode supports this flag too.
-      </para>
-     </listitem>
-    </varlistentry>
 
-    <varlistentry>
-     <term><literal>\w</literal> <replaceable class="parameter">filename</replaceable></term>
-     <listitem>
-      <para>
-       Write the current query buffer to the file
-       <replaceable class="parameter">filename</replaceable>.
-      </para>
-     </listitem>
-    </varlistentry>
+<refsect1 id="R1-APP-PSQL-4">
+    <refsect1info>
+      <date>1998-09-27</date>
+    </refsect1info>
 
-    <varlistentry>
-     <term><literal>\z</literal></term>
-     <listitem>
+    <title>Advanced features</title>
+
+  <refsect2 id="APP-PSQL-variables">
+    <title id="APP-PSQL-variables-title">Variables</title>
+
+    <para>
+    <application>psql</application> provides variable substitution features
+    similar to common Unix command shells. Variables are simply name/values
+    pairs, where the value can be any string of any length. To set variables,
+    use the <application>psql</application> meta-command <command>\set</command>:
+    <programlisting>
+testdb=> <userinput>\set foo bar</userinput>
+    </programlisting>
+    sets the variable <quote>foo</quote> to the value <quote>bar</quote>. To retrieve
+    the content of the variable, precede the name with a dollar-sign and use it
+    as the argument of any slash command:
+    <programlisting>
+testdb=> <userinput>\echo $foo</userinput>
+bar
+    </programlisting>
+    Alternatively, the value can also be interpolated into a double-quoted (or backtick-quoted)
+    string, like so:
+    <programlisting>
+testdb=> <userinput>\echo "foo is now ${foo}."</userinput>
+foo is now bar.
+    </programlisting>
+    (The curly braces are required. This is not <productname>Perl</productname>.) No variable substitution
+    will be performed in single-quoted strings or in any of the backslash commands
+    that have special parsing rules (<command>\copy</command>, <command>\help</command>).
+    </para>
+
+    <note>
+    <para>
+    The arguments of <command>\set</command> are subject to the same substitution
+    rules as with other commands. Thus you can construct interesting references
+    such as <literal>\set "${foo}bar" 'something'</literal> and get <quote>variable
+    variables</quote> of <productname>Perl</productname> or <productname><acronym>PHP</acronym></productname>
+    fame. Unfortunately (or fortunately?), there is not way to do anything useful
+    with these constructs. (<literal>\echo ${${foo}}</literal> doesn't work.) On the
+    other hand, <literal>\set bar $foo</literal> is a perfectly valid way to copy
+    a variable.
+    </para>
+    </note>
+
+    <para>
+    <application>psql</application>'s internal variable names can consist of
+    lower-case letters, numbers, and underscores in any order and any number of
+    them. Upper-case letters are not allowed. (There is a reason for that. Keep reading.)
+    If you attempt to refer to a variable that does not consist of those
+    characters <application>psql</application> first checks if it is the name of
+    one of several defined <quote>magic</quote> variables. Those variables you cannot
+    set but they always have a value. By convention they all start with an
+    upper-case letter. Finally, if no match is found that way, the value of
+    the respective environment variable is substituted.
+    </para>
+
+    <para>
+    Currently, the following <quote>magic</quote> variables are defined:
+    <envar>Version</envar> which contains a string with the version of
+    <application>psql</application>; <envar>Database</envar>, <envar>Host</envar>,
+    <envar>Port</envar>, <envar>User</envar> are the currently active
+    connection options.
+    </para>
+
+    <para>
+    A number of regular variables are treated specially by <application>psql</application>.
+    They indicate certain option settings that can be changed at runtime
+    by altering the value of the variable. Although you can use these
+    variables for any other purpose, this is not recommended, as the
+    program behavior might grow really strange really quickly. Note that the
+    majority variables are <quote>boolean</quote> variables, that is, they
+    only care whether or not are they set, not what to. A list of all specially
+    treated variables follows.
+    <variablelist>
+      <varlistentry>
+        <term><envar>description</envar></term>
+       <listitem>
+       <para>
+       If set, the various <command>\d*</command> commands as well as
+       <command>\l</command> and <command>\lo_list</command> show object
+       descriptions along with the normal information. (Except for
+       <command>\dd</command> which always shows descriptions as this
+       is its very purpose.)
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>die_on_error</envar></term>
+       <listitem>
+       <para>
+       By default, if non-interactive scripts encounter an error, such as a
+       malformed <acronym>SQL</acronym> query or internal meta-command,
+       processing continues. This is often less than desirable. If this variable
+       is set, script processing will immediately terminate. If the script was
+       called from another script it will terminate in the same fashion.
+       If the outermost script was not called from an interactive <application>psql</application>
+       session but rather using the <option>-f</option> option, <application>psql</application>
+       will return error code 3, to distinguish this case from fatal
+       error conditions (error code 1).
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>echo</envar></term>
+       <listitem>
+       <para>
+       If set, all lines from a script are written to the standard output before they
+       are executed. To specify this on program startup, in conjunction with the
+       <option>-f</option> option perhaps, use the switch <option>-e</option>.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>echo_secret</envar></term>
+       <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>
+       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.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>lo_transaction</envar></term>
+       <listitem>
+       <para>
+       If you use the <productname>PostgreSQL</productname> large object interface to store
+       data that does not fit into one tuple specially all the operations must be contained
+       in a transaction block. (See the documentation of the large object interface for
+       more information.) Since <application>psql</application> has no way to keep track if
+       you already have a transaction in progress when you call one of its internal commands
+       <command>\lo_export</command>, <command>\lo_import</command>, <command>\lo_unlink</command>
+       it must take some arbitrary action. This action could either be to roll back any transaction
+       that might already be in progress, or to commit any such transaction, or to do nothing
+       at all. In the latter case you must provide you own <command>BEGIN</command>/<command>END</command>
+       block or the results are unpredictable (usually resulting in the desired action not being
+       performed anyway).
+       </para>
+
+       <para>
+       To choose what you want to do you set this variable to one of
+       <quote>rollback</quote>, <quote>commit</quote>, or <quote>nothing</quote>. The default is
+       to roll back the transaction. If you just want to load one or a few objects this is fine.
+       However, if you intend to transfer many large objects, it might be advisable to
+       provide one explicit transaction block around all commands.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>prompt1</envar>, <envar>prompt2</envar>, <envar>prompt3</envar></term>
+       <listitem>
+       <para>
+       These specify what the prompt <application>psql</application> issues is
+       supposed to look like. See
+       <quote><xref linkend="APP-PSQL-prompting" endterm="APP-PSQL-prompting-title"></quote>
+       below.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>quiet</envar></term>
+       <listitem>
+       <para>
+       This variable is equivalent to the command line option <option>-q</option>.
+       It is probably not too useful in interactive mode.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>singleline</envar></term>
+       <listitem>
+       <para>
+       This variable is set be the command line options <option>-S</option>. You
+       can unset or reset it at run time.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>singlestep</envar></term>
+       <listitem>
+       <para>
+       This variable is equivalent to the command line option <option>-s</option>.
+       </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><envar>sql_interpol</envar></term>
+       <listitem>
+       <para>
+       The escape character for <acronym>SQL</acronym> variable interpolation. See below.
+       </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+
+    </para>
+
+  </refsect2>
+
+
+  <refsect2 id="APP-PSQL-sql-interpol">
+    <title id="APP-PSQL-sql-interpol-title"><acronym>SQL</acronym> Interpolation</title>
+
+    <para>
+    An additional useful feature of <application>psql</application> variables
+    is that you can substitute (<quote>interpolate</quote>) them into
+    regular <acronym>SQL</acronym> statements. In order not to break existing
+    <acronym>SQL</acronym> statements, you must choose your own special
+    character that tells <application>psql</application> that you wish to
+    interpolate the value of a variable here. You do this by setting the
+    variable <envar>sql_interpol</envar>. Only the first character will be
+    looked at. You can set this variable to anything you want but, for instance,
+    letters, numbers, semicolons, or backslashes will not make your life easier.
+    Reasonable choices include the dollar (<quote>$</quote>) and pound
+    (<quote>#</quote>) signs.
+    <programlisting>
+testdb=> <userinput>\set sql_interpol '#'</userinput>
+    </programlisting>
+    </para>
+
+    <para>
+    Once this is set up, whenever <application>psql</application> sees the
+    magic character where it would expect a query, it will continue scanning
+    until it sees the same character again and will interpret anything in
+    between as a variable name.
+    <programlisting>
+testdb=> <userinput>\set foo 'my_table'</userinput>
+testdb=> <userinput>SELECT * FROM #foo#;</userinput>
+    </programlisting>
+    would then query the table <literal>my_table</literal>. The value of the
+    variable is copied literally, so it can even contain unbalanced quotes or
+    backslash commands. You must make sure that it makes sense where you put it.
+    </para>
+
+    <para>
+    One possible application of this mechanism is to copy the contents of a file
+    into a field. First load the file into a variable and then proceed as above.
+    <programlisting>
+testdb=> <userinput>\set content `cat my_file.txt`</userinput>
+testdb=> <userinput>INSERT INTO my_table VALUES ('#content#');</userinput>
+    </programlisting>
+    One possible problem with this approach is that <filename>my_file.txt</filename>
+    might contain single quotes. These need to be escaped so that
+    they don't cause a syntax error when the second line is processed. This
+    could be done with the program <application>sed</application>:
+    <programlisting>
+testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinput>
+    </programlisting>
+    Observe the correct number of backslashes (6)! You can resolve it this way: After
+    <application>psql</application> has parsed this line, it passes
+    <literal>sed -e "s/'/\\\'/g" < my_file.txt</literal> to the shell. The shell
+    will do it's own thing inside the double quotes and execute <filename>sed</filename>
+    with the arguments <literal>-e</literal> and <literal>s/'/\\'/g</literal>.
+    When <application>sed</application> parses this it will replace the two
+    backslashes with a single one and then do the substitution. Perhaps at
+    one point you thought it was great that all Unix commands use the same
+    escape character. And this is ignoring the fact that you might have to
+    escape all backslashes as well because <acronym>SQL</acronym> text constants
+    are also subject to certain interpretations. In that case you might
+    be better off preparing the file externally.
+    </para>
+
+  </refsect2>
+
+
+  <refsect2 id="APP-PSQL-prompting">
+    <title id="APP-PSQL-prompting-title">Prompting</title>
+
+    <para>
+    The prompts <application>psql</application> issues can be customized to
+    your preference. The three variables <envar>prompt1</envar>, <envar>prompt2</envar>,
+    and <envar>prompt3</envar> contain strings and special escape sequences
+    that describe the appearance of the prompt. Prompt 1 is the normal prompt
+    that is issued when <application>psql</application> requests a new query.
+    Prompt 2 is issued when more input is expected during query input because
+    the query was not terminated with a semicolon or a quote was not closed.
+    Prompt 3 is issued when you run an <acronym>SQL</acronym> <command>COPY</command>
+    command and you are expected to type in the tuples on the terminal.
+    </para>
+
+    <para>
+    The value of the respective prompt variable is printed literally, except where
+    a percent sign (<quote>%</quote>) is encountered. Depending on the next
+    character, certain other text is substituted instead. Defined substitutions are:
+
+    <variablelist>
+      <varlistentry>
+        <term><literal>%M</literal></term>
+       <listitem><para>The hostname of the database server (or <quote>.</quote> if Unix domain socket).</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%m</literal></term>
+       <listitem><para>The hostname of the database server truncated after the first dot.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%&gt;</literal></term>
+       <listitem><para>The port number at which the database server is listening.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%n</literal></term>
+       <listitem><para>The username you are connected as (not your local system user name).</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%/</literal></term>
+       <listitem><para>The name of the current database.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%~</literal></term>
+       <listitem><para>Like <literal>%/</literal>, but the output is <quote>~</quote> (tilde) if the database
+       is your default database.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%#</literal></term>
+       <listitem><para>If the username is <literal>postgres</literal>, a <quote>#</quote>, otherwise a <quote>&gt;</quote>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%R</literal></term>
+       <listitem><para>
+       In prompt 1 normally <quote>=</quote>, but <quote>^</quote> if in single-line mode, and
+       <quote>!</quote> if the session is disconnected from the database (which can only
+       happen if <command>\connect</command> fails).
+       In prompt 2 the sequence is replaced by <quote>-</quote>, <quote>*</quote>, a single quote,
+       or a double quote, depending on whether <application>psql</application> expects more input
+       because the query wasn't terminated yet, because you are inside a <literal>/* ... */</literal>
+       comment, or because you are inside a quote.
+       In prompt 3 the sequence doesn't resolve to anything.</para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%</literal><replaceable class="parameter">digits</replaceable></term>
+       <listitem><para>
+       If <replaceable class="parameter">digits</replaceable> starts with <literal>0x</literal>
+       the rest of the characters are interpreted at a hexadecimal digit and the
+       character with the corresponding code is subsituted. If the first digit is <literal>0</literal>
+       the characters are interpreted as on octal number and the corresponding character
+       is substituted. Otherwise a decimal number is assumed.</para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%$</literal><replaceable class="parameter">name</replaceable><literal>$</literal></term>
+       <listitem><para>
+       The value of the <application>psql</application>, <quote>magic</quote>, or environment
+       variable <replaceable class="parameter">name</replaceable>. See the section
+       <quote><xref linkend="APP-PSQL-variables" endterm="APP-PSQL-variables-title"></quote>
+       for details.</para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>%`</literal><replaceable class="parameter">command</replaceable><literal>`</literal></term>
+       <listitem><para>
+       The output of <replaceable class="parameter">command</replaceable>, similar to
+       ordinary <quote>back-tick</quote> substitution.</para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+
+    To insert a percent sign into your prompt, write <literal>%%</literal>. The
+    default prompts are equivalent to <literal>'%/%R%# '</literal> for prompts 1
+    and 2, and <literal>'&gt;&gt; '</literal> for prompt 3.
+    </para>
+
+   </refsect2>
+
+</refsect1>
+
+
+<refsect1 id="APP-PSQL-examples">
+  <title id="APP-PSQL-examples-title">Examples</title>
+
+  <note>
+  <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
+  is included in the distribution.
+  </para>
+  </note>
+
+  <para>
+  The first example shows how to spread a query over several lines of input.
+  Notice the changing prompt.
+  <programlisting>
+testdb=> <userinput>CREATE TABLE my_table (</userinput>
+testdb-> <userinput> first int4 not null default 0,</userinput>
+testdb-> <userinput> second text</userinput>
+testdb-> <userinput>);</userinput>
+CREATE
+  </programlisting>
+  Now look at the table definition again:
+  <programlisting>
+testdb=> <userinput>\d my_table</userinput>
+           Table "my_table"
+ Attribute | Type |        Info
+-----------+------+--------------------
+ first     | int4 | not null default 0
+ second    | text |
+
+  </programlisting>
+  At this point you decide to change the prompt to something more
+  interesting:
+  <programlisting>
+testdb=> <userinput>\set prompt1 '%n@%m %~%R%# '</userinput>
+peter@localhost testdb=>
+  </programlisting>
+  Let's assume you have filled the table with data and want to take a look at it:
+  <programlisting>
+peter@localhost testdb=> SELECT * FROM my_table;
+ first | second
+-------+--------
+     1 | one
+     2 | two
+     3 | three
+     4 | four
+(4 rows)
+
+  </programlisting>
+  Notice how the int4 colums in right aligned while the text column in left aligned.
+  You can make this table look differently by using the <command>\pset</command>
+  command.
+  <programlisting>
+peter@localhost testdb=> <userinput>\pset border 2</userinput>
+Border style is 2.
+peter@localhost testdb=> <userinput>SELECT * FROM my_table;</userinput>
++-------+--------+
+| first | second |
++-------+--------+
+|     1 | one    |
+|     2 | two    |
+|     3 | three  |
+|     4 | four   |
++-------+--------+
+(4 rows)
+
+peter@localhost testdb=> <userinput>\pset border 0</userinput>
+Border style is 0.
+peter@localhost testdb=> <userinput>SELECT * FROM my_table;</userinput>
+first second
+----- ------
+    1 one
+    2 two
+    3 three
+    4 four
+(4 rows)
+
+peter@localhost testdb=> <userinput>\pset border 1</userinput>
+Border style is 1.
+peter@localhost testdb=> <userinput>\pset format unaligned</userinput>
+Output format is unaligned.
+peter@localhost testdb=> <userinput>\pset fieldsep ","</userinput>
+Field separator is ",".
+peter@localhost testdb=> <userinput>\pset tuples_only</userinput>
+Showing only tuples.
+peter@localhost testdb=> <userinput>SELECT second, first FROM my_table;</userinput>
+one,1
+two,2
+three,3
+four,4
+  </programlisting>
+  Alternatively, use the short commands:
+  <programlisting>
+peter@localhost testdb=> <userinput>\a \t \x</userinput>
+Output format is aligned.
+Tuples only is off.
+Expanded display is on.
+peter@localhost testdb=> <userinput>SELECT * FROM my_table;</userinput>
+-[ RECORD 1 ]-
+first  | 1
+second | one
+-[ RECORD 2 ]-
+first  | 2
+second | two
+-[ RECORD 3 ]-
+first  | 3
+second | three
+-[ RECORD 4 ]-
+first  | 4
+second | four
+  </programlisting>
+  </para>
+
+</refsect1>
+
+
+<refsect1>
+  <refsect1info>
+    <date>1999-10-27</date>
+  </refsect1info>
+
+  <title>Appendix</title>
+
+  <refsect2>
+    <title>Bugs and Issues</title>
+
+    <itemizedlist>
+      <listitem>
       <para>
-       Produces a list of all tables in the database with their appropriate ACLs
-       (grant/revoke permissions) listed.
+      In some earlier life <application>psql</application> allowed the first
+      argument to start directly after the (single-letter) command. For
+      compatibility this is still supported to some extent but I am not
+      going to explain the details here as this use is discouraged. But
+      if you get strange messages, keep this in mind. For example
+      <programlisting>
+testdb=> <userinput>\foo</userinput>
+Field separator is "oo".
+      </programlisting>
+      is perhaps not what one would expect.
       </para>
-     </listitem>
-    </varlistentry>
+      </listitem>
 
-    <varlistentry>
-     <term><literal>\!</literal> [ <replaceable class="parameter">command</replaceable> ]</term>
-     <listitem>
+      <listitem>
       <para>
-       Escape to a separate Unix shell or execute the Unix command
-       <replaceable class="parameter">command</replaceable>.
+      There are about three different parsers in <application>psql</application>,
+      in addition to the backend <acronym>SQL</acronym> parser, all doing their own thing
+      and attempting to get along with each other. Sometimes they do, sometimes
+      they don't. An excellent example of this can be seen in section
+      <quote><xref linkend="APP-PSQL-sql-interpol" endterm="APP-PSQL-sql-interpol-title"></quote>.
+      Changing this situation, however, is beyond feasability.
       </para>
-     </listitem>
-    </varlistentry>
+      </listitem>
 
-    <varlistentry>
-     <term><literal>\?</literal></term>
-     <listitem>
+      <listitem>
       <para>
-       Get help information about the slash (<quote>\</quote>) commands.
+      Several string buffers are assigned fixed sizes at compile time. These
+      are usually based on certain settings about what the backend can accept
+      for a particular quantity. If you use <application>psql</application> with
+      a different backend than the one it was configured for, you might encounter
+      these limits sooner rather than later.
       </para>
-     </listitem>
-    </varlistentry>
-   </variablelist>
-  </para>
- </refsect1>
+      </listitem>
+    </itemizedlist>
+
+  </refsect2>
+
+  <refsect2>
+    <title>History and Lineage</title>
+
+    <para>
+    <application>psql</application> first appeared in <productname>Postgres95</productname>
+    to complement and later replace the <application>monitor</application> program. (You see this
+    name here or there in really old files. The author has never had the pleasure to use this
+    program though.) An uncountable number of people have added features since to reflect
+    the enhancements in the actual database server.
+    </para>
+
+    <para>
+    The present version is the result of a major clean-up and re-write in 1999 by
+    <ulink URL="mailto:peter_e@gmx.net">Peter Eisentraut</ulink> in preparation for release 7.0.
+    Many people had again contributed their ideas. The author would also like
+    to recognize the influence of <application>tcsh</application> at a number
+    of places.
+    </para>
+  </refsect2>
+
+  <refsect2>
+    <title><acronym>GNU</acronym> readline</title>
+
+    <para>
+    A great deal of <application>psql</application>'s convenience is owed to it
+    using the <acronym>GNU</acronym> readline and history library for accepting
+    and storing user input. To verify whether your copy of <application>psql</application>
+    was compiled with readline support, execute <literal>psql -V</literal> and check the
+    output for the words <quote>readline</quote> and <quote>history</quote>.
+    </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
+    top-level <filename>configure</filename> script finds it. <filename>configure</filename>
+    needs to find both the library <filename>libreadline.a</filename>
+    (or <filename>libreadline.so</filename> on systems with shared libraries)
+    <emphasis>and</emphasis> the header files <filename>readline.h</filename> and
+    <filename>history.h</filename> (or <filename>readline/readline.h</filename> and
+    <filename>readline/history.h</filename>) in appropriate directories. If
+    you have the library and header files installed in an obscure place you
+    must tell <filename>configure</filename> about them, for example:
+    <programlisting>
+$ ./configure --with-includes=/opt/gnu/include --with-libraries=/opt/gnu/lib  ...
+    </programlisting>
+    Then you have to recompile <application>psql</application> (not necessarily
+    the entire code tree).
+    </para>
+
+    <para>
+    The <acronym>GNU</acronym> readline library can be obtained from the <acronym>GNU</acronym>
+    project's <acronym>FTP</acronym> server at <ulink URL="ftp://ftp.gnu.org">ftp://ftp.gnu.org</ulink>.
+    </para>
+  </refsect2>
+
+</refsect1>
+
 </refentry>
 
 <!-- Keep this comment at the end of the file
index e356888e776799365282946885aaa7fc702985e7..60d5a401478abd69a68be999cce94535d2ed0718 100644 (file)
@@ -14,6 +14,10 @@ struct _helpStruct
 
 
 static struct _helpStruct QL_HELP[] = {
+    { "TRUNCATE",
+      "Empty a table",
+      "TRUNCATE [ TABLE ] name" },
+
     { "ABORT",
       "Aborts the current transaction",
       "ABORT [ WORK | TRANSACTION ]" },
@@ -44,7 +48,7 @@ static struct _helpStruct QL_HELP[] = {
 
     { "COPY",
       "Copies data between files and tables",
-      "COPY [ BINARY ] table [ WITH OIDS ]\n    FROM { 'filename' | stdin }\n    [ USING DELIMITERS 'delimiter' ]\nCOPY [ BINARY ] table [ WITH OIDS ]\n    TO { 'filename' | stdout }\n    [ USING DELIMITERS 'delimiter' ]" },
+      "COPY [ BINARY ] table [ WITH OIDS ]\n    FROM { 'filename' | stdin }\n    [ [USING] DELIMITERS 'delimiter' ]\nCOPY [ BINARY ] table [ WITH OIDS ]\n    TO { 'filename' | stdout }\n    [ [USING] DELIMITERS 'delimiter' ]" },
 
     { "CREATE AGGREGATE",
       "Defines a new aggregate function",
@@ -56,7 +60,7 @@ static struct _helpStruct QL_HELP[] = {
 
     { "CREATE FUNCTION",
       "Defines a new function",
-      "CREATE FUNCTION name ( [ ftype [, ...] ] )\n    RETURNS rtype\n    AS definition\n    LANGUAGE 'langname'" },
+      "CREATE FUNCTION name ( [ ftype [, ...] ] )\n    RETURNS rtype\n    [ WITH ( attribute [, ...] ) ]\n    AS definition   \n    LANGUAGE 'langname'\n\n\nCREATE FUNCTION name ( [ ftype [, ...] ] )\n    RETURNS rtype\n    [ WITH ( attribute [, ...] ) ]\n    AS obj_file , link_symbol  \n    LANGUAGE 'C'" },
 
     { "CREATE INDEX",
       "Constructs a secondary index",
@@ -107,21 +111,21 @@ static struct _helpStruct QL_HELP[] = {
       "DECLARE cursor [ BINARY ] [ INSENSITIVE ] [ SCROLL ]\n    CURSOR FOR query\n    [ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]" },
 
     { "DELETE",
-      "Deletes rows from a table",
+      "Removes rows from a table",
       "DELETE FROM table [ WHERE condition ]" },
 
     { "DROP AGGREGATE",
       "Removes the definition of an aggregate function",
       "DROP AGGREGATE name type" },
 
+    { "FETCH",
+      "Gets rows using a cursor",
+      "FETCH [ selector ] [ count ] { IN | FROM } cursor\nFETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor" },
+
     { "DROP DATABASE",
       "Destroys an existing database",
       "DROP DATABASE name" },
 
-    { "END",
-      "Commits the current transaction",
-      "END [ WORK | TRANSACTION ]" },
-
     { "DROP FUNCTION",
       "Removes a user-defined C function",
       "DROP FUNCTION name ( [ type [, ...] ] )" },
@@ -170,10 +174,6 @@ static struct _helpStruct QL_HELP[] = {
       "Shows statement execution details",
       "EXPLAIN [ VERBOSE ] query" },
 
-    { "FETCH",
-      "Gets rows using a cursor",
-      "FETCH [ selector ] [ count ] { IN | FROM } cursor\nFETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor" },
-
     { "GRANT",
       "Grants access privilege to a user, a group or all users",
       "GRANT privilege [, ...] ON object [, ...]\n    TO { PUBLIC | GROUP group | username }" },
@@ -191,8 +191,8 @@ static struct _helpStruct QL_HELP[] = {
       "LOAD 'filename'" },
 
     { "LOCK",
-      "Explicit lock of a table inside a transaction",
-      "LOCK [ TABLE ] table\nLOCK [ TABLE ] table IN [ ROW | ACCESS ] { SHARE | EXCLUSIVE } MODE\nLOCK [ TABLE ] table IN SHARE ROW EXCLUSIVE MODE" },
+      "Explicitly lock a table inside a transaction",
+      "LOCK [ TABLE ] name\nLOCK [ TABLE ] name IN [ ROW | ACCESS ] { SHARE | EXCLUSIVE } MODE\nLOCK [ TABLE ] name IN SHARE ROW EXCLUSIVE MODE" },
 
     { "MOVE",
       "Moves cursor position",
@@ -230,22 +230,26 @@ static struct _helpStruct QL_HELP[] = {
       "Shows run-time parameters for session",
       "SHOW keyword" },
 
-    { "TRUNCATE",
-      "Close a cursor",
-      "TRUNCATE TABLE table" },
+    { "UNLISTEN",
+      "Stop listening for notification",
+      "UNLISTEN { notifyname | * }" },
 
     { "UPDATE",
       "Replaces values of columns in a table",
       "UPDATE table SET R\">colle> = expression [, ...]\n    [ FROM fromlist ]\n    [ WHERE condition ]" },
 
-    { "UNLISTEN",
-      "Stop listening for notification",
-      "UNLISTEN { notifyname | * }" },
-
     { "VACUUM",
       "Clean and analyze a Postgres database",
       "VACUUM [ VERBOSE ] [ ANALYZE ] [ table ]\nVACUUM [ VERBOSE ] ANALYZE [ ER\">tBLE> [ (column [, ...] ) ] ]" },
 
+    { "END",
+      "Commits the current transaction",
+      "END [ WORK | TRANSACTION ]" },
+
+    { "COMMENT",
+      "Add comment to an object",
+      "COMMENT ON\n[\n  [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]\n  object_name |\n  COLUMN table_name.column_name|\n  AGGREGATE agg_name agg_type|\n  FUNCTION func_name (arg1, arg2, ...)|\n  OPERATOR op (leftoperand_type rightoperand_type) |\n  TRIGGER trigger_name ON table_name\n] IS 'text'" },
+
 
     { NULL, NULL, NULL }    /* End of list marker */
 };