This patch makes some improvements and adds some details to the
documentation on routine database maintenance activities. Any comments
on the new text would be appreciated. I decided not to mention the
FSM -- I haven't seen any reports that users have had to tweak FSM
settings in 7.4, and it is probably better not to get into
implementation details unless there's a good reason for it. But if
anyone thinks otherwise, please speak up.

I also corrected a bunch of instances of SGML usage. One of these
days I'll get around to writing a style guide for the PostgreSQL SGML
docs...

-Neil
Index: doc/src/sgml/maintenance.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/maintenance.sgml,v
retrieving revision 1.29
diff -c -r1.29 maintenance.sgml
*** doc/src/sgml/maintenance.sgml	29 Nov 2003 19:51:37 -0000	1.29
--- doc/src/sgml/maintenance.sgml	11 Dec 2003 04:26:14 -0000
***************
*** 87,93 ****
     of <command>VACUUM</> can run in parallel with normal database operations
     (selects, inserts, updates, deletes, but not changes to table definitions).
     Routine vacuuming is therefore not nearly as intrusive as it was in prior
!    releases, and it's not as critical to try to schedule it at low-usage
     times of day.
    </para>
  
--- 87,93 ----
     of <command>VACUUM</> can run in parallel with normal database operations
     (selects, inserts, updates, deletes, but not changes to table definitions).
     Routine vacuuming is therefore not nearly as intrusive as it was in prior
!    releases, and it is not as critical to try to schedule it at low-usage
     times of day.
    </para>
  
***************
*** 115,121 ****
      Clearly, a table that receives frequent updates or deletes will need
      to be vacuumed more often than tables that are seldom updated. It
      may be useful to set up periodic <application>cron</> tasks that
!     vacuum only selected tables, skipping tables that are known not to
      change often. This is only likely to be helpful if you have both
      large heavily-updated tables and large seldom-updated tables --- the
      extra cost of vacuuming a small table isn't enough to be worth
--- 115,121 ----
      Clearly, a table that receives frequent updates or deletes will need
      to be vacuumed more often than tables that are seldom updated. It
      may be useful to set up periodic <application>cron</> tasks that
!     <command>VACUUM</command> only selected tables, skipping tables that are known not to
      change often. This is only likely to be helpful if you have both
      large heavily-updated tables and large seldom-updated tables --- the
      extra cost of vacuuming a small table isn't enough to be worth
***************
*** 123,161 ****
     </para>
  
     <para>
!     The standard form of <command>VACUUM</> is best used with the goal of
!     maintaining a fairly level steady-state usage of disk space.  The standard
!     form finds old row versions and makes their space available for re-use within
!     the table, but it does not try very hard to shorten the table file and
!     return disk space to the operating system.  If you need to return disk
!     space to the operating system you can use <command>VACUUM FULL</> ---
!     but what's the point of releasing disk space that will only have to be
!     allocated again soon?  Moderately frequent standard <command>VACUUM</> runs
!     are a better approach than infrequent <command>VACUUM FULL</> runs for
!     maintaining heavily-updated tables.
     </para>
  
     <para>
      Recommended practice for most sites is to schedule a database-wide
!     <command>VACUUM</> once a day at a low-usage time of day, supplemented
!     by more frequent vacuuming of heavily-updated tables if necessary.
!     (If you have multiple databases in a cluster, don't forget to
!     vacuum each one; the program <filename>vacuumdb</> may be helpful.)
!     Use plain <command>VACUUM</>, not <command>VACUUM FULL</>, for routine
!     vacuuming for space recovery.
     </para>
  
     <para>
!     <command>VACUUM FULL</> is recommended for cases where you know you have
!     deleted the majority of rows in a table, so that the steady-state size
!     of the table can be shrunk substantially with <command>VACUUM FULL</>'s
!     more aggressive approach.
     </para>
  
     <para>
!     If you have a table whose contents are deleted completely every so often,
!     consider doing it with <command>TRUNCATE</> rather than using
!     <command>DELETE</> followed by <command>VACUUM</>.
     </para>
    </sect2>
  
