<!-- $PostgreSQL: pgsql/doc/src/sgml/release-9.0.sgml,v 2.7 2010/03/21 02:24:29 momjian Exp $ -->


 <sect1 id="release-9-0">
  <title>Release 9.0</title>

  <note>
   <title>Release date</title>
   <simpara>2010-??-??</simpara>
  </note>

  <sect2>
    <title>Overview</title>

    <para>
    ADD HERE
    </para>

    <!-- This list duplicates items below, but without authors or details-->

    <para>
      The above items are explained in more detail in the sections below.
    </para>

  </sect2>

  <sect2>

    <title>Migration to Version 9.0</title>
    <para>CURRENT AS OF 2010-03-15</para>

    <para>
      A dump/restore using <application>pg_dump</application> is
      required for those wishing to migrate data from any previous
      release.
    </para>

    <para>
      Observe the following incompatibilities:
    </para>

    <sect3>
      <title>Server Settings</title>

      <itemizedlist>

        <listitem>
          <para>
            Remove server variable <varname>add_missing_from</>, which was
            defaulted to off for many years (Tom)
          </para>
        </listitem>
  
        <listitem>
          <para>
            Remove server variable <varname>regex_flavor</>, which
            was defaulted to <link
            linkend="posix-syntax-details"><literal>advanced</></link>
            (e.g. Perl-regex compatible) for many years (Tom)
          </para>
        </listitem>
      
      </itemizedlist>
      
    </sect3>

    <sect3>
      <title>Queries</title>
      <itemizedlist>

      <listitem>
        <para>
          When querying a <link linkend="ddl-inherit">parent table</link>,
          do not do additional permission checks on child tables
          returned as part of the query (Peter)
        </para>

        <para>
          The SQL standard specifies this behavior.
        </para>
      </listitem>

      <listitem>
        <para>
          Have fractional seconds conversion truncate rather than
          round when using float-based dates/times (Tom)
        </para>
      </listitem>

      </itemizedlist>

    </sect3>

    <sect3>
      <title>String Handling</title>
      <itemizedlist>

      <listitem>
        <para>
          Fix <link linkend="functions-similarto-regexp"><literal>SIMILAR
          TO</></link> to match the SQL standard-specified behavior
          by processing <literal>?</> and <literal>{}</> the same way
          they are processed in regular expressions (Tom)
        </para>
      </listitem>

      <listitem>
        <para>
          Properly treat <literal>^</> and <literal>$</> as literals in
          <literal>SIMILAR TO</> patterns, to match the SQL standard (Tom)
        </para>

        <para>
          Previously these were treated using regular expression syntax.  This
          change breaks backward compatibility.  This also affects
          <function>substring()</>'s interpretation of regular expressions.
        </para>
      </listitem>

      <listitem>
        <para>
          Process parentheses as literals in <literal>SIMILAR TO</> expressions;
          also make character class handling more standards-compliant (Tom)
        </para>

        <para>
          This also affects <function>substring()</>'s handling of regular
          expressions.
        </para>
      </listitem>

      <listitem>
        <para>
          Do not allow <link
          linkend="functions-string-sql"><function>substring()</></link>
          to have a negative third length, per the SQL standard (Tom)
        </para>
      </listitem>

    </itemizedlist>

    </sect3>

    <sect3>
      <title>Object Renaming</title>
      <itemizedlist>

        <listitem>
          <para>
            Tighten enforcement of column renaming when a child table inherits
            the renamed column from an unrelated parent (KaiGai Kohei)
          </para>
        </listitem>

        <listitem>
          <para>
            No longer rename index names and index column names when table
            columns are renamed (Tom)
          </para>

          <para>
            Administrators still can rename such columns manually.  Expression
            index names are also not renamed.  WHY ARE EXPRESSION INDEXES
            SIGNIFICANT?
          </para>
        </listitem>


      </itemizedlist>

    </sect3>

    <sect3>
      <title>PL/pgSQL Variables</title>
      <itemizedlist>


        <listitem>
          <para>
            Have PL/pgSQL throw an error if a variable name conflicts with a
            column name used in a query (Tom)
          </para>

          <para>
            This behavior can be changed via the server variable <link
            linkend="plpgsql-var-subst"><varname>plpgsql.variable_conflict</></link>,
            or by the per-function option <literal>#variable_conflict</>.
            The former behavior was to bind to variable names over
            column names.
          </para>
        </listitem>

        <listitem>
          <para>
            Remove PL/pgSQL's <literal>RENAME</> declaration option (Tom)
          </para>

          <para>
            Instead, use <link
            linkend="plpgsql-declaration-parameters"><literal>ALIAS</></link>,
            which can now alias any variable, not just dollar sign
            variables, e.g. <literal>$1</>.
          </para>
        </listitem>

        <listitem>
          <para>
            PL/pgSQL no longer allows unquoted variables names that match SQL
            reserved words (Tom)
          </para>

          <para>
            Variables can be double-quoted to avoid this restriction.
          </para>
        </listitem>
      </itemizedlist>

    </sect3>
  </sect2>

  <sect2>
    <title>Changes</title>

    <sect3>
      <title>Server</title>

      <sect4>
        <title>Continuous Archiving</title>
        <itemizedlist>

          <listitem>
            <para>
              Allow continuous archive standby systems to accept read-only queries
              (Simon, Heikki)
            </para>

            <para>
              This feature is called Hot Standby.  There are new
              <filename>postgresql.conf</> and <filename>recovery.conf</>
              settings to enable this feature, as well as extensive
              <link linkend="hot-standby">documentation</link>.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow continuous archive (<acronym>WAL</>) files to be streamed to a
              standby system (Fujii Masao, Heikki)
            </para>

            <para>
              Previously <acronym>WAL</> files could be sent to standby systems only
              as 16 megabytes files;  this allows master changes to be sent to the
              slave with very little delay.  There are new <filename>postgresql.conf</>
              and <filename>recovery.conf</> settings to enable this
              feature, as well as extensive <link
              linkend="streaming-replication">documentation</link>.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link
              linkend="functions-recovery-info-table"><function>pg_last_xlog_receive_location()</></link>
              and <function>pg_last_xlog_replay_location()</>, which
              can be used to monitor standby server <acronym>WAL</>
              activity (Fujii Masao, Heikki)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Performance</title>
        <itemizedlist>

          <listitem>
            <para>
              Improve performance of finding inherited child tables (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow per-tablespace sequential and random page cost variables
              (<varname>seq_page_cost</>/(<varname>random_page_cost</>)) via
              <link linkend="SQL-ALTERTABLESPACE"><command>ALTER TABLESPACE
              ...  SET/RESET</></link> (Robert Haas)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve performance of <link
              linkend="SQL-TRUNCATE"><command>TRUNCATE</></link> when
              used in the same transaction as table creation (Tom)
            </para>
          </listitem>

          </itemizedlist>

      </sect4>

      <sect4>
        <title>Optimizer</title>

        <itemizedlist>
          <listitem>
            <para>
              Allow <literal>IS NOT NULL</> restrictions to use indexes (Tom)
            </para>

            <para>
              This is particularly useful for finding
              <function>MAX()</>/<function>MIN()</> values in indexes that also
              contain NULLs.
            </para>
          </listitem>

          <listitem>
            <para>
              Remove unnecessary <link linkend="queries-join">outer
              joins</link> (Robert Haas)
            </para>

            <para>
              Outer joins where the inner side is unique and not referenced in
              the query are unnecessary and are therefore now removed.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve optimizer equivalence detection of &lt;&gt; <type>boolean</>
              tests (Tom)
            </para>
          </listitem>
        </itemizedlist>
      </sect4>

      <sect4>
        <title><link linkend="geqo">GEQO</link></title>
        <itemizedlist>

          <listitem>
            <para>
              Use the same random seed everytime GEQO plans a query (Andres
              Freund)
            </para>

            <para>
              While the Genetic Query Optimizer (GEQO) still selects
              random plans, it now selects the same random plans for
              identical queries.  You can modify <xref
              linkend="guc-geqo-seed"> to
              randomize the starting value of the random plan generator.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve GEQO plan selection (Tom).
            </para>

            <para>
              This avoids the rare error, "failed to make a  valid plan".
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Optimizer Statistics</title>
        <itemizedlist>

          <listitem>
            <para>
              Improve <link linkend="SQL-ANALYZE"><command>ANALYZE</></link>
              to support inheritance-tree statistics (Tom)
            </para>

            <para>
              This is particularly useful for partitioned tables.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve <link linkend="routine-vacuuming">autovacuum</link>
              detection of when re-analyze is necessary (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve optimizer statistics for greater/less-than comparisons
              (Tom)
            </para>

            <para>
              When looking up optimizer statistics for greater/less-than comparisons,
              if the comparison value is in the first or last histogram bucket,
              use an index to generate the actual statistics.  This is particularly
              useful for columns that are always increasing, and hence often have
              inaccurate statistics.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow setting of distinct statistics using <link
              linkend="SQL-ALTERTABLE"><command>ALTER TABLE</></link>
              (Robert Haas)
            </para>

            <para>
              This allows user-override of the number or percentage of distinct
              values for a column and optionally its child tables.  This value
              is normally computed by <command>ANALYZE</>.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Authentication</title>
        <itemizedlist>

          <listitem>
            <para>
              Add support for <link
              linkend="auth-radius"><acronym>RADIUS</></link> (Remote
              Authentication Dial In User Service) authentication
              (Magnus)
            </para>
          </listitem>


          <listitem>
            <para>
              Allow <link linkend="auth-ldap"><acronym>LDAP</></link>
              (Lightweight Directory Access Protocol) authentication
              to operate in "search/bind" mode (Robert Fleming, Magnus)
            </para>

            <para>
              This allows the user to be looked up first, then the system uses
              the <acronym>DN</> (Distinguished Name) returned for that user.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link
              linkend="auth-pg-hba-conf"><literal>samehost</></link>
              and <literal>samenet</> designations to
              <filename>pg_hba.conf</> (Stef Walter)
            </para>

            <para>
              These match the server's <acronym>IP</> address and network address
              respectively.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Monitoring</title>
        <itemizedlist>

          <listitem>
            <para>
              Add the ability for clients to set an <link
              linkend="libpq-connect-application-name">application
              name</link>, which is displayed in
              <structname>pg_stat_activity</> (Dave Page)
            </para>
          </listitem>

          <listitem>
            <para>
              Add an SQL state option (<literal>%e</>) to <link
              linkend="guc-log-line-prefix"><varname>log_line_prefix</></link>
              (Guillaume Smet)
            </para>
          </listitem>

          <listitem>
            <para>
              Write to the Windows event log in <acronym>UTF16</> encoding
              (Itagaki Takahiro)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Statistics Counters</title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link
              linkend="monitoring-stats-funcs-table"><function>pg_stat_reset_shared('bgwriter')</></link>
              to reset the cluster-wide shared statistics of the
              bgwriter (Greg Smith)
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link
              linkend="monitoring-stats-funcs-table"><function>pg_stat_reset_single_table_counters()</></link>
              and <function>pg_stat_reset_single_function_counters()</>
              to allow the reseting of statistics counters for individual
              tables and indexes (Magnus)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Server Settings</title>
        <itemizedlist>

          <listitem>
            <para>
              Allow setting of configuration variables based on <link
              linkend="sql-alterrole-title">database/role</link>
              combinations (Alvaro)
            </para>

            <para>
              Previously only per-database and per-role setting were possible,
              not combinations.  All role and database settings are now stored
              in the new <structname>pg_db_role_setting</> system table.  A new
              <application>psql</> <literal>\drds</> command shows these settings.
              Backwards-compatible system views do not show this information.
            </para>
          </listitem>

          <listitem>
            <para>
              Add boolean variable <link
              linkend="guc-bonjour"><varname>bonjour</></link>, which
              controls whether a Bonjour-enabled binary advertises
              itself via <productname>Bonjour</> (Tom)
            </para>

            <para>
              The default is off, meaning it does not advertise.
            </para>
          </listitem>

          <listitem>
            <para>
              Log changed parameter values when <filename>postgresql.conf</> is
              reloaded (Peter)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Queries</title>
      <itemizedlist>

        <listitem>
          <para>
            Do <link linkend="SQL-FOR-UPDATE-SHARE"><command>SELECT
            FOR UPDATE</>/<literal>SHARE</></link> processing after
            applying <literal>LIMIT</>, so the number of rows returned
            is always predictable (Tom)
          </para>

          <para>
            Previously, concurrent transactions could potentially cause
            <command>SELECT</> to return fewer rows than specified by
            <literal>LIMIT</>.  <literal>FOR UPDATE</> can still affect
            <literal>ORDER BY</> ordering, but this can be corrected by using
            <literal>FOR UPDATE</> in a subquery.
          </para>
        </listitem>

        <listitem>
          <para>
            Allow mixing of traditional and SQL-standard <link
            linkend="SQL-LIMIT"><literal>LIMIT</>/<literal>OFFSET</></link>
            syntax in the same query (Tom)
          </para>
        </listitem>

        <listitem>
          <para>
            Increase the supported frame options in <link
            linkend="SQL-WINDOW">window functions</link> (Hitoshi
            Harada)
          </para>

          <para>
            This allows frames (<literal>RANGE</> or <literal>ROWS</>) to start
            with <literal>CURRENT ROW</>, and to use the <literal>ROWS n
            PRECEDING</>/<literal>FOLLOWING</> clause.
          </para>
        </listitem>

        <listitem>
          <para>
            Have <command>SELECT</> and <command>CREATE TABLE AS</> return
            row counts to the client
            (Boszormenyi Zoltan)
          </para>

          <para>
            <application>psql</> does not display these counts.
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title>Unicode Strings</title>
        <itemizedlist>

          <listitem>
            <para>
              Add Unicode surrogate pair (dual 16-bit) support to
              <link
              linkend="sql-syntax-strings-uescape"><literal>U&amp;</></link>
              strings and identifiers (Peter)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow Unicode escapes in <link
              linkend="sql-syntax-strings-escape"><literal>E'...'</></link>
              strings (Marko Kreen)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Object Manipulation</title>
      <itemizedlist>

        <listitem>
          <para>
            Speed up <link linkend="SQL-CREATEDATABASE"><command>CREATE
            DATABASE</></link> by deferring flushes to disk (Andres
            Freund, Greg Stark)
          </para>
        </listitem>

        <listitem>
          <para>
            Allow <link linkend="SQL-COMMENT">comments</link> only on
            columns of tables, views, and composite types, not other
            objects like indexes and <acronym>TOAST</> tables (Tom)
          </para>
        </listitem>

        <listitem>
          <para>
            Allow the creation of <link
            linkend="SQL-CREATETYPE-enum">enumerate types</link> with
            no labels (Bruce)
          </para>

          <para>
            This is useful for supporting binary upgrades.
          </para>
        </listitem>

        <listitem>
          <para>
            Have columns defined with storage type <literal>MAIN</> remain on
            the main heap page unless it cannot fit (Kevin Grittner)
          </para>

          <para>
            Previously <literal>MAIN</> values were forced to <acronym>TOAST</>
            tables until the row size was one-quarter of the page size.
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
       <title><command>ALTER</></title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link linkend="SQL-ALTERDEFAULTPRIVILEGES"><command>ALTER
              DEFAULT PRIVILEGES</></link> command to control privileges
              of all newly-created objects (Petr Jelinek)
            </para>

            <para>
              It currently supports tables, views, sequences, and functions, and
              also has per-schema control.
            </para>
          </listitem>

          <listitem>
            <para>
              Implement <literal>IF EXISTS</> for <literal>DROP COLUMN</> and
              <literal>DROP CONSTRAINT </> (Andres Freund)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>ALTER TABLE</> commands which rewrite tables to skip
              <acronym>WAL</> logging (Itagaki Takahiro)
            </para>

            <para>
              Such operations either complete fully or are rolled back, so
              <acronym>WAL</> archiving can be skipped, unless running in continuous
              archiving mode.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="SQL-CREATETABLE"><command>CREATE TABLE</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Add support for copying <literal>COMMENTS</> and <literal>STORAGE</>
              to the <command>CREATE TABLE ... LIKE INCLUDING</> command (Itagaki
              Takahiro)
            </para>
          </listitem>

          <listitem>
            <para>
              Add support for copying all attributes to the <command>CREATE
              TABLE LIKE INCLUDING</> command (Itagaki Takahiro)
            </para>
          </listitem>

          <listitem>
            <para>
              Add the SQL-standard <command>CREATE TABLE ... OF type</> command
              (Peter)
            </para>

            <para>
              This allows the creation of a table to match an existing composite
              type.  Additional constraints and defaults can be specified in the
              command.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Constraints</title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link linkend="SQL-CREATETABLE-compatibility">deferrable
              unique constraints</link> (Dean Rasheed)
            </para>

            <para>
              This allows <command>UPDATE tab SET col = col + 1</> to work on
              columns that have a unique indexes or are marked as primary keys,
              but <literal>DEFERRABLE INITIALLY DEFERRED</> must be used to mark
              the constraint as deferred.
            </para>
          </listitem>

          <listitem>
            <para>
              Generalize uniqueness constraints by allowing arbitrary operator
              comparisons, not just equality (Jeff Davis)
            </para>

            <para>
              This is enabled with the <link
              linkend="SQL-CREATETABLE-description"><command>CREATE
              TABLE CONSTRAINT ...  EXCLUDE</></link> clause.  While
              uniqueness checks could be specified using this syntax,
              the real value of this features is in using complex
              operators that do not have built-in constraints.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve the constraint violation error message to report the values
              causing the failure (Itagaki Takahiro)
            </para>

            <para>
              For example, a uniqueness constraint violation now reports <literal>Key
              (x)=(2) already exists</>.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Object Permissions</title>
        <itemizedlist>

          <listitem>
            <para>
              Add the ability to make mass permission changes per
              schema using the new <link
              linkend="SQL-GRANT"><command>GRANT</>/<command>REVOKE
              IN SCHEMA</></link> clause (Petr Jelinek)
            </para>
          </listitem>

          <listitem>
            <para>
              Add the ability to control large object permissions with
              <command>GRANT</>/<command>REVOKE</>(KaiGai Kohei)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Utility Operations</title>

      <itemizedlist>

        <listitem>
          <para>
            Have <link linkend="SQL-LISTEN"><command>LISTEN</></link>/<link
            linkend="SQL-NOTIFY"><command>NOTIFY</></link> store events
            in a memory queue, rather than a system table (Joachim
            Wieland)
          </para>

          <para>
            This greatly improves performance for these operations.
          </para>
        </listitem>

        <listitem>
          <para>
            Allow <link linkend="SQL-NOTIFY"><command>NOTIFY</></link>
            to pass an optional string to listeners (Joachim Wieland)
          </para>
        </listitem>

        <listitem>
          <para>
            Allow <link linkend="SQL-CLUSTER"><command>CLUSTER</></link>
            on all system tables (Tom)
          </para>

          <para>
            Global system tables still cannot be clustered.
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title><link linkend="SQL-COPY"><command>COPY</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Allow <literal>*</> as a parameter in <literal>FORCE QUOTE</> for
              <literal>COPY CSV</> (Itagaki Takahiro)
            </para>

            <para>
              This forces quotes for all <acronym>CSV</> output columns.
            </para>
          </listitem>

          <listitem>
            <para>
              Add new <command>COPY</> syntax that allows parameters to be
              specified in parentheses (Robert Haas, Emmanuel Cecchet)
            </para>

            <para>
              This allows greater flexibility for future <command>COPY</> options.
              The old syntax is still supported.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="SQL-EXPLAIN"><command>EXPLAIN</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Add new <command>EXPLAIN (BUFFERS)</> to report query buffer
              activity (Itagaki Takahiro)
            </para>

            <para>
              log_*_stats log output, e.g. <xref
              linkend="runtime-config-statistics-monitor">, no longer shows
              this information.
            </para>
          </listitem>

          <listitem>
            <para>
              Add hash usage information to <command>EXPLAIN</> output (Robert
              Haas)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>EXPLAIN</> output in <acronym>XML</>, <acronym>JSON</>,
              and <acronym>YAML</> formats (Robert Haas, Greg Sabino Mullane)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>EXPLAIN</> options to be specified inside parentheses
              (Robert Haas)
            </para>

            <para>
              This allows for the expansion of <command>EXPLAIN</> options.  The
              old syntax is still supported.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="SQL-VACUUM"><command>VACUUM</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Change <command>VACUUM FULL</> to rewrite the entire table and
              indexes, rather than moving around single rows to compact space
              (Itagaki Takahiro, Tom)
            </para>

            <para>
              The previous method was usually slower and caused index bloat.
            </para>
          </listitem>

          <listitem>
            <para>
              Add new <command>VACUUM</> syntax that allows parameters to be
              specified in parentheses (Itagaki Takahiro)
            </para>

            <para>
              This allows greater flexibility for future <command>VACUUM</>
              options.  The old syntax is still supported.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Indexes</title>
        <itemizedlist>

          <listitem>
            <para>
              Allow an index to be auto-named by not supplying an index name to
              <link linkend="SQL-CREATEINDEX"><command>CREATE INDEX</></link> (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <link linkend="SQL-REINDEX"><command>REINDEX</></link>
              on system indexes (Tom)
            </para>

            <para>
              WAS THIS POSSIBLE ON ANY SYSTEM TABLE BEFORE?  NON-HARDWIRED ONES?
            </para>
          </listitem>

          <listitem>
            <para>
              Add <literal>point_ops</> opclass for GiST (Teodor)
            </para>

            <para>
              DETAILS?
            </para>
          </listitem>

          <listitem>
            <para>
              Use red-black trees for <acronym>GIN</> index creation (Teodor)
            </para>

            <para>
              Red-black trees are self-balanced so allow for faster index
          creation.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Data Types</title>
      <itemizedlist>

        <listitem>
          <para>
            Allow hex values to be specified in <link
            linkend="datatype-binary"><type>bytea</></link> strings
            (Peter)
          </para>

          <para>
            The variable <xref linkend="guc-bytea-output"> controls if hex (default)
            or octal escapes are used for <type>bytea</> output.  (SWITCH
            DEFAULT FOR BETA?  PETER)  Libpq's <function>PQescapeByteaConn()</>
            now uses the hex format for <productname>PostgreSQL</> 9.0 servers.
          </para>
        </listitem>

        <listitem>
          <para>
            Allow <xref linkend="guc-extra-float-digits"> to be increased to <literal>3</>
        (Tom)
          </para>

          <para>
            The previous maximum <varname>extra_float_digits</> was <literal>2</>.
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title><link linkend="textsearch">Full Text Search</link></title>
        <itemizedlist>

          <listitem>
            <para>
              Add prefix support for the full text search synonym dictionary
          (Teodor)
            </para>
          </listitem>

          <listitem>
            <para>
              Add full text search filtering dictionaries (Teodor)
            </para>

            <para>
              Filtering dictionaries allow tokens to be modified and passed to
              subsequent dictionaries.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow underscores in full text email addresses (Teodor)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Functions</title>
      <itemizedlist>

        <listitem>
          <para>
            Allow case-insensitive <link
            linkend="functions-posix-regexp">regular expression</link>
            matching with <acronym>UTF-8</> server encodings.
          </para>

          <para>
            Previously, only <acronym>ASCII</> characters and single-byte
            encodings worked properly.  Other multi-byte, non-<acronym>UTF-8</>
            encodings are still broken for case-insensitive regular expression
            matching.
          </para>
        </listitem>

        <listitem>
          <para>
            Allow function calls to supply parameter names and match them to named
            parameters in the function definition (Pavel Stehule)
          </para>

          <para>
            For example, if a function is defined to take parameters <literal>a</>
            and <literal>b</>, it can be called with <literal>func(7 AS a, 12
            AS b)</> or <literal>func(12 AS b, 7 AS a)</>.
          </para>
        </listitem>

        <listitem>
          <para>
            Add support for <link
            linkend="functions-formatting"><function>to_char()</></link>
            scientific notation output (<link
            linkend="functions-formatting-numeric-table"><literal>'EEEE'</></link>)
            (Pavel Stehule, Brendan Jurd)
          </para>
        </listitem>

        <listitem>
          <para>
            Have <function>to_char()</> honor <link
            linkend="functions-formatting-datetimemod-table"><literal>'FM'</></link>
            (fill mode) in <literal>'Y'</>, <literal>'YY'</>, and
            <literal>'YYY'</> specifications (Bruce)
          </para>

          <para>
            It was already honored by <literal>'YYYY'</>.
          </para>
        </listitem>

        <listitem>
          <para>
            Correct calculations of <link
            linkend="functions-geometry-op-table">"overlap"</link>
            and "contains" operations over polygons (Teodor)
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title>Aggregates</title>
        <itemizedlist>

          <listitem>
            <para>
              Allow aggregate functions to use <literal>ORDER BY</> (Andrew
              Gierth)
            </para>

            <para>
              For example, this is now supported, <literal>array_agg(a ORDER BY
              b)</>.  This is useful for aggregates where the order of values is
              significant.
            </para>
          </listitem>

          <listitem>
            <para>
              Add the <link
              linkend="functions-aggregate-table"><function>string_agg()</></link>
              aggregate function which aggregates values into a single
              string (Pavel Stehule)
            </para>

            <para>
              An optional second argument allows specification of a delimiter.
            </para>
          </listitem>

          <listitem>
            <para>
              Aggregate functions that are called with <literal>DISTINCT</> are
              now passed NULL values if the aggregate transition function is
              not marked as <literal>STRICT</> (Andrew Gierth)
            </para>

            <para>
              For example, <literal>agg(DISTINCT x)</> might pass NULL <literal>x</>
              values to <function>agg()</>.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Bit Strings</title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link
              linkend="functions-binarystring-other"><function>get_bit()</></link>
              and <function>set_bit()</> functions for <type>bit</>
              strings, mirroring those for <type>bytea</> (Leonardo
              F)
            </para>
          </listitem>

          <listitem>
            <para>
              Implement <link
              linkend="functions-string-sql"><function>OVERLAY()</></link>
              (replace) for <type>bit</> strings and <type>bytea</>
              (Leonardo F)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Object Information Functions</title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link
              linkend="functions-admin-dbsize"><function>pg_table_size()</></link>
              and <function>pg_indexes_size()</> to provide a more
              user-friendly interface to the <function>pg_relation_size()</>
              function (Bernd Helmle)
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link
              linkend="functions-info-access-table"><function>has_sequence_privilege()</></link>
              for sequence permission checking (Abhijit Menon-Sen)
            </para>
          </listitem>

          <listitem>
            <para>
              Have <link linkend="information-schema">information
              schema</link> properly display date type octet lengths
              (Peter)
            </para>

            <para>
              The reported length is now the maximum octet length;  previously,
              a huge value was reported.
            </para>
          </listitem>

          <listitem>
            <para>
              Speed up information schema privilege views (Joachim Wieland)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Function and Trigger Creation</title>
        <itemizedlist>

          <listitem>
            <para>
              Implement anonymous functions using the <link
              linkend="SQL-DO"><command>DO</></link> statement (Petr
              Jelinek, Joshua Tolley, Hannu Valtonen)
            </para>

            <para>
              This allows execution of server-side code without the need to create
              a new function and execute it.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow SQL-compliant <link
              linkend="SQL-CREATETRIGGER">per-column triggers</link>
              (Itagaki Takahiro)
            </para>

            <para>
              Such triggers are fired only if the specified columns are affected
              by the query, e.g. in <command>UPDATE</>'s <literal>SET</> list.
              information_schema now also shows this information.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <literal>WHERE</> clause to <link
              linkend="SQL-CREATETRIGGER"><command>CREATE TRIGGER</></link>
              to allow control over whether a trigger is fired (Takahiro
              Itagaki)
            </para>

            <para>
              While a check can be performed inside the trigger, doing it in an
              external <literal>WHERE</> clause has performance benefits.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Server-Side Languages</title>

      <itemizedlist>

        <listitem>
          <para>
            Add the <literal>OR REPLACE</> clause to <link
            linkend="SQL-CREATELANGUAGE"><command>CREATE LANGUAGE</></link>
            (Tom)
          </para>

          <para>
            This is helpful to optionally install a language if it does not
            already exist, and is particularly helpful now that PL/pgSQL is
            installed by default.
          </para>
        </listitem>

        </itemizedlist>

        <sect4>
        <title><link linkend="plpgsql">PL/PgSQL</link> Server-Side
        Language</title>

        <itemizedlist>

          <listitem>
            <para>
              Install server-side language PL/pgSQL by default (Bruce) 
            </para>
          </listitem>

          <listitem>
            <para>
              Allow PL/pgSQL to handle row types with dropped columns (Pavel Stehule)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <literal>IN</> parameters to be assigned values within
              PL/pgSQL functions (Steve Prentice)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve error location reporting in PL/pgSQL (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Have PL/pgSQL use the main lexer, rather than a custom version (Tom)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="plpgsql-cursors">PL/pgSQL Cursors</link></title>
        <itemizedlist>

          <listitem>
            <para>
              Add count and <literal>ALL</> options to <command>MOVE
              FORWARD</>/<literal>BACKWARD</> in PL/pgSQL (Pavel Stehule)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow PL/pgSQL's <literal>WHERE CURRENT OF</> to use a cursor
              variable (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Add PL/pgSQL's <command>OPEN cursor FOR EXECUTE</> to use parameters
              (Pavel Stehule, Itagaki Takahiro)
            </para>

            <para>
              This is accomplished with a new <literal>USING</> clause.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="plperl">PL/Perl</link> Server-Side Language</title>
        <itemizedlist>

          <listitem>
            <para>
              Add new PL/Perl functions:  <link
              linkend="plperl-utility-functions"><function>quote_literal()</></link>,
              <function>quote_nullable()</>, <function>quote_ident()</>,
              <function>encode_bytea()</>, <function>decode_bytea()</>,
              <function>looks_like_number()</>,
              <function>encode_array_literal()</>,
              <function>encode_array_constructor()</> (Tim Bunce)
            </para>
          </listitem>

          <listitem>
            <para>
              Add server variable <xref linkend="guc-plperl-on-init"> to specify a PL/Perl
              Perl initialization function (Tim Bunce)
            </para>

            <para>
              <xref linkend="guc-plperl-on-plperl-init"> and <varname>plperl.on_plperlu_init</>
              are also available for trusted/untrusted-specific initialization.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve error context support in PL/Perl (Alexey Klyukin)
            </para>
          </listitem>

          <listitem>
            <para>
              Support <command>END</> blocks in PL/Perl (Tim Bunce)
            </para>

            <para>
              <command>END</> blocks do not currently allow database access.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>use strict</> in PL/Perl (Tim Bunce)
            </para>

            <para>
              This can be enabled with the server variable <xref
              linkend="guc-plperl-use-strict">.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>require</> in PL/Perl (Tim Bunce)
            </para>

            <para>
              This basically tests to see if the module is loaded, and if not,
              generates an error.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <command>use feature</> in PL/Perl if Perl version 5.10 or
              later is used (Tim Bunce)
            </para>
          </listitem>

          <listitem>
            <para>
              Verify that PL/Perl return values are valid in the server encoding
              (Andrew)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve PL/Perl code structure (Tim Bunce)
            </para>
          </listitem>

          <listitem>
            <para>
              PL/Perl subroutines are now given names (Tim Bunce)
            </para>

            <para>
              This is for the use of profiling and code coverage tools.  DIDN'T
              THEY HAVE NAMES BEFORE?
            </para>
          </listitem>

          <listitem>
            <para>
              PL/Perl no longer allows <application>Safe</> version 2.20 because
              it is unsafe (Tim Bunce)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="plpython">PL/Python</link> Server-Side Language</title>
        <itemizedlist>

          <listitem>
            <para>
              Add Unicode support in PL/Python (Peter)
            </para>

            <para>
              Strings are automatically converted from/to the server encoding as
              necessary.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve <type>bytea</> support in PL/Python (Caleb Welton)
            </para>

            <para>
              <type>Bytea</> values passed into PL/Python now are represented as
              binary, rather than the Postgres <type>bytea</> text format.  Null
              bytes are now also output properly from PL/Python.  <type>Boolean</>
              and <type>numeric</> value passing in PL/Python was also improved.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link linkend="plpython-arrays">array parameter/return
              support</link> to PL/Python (Peter)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve mapping of domains to Python base types in PL/Python (Peter)
            </para>
          </listitem>

          <listitem>
            <para>
              Add <application>Python</> 3 support to PL/Python (Peter)
            </para>

            <para>
              The new server-side language is called <link
              linkend="plpython-python23"><literal>plpython3u</></link>.
            </para>
          </listitem>

          <listitem>
            <para>
              Improve error location and exception reporting in PL/Python (Peter)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Client Applications</title>
      <itemizedlist>

        <listitem>
        <para>
          Add <link linkend="APP-VACUUMDB"><command>vacuumdb</></link>
          <option>--analyze-only</> option to only analyze (Bruce)
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title><link linkend="APP-PSQL"><application>psql</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Properly escape <application>psql</> <link
              linkend="APP-PSQL-variables">variables</link> and
              identifiers (Pavel Stehule, Robert Haas)
            </para>

            <para>
              For example, <literal>:'var'</> will be escaped as a literal string, and
              <literal>:"var"</> will be escaped as an SQL identifier.
            </para>
          </listitem>

          <listitem>
            <para>
              Ignore leading UTF-8-encoded Unicode byte-order marker in
              <application>psql</> (Itagaki Takahiro)
            </para>

            <para>
              This is enabled when the client encoding is <acronym>UTF-8</>.
            </para>
          </listitem>

          <listitem>
            <para>
              Fix <command>psql --file -</> to properly honor <link
              linkend="R1-APP-PSQL-3"><option>--single-transaction</></link>
              (Bruce)
            </para>
          </listitem>

          <listitem>
            <para>
              Prevent overwriting of <application>psql</>'s command-line history
              if two <application>psql</> sessions are run simultaneously (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Improve <application>psql</>'s tab completion support (Itagaki
              Takahiro)
            </para>
          </listitem>

        </itemizedlist>

        <sect5>
        <title><application>psql</> Display</title>
          <itemizedlist>

            <listitem>
              <para>
                Allow <application>psql</> to use fancy Unicode line-drawing
                characters via <command>\pset linestyle unicode</> (Roger Leigh)
              </para>
            </listitem>

            <listitem>
              <para>
                Improve display of wrapped columns in <application>psql</> (Roger
                Leigh)
              </para>

              <para>
                The previous format is available by using <command>\pset linestyle
                old-ascii</>.
              </para>
            </listitem>

          </itemizedlist>

        </sect5>

        <sect5>
          <title><application>psql</> <link
          linkend="APP-PSQL-meta-commands"><command>\d</></link>
          Commands</title>
          <itemizedlist>

            <listitem>
              <para>
                Have <command>\d</> show child tables that inherit from the specified
                parent (Damien Clochard)
              </para>

              <para>
                <command>\d</> shows only the number of child tables, while
                <command>\d+</> shows the names of all child tables.
              </para>
            </listitem>

            <listitem>
              <para>
                Show definition of indexes in <command>\d index_name</> (Khee Chin)
              </para>

              <para>
                The definition is useful for expression indexes.
              </para>
            </listitem>

            <listitem>
              <para>
                In <application>psql</>, show the view definition only with <command>\d+</>,
                not with <command>\d</> (Peter)
              </para>
            </listitem>

          </itemizedlist>

        </sect5>
      </sect4>

      <sect4>
        <title><link linkend="APP-PGDUMP"><application>pg_dump</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Have <application>pg_dump</>/<application>pg_restore</>
              <link linkend="pg-dump-options"><option>--clean</></link>
              also remove large objects (Itagaki Takahiro)
            </para>
          </listitem>

          <listitem>
            <para>
              Fix <application>pg_dump</> to properly dump large objects if
              standard_conforming_strings is enabled (Tom)
            </para>

            <para>
              Large objects dumps now use hex format for output.  (SWITCH DEFAULT
              FOR BETA? TOM)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <application>pg_dump</> to dump comments attached to columns
              of composite types (Taro Minowa (Higepon))
            </para>
          </listitem>

          <listitem>
            <para>
              Have <application>pg_dump</> <link
              linkend="pg-dump-options"><option>--verbose</></link>
              output the <application>pg_dump</> and server versions
              in text output mode (Jim Cox, Tom)
            </para>

            <para>
              These were already present in custom output mode.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link
        linkend="app-pg-ctl"><application>pg_ctl</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Allow <application>pg_ctl</> to be safely used to start the
              <application>postmaster</> at boot-time (Tom)
            </para>

            <para>
              Previously the <application>pg_ctl</> process could have been mistakenly
              identified as a running <application>postmaster</> based on a stale
              <application>postmaster</> lock file.
            </para>
          </listitem>

          <listitem>
            <para>
              Give <application>pg_ctl</> the ability to initialize the database
              (like <application>initdb</>) (Zdenek Kotala)
            </para>
          </listitem>


        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title><application>Development Tools</></title>

      <sect4>
        <title><link linkend="libpq"><application>libpq</></link></title>

        <itemizedlist>

          <listitem>
            <para>
              Add new <application>libpq</> functions
              <link
              linkend="libpq-connect"><function>PQconnectdbParams()</></link>
              and <function>PQconnectStartParams()</> (Guillaume
              Lelarge)
            </para>

            <para>
              These functions are similar to <function>PQconnectdb()</> and
              <function>PQconnectStart()</> except they allow a null-terminated
              array of connection options, rather than requiring all options to
              be sent in a single string.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <application>libpq</> functions <link
              linkend="libpq-exec-escape-string"><function>PQescapeLiteral()</></link>
              and <function>PQescapeIdentifier()</> (Robert Haas)
            </para>

            <para>
              These functions return appropriately quoted and escaped literal
              strings and identifiers.  The caller is not required to pre-allocate
              the string result, as is required by <function>PQescapeStringConn()</>.
            </para>
          </listitem>

          <listitem>
            <para>
              Add checking for a per-user service file (<link
              linkend="libpq-pgservice"><filename>.pg_service.conf</></link>),
              which is checked before the site-wide service file
              (Peter)
            </para>

            <para>
              The file <filename>.pg_service.conf</> is assumed to be in the
              user's home directory.
            </para>
          </listitem>

          <listitem>
            <para>
              Properly report an error if the specified <application>libpq</> service
              cannot be found (Peter)
            </para>
          </listitem>

          <listitem>
            <para>
              Issue a warning if the <link
              linkend="libpq-pgpass"><filename>.pgpass</></link>-retrieved
              password fails (Bruce)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title><link linkend="ecpg"><application>ecpg</></link></title>
        <itemizedlist>

          <listitem>
            <para>
              Add <link linkend="ecpg-descriptors"><acronym>SQLDA</></link>
              (SQL Descriptor Area) support to <application>ecpg</>
              (Boszormenyi Zoltan)
            </para>
          </listitem>

          <listitem>
            <para>
              Add the <link linkend="ecpg-descriptors"><command>DESCRIBE</>
              [<literal>OUTPUT</>]</link> statement to <application>ecpg</>
              (Boszormenyi Zoltan)
            </para>
          </listitem>

          <listitem>
            <para>
              Add an <application>ecpg</> <link
              linkend="ecpg-library">function</link> to return the
              current transaction status (Bernd Helmle)
            </para>
          </listitem>

          <listitem>
            <para>
              Add the <literal>string</> data type in <application>ecpg</>
              Informix-compatibility mode (Zoltan Boszormenyi)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow <application>ecpg</> to use <literal>new</> and <literal>old</>
              variable names without restriction (Michael)
            </para>
          </listitem>

          <listitem>
            <para>
              Have <application>ecpg</> return zero for non-SQL3 data types (Michael)
            </para>

            <para>
              Previously it returned the negative of the data type <type>oid</>.
            </para>
          </listitem>

          </itemizedlist>

          <sect5>
            <title><application>ecpg</> Cursors</title>
            <itemizedlist>

            <listitem>
              <para>
                Add <application>ecpg</> out-of-scope cursor support in native mode
                (Boszormenyi Zoltan)
              </para>

              <para>
                This allows <command>DECLARE</> to use variables that are not in
                scope when <command>OPEN</> is called.  This facility already existed
                in <application>ecpg</> Informix-compatibility mode.
              </para>
            </listitem>

            <listitem>
              <para>
                Allow dynamic <application>ecpg</> cursor names (Boszormenyi Zoltan)
              </para>
            </listitem>

            <listitem>
              <para>
                Allow <application>ecpg</> to use noise words <literal>FROM</> and
                <literal>IN</> in <command>FETCH</> and <command>MOVE</> (Zoltan
                Boszormenyi)
              </para>
            </listitem>

          </itemizedlist>

        </sect5>

      </sect4>

    </sect3>

    <sect3>
      <title>Build Options</title>
      <itemizedlist>

        <listitem>
          <para>
            Enable client thread safety by default (Bruce)
          </para>

          <para>
            Thread-safe builds can be disabled with <link
            linkend="configure"><application>configure</></link>
            <option>--disable-thread-safety</>.
          </para>
        </listitem>

        <listitem>
          <para>
            Add a compile-time option to allow the Linux out-of-memory killer
            to kill backends (Alex Hunsaker, Tom)
          </para>

          <para>
            Now that <filename>/proc/self/oom_adj</> allows disabling
            of the <productname>Linux</> out-of-memory (<acronym>OOM</>)
            killer for the postmaster and its children, the new
            compile-time option <link
            linkend="linux-memory-overcommit"><literal>-DLINUX_OOM_ADJ=0</></link>
            allows the killer to be enabled for <application>postmaster</>
            children.  <application>pg_config</> shows if this flag
            was used during compilation.
          </para>
        </listitem>

        <listitem>
          <para>
            Use <productname>DocBook</> <acronym>XSL</> stylesheets for man page
            building (Peter)
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title>Makefiles</title>
        <itemizedlist>

          <listitem>
            <para>
              New <filename>Makefile</> targets <link
              linkend="build"><literal>world</></link>,
              <literal>install-world</>, and <literal>installcheck-world</>
              (Andrew)
            </para>

            <para>
              These are similar to the existing <literal>all</>, <literal>install</>,
              and <literal>installcheck</> targets, but they build <acronym>HTML</>
              documentation, build and test <filename>/contrib</>, and test
              server-side languages and <application>ecpg</>.
            </para>
          </listitem>

          <listitem>
            <para>
              Add data and documentation location control to <link
              linkend="xfunc-c-pgxs"><acronym>PGXS</></link> Makefiles
              (Mark Cave-Ayland)
            </para>
          </listitem>

          <listitem>
            <para>
              Restructure the <acronym>HTML</> documentation build
              <filename>Makefile</> rules (Peter)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>New Requirements</title>
        <itemizedlist>

          <listitem>
            <para>
              Require <application>Autoconf</> 2.63 for building from source (Peter)
            </para>
          </listitem>

          <listitem>
            <para>
              Require <application>Flex</> 2.5.31 or later to build from source
              (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Require <application>Perl</> version 5.8 or greater to build the server
              from a <acronym>CVS</> copy (John Naylor, Andrew)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Windows</title>
        <itemizedlist>

          <listitem>
            <para>
              Add support for compiling on <link
              linkend="install-win32-full">64-bit
              <productname>Windows</></link> and running in 64-bit
              mode (Tsutomu Yamada, Magnus)
            </para>

            <para>
              This allows for large shared memory sizes on <productname>Windows</>.
            </para>
          </listitem>

          <listitem>
            <para>
              Allow server builds using <link
              linkend="install-win32-full"><productname>Visual Studio
              2008</></link> (Magnus)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow multi-processor compilation using <productname>Microsoft Visual
              C</> (Magnus)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Source Code</title>
      <itemizedlist>

        <listitem>
          <para>
            Distribute documentation in a proper directory tree, rather than
            as tar archive files inside the main distribution tarball (Peter)
          </para>

          <para>
            For example, the <acronym>HTML</> documentation is now in
            <filename>doc/src/sgml/html</>;  the manual pages are packaged
            similarly.
          </para>
        </listitem>

        <listitem>
          <para>
            Enable the server lexer to be reentrant (Tom)
          </para>

          <para>
            This was needed for use of the lexer by PL/pgSQL.
          </para>
        </listitem>

        <listitem>
          <para>
            Improve speed of memory allocation (Tom, Greg Stark)
          </para>
        </listitem>

        <listitem>
          <para>
            Add system columns to better document the use of indexes for constraint
            enforcement (Tom)
          </para>
        </listitem>

        <listitem>
          <para>
            Allow multiple actions to be communicated using the same operating
            system signal (Fujii Masao)
          </para>

          <para>
            This allows improved backend communication as new features are
            added.
          </para>
        </listitem>

        <listitem>
          <para>
            Improve source code test coverage, including /contrib, PL/Python,
            and PL/Perl (Peter, Andrew)
          </para>
        </listitem>

        <listitem>
          <para>
            Remove the use of flat files for system table bootstrapping (Tom,
            Alvaro)
          </para>

          <para>
            This also improves performance when using millions of users and
            databases.
          </para>
        </listitem>

        <listitem>
          <para>
            Improve the ability to translate <application>psql</> strings
            (Peter)
          </para>
        </listitem>

        <listitem>
          <para>
            Reduce the length of some file names so file paths are less than
            100 characters (Tom)
          </para>

          <para>
            Some decompression programs have problems with long file names.
          </para>
        </listitem>

        <listitem>
          <para>
            Tighten input requirements for <type>int2</> vector input (Caleb
            Welton)
          </para>
        </listitem>

        <listitem>
          <para>
            Add a new <link
            linkend="errcodes-table"><literal>ERRCODE_INVALID_PASSWORD</></link>
            <literal>SQLSTATE</> error code (Bruce)
          </para>
        </listitem>

        <listitem>
          <para>
            Properly remove the few remaining personal source code copyright
            entries (Bruce)
          </para>

          <para>
            The personal copyright notices were insignificant but the community
            occasionally had to answer questions about them.
          </para>
        </listitem>

      </itemizedlist>

      <sect4>
        <title>Feature Support</title>
        <itemizedlist>

          <listitem>
            <para>
              Use a more modern <acronym>API</> for <application>Bonjour</> (Tom)
            </para>

            <para>
              Bonjour now requires <productname>OS X</> 10.3 or later.
            </para>
          </listitem>

          <listitem>
            <para>
              Add processor test-and-test lock support for the <productname>SuperH</>
              architecture (Nobuhiro Iwamatsu)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow non-<application>GCC</> compilers to use inline functions if
              they support them (Kurt Harriman)
            </para>
          </listitem>

          <listitem>
            <para>
              Remove support for platforms that don't have a working 64-bit
              integer data types (Tom)
            </para>

            <para>
              It is believed all supported platforms have working 64-bit integer
              data types.
            </para>
          </listitem>


        </itemizedlist>

      </sect4>

      <sect4>
        <title>Server Programming</title>
        <itemizedlist>

          <listitem>
            <para>
              Allow use of <productname>C++</> functions in backend code  (Kurt
              Harriman, Peter)
            </para>

            <para>
              This removes keyword conflicts that previously made <productname>C++</>
              usage difficult in backend code.  <literal>extern "C" { }</> might still
              be necessary.
            </para>
          </listitem>

          <listitem>
            <para>
              Add <link
              linkend="xaggr"><function>AggCheckCallContext()</></link>
              for use in detecting if a <productname>C</> function is
              being called as an aggregate (Hitoshi Harada)
            </para>
          </listitem>

          <listitem>
            <para>
              Require <function>fastgetattr()</> and <function>heap_getattr()</>
              backend macros to use a non-NULL fourth argument (Robert Haas)
              KEEP?
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Server Hooks</title>
        <itemizedlist>

          <listitem>
            <para>
              Add parser hooks to access column and parameter references in
              queries (Tom)
            </para>
          </listitem>

          <listitem>
            <para>
              Add a hook so loadable modules can control utility commands (Itagaki
              Takahiro)
            </para>
          </listitem>

          <listitem>
            <para>
              Allow the calling of parser hooks from <acronym>SPI</> and cached
              plans (Tom)
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

      <sect4>
        <title>Binary Upgrade Support</title>
        <itemizedlist>

          <listitem>
            <para>
              Add support for preservation of all <link
              linkend="catalog-pg-class"><structname>relfilenodes</></link>,
              for use during binary upgrades (Bruce)
            </para>
          </listitem>

          <listitem>
            <para>
              Add support for binary upgrades to preserve <structname>pg_type</>
              and <structname>pg_enum</> <type>oids</> (Bruce)
            </para>

            <para>
              This is needed to allow binary upgrades of user-defined composite
              types, arrays, and enums (enumerated types).
            </para>
          </listitem>

          <listitem>
            <para>
              Move tablespace data directories into their own
              <productname>PostgreSQL</> version-specific subdirectory (Bruce)
            </para>

            <para>
              This simplifies binary upgrades.
            </para>
          </listitem>

        </itemizedlist>

      </sect4>

    </sect3>

    <sect3>
      <title>Contrib</title>
      <itemizedlist>

        <listitem>
          <para>
            Add multi-threaded option (<option>-j</>) to <link
            linkend="pgbench"><filename>/contrib/pgbench</></link>
            (Itagaki Takahiro)
          </para>

          <para>
            This allows multiple <acronym>CPU</>s to be used for pgbench tests.
          </para>
        </listitem>

        <listitem>
          <para>
            Add <command>\shell</> and <command>\setshell</> meta
            commands to <link
            linkend="pgbench"><filename>/contrib/pgbench</></link>
            (Michael Paquier)
          </para>
        </listitem>

        <listitem>
          <para>
            New features for <link
            linkend="dict-xsyn"><filename>/contrib/dict_xsyn</></link>
            (Sergey Karpov)
          </para>

          <para>
            The new options are <literal>matchorig</>, <literal>matchsynonyms</>,
            and <literal>keepsynonyms</>.
          </para>
        </listitem>

        <listitem>
          <para>
            Add full text dictionary <link
            linkend="unaccent"><filename>/contrib/unaccent</></link>
            (Teodor)
          </para>

          <para>
            This filter dictionary removes accents from tokens.
          </para>
        </listitem>

        <listitem>
          <para>
            Add <link
            linkend="CONTRIB-DBLINK-GET-NOTIFY"><function>dblink_get_notify()</></link>
            to <filename>/contrib/dblink</> (Marcus Kempe)
          </para>

          <para>
            This allows async notifications in <productname>dblink</>.
          </para>
        </listitem>

        <listitem>
          <para>
            Greatly increase <link
            linkend="hstore"><filename>/contrib/hstore</></link>'s
            length limit and add btree and hash abilities so <literal>GROUP
            BY</> and <literal>DISTINCT</> operations are possible
            (Andrew Gierth)
          </para>

          <para>
            New functions and operators were also added.
          </para>
        </listitem>

        <listitem>
          <para>
            Add <link
            linkend="passwordcheck"><filename>/contrib/passwordcheck</></link>
            which can check the strength of assigned passwords (Laurenz
            Albe)
          </para>

          <para>
            The source code of this module should be modified to implement
            site-specific password policies.
          </para>
        </listitem>

        <listitem>
          <para>
            Add query text to <link
            linkend="auto-explain"><filename>/contrib/auto_explain</></link>
            output (Andrew)
          </para>
        </listitem>

        <listitem>
          <para>
            Add buffer access counters to <link
            linkend="pgstatstatements"><filename>/contrib/pg_stat_statements</></link>
            (Itagaki Takahiro)
          </para>
        </listitem>

        <listitem>
          <para>
            Update <link
            linkend="server-start"><filename>/contrib/start-scripts/linux</></link>
            to use <filename>/proc/self/oom_adj</> to disable the
            <link linkend="linux-memory-overcommit"><productname>Linux</>
            out-of-memory</link> (<acronym>OOM</>) killer (Alex
            Hunsaker, Tom)
          </para>
        </listitem>

      </itemizedlist>

    </sect3>
  </sect2>
</sect1>


<sect1 id="release-9-0-alpha">
  <title>Release 9.0alpha4</title>
  <sect2>
    <title>Overview</title>
    <para>
      PostgreSQL alpha releases are snapshots of development code. They
      are intended to preview and test upcoming features and to provide
      the possibility for early feedback. They should not be used in
      production installations or active development projects. While the
      PostgreSQL code is continuously subject to a number of automated
      and manual tests, alpha releases might have serious bugs. Also
      features may be changed incompatibly or removed at any time during
      the development cycle.
    </para>
    <para>
      The development cycle of a PostgreSQL major release alternates
      between periods of development and periods of integration work,
      called commit fests, normally one month each. Alpha releases are
      planned to be produced at the end of every commit fest, thus every
      two months. Since the first commit fest starts within a month from
      the beginning of development altogether, early alpha releases are
      not indicative of the likely feature set of the final release.
    </para>
    <para>
      The release notes below highlight user visible changes and new
      features. There are normally numerous bug fixes and performance
      improvements in every new snapshot of PostgreSQL, and it would be
      too bulky to attempt to list them all. Note that many bug fixes are
      also backported to stable releases of PostgreSQL, and you should be
      using those if you are looking for bug-fix-only upgrades for your
      current installations.
    </para>
    <para>
      The release notes are cumulative over all alpha releases.  Items
      that are new in the latest alpha release
      are <emphasis>emphasized</emphasis>.
    </para>
  </sect2>
  <sect2>
    <title>Migration</title>
    <para>
      To upgrade from any release to an alpha release or from an alpha
      release to any other release will most likely require a
      dump/restore upgrade procedure. It may happen that this is not
      necessary in particular cases, but that is not verified beforehand.
      (The server will warn you in any case when a dump/restore is
      necessary if you attempt to use it with an old data directory.)
      Note, however, that the dump/restore upgrade procedure is expected
      to work for alpha releases, and problems in this area should be
      reported.
    </para>
  </sect2>
  <sect2>
    <title>Testing</title>
    <para>
      The primary reason we release alphas is to get users to test new
      features as early as possible.  If you are interested in helping
      with organized testing, please see
      <ulink url="http://wiki.postgresql.org/wiki/HowToBetaTest">the
      testing information page</ulink>.
      </para>
  </sect2>
  <sect2>
    <title>Changes</title>
    <sect3>
      <title>SQL Features</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Disallow comments on columns of relation types
         other than tables, views, and composite types, that is,
         sequences and TOAST tables.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Adjust naming of indexes and their columns. Index
         expression columns are now named after the FigureColname
         result for their expressions, rather than always being
         "pg_expression_N".  Digits are appended to this name if
         needed to make the column name unique within the index.
         Default names for indexes and associated constraints now
         include the column names of all their columns, not only the
         first one as in previous practice.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Allow the index name to be omitted in CREATE INDEX,
         causing the system to choose an index name the same as it
         would do for an unnamed index constraint.  A necessary
         side-effect is to promote the word CONCURRENTLY to a more
         reserved status; it can't be a table/column/index name
         anymore unless quoted.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Improve the handling of SET CONSTRAINTS commands by
         having them search pg_constraint before searching pg_trigger.
         This allows saner handling of corner cases.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Typed table feature; this adds the CREATE TABLE
         name OF type command.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Tighten integrity checks on ALTER TABLE ... RENAME
         COLUMN in inheritance hierarchies.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Replace the pg_listener-based LISTEN/NOTIFY
         mechanism with an in-memory queue.  In addition, add support
         for a "payload" string to be passed along with each notify
         event.</emphasis>
        </para>
        <para>
         <emphasis>This implementation should be significantly more
         efficient than the old one, and is also more compatible with
         Hot Standby usage.  There is not yet any facility for HS
         slaves to receive notifications generated on the master,
         although such a thing is possible in future.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Have SELECT and CREATE TABLE AS queries return a
         row count.  While this is invisible in psql, other
         interfaces, like libpq, make this value visible.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Extend the set of frame options supported for
         window functions.  This allows the frame to start from
         CURRENT ROW (in either RANGE or ROWS mode), and it also adds
         support for ROWS n PRECEDING and ROWS n FOLLOWING start and
         end points.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add DO statement to support execution of procedural language
         code without having to create a function for it.
        </para>
       </listitem>
       <listitem>
        <para>
         Support use of function argument names to identify which
         actual arguments match which function parameters. The syntax
         uses AS, for example funcname(value AS arg1, anothervalue AS
         arg2).
        </para>
       </listitem>
       <listitem>
        <para>
         Remove previously deprecated configuration
         parameter add_missing_from. The system now always behaves as
         though add_missing_from were off.
        </para>
       </listitem>
       <listitem>
        <para>
         Performance and behavioral improvements in UPDATE,
         DELETE, and SELECT FOR UPDATE/SHARE queries with joins.
         Fix various corner cases that could have resulted in duplicated output
         rows. Set-returning functions are now prohibited in the
         target list of SELECT FOR UPDATE/SHARE. FOR UPDATE does not
         propagate into a WITH query anymore.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix SELECT FOR UPDATE/SHARE in conjunction with LIMIT.
          Previously, it could return fewer rows than the limit specified.
        </para>
       </listitem>
       <listitem>
        <para>
         Add a WHEN clause to CREATE TRIGGER, allowing a boolean expression
          to be checked to determine whether the trigger should be fired.
        </para>
        <para>
         For BEFORE triggers this is mostly a matter of spec compliance; but
          for AFTER triggers it can provide a noticeable performance
          improvement, since queuing of a deferred trigger event and
          re-fetching of the row(s) at end of statement can be
          short-circuited if the trigger does not need to be fired.
        </para>
       </listitem>
       <listitem>
        <para>
         Add exclusion constraints, which generalize the concept of
          uniqueness to support any indexable commutative operator, not just
          equality. Two rows violate the exclusion constraint if
          &quot;row1.col OP row2.col&quot; is TRUE for each of the columns in
          the constraint.
        </para>
       </listitem>
       <listitem>
        <para>
         Support ORDER BY within aggregate function calls, at long last
          providing a non-kluge method for controlling the order in which
          values are fed to an aggregate function. At the same time eliminate
          the old implementation restriction that DISTINCT was only supported
          for single-argument aggregates.
        </para>
        <para>
         Behavioral change: formerly, agg(DISTINCT x) dropped null values of
          x unconditionally. Now, it does so only if the aggregate's transition
          function is strict; otherwise nulls are treated as DISTINCT
          normally would, i.e., you get one copy.
        </para>
       </listitem>
       <listitem>
        <para>
         Add SQL-compliant triggers on columns, which fire only if
         certain columns are named in the UPDATE's SET list.
        </para>
       </listitem>
       <listitem>
        <para>
         Add CREATE LIKE INCLUDING COMMENTS and STORAGE, and INCLUDING
         ALL shortcut to allow users to make an exact copy of a table including
         all options and features.
        </para>
       </listitem>
       <listitem>
        <para>
         Define a new, more extensible syntax for COPY options
         in order to support additional COPY options in the future.
        </para>
       </listitem>
       <listitem>
        <para>
         Modify the definition of window-function PARTITION
         BY and ORDER BY clauses so that their elements are always
         taken as simple expressions over the query's input
         columns. This fixes a bug.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix bug with nested WITH RECURSIVE statements.
        </para>
       </listitem>
       <listitem>
        <para>
         Add surrogate pair support for U&amp; string and identifier
         syntax.
        </para>
       </listitem>
       <listitem>
        <para>
         Add Unicode escapes in E'...' strings.
        </para>
       </listitem>
        <listitem>
          <para>
            DROP COLUMN and DROP CONSTRAINT now support an IF EXISTS clause so
            that users can avoid fatal errors when running repeatable scripts.
          </para>
        </listitem>
        <listitem>
          <para>
            UNIQUE constraints can now be DEFERRABLE. This is primarily useful
            for incremental updates of numerical keys, e.g. &quot;ID = ID +
            1&quot;
          </para>
        </listitem>
        <listitem>
          <para>
            Allow parentheses around the query expression that follows a WITH
            clause.
          </para>
        </listitem>
        <listitem>
          <para>
            INFORMATION_SCHEMA, a catalog of standard views of database
            objects, has been updated to the SQL:2008 standard.
          </para>
        </listitem>
        <listitem>
          <para>
            Change character_octet_length to more sensible values in
            INFORMATION_SCHEMA.
          </para>
        </listitem>
        <listitem>
          <para>
            Allow * as parameter for FORCE QUOTE for COPY CSV, so that all
            columns will be quoted.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Performance</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Support "x IS NOT NULL" clauses as index-scan
         conditions.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>When estimating the selectivity of an inequality
         "column &gt; constant" or "column &lt; constant", and the
         comparison value is in the first or last histogram bin or
         outside the histogram entirely, try to fetch the actual
         column min or max value using an index scan (if there is an
         index on the column).  If successful, replace the lower or
         upper histogram bound with that value before carrying on with
         the estimate.  This limits the estimation error caused by
         moving min/max values when the comparison value is close to
         the min or max.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Generic implementation of red-black binary tree.
         For now, only GIN uses it during index creation.  Using
         self-balanced tree greatly speeds up index creation in corner
         cases with preordered data.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Allow rewriting forms of ALTER TABLE to skip WAL
          logging.
        </para>
       </listitem>
       <listitem>
        <para>
         Speed up INFORMATION_SCHEMA's privilege views.
        </para>
       </listitem>
       <listitem>
        <para>
         Make TRUNCATE do truncate-in-place when processing
         a relation that was created or previously truncated in the
         current (sub)transaction.
        </para>
       </listitem>
       <listitem>
        <para>
         Implement &quot;join removal&quot; for cases where the inner side
          of a left join is unique and is not referenced above the join.  This should
          speed up many ORM-generated and reporting tool queries.
        </para>
       </listitem>
       <listitem>
        <para>
         Remove the use of the flat files pg_auth and
         pg_database in order to improve performance. (Warning: pgbouncer
         and possibly other tools currently suggest referring to the pg_auth
         file for its user database. Such schemes will no longer work.)
        </para>
       </listitem>
        <listitem>
          <para>
            EXPLAIN allows output of plans in XML, JSON, or YAML format for automated
            processing of explain plans by analysis or visualization tools.
          </para>
        </listitem>
        <listitem>
          <para>
            EXPLAIN now supports the use of generic options in EXPLAIN ( option
            value, ... ) format, which permits the creation of additional
            EXPLAIN options.
          </para>
        </listitem>
        <listitem>
          <para>
            ALTER TABLE ... ALTER COLUMN ... SET STATISTICS DISTINCT allows
            users to manually tweak the number of distinct values estimated for
            a column, to fix cases where ANALYZE estimates are incorrect.
          </para>
        </listitem>
        <listitem>
          <para>
            Make GEQO's planning deterministic by having it start from a
            predictable random number seed each time.
          </para>
        </listitem>
        <listitem>
          <para>
            Rewrite GEQO's gimme_tree function so that it always finds a legal
            join sequence. Previously, it could have failed to produce a plan
            in some cases.
          </para>
        </listitem>
        <listitem>
          <para>
            Tweak TOAST code so that columns marked with MAIN storage strategy
            are not forced out-of-line unless that is necessary to make the row
            fit on a page. Previously, they were forced out-of-line if needed
            to get the row down to the default target size (1/4th page).
          </para>
        </listitem>
        <listitem>
          <para>
            Simplify the forms foo &lt;&gt; true and foo &lt;&gt; false to foo
            = false and foo = true during query optimization.
          </para>
        </listitem>
        <listitem>
          <para>
            Avoid per-send() system calls to manage SIGPIPE in libpq, if the
            platform provides either sockopt(SO_NOSIGPIPE) or the MSG_NOSIGNAL
            flag to send().
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Administration and Monitoring</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add the ability to store inheritance-tree
         statistics in pg_statistic, and teach ANALYZE to compute such
         stats for tables that have subclasses.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Revise pgstat's tracking of tuple changes to
         improve the reliability of decisions about when to
         auto-analyze.  The previous code depended on n_live_tuples +
         n_dead_tuples - last_anl_tuples, where all three of these
         numbers could be bad estimates from ANALYZE itself.  Even
         worse, in the presence of a steady flow of HOT updates and
         matching HOT-tuple reclamations, auto-analyze might never
         trigger at all, even if all three numbers are exactly right,
         because n_dead_tuples could hold steady.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Support ALTER TABLESPACE name SET/RESET (
         tablespace_options ), currently supporting seq_page_cost and
         random_page_cost as parameters.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>New faster implementation of VACUUM FULL.  The old
         idiom of using CLUSTER instead of VACUUM FULL for speed is
         now obsolete.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add buffer access counters to
         pg_stat_statements.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add some simple support and documentation for using
         process-specific oom_adj settings to prevent the postmaster
         from being OOM-killed on Linux systems.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Place tablespace directories in their own
         subdirectory so pg_migrator can upgrade clusters without
         renaming the tablespace directories.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Introduce Streaming Replication.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add pg_table_size() and pg_indexes_size() to
         provide more user-friendly wrappers around the
         pg_relation_size() function.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add pg_stat_reset_shared('bgwriter') to reset the
         cluster-wide shared statistics of the bgwriter.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Replace ALTER TABLE ... SET STATISTICS DISTINCT
         with a more general mechanism.  Attributes can now have
         options, just as relations and tablespaces do, and the
         reloptions code is used to parse, validate, and store
         them.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Fix longstanding gripe that we check for
         0000000001.history at start of archive recovery, even when we
         know it is never present.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Make standby server continuously retry restoring
         the next WAL segment with restore_command, if the connection
         to the primary server is lost.  This ensures that the standby
         can recover automatically, if the connection is lost for a
         long time and standby falls behind so much that the required
         WAL segments have been archived and deleted in the
         master.</emphasis>
        </para>
        <para>
         <emphasis>This also makes standby_mode useful without
         streaming replication; the server will keep retrying
         restore_command every few seconds until the trigger file is
         found.  That's the same basic functionality pg_standby
         offers, but without the bells and whistles.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add functions to reset the statistics counter for a
         single table/index or a single function.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Augment EXPLAIN output with more details on Hash
         nodes.</emphasis>
         </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Reindexing shared system catalogs is now fully
         transactional and crash-safe.</emphasis>
         </para>
       </listitem>
       <listitem>
        <para>
         Allow read-only connections during recovery, also
         known as Hot Standby.  This provides a built-in master-slave
         replication solution.
        </para>
       </listitem>
       <listitem>
        <para>
         Provide a parenthesized-options syntax for VACUUM, analogous to
          that recently adopted for EXPLAIN. This will allow additional
          options to be implemented in future without having to make them
          fully-reserved keywords. The old syntax remains available for
          existing options, however.
        </para>
       </listitem>
       <listitem>
        <para>
         Add support for an application_name parameter, which is displayed
          in pg_stat_activity and recorded in log entries.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix longstanding problems in VACUUM caused by untimely
          interruptions.
        </para>
       </listitem>
       <listitem>
        <para>
         Add YAML to list of EXPLAIN formats.
        </para>
       </listitem>
       <listitem>
        <para>
         Add an EXPLAIN (BUFFERS) option to show buffer-usage statistics.
        </para>
       </listitem>
       <listitem>
        <para>
         Add a hook to let loadable modules get control at ProcessUtility
          execution, and use it to extend contrib/pg_stat_statements to track
          utility commands.
        </para>
       </listitem>
       <listitem>
        <para>
         Add a Boolean server configuration parameter
         &quot;bonjour&quot; to control whether a Bonjour-enabled
         build actually attempts to advertise itself via Bonjour.
        </para>
       </listitem>
       <listitem>
        <para>
         When reloading postgresql.conf, log what parameters actually
         changed.
        </para>
       </listitem>
       <listitem>
        <para>
         Make it possibly to specify server configuration parameters
         per user-database combination. Add a \drds command to psql to
         display the settings.
        </para>
       </listitem>
       <listitem>
        <para>
         Allow the collection of statistics on sequences.
        </para>
       </listitem>
      <listitem>
       <para>
        Increase the maximum value of extra_float_digits to
        3, and have pg_dump use that value when the backend is new
        enough to allow it, because it is possible to need 3 extra
        digits for float4 values (but not for float8 values).
       </para>
      </listitem>
        <listitem>
          <para>
            Add the ability to include the SQLSTATE error code of any error
            messages in the PostgreSQL activity log with the new
            log_line_prefix placeholder %e.
          </para>
        </listitem>
        <listitem>
          <para>
            Show the exact value being complained of in
            unique-constraint-violation error messages, including unique-index
            build failures.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Security</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add support for RADIUS authentication.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         When querying a table with child tables, do not check permissions
          on the child tables, only on the parent table. The old behavior was
          found to be useless and confusing in virtually all cases, and also
          contrary to the SQL standard.
        </para>
       </listitem>
       <listitem>
        <para>
         Add a hook to CREATE/ALTER ROLE to allow an external module to
          check the strength of database passwords, and create a sample
          implementation of such a hook as a new contrib module
          &quot;passwordcheck&quot;.
        </para>
       </listitem>
       <listitem>
        <para>
         Add large object access control.
        </para>
       </listitem>
       <listitem>
        <para>
         Allow LDAP authentication to operate in search+bind
         mode, meaning it does a search for the user in the directory
         first, and then binds with the DN found for this user.  This
         allows for LDAP logins in scenarios where the DN of the user
         cannot be determined simply by prefix and suffix, such as the
         case where different users are located in different
         containers.  The old way of authentication can be
         significantly faster, so it's kept as an option.
        </para>
       </listitem>
       <listitem>
        <para>
         Add ALTER DEFAULT PRIVILEGES command, which allows
         users to adjust the privileges that will be applied to
         subsequently-created objects.
        </para>
       </listitem>
       <listitem>
        <para>
         Add GRANT/REVOKE ON ALL TABLES/SEQUENCES/FUNCTIONS IN SCHEMA.
         This makes it easier to manage permissions on database objects.
        </para>
       </listitem>
       <listitem>
        <para>
         Support &quot;samehost&quot; and &quot;samenet&quot; specifications
         in pg_hba.conf.  This allows users with dynamic server addresses to run
         PostgreSQL without frequently modifying pg_hba.conf.
        </para>
       </listitem>
        <listitem>
          <para>
            New has_sequence_privilege() functions allow you to check sequence
            privileges for a given ROLE.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Built-In Functions</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Fix 3-parameter form of bit substring() to throw
         error for negative length, as required by SQL
         standard.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add get_bit/set_bit functions for bit strings,
         paralleling those for bytea, and implement OVERLAY() for bit
         strings and bytea.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add string_agg aggregate functions.  The
         one-argument version concatenates the input values into a
         string.  The two-argument version also does the same thing,
         but inserts delimiters between elements.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Honor to_char() "FM" specification in YYY, YY, and
         Y; it was already honored by YYYY.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Remove configuration parameter regex_flavor. It is now always
          &quot;advanced&quot;.
        </para>
       </listitem>
       <listitem>
        <para>
         Teach the regular expression functions to do case-insensitive
          matching and locale-dependent character classification properly
          when the database encoding is UTF8. This previously only worked
          correctly for single-byte encodings.  It is still broken for other
          multibyte encodings.
        </para>
       </listitem>
       <listitem>
        <para>
         Support POSIX-compatible interpretation of ? as well as {m,n}
         and related constructs in SIMILAR TO, per SQL:2008.
        </para>
       </listitem>
        <listitem>
          <para>
            The to_char() formatting functions now supports EEEE (scientific
            notation).
          </para>
        </listitem>
        <listitem>
          <para>
            Use floor() not rint() when reducing precision of fractional
            seconds in timestamp_trunc, timestamptz_trunc, and interval_trunc()
            for the float-datetime case. This improves accuracy of time
            calculations.
          </para>
        </listitem>
        <listitem>
          <para>
            Fix ancient bug in handling of to_char() modifier 'TH', when used
            with HH.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Data Types</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Allow enums to be created with zero labels, for use
         during binary upgrade.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         When doing &quot;ARRAY[...]::domain&quot;, where domain is a domain
          over an array type, we need to check domain constraints. Regression
          introduced in 8.4.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix integer-to-bit-string conversions to handle the first
          fractional byte correctly when the output bit width is wider than
          the given integer by something other than a multiple of 8 bits.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix encoding handling in binary input function of xml type.
        </para>
       </listitem>
       <listitem>
        <para>
         Tighten binary receive functions so that they reject values
         that the text input functions don't accept either.
        </para>
       </listitem>
        <listitem>
          <para>
            New hex-string input and output format options for type bytea. Hex
            output format is enabled by default, which is an incompatible
            change. See the new bytea_output parameter if you need to restore
            compatibility.
          </para>
        </listitem>
        <listitem>
          <para>
            Adds prefix support for text search synonym dictionary, allowing
            creation of synonyms on partial matches.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Server Tools</title>
      <itemizedlist>
       <listitem>
        <para>
         initdb now selects the encoding SQL_ASCII when the locale specifies
          US-ASCII. This case previously failed.
        </para>
       </listitem>
       <listitem>
        <para>
         Add init[db] option to pg_ctl.
        </para>
       </listitem>
       <listitem>
        <para>
         It is now reasonably safe to use pg_ctl to start
         the postmaster from a boot-time script.
        </para>
       </listitem>
       <listitem>
          <para>
            pg_dump/pg_restore --clean now drops large objects.
          </para>
        </listitem>
        <listitem>
          <para>
            Modify parallel pg_restore ordering logic to avoid a potential
            O(N^2) slowdown for some complex databases.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>libpq</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add user-specific .pg_service.conf file.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add new escaping functions PQescapeLiteral and
         PQescapeIdentifier.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Introduce two new libpq connection functions,
         PQconnectdbParams and PQconnectStartParams, which are
         analogous to PQconnectdb and PQconnectStart respectively, but
         accept two NULL-terminated arrays, keywords and values,
         rather than conninfo strings. This avoids the need to build
         the conninfo string in cases where it might be inconvenient
         to do so.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Throw error when a specified connection service name is not
          found in pg_service.conf, instead of ignoring it.
        </para>
       </listitem>
       <listitem>
        <para>
         Make libpq reject non-numeric and out-of-range port numbers with a
         suitable error message.
        </para>
       </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>psql</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Allow psql variables to be interpolated with
         literal or identifier escaping.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         In psql, show view definition only with \d+, not with \d.
        </para>
       </listitem>
       <listitem>
        <para>
         In psql, ignore UTF-8-encoded Unicode byte-order mark at the
          beginning of a file if the client encoding is UTF-8.
        </para>
       </listitem>
       <listitem>
        <para>
         Improve psql's tabular display of wrapped-around data by inserting
          markers in the formerly-always-blank columns just to left and right
          of the data. &quot;pset linestyle old-ascii&quot; is added to make
          the previous behavior available if anyone really wants it.
        </para>
       </listitem>
       <listitem>
        <para>
         Simplify psql's new linestyle behavior to default to
          linestyle=ascii all the time, rather than hoping we can tell
          whether the terminal supports UTF-8 characters.
        </para>
       </listitem>
       <listitem>
        <para>
         Implement significantly saner behavior when two or
         more psql sessions overlap in their use of the history file.
        </para>
       </listitem>
       <listitem>
        <para>
         Add &quot;pset linestyle ascii/unicode&quot; option to psql,
         allowing our traditional ASCII-art style of table output to
         be upgraded to use Unicode box drawing characters if
         desired.
        </para>
       </listitem>
        <listitem>
          <para>
            Have \d show child tables that inherit from the specified parent
          </para>
        </listitem>
        <listitem>
          <para>
            psql now shows the index methods in \di
          </para>
        </listitem>
      </itemizedlist>
    </sect3>

    <sect3>
      <title>Procedural Languages</title>
      <sect4>
       <title>PL/pgSQL</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add "USING expressions" option to PL/pgSQL's OPEN
         cursor FOR EXECUTE.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         PL/pgSQL is installed by default.
        </para>
       </listitem>
       <listitem>
        <para>
         Remove PL/pgSQL's RENAME declaration, which has
          bizarre and mostly nonfunctional behavior, and is so little
          used that no one has been interested in fixing it. To ensure
          that possible uses are covered, remove the ALIAS declaration's
          arbitrary restriction that only $n identifiers can be
          aliased.
        </para>
       </listitem>
       <listitem>
        <para>
         The PL/pgSQL parser and scanner were reworked to behave much more
          sanely:
        </para>
        <para>
         A variable reference will only be recognized where it can validly
          go, ie, a place where a column value or parameter would be legal,
          instead of the former behavior that would replace any textual match
          including table names and column aliases (leading to syntax errors
          later on).
        </para>
        <para>
         When a name could refer either to a PL/pgSQL variable or a
          table column, PL/pgSQL formerly always assumed the variable was
          meant, sometimes resulting in surprising behavior.  Now, PL/pgSQL
          can assume the variable is meant, or assume the table column is
          meant, or throw an error in ambiguous cases.  For safety the default
          is to throw error.  To configure this see <link
          linkend="plpgsql-var-subst">the PL/pgSQL documentation</link>.
        </para>
        <para>
         Error reporting is much nicer: it no longer shows edited
          versions of statements that look significantly different from what
          you wrote.
        </para>
        <para>
         Note that this change affects the set of keywords that are
          reserved in PL/pgSQL (i.e., cannot be the name of a PL/pgSQL
          variable).  Now, all keywords shown as reserved in <link
          linkend="sql-keywords-appendix">Appendix C</link> are reserved for
          PL/pgSQL purposes as well.  However, many PL/pgSQL-only keywords
          that were formerly treated as reserved no longer are.  As in regular
          SQL, you can double-quote a variable's name if you want to use a
          name that conflicts with a reserved keyword.
        </para>
       </listitem>
       <listitem>
        <para>
         PL/pgSQL IN parameters now accept value assignments.
        </para>
       </listitem>
       <listitem>
        <para>
         Allow cursor commands MOVE FORWARD n, MOVE BACKWARD n,
         MOVE FORWARD ALL, MOVE BACKWARD ALL in PL/pgSQL.
        </para>
       </listitem>
        <listitem>
          <para>
            PL/pgSQL functions can now better cope with row types
            containing dropped columns.
          </para>
        </listitem>
      </itemizedlist>
      </sect4>

      <sect4>
       <title>PL/Perl</title>
       <itemizedlist>
        <listitem>
         <para>
          <emphasis>Add utility functions to PL/Perl: quote_literal,
          quote_nullable, quote_ident, encode_bytea, decode_bytea,
          looks_like_number, encode_array_literal,
          encode_array_constructor.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Add plperl.on_plperl_init, plperl.on_plperlu_init,
          and plperl.on_init settings for startup code.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Allow (ineffective) use of "require".  If the
          required module is not already loaded then it dies.  So "use
          strict;" now works in PL/Perl.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Pre-load the feature module if Perl &gt;= 5.10.
          So "use feature :5.10;" now works in PL/Perl.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Stored procedure subs are now given names.  The
          names are not visible in ordinary use, but they make tools
          like Devel::NYTProf and Devel::Cover much more
          useful.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Handle END blocks in PL/Perl.</emphasis>
         </para>
        </listitem>
       <listitem>
        <para>
         <emphasis>Clean up package namespace use and use of Safe.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Change log level of Perl warnings from NOTICE to
         WARNING.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add support for anonymous code blocks (DO blocks) to PL/Perl.
        </para>
       </listitem>
       <listitem>
        <para>
         Improve error context reporting in PL/Perl, for
         easier debugging.
        </para>
       </listitem>
       <listitem>
        <para>
         Convert a Perl array to a PostgreSQL array when returned by
         set-returning functions as well as non-SRFs.
        </para>
       </listitem>
       </itemizedlist>
      </sect4>

      <sect4>
       <title>PL/Python</title>
       <itemizedlist>
        <listitem>
         <para>
          <emphasis>Improved printing of Python exceptions in
          PL/Python.</emphasis>
         </para>
        </listitem>
        <listitem>
         <para>
          <emphasis>Add PL/Python DO handler.</emphasis>
         </para>
        </listitem>
       <listitem>
        <para>
         Support arrays as parameters and return values of PL/Python
          functions.
        </para>
       </listitem>
       <listitem>
        <para>
         Add Python 3 support to PL/Python.  It behaves more or less
          unchanged compared to Python 2, but the new language variant is
          called plpython3u.
        </para>
       </listitem>
       <listitem>
        <para>
         Fix/improve bytea and boolean support in PL/Python. Data type
         conversion into and out of PL/Python previously went through
         an intermediate string representation, which caused various
         discrepancies especially with bytea and boolean data. This is
         now fixed by converting the values directly.
        </para>
       </listitem>
       <listitem>
        <para>
         PL/Python now accepts Unicode objects where it previously
         only accepted string objects (for example, as return
         value). Unicode objects are converted to the PostgreSQL
         server encoding as necessary.
        </para>
       </listitem>
        <listitem>
          <para>
            Improve error context reporting in PL/Python, for easier
            debugging.
          </para>
        </listitem>
        <listitem>
          <para>
            Greatly expand the regression testing for PL/Python.
          </para>
        </listitem>
      </itemizedlist>
      </sect4>
    </sect3>

    <sect3>
      <title>Additional Supplied Modules</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add query text to auto_explain output.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Add \shell and \setshell meta commands to pgbench.
        </para>
        <para>
         \shell runs an external shell command. \setshell
          does the same and assigns the result to a variable.
        </para>
       </listitem>
       <listitem>
        <para>
         Multiple improvements in contrib/hstore, including
         raising limits on keys and values, conversions to and from
         records and arrays, and support for GROUP BY and DISTINCT.
        </para>
       </listitem>
        <listitem>
          <para>
            pgbench is now multi-threaded, allowing it to use multiple CPU's
            for its client connections, and to do more realistic workload
            testing.
          </para>
        </listitem>
        <listitem>
          <para>
            Added the ability to retrieve asynchronous notifications using
            dblink, via the addition of the function dblink_get_notify().
          </para>
        </listitem>
        <listitem>
          <para>
            Added matchorig, matchsynonyms, and keepsynonyms options to
            contrib/dict_xsyn.
          </para>
        </listitem>
        <listitem>
          <para>
            Added contrib/unaccent.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>ECPG</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add sqlda support in both native and compatibility
         mode.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Fix SQL3 type return value: For non-SQL3 types ECPG
         used to return -OID. This will break if there are enough OIDs
         to fill the namespace.  Therefore we play it safe and return
         0 if there is no OID->SQL3 type mapping available.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Make char the default sqlda type.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add DESCRIBE [OUTPUT] statement.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add out-of-scope cursor support to native mode.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Refactor ECPG grammar so that it uses the core grammar's
          unreserved_keyword list, minus a few specific words that have to be
          treated specially. This de-reserves a number of words in ECPG.
        </para>
       </listitem>
       <listitem>
        <para>
         Added dynamic cursor names to ECPG.
        </para>
       </listitem>
      <listitem>
       <para>
        Add ECPG function that returns the current transaction status.
       </para>
      </listitem>
      <listitem>
       <para>
        Make ECPG more robust against applications freeing strings.
       </para>
      </listitem>
        <listitem>
          <para>
            ECPG now includes a STRING datatype for Informix compatibility
            mode.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Ports</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Add basic build support for Visual Studio 2008,
         without resorting to generating the build files for 2005 and
         then converting them.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Added support for 64-bit Windows platforms.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         Disable triggering failover with a signal in pg_standby on Windows.
          It never really worked before anyway.
        </para>
       </listitem>
       <listitem>
        <para>
         Change the WIN32 API version to be 5.01 (Windows XP), to
         bring in the proper IPv6 headers in newer SDKs.
        </para>
       </listitem>
       <listitem>
        <para>
         Write to the Windows eventlog in UTF-16, converting the
         message encoding as necessary.
        </para>
       </listitem>
       <listitem>
        <para>
         Replace use of the long-deprecated Bonjour API
         DNSServiceRegistrationCreate with the not-so-deprecated
         DNSServiceRegister. The new code will fail on Mac OS X
         releases before 10.3.
        </para>
       </listitem>
       <listitem>
          <para>
            Reserve the shared memory region during backend startup on Windows,
            so that memory allocated by starting third party DLLs doesn't end
            up conflicting with it. Hopefully this solves the long-time issue
            with &quot;could not reattach to shared memory&quot; errors on
            Win32.
          </para>
        </listitem>
        <listitem>
          <para>
            Add s_lock support for SuperH architecture (not well tested).
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
    <sect3>
      <title>Source Code, Build Options</title>
      <itemizedlist>
       <listitem>
        <para>
         <emphasis>Improve PGXS makefile system to allow the module's
         makefile to specify where to install DATA and DOCS files.
         This is mainly intended to allow versioned installation, eg,
         install into contrib/fooM.N/ rather than directly into
         contrib/.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Get rid of the need for manual maintenance of the
         initial contents of pg_attribute, by having genbki.pl derive
         the information from the various catalog header files.  This
         greatly simplifies modification of the "bootstrapped"
         catalogs.  This patch finally kills genbki.sh and
         Gen_fmgrtab.sh; we now rely entirely on Perl scripts for
         those build steps.  To avoid creating a Perl build dependency
         where there was not one before, they will be built and
         shipped in tarballs.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Move the default configuration for the MSVC build
         system to config_default.pl, and allow using config.pl to
         override the defaults.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Make configure check the version of Perl we're
         building with, and reject versions &lt; 5.8.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Remove all support for working around on systems
         that don't provide a working 64-bit integer type.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         <emphasis>Add new make targets "world", "install-world" and
         "installcheck-world" to build, install and check just about
         everything.  In addition to everything built installed and
         tested by all, install and installcheck targets, these build
         HTML documentation, build and test contrib, and test
         procedural languages and ECPG.</emphasis>
        </para>
       </listitem>
       <listitem>
        <para>
         configure --enable-thread-safety is now the default (but can still
          be turned off).
        </para>
       </listitem>
       <listitem>
        <para>
         Fix inclusions of readline/editline header files so that we
         only attempt to #include the version of history.h that is in
         the same directory as the readline.h we are using. This
         avoids problems in some scenarios where both readline and
         editline are installed.
        </para>
       </listitem>
       <listitem>
        <para>
         Derived files that are shipped in the distribution used to be
         built in the source directory even for out-of-tree
         builds. They are now built in the build tree. This
         should be more convenient for certain developers' workflows.
        </para>
       </listitem>
        <listitem>
          <para>
            Functions which conflict with C++ reserved words have been renamed,
            making backend header files now safe to use with C++ libraries.
          </para>
        </listitem>
        <listitem>
          <para>
            Add man pages for SPI functions.
          </para>
        </listitem>
        <listitem>
          <para>
            Upgrade to Autoconf 2.63 (not relevant to users of distribution
            tarballs).
          </para>
        </listitem>
        <listitem>
          <para>
            Minimum version of Flex is now 2.5.31, to support reentrant
            scanners (not relevant to users of distribution tarballs).
          </para>
        </listitem>
        <listitem>
          <para>
            Documentation build rules have been improved. The generated
            documentation files are now shipped &quot;loose&quot;, not in
            sub-tarballs.
          </para>
        </listitem>
        <listitem>
          <para>
            New toolchain to generate man pages. From now on, the man pages
            will be current in every release.
          </para>
        </listitem>
        <listitem>
          <para>
            Code-coverage testing support now extends to the entire source
            tree, not only src/backend/.
          </para>
        </listitem>
        <listitem>
          <para>
            Make the core scanner re-entrant, along with additional fixes that
            will let it be used directly by PL/pgSQL.
          </para>
        </listitem>
      </itemizedlist>
    </sect3>
  </sect2>
</sect1>