--- 123,191 ----
     </para>
  
     <para>
!     There are two variants of the <command>VACUUM</command>
!     command. The first form, known as <quote>lazy vacuum</quote> or
!     just <command>VACUUM</command>, marks expired data in tables and
!     indexes for future reuse; it does <emphasis>not</emphasis> attempt
!     to reclaim the space used by this expired data
!     immediately. Therefore, the table file is not shortened, and any
!     unused space in the file is not returned to the operating
!     system. This variant of <command>VACUUM</command> can be run
!     concurrently with normal database operations.
!    </para>
! 
!    <para>
!     The second form is the <command>VACUUM FULL</command>
!     command. This uses a more aggressive algorithm for reclaiming the
!     space consumed by expired row versions. Any space that is freed by
!     <command>VACUUM FULL</command> is immediately returned to the
!     operating system. Unfortunately, this variant of the
!     <command>VACUUM</command> command acquires an exclusive lock on
!     each table while <command>VACUUM FULL</command> is processing
!     it. Therefore, frequently using <command>VACUUM FULL</command> can
!     have an extremely negative effect on the performance of concurrent
!     database queries.
!    </para>
! 
!    <para>
!     The standard form of <command>VACUUM</> is best used with the goal
!     of maintaining a fairly level steady-state usage of disk space. If
!     you need to return disk space to the operating system you can use
!     <command>VACUUM FULL</> --- but what's the point of releasing disk
!     space that will only have to be allocated again soon?  Moderately
!     frequent standard <command>VACUUM</> runs are a better approach
!     than infrequent <command>VACUUM FULL</> runs for maintaining
!     heavily-updated tables.
     </para>
  
     <para>
      Recommended practice for most sites is to schedule a database-wide
!     <command>VACUUM</> once a day at a low-usage time of day,
!     supplemented by more frequent vacuuming of heavily-updated tables
!     if necessary. In fact, some installations with an extremely high
!     rate of data modification <command>VACUUM</command> some tables as
!     often as once very five minutes.  (If you have multiple databases
!     in a cluster, don't forget to <command>VACUUM</command> each one;
!     the program <filename>vacuumdb</> may be helpful.)
     </para>
  
     <para>
!     <command>VACUUM FULL</> is recommended for cases where you know
!     you have deleted the majority of rows in a table, so that the
!     steady-state size of the table can be shrunk substantially with
!     <command>VACUUM FULL</>'s more aggressive approach.  Use plain
!     <command>VACUUM</>, not <command>VACUUM FULL</>, for routine
!     vacuuming for space recovery.
     </para>
  
     <para>
!     If you have a table whose contents are deleted on a periodic
!     basis, consider doing it with <command>TRUNCATE</command> rather
!     than using <command>DELETE</command> followed by
!     <command>VACUUM</command>. <command>TRUNCATE</command> removes the
!     content of the table immediately, without acquiring a subsequent
!     <command>VACUUM</command> or <command>VACUUM FULL</command> to
!     reclaim the now-unused disk space.
     </para>
    </sect2>
  
***************
*** 319,325 ****
      statistics in the system table <literal>pg_database</>.  In particular,
      the <literal>datfrozenxid</> column of a database's
      <literal>pg_database</> row is updated at the completion of any
!     database-wide vacuum operation (i.e., <command>VACUUM</> that does not
      name a specific table).  The value stored in this field is the freeze
      cutoff XID that was used by that <command>VACUUM</> command.  All normal
      XIDs older than this cutoff XID are guaranteed to have been replaced by
--- 349,355 ----
      statistics in the system table <literal>pg_database</>.  In particular,
      the <literal>datfrozenxid</> column of a database's
      <literal>pg_database</> row is updated at the completion of any
!     database-wide <command>VACUUM</command> operation (i.e., <command>VACUUM</> that does not
      name a specific table).  The value stored in this field is the freeze
      cutoff XID that was used by that <command>VACUUM</> command.  All normal
      XIDs older than this cutoff XID are guaranteed to have been replaced by
***************
*** 338,344 ****
      With the standard freezing policy, the <literal>age</> column will start
      at one billion for a freshly-vacuumed database.  When the <literal>age</>
      approaches two billion, the database must be vacuumed again to avoid
!     risk of wraparound failures.  Recommended practice is to vacuum each
      database at least once every half-a-billion (500 million) transactions,
      so as to provide plenty of safety margin.  To help meet this rule,
      each database-wide <command>VACUUM</> automatically delivers a warning
--- 368,374 ----
      With the standard freezing policy, the <literal>age</> column will start
      at one billion for a freshly-vacuumed database.  When the <literal>age</>
      approaches two billion, the database must be vacuumed again to avoid
!     risk of wraparound failures.  Recommended practice is to <command>VACUUM</command> each
      database at least once every half-a-billion (500 million) transactions,
      so as to provide plenty of safety margin.  To help meet this rule,
      each database-wide <command>VACUUM</> automatically delivers a warning
***************
*** 366,372 ****
      It should also be used to prepare any user-created databases that
      are to be marked <literal>datallowconn</> = <literal>false</> in
      <literal>pg_database</>, since there isn't any convenient way to
!     vacuum a database that you can't connect to. Note that
      <command>VACUUM</command>'s automatic warning message about
      unvacuumed databases will ignore <literal>pg_database</> entries
      with <literal>datallowconn</> = <literal>false</>, so as to avoid
--- 396,402 ----
      It should also be used to prepare any user-created databases that
      are to be marked <literal>datallowconn</> = <literal>false</> in
      <literal>pg_database</>, since there isn't any convenient way to
!     <command>VACUUM</command> a database that you can't connect to. Note that
      <command>VACUUM</command>'s automatic warning message about
      unvacuumed databases will ignore <literal>pg_database</> entries
      with <literal>datallowconn</> = <literal>false</>, so as to avoid
***************
*** 410,423 ****
     log output tends to be voluminous (especially at higher debug levels)
     and you won't want to save it indefinitely.  You need to <quote>rotate</>
     the log files so that new log files are started and old ones thrown
!    away every so often.
    </para>
  
    <para>
     If you simply direct the <systemitem>stderr</> of the <command>postmaster</command> into a
     file, the only way to truncate the log file is to stop and restart
!    the <command>postmaster</command>. This may be OK for development setups but you won't
!    want to run a production server that way.
    </para>
  
    <para>
--- 440,454 ----
     log output tends to be voluminous (especially at higher debug levels)
     and you won't want to save it indefinitely.  You need to <quote>rotate</>
     the log files so that new log files are started and old ones thrown
!    away after a reasonable period of time.
    </para>
  
    <para>
     If you simply direct the <systemitem>stderr</> of the <command>postmaster</command> into a
     file, the only way to truncate the log file is to stop and restart
!    the <command>postmaster</command>. This may be OK if you are using
!    <productname>PostgreSQL</productname> in a development environment,
!    but few production servers would find this behavior acceptable.
    </para>
  
    <para>
***************
*** 444,457 ****
     <command>pg_ctl</>, then the <systemitem>stderr</> of the <command>postmaster</command>
     is already redirected to <systemitem>stdout</>, so you just need a
     pipe command:
!    
  <programlisting>
  pg_ctl start | logrotate
  </programlisting>
  
!    The <productname>PostgreSQL</> distribution doesn't include a suitable
!    log rotation program, but there are many available on the Internet;
!    one is included in the Apache distribution, for example.
    </para>
   </sect1>
  </chapter>
--- 475,489 ----
     <command>pg_ctl</>, then the <systemitem>stderr</> of the <command>postmaster</command>
     is already redirected to <systemitem>stdout</>, so you just need a
     pipe command:
! 
  <programlisting>
  pg_ctl start | logrotate
  </programlisting>
  
!    The <productname>PostgreSQL</> distribution doesn't include a
!    suitable log rotation program, but there are many available on the
!    Internet; one is included in the <productname>Apache</productname>
!    distribution, for example.
    </para>
   </sect1>
  </chapter>
Index: doc/src/sgml/page.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/page.sgml,v
retrieving revision 1.16
diff -c -r1.16 page.sgml
*** doc/src/sgml/page.sgml	29 Nov 2003 19:51:37 -0000	1.16
--- doc/src/sgml/page.sgml	11 Dec 2003 04:54:54 -0000
***************
*** 151,157 ****
   </table>
  
   <para>
!   All the details may be found in src/include/storage/bufpage.h.
   </para>
  
   <para>  
--- 151,158 ----
   </table>
  
   <para>
!   All the details may be found in
!   <filename>src/include/storage/bufpage.h</filename>.
   </para>
  
   <para>  
***************
*** 305,311 ****
   </table>
  
   <para>
!    All the details may be found in src/include/access/htup.h.
   </para>
  
   <para>
--- 306,313 ----
   </table>
  
   <para>
!    All the details may be found in
!    <filename>src/include/access/htup.h</filename>.
   </para>
  
   <para>
Index: doc/src/sgml/perform.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/perform.sgml,v
retrieving revision 1.38
diff -c -r1.38 perform.sgml
*** doc/src/sgml/perform.sgml	29 Nov 2003 19:51:37 -0000	1.38
--- doc/src/sgml/perform.sgml	11 Dec 2003 04:51:34 -0000
***************
*** 100,106 ****
  
     <para>
      Here are some examples (using the regression test database after a
!     <literal>VACUUM ANALYZE</>, and 7.3 development sources):
  
  <programlisting>
  EXPLAIN SELECT * FROM tenk1;
--- 100,106 ----
  
     <para>
      Here are some examples (using the regression test database after a
!     <command>VACUUM ANALYZE</>, and 7.3 development sources):
  
  <programlisting>
  EXPLAIN SELECT * FROM tenk1;
Index: doc/src/sgml/plperl.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/plperl.sgml,v
retrieving revision 2.21
diff -c -r2.21 plperl.sgml
*** doc/src/sgml/plperl.sgml	29 Nov 2003 19:51:37 -0000	2.21
--- doc/src/sgml/plperl.sgml	11 Dec 2003 05:01:22 -0000
***************
*** 152,158 ****
    <para>
     The argument values supplied to a PL/Perl function's code are
     simply the input arguments converted to text form (just as if they
!    had been displayed by a <literal>SELECT</literal> statement).
     Conversely, the <literal>return</> command will accept any string
     that is acceptable input format for the function's declared return
     type.  So, the PL/Perl programmer can manipulate data values as if
--- 152,158 ----
    <para>
     The argument values supplied to a PL/Perl function's code are
     simply the input arguments converted to text form (just as if they
!    had been displayed by a <command>SELECT</command> statement).
     Conversely, the <literal>return</> command will accept any string
     that is acceptable input format for the function's declared return
     type.  So, the PL/Perl programmer can manipulate data values as if
Index: doc/src/sgml/protocol.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/protocol.sgml,v
retrieving revision 1.48
diff -c -r1.48 protocol.sgml
*** doc/src/sgml/protocol.sgml	29 Nov 2003 19:51:37 -0000	1.48
--- doc/src/sgml/protocol.sgml	11 Dec 2003 04:49:58 -0000
***************
*** 200,212 ****
    <para>
     This section describes the message flow and the semantics of each
     message type.  (Details of the exact representation of each message
!    appear in <xref linkend="protocol-message-formats">.)
!    There are several different sub-protocols
!    depending on the state of the connection: start-up,
!    query, function call, COPY, and termination.  There are also special
!    provisions for asynchronous operations (including
!    notification responses and command cancellation),
!    which can occur at any time after the start-up phase.
    </para>
  
    <sect2>
--- 200,212 ----
    <para>
     This section describes the message flow and the semantics of each
     message type.  (Details of the exact representation of each message
!    appear in <xref linkend="protocol-message-formats">.)  There are
!    several different sub-protocols depending on the state of the
!    connection: start-up, query, function call,
!    <command>COPY</command>, and termination.  There are also special
!    provisions for asynchronous operations (including notification
!    responses and command cancellation), which can occur at any time
!    after the start-up phase.
    </para>
  
    <sect2>
***************
*** 989,1003 ****
     </para>
  
     <para>
!     ParameterStatus messages will be generated whenever the active value
!     changes for any of the parameters the backend believes the frontend
!     should know about.  Most commonly this occurs in response to a
!     <command>SET</> SQL command executed by the frontend, and this case
!     is effectively synchronous --- but it is also possible for parameter
!     status changes to occur because the administrator changed a configuration
!     file and then sent the <systemitem>SIGHUP</systemitem> signal to the postmaster.  Also, if a SET command is
!     rolled back, an appropriate ParameterStatus message will be generated
!     to report the current effective value.
     </para>
  
     <para>
--- 989,1005 ----
     </para>
  
     <para>
!     ParameterStatus messages will be generated whenever the active
!     value changes for any of the parameters the backend believes the
!     frontend should know about.  Most commonly this occurs in response
!     to a <command>SET</> SQL command executed by the frontend, and
!     this case is effectively synchronous --- but it is also possible
!     for parameter status changes to occur because the administrator
!     changed a configuration file and then sent the
!     <systemitem>SIGHUP</systemitem> signal to the postmaster.  Also,
!     if a <command>SET</command> command is rolled back, an appropriate
!     ParameterStatus message will be generated to report the current
!     effective value.
     </para>
  
     <para>
***************
*** 1129,1174 ****
     <para>
      For either normal or abnormal termination, any open transaction is
      rolled back, not committed.  One should note however that if a
!     frontend disconnects while a non-SELECT query is being processed,
!     the backend will probably finish the query before noticing the
!     disconnection.
!     If the query is outside any transaction block (<command>BEGIN</>
!     ... <command>COMMIT</> sequence) then its results may be committed
!     before the disconnection is recognized.
     </para>
    </sect2>
  
    <Sect2>
!    <Title>SSL Session Encryption</Title>
  
     <Para>
!     If <productname>PostgreSQL</> was built with SSL support, frontend/backend
!     communications can be encrypted using SSL.  This provides communication
!     security in environments where attackers might be able to capture the
!     session traffic.
     </para>
  
     <para>
!     To initiate an SSL-encrypted connection, the frontend initially sends
!     an SSLRequest message rather than a StartupMessage.  The server then
!     responds with a single byte containing <literal>S</> or <literal>N</>,
!     indicating that it is willing or unwilling to perform SSL, respectively.
!     The frontend may close the connection at this point if it is dissatisfied
!     with the response.  To continue after <literal>S</>, perform an SSL
!     startup handshake (not described here, part of the SSL specification)
!     with the server.  If this is successful, continue with
!     sending the usual StartupMessage.  In this case the StartupMessage and
!     all subsequent data will be SSL-encrypted.  To continue after
      <literal>N</>, send the usual StartupMessage and proceed without
      encryption.
     </para>
  
     <para>
!     The frontend should also be prepared to handle an ErrorMessage response
!     to SSLRequest from the server.  This would only occur if the server
!     predates the addition of SSL support to <productname>PostgreSQL</>.
!     In this case the connection must be closed, but the frontend may choose
!     to open a fresh connection and proceed without requesting SSL.
     </para>
  
     <para>
--- 1131,1183 ----
     <para>
      For either normal or abnormal termination, any open transaction is
      rolled back, not committed.  One should note however that if a
!     frontend disconnects while a non-<command>SELECT</command> query
!     is being processed, the backend will probably finish the query
!     before noticing the disconnection.  If the query is outside any
!     transaction block (<command>BEGIN</> ... <command>COMMIT</>
!     sequence) then its results may be committed before the
!     disconnection is recognized.
     </para>
    </sect2>
  
    <Sect2>
!    <Title><acronym>SSL</acronym> Session Encryption</Title>
  
     <Para>
!     If <productname>PostgreSQL</> was built with
!     <acronym>SSL</acronym> support, frontend/backend communications
!     can be encrypted using <acronym>SSL</acronym>.  This provides
!     communication security in environments where attackers might be
!     able to capture the session traffic. For more information on
!     encrypting <productname>PostgreSQL</productname> sessions with
!     <acronym>SSL</acronym>, see <xref linkend="ssl-tcp">.
     </para>
  
     <para>
!     To initiate an <acronym>SSL</acronym>-encrypted connection, the
!     frontend initially sends an SSLRequest message rather than a
!     StartupMessage.  The server then responds with a single byte
!     containing <literal>S</> or <literal>N</>, indicating that it is
!     willing or unwilling to perform <acronym>SSL</acronym>,
!     respectively.  The frontend may close the connection at this point
!     if it is dissatisfied with the response.  To continue after
!     <literal>S</>, perform an <acronym>SSL</acronym> startup handshake
!     (not described here, part of the <acronym>SSL</acronym>
!     specification) with the server.  If this is successful, continue
!     with sending the usual StartupMessage.  In this case the
!     StartupMessage and all subsequent data will be
!     <acronym>SSL</acronym>-encrypted.  To continue after
      <literal>N</>, send the usual StartupMessage and proceed without
      encryption.
     </para>
  
     <para>
!     The frontend should also be prepared to handle an ErrorMessage
!     response to SSLRequest from the server.  This would only occur if
!     the server predates the addition of <acronym>SSL</acronym> support
!     to <productname>PostgreSQL</>.  In this case the connection must
!     be closed, but the frontend may choose to open a fresh connection
!     and proceed without requesting <acronym>SSL</acronym>.
     </para>
  
     <para>
***************
*** 1178,1185 ****
  
     <para>
      While the protocol itself does not provide a way for the server to
!     force SSL encryption, the administrator may configure the server to
!     reject unencrypted sessions as a byproduct of authentication checking.
     </para>
    </sect2>
   </sect1>
--- 1187,1195 ----
  
     <para>
      While the protocol itself does not provide a way for the server to
!     force <acronym>SSL</acronym> encryption, the administrator may
!     configure the server to reject unencrypted sessions as a byproduct
!     of authentication checking.
     </para>
    </sect2>
   </sect1>
***************
*** 2106,2112 ****
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as COPY data.
  </Para>
  </ListItem>
  </VarListEntry>
--- 2116,2122 ----
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as <command>COPY</command> data.
  </Para>
  </ListItem>
  </VarListEntry>
***************
*** 2153,2159 ****
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as a COPY-complete indicator.
  </Para>
  </ListItem>
  </VarListEntry>
--- 2163,2169 ----
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as a <command>COPY</command>-complete indicator.
  </Para>
  </ListItem>
  </VarListEntry>
***************
*** 2188,2194 ****
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as a COPY-failure indicator.
  </Para>
  </ListItem>
  </VarListEntry>
--- 2198,2204 ----
  </Term>
  <ListItem>
  <Para>
!                 Identifies the message as a <command>COPY</command>-failure indicator.
  </Para>
  </ListItem>
  </VarListEntry>
***************
*** 2255,2261 ****
  </Term>
  <ListItem>
  <Para>
!                 0 indicates the overall copy format is textual (rows
  		separated by newlines, columns separated by separator
  		characters, etc).
  		1 indicates the overall copy format is binary (similar
--- 2265,2271 ----
  </Term>
  <ListItem>
  <Para>
!                 0 indicates the overall <command>COPY</command> format is textual (rows
  		separated by newlines, columns separated by separator
  		characters, etc).
  		1 indicates the overall copy format is binary (similar
***************
*** 2330,2342 ****
  </Term>
  <ListItem>
  <Para>
!                 0 indicates the overall copy format is textual (rows
! 		separated by newlines, columns separated by separator
! 		characters, etc).
! 		1 indicates the overall copy format is binary (similar
! 		to DataRow format).
! 		See <xref linkend="sql-copy" endterm="sql-copy-title">
! 		for more information.
  </Para>
  </ListItem>
  </VarListEntry>
--- 2340,2351 ----
  </Term>
  <ListItem>
  <Para>
!                 0 indicates the overall <command>COPY</command> format
!                 is textual (rows separated by newlines, columns
!                 separated by separator characters, etc). 1 indicates
!                 the overall copy format is binary (similar to DataRow
!                 format). See <xref linkend="sql-copy"
!                 endterm="sql-copy-title"> for more information. 
  </Para>
  </ListItem>
  </VarListEntry>
***************
*** 3602,3608 ****
  </Term>
  <ListItem>
  <Para>
!                 The SSL request code.  The value is chosen to contain
                  <literal>1234</> in the most significant 16 bits, and <literal>5679</> in the
                  least 16 significant bits.  (To avoid confusion, this code
                  must not be the same as any protocol version number.)
--- 3611,3617 ----
  </Term>
  <ListItem>
  <Para>
!                 The <acronym>SSL</acronym> request code.  The value is chosen to contain
                  <literal>1234</> in the most significant 16 bits, and <literal>5679</> in the
                  least 16 significant bits.  (To avoid confusion, this code
                  must not be the same as any protocol version number.)
***************
*** 3899,3906 ****
  <ListItem>
  <Para>
          Where: an indication of the context in which the error occurred.
! 	Presently this includes a call stack traceback of active PL functions.
! 	The trace is one entry per line, most recent first.
  </Para>
  </ListItem>
  </VarListEntry>
--- 3908,3916 ----
  <ListItem>
  <Para>
          Where: an indication of the context in which the error occurred.
! 	Presently this includes a call stack traceback of active
! 	procedural language functions.  The trace is one entry per line,
! 	most recent first.
  </Para>
  </ListItem>
  </VarListEntry>
***************
*** 4006,4017 ****
  </para>
  
  <para>
! COPY data is now encapsulated into CopyData and CopyDone messages.  There
! is a well-defined way to recover from errors during COPY.  The special
  <quote><literal>\.</></quote> last line is not needed anymore, and is not sent
! during COPY OUT.
! (It is still recognized as a terminator during COPY IN, but its use is
! deprecated and will eventually be removed.)  Binary COPY is supported.
  The CopyInResponse and CopyOutResponse messages include fields indicating
  the number of columns and the format of each column.
  </para>
--- 4016,4027 ----
  </para>
  
  <para>
! <command>COPY</command> data is now encapsulated into CopyData and CopyDone messages.  There
! is a well-defined way to recover from errors during <command>COPY</command>.  The special
  <quote><literal>\.</></quote> last line is not needed anymore, and is not sent
! during <command>COPY OUT</command>.
! (It is still recognized as a terminator during <command>COPY IN</command>, but its use is
! deprecated and will eventually be removed.)  Binary <command>COPY</command> is supported.
  The CopyInResponse and CopyOutResponse messages include fields indicating
  the number of columns and the format of each column.
  </para>
***************
*** 4046,4052 ****
  <para>
  The NotificationResponse ('<literal>A</>') message has an additional string
  field, which is presently empty but may someday carry additional data passed
! from the NOTIFY event sender.
  </para>
  
  <para>
--- 4056,4062 ----
  <para>
  The NotificationResponse ('<literal>A</>') message has an additional string
  field, which is presently empty but may someday carry additional data passed
! from the <command>NOTIFY</command> event sender.
  </para>
  
  <para>
Index: doc/src/sgml/typeconv.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/typeconv.sgml,v
retrieving revision 1.41
diff -c -r1.41 typeconv.sgml
*** doc/src/sgml/typeconv.sgml	2 Dec 2003 00:26:59 -0000	1.41
--- doc/src/sgml/typeconv.sgml	11 Dec 2003 05:00:10 -0000
***************
*** 122,128 ****
  </term>
  <listitem>
  <para>
! Since all query results from a unionized <literal>SELECT</literal> statement
  must appear in a single set of columns, the types of the results of each
  <literal>SELECT</> clause must be matched up and converted to a uniform set.
  Similarly, the branch expressions of a <literal>CASE</> construct must be
--- 122,128 ----
  </term>
  <listitem>
  <para>
! Since all query results from a unionized <command>SELECT</command> statement
  must appear in a single set of columns, the types of the results of each
  <literal>SELECT</> clause must be matched up and converted to a uniform set.
  Similarly, the branch expressions of a <literal>CASE</> construct must be
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to