<!-- doc/src/sgml/release-11.sgml -->
<!-- See header comment in release.sgml about typical markup -->

 <sect1 id="release-11">
  <title>Release 11</title>

  <formalpara>
   <title>Release date:</title>
   <para>2018-??-?? (CURRENT AS OF 2018-05-01)</para>
  </formalpara>

  <sect2>
   <title>Overview</title>

   <para>
    Major enhancements in <productname>PostgreSQL</productname> 11 include:
   </para>

   <!-- Items in this list summarize one or more items below -->

   <itemizedlist>

    <listitem>
     <para>
      Major improvements to partitioning:
      <itemizedlist>
       <listitem>
        <para>
         Partitioning by a hash key
        </para>
       </listitem>
       <listitem>
        <para>
         <command>UPDATE</command> statements that change a partition key
         now move affected rows to the appropriate partitions
        </para>
       </listitem>
       <listitem>
        <para>
         Improved <command>SELECT</command> query performance due to
         enhanced partition elimination during query processing and
         execution
        </para>
       </listitem>
       <listitem>
        <para>
         Support for <literal>PRIMARY KEY</literal>, <literal>FOREIGN
         KEY</literal>, indexes, and triggers on partitioned tables
        </para>
       </listitem>
      </itemizedlist>
     </para>
    </listitem>

    <listitem>
     <para>
      Improvements to parallelism:
      <itemizedlist>
       <listitem>
        <para>
         Parallelized hash joins
        </para>
       </listitem>
       <listitem>
        <para>
         Parallelized <command>CREATE INDEX</command> for B-tree indexes
        </para>
       </listitem>
       <listitem>
        <para>
         Parallelized <command>CREATE TABLE .. AS</command>,
         <command>CREATE MATERIALIZED VIEW</command>, and certain
         queries using <literal>UNION</literal>
        </para>
       </listitem>
      </itemizedlist>
     </para>
    </listitem>

    <listitem>
     <para>
      SQL stored procedures, with support for embedded transactions
     </para>
    </listitem>

    <listitem>
     <para>
      JIT compilation of some SQL code, including support for fast evaluation
      of expressions
     </para>
    </listitem>

    <listitem>
     <para>
      Window functions now support all options shown in the SQL:2011
      standard, including <literal>RANGE <replaceable>distance</replaceable>
      PRECEDING/FOLLOWING</literal>, <literal>GROUPS</literal> mode, and
      frame exclusion options
     </para>
    </listitem>

    <listitem>
     <para>
      Channel binding for SCRAM authentication, to prevent potential
      man-in-the-middle attacks on database connections
     </para>
    </listitem>

    <listitem>
     <para>
      Many other useful performance improvements, including making
      <command>ALTER TABLE .. ADD COLUMN</command> with a
      non-null column default faster
     </para>
    </listitem>

   </itemizedlist>

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

  </sect2>

  <sect2>

  <title>Migration to Version 11</title>

   <para>
    A dump/restore using <xref linkend="app-pg-dumpall"/>, or use of <xref
    linkend="pgupgrade"/>, is required for those wishing to migrate data
    from any previous release.
   </para>

   <para>
    Version 11 contains a number of changes that may affect compatibility
    with previous releases.  Observe the following incompatibilities:
   </para>

   <itemizedlist>

    <listitem>
<!--
2018-01-22 [b3f840120] Move handling of database properties from pg_dumpall int
2018-01-23 [160a4f62e] In pg_dump, force reconnection after issuing ALTER DATAB
2018-01-25 [0d4e6ed30] Clean up some aspects of pg_dump/pg_restore item-selecti
-->

       <para>
        Have <link
        linkend="app-pgdump"><application>pg_dump</application></link>
        dump all aspects of a database (Haribabu Kommi)
       </para>

       <para>
        Previously database attributes like
        <command>GRANT</command>/<command>REVOKE</command> permissions and
        <command>ALTER DATABASE SET</command> and <command>ALTER ROLE IN
        DATABASE SET</command> variable settings were only dumped by <link
        linkend="app-pg-dumpall"><application>pg_dumpall</application></link>.
        Now <command>pg_dump --create</command> and
        <command>pg_restore --create</command> will restore all
        database aspects.  <command>pg_dumpall -g</command> will
        now only output role and tablespace-related attributes.
        <application>pg_dumpall</application>'s output (without
        <option>-g</option>) is unchanged.
       </para>

       <para>
        <application>pg_dump</application> and
        <application>pg_restore</application>, without
        <option>--clean</option>, no longer dump/restore database comments
        and security labels.
       </para>

       <para>
        <command>pg_dumpall --clean</command> now restores the "postgres"
        and "template1" databases with the original locale and encoding
        settings.
       </para>

       <para>
        A restore of <application>pg_dumpall</application> will now create
        databases with their original locale and encoding, and will fail if
        the creation fails.  Previously <command>CREATE DATABASE</command>
        would be dumped without such specifications if the database locale
        and encoding matched the old cluster's defaults.
       </para>

       <para>
        DID I GET EVERYTHING?
       </para>
      </listitem>

      <listitem>
<!--
2017-08-16 [9b5140fb5] Correct representation of foreign tables in information
-->

       <para>
        Correct information schema column <link
        linkend="infoschema-tables"><structname>tables</structname>.<structfield>table_type</structfield></link>
        to return <literal>FOREIGN</literal> instead of <literal>FOREIGN
        TABLE</literal> (Peter Eisentraut)
       </para>

       <para>
        This new output matches the SQL standard.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-20 [be87b70b6] Sync process names between ps and pg_stat_activity
-->

       <para>
        Change the ps process display
        labels for background workers to match the <link
        linkend="pg-stat-activity-view"><structname>pg_stat_activity</structname>.<structfield>backend_type</structfield></link>
        labels (Peter Eisentraut)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-17 [e87d4965b] Prevent to_number() from losing data when template doesn
-->

       <para>
        Prevent <link
        linkend="functions-formatting-numeric-table"><function>to_number()</function></link>
        from consuming characters when the template separator does not
        match (Oliver Ford)
       </para>

       <para>
        Specifically, <command>SELECT to_number('1234', '9,999')</command>
        used to return <literal>134</literal>.  It will now
        return <literal>1234</literal>.  <literal>L</literal> and
        <literal>TH</literal> now only consume characters that are not
        digits, positive/negative signs, decimal points, and commas.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-18 [976a1a48f] Improve to_date/to_number/to_timestamp behavior with mul
-->

       <para>
        Fix <link
        linkend="functions-formatting"><function>to_date()</function></link>,
        <function>to_number()</function>, and
        <function>to_timestamp()</function> to skip a character for each
        template character (Tom Lane)
       </para>

       <para>
        Previously _bytes_ were skipped.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-18 [63ca86318] Fix quoted-substring handling in format parsing for to_c
-->

       <para>
        Adjust the handling of backslashes inside double-quotes in
        template strings for <function>to_char()</function>,
        <function>to_number()</function>, and
        <function>to_timestamp()</function>.
       </para>

       <para>
        Such a backslash now escapes the character after it, particularly
        a double-quote or another backslash.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-27 [1944cdc98] libpq: PQhost to return active connected host or hostadd
-->

       <para>
        Have libpq's <link
        linkend="libpq-pqhost"><function>PQhost()</function></link>
        always return the actual connected host (Hari Babu)
       </para>

       <para>
        Previously <function>PQhost()</function> often returned the
        supplied host parameters, which could contain several hosts.
        The same is true of <function>PQport()</function>, which now
        returns the actual port number, not the multiple supplied port
        numbers.  ACCURATE?
       </para>
      </listitem>

      <listitem>
<!--
2017-09-18 [f8e5f156b] Rearm statement_timeout after each executed query.

-->

       <para>
        In the <link linkend="protocol-query-concepts">Extended Query
        Protocol</link>, have <varname>statement_timeout</varname>
        apply to each Execute message, not to all commands before Sync
        (Tatsuo Ishii, Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-14 [f66e8bf87] Remove pg_class.relhaspkey
-->

       <para>
        Remove <structfield>relhaspkey</structfield> column from system
        table <structname>pg_class</structname> (Peter Eisentraut)
       </para>

       <para>
        Applications needing to check for a primary key should consult
        <structname>pg_index</structname>.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-02 [fd1a421fe] Add prokind column, replacing proisagg and proiswindow
-->

       <para>
        Replace system table <structname>pg_proc</structname>'s
        <structfield>proisagg</structfield> and
        <structfield>proiswindow</structfield> with
        <structfield>prokind</structfield> (Peter Eisentraut)
       </para>

       <para>
        This new column more clearly identifies functions, procedures,
        aggregates, and window functions.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-09 [ae20b23a9] Refactor permissions checks for large objects.
2017-11-14 [6d776522d] Document changes in large-object privilege checking.
-->

       <para>
        Cause large object permission checks
        to happen on large object open, <link
        linkend="lo-open"><function>lo_open()</function></link>, not
        read/write (Tom Lane, Michael Paquier)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-06 [11523e860] Support new default roles with adminpack
-->

       <para>
        Remove deprecated contrib/adminpack functions
        <function>pg_file_read()</function>,
        <function>pg_file_length()</function>, and
        <function>pg_logfile_rotate()</function> (Stephen Frost)
       </para>

       <para>
        These function are now present by default.  Old <link
        linkend="adminpack"><application>adminpack</application></link>
        installs will continue to have access to these functions until
        they are updated via <command>ALTER EXTENSION ... UPDATE</command>.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-26 [fb8697b31] Avoid unnecessary use of pg_strcasecmp for already-downc
-->

       <para>
        Honor the capitalization of double-quoted command options
        (Daniel Gustafsson)
       </para>

       <para>
        Previously index options names like ("FillFactor" = 50) were
        automatically lower-cased.  This quoted capitalization will now
        generate an error.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-29 [8b304b8b7] Remove replacement selection sort.
-->

       <para>
        Remove server variable <varname>replacement_sort_tuples</varname>
        (Peter Geoghegan)
       </para>

       <para>
        Replacement sorts were determined to be no longer useful.
       </para>

      </listitem>

      <listitem>
<!--
2018-01-26 [4971d2a32] Remove the obsolete WITH clause of CREATE FUNCTION.
-->

       <para>
        Remove <literal>WITH</literal> clause in <link
        linkend="sql-createfunction"><command>CREATE
        FUNCTION</command></link> (Michael Paquier)
       </para>

       <para>
        <productname>PostgreSQL</productname> has long supported a more
        standard-compliant syntax for this capability.
       </para>
      </listitem>

      <listitem>
<!--
Branch: master [6bdf1303b] Avoid wrong results for power() with NaN
-->

       <para>
        Consistently return <literal>NaN</literal> for
        <literal>NaN</literal> inputs to <function>power()</function>
        on older platforms (Tom Lane, Dang Minh Huong)
       </para>

      </listitem>

   </itemizedlist>

  </sect2>

  <sect2>
   <title>Changes</title>

   <para>
    Below you will find a detailed account of the changes between
    <productname>PostgreSQL</productname> 11 and the previous major
    release.
   </para>

   <sect3>
    <title>Server</title>

    <sect4>
     <title>Partitioning</title>

     <itemizedlist>

      <listitem>
<!--
2018-02-02 [9aef17316] Refactor code for partition bound searching
2018-02-23 [f724022d0] Revise API for partition bound search functions.
2018-04-06 [9fdb675fc] Faster partition pruning
2018-04-23 [055fb8d33] Add GUC enable_partition_pruning
-->

       <para>
        Allow faster partition elimination during query processing (Amit
        Langote, David Rowley, Dilip Kumar)
       </para>

       <para>
        This speeds access to partitioned tables with many partitions.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-07 [499be013d] Support partition pruning at execution time
-->

       <para>
        Allow partition elimination during query execution (David Rowley,
        Beena Emerson)
       </para>

       <para>
        Previously partition elimination could only happen at planning
        time, meaning many joins and prepared queries could not use
        partition elimination.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-09 [1aba8e651] Add hash partitioning.
-->

       <para>
        Allow the creation of partitions based on hashing a key (Amul Sul)
       </para>
      </listitem>

      <listitem>
<!--
2018-01-19 [2f1784410] Allow UPDATE to move rows between partitions.
-->

       <para>
        Allow updated rows to automatically move to new partitions based
        on the new row contents (Amit Khandekar)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-08 [6f6b99d13] Allow a partitioned table to have a default partition.
2018-04-11 [72cf7f310] Fix ALTER TABLE .. ATTACH PARTITION ... DEFAULT
-->

       <para>
        Allow partitioned tables to have a default partition (Jeevan Ladhe,
        Beena Emerson, Ashutosh Bapat, Rahila Syed, Robert Haas)
       </para>

       <para>
        The default partition can store rows that don't match any of the
        other defined partitions, and is searched accordingly.
       </para>
      </listitem>

      <listitem>
<!--
2018-02-19 [eb7ed3f30] Allow UNIQUE indexes on partitioned tables
2018-03-26 [555ee77a9] Handle INSERT .. ON CONFLICT with partitioned tables
-->

       <para>
        Allow <literal>UNIQUE</literal> indexes on partitioned tables if
        the partition key guarantees uniqueness (&Aacute;lvaro Herrera,
        Amit Langote)
       </para>
      </listitem>

      <listitem>
<!--
2018-01-19 [8b08f7d48] Local partitioned indexes
-->

       <para>
        Allow indexes on a partitioned table to be automatically created
        in any child partitions (&Aacute;lvaro Herrera)
       </para>

       <para>
        The new command <link linkend="sql-alterindex"><command>ALTER
        INDEX ATTACH PARTITION</command></link> allows indexes to be
        attached to partitions.  This does not behave as a global index
        since the contents are private to each index.  WARN WHEN USING
        AN EXISTING INDEX?
       </para>
      </listitem>

      <listitem>
<!--
2018-04-04 [3de241dba] Foreign keys on partitioned tables
-->

       <para>
        Allow foreign keys on partitioned tables (&Aacute;lvaro Herrera)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-06 [3d956d956] Allow insert and update tuple routing and COPY for forei
-->

       <para>
        Allow <command>INSERT</command>, <command>UPDATE</command>, and
        <command>COPY</command> on partitioned tables to properly route
        rows to foreign partitions (Etsuro Fujita, Amit Langote)
       </para>

       <para>
        This is supported by <application>postgres_fdw</application>
        foreign tables.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-23 [86f575948] Allow FOR EACH ROW triggers on partitioned tables
-->

       <para>
        Allow <literal>FOR EACH ROW</literal> triggers on partitioned
        tables (&Aacute;lvaro Herrera)
       </para>

       <para>
        Creation of a trigger on partitioned tables automatically creates
        triggers on all partition tables, and on newly-created ones.
        This also allows deferred unique constraints on partitioned tables.
       </para>
      </listitem>

      <listitem>
<!--
2017-08-15 [e139f1953] Assorted preparatory refactoring for partition-wise join
2017-10-06 [f49842d1e] Basic partition-wise join functionality.
2018-02-16 [2fb1abaeb] Rename enable_partition_wise_join to enable_partitionwis
-->

       <para>
        Allow equality joins between partitioned tables with identically
        partitioned child tables to join the child tables directly
        (Ashutosh Bapat)
       </para>

       <para>
        This features is disabled by default
        but can be enabled by changing <link
        linkend="guc-enable-partitionwise-join"><varname>enable_partitionwise_join</varname></link>.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-26 [9fd8b7d63] Factor some code out of create_grouping_paths.
2018-03-22 [e2f1eb0ee] Implement partition-wise grouping/aggregation.
-->

       <para>
        Perform aggregation on each partition, and then merge the results
        (Jeevan Chalke, Ashutosh Bapat, Robert Haas)
       </para>

       <para>
        This features is disabled by default
        but can be enabled by changing <link
        linkend="guc-enable-partitionwise-aggregate"><varname>enable_partitionwise_aggregate</varname></link>.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-02 [7e0d64c7a] postgres_fdw: Push down partition-wise aggregation.
-->

       <para>
        Allow <link
        linkend="postgres-fdw"><application>postgres_fdw</application></link>
        to push down aggregates to foreign tables that are partitions
        (Jeevan Chalke)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>Parallel Queries</title>

     <itemizedlist>

      <listitem>
<!--
2018-02-02 [9da0cc352] Support parallel btree index builds.
-->

       <para>
        Allow btree indexes to be built in parallel (Peter Geoghegan,
        Rushabh Lathia, Heikki Linnakangas)
       </para>
      </listitem>

      <listitem>
<!--
2017-12-21 [180428404] Add parallel-aware hash joins.
-->

       <para>
        Allow hash joins to be performed in parallel using a shared hash
        table (Thomas Munro)
       </para>
      </listitem>

      <listitem>
<!--
2017-12-05 [ab7271677] Support Parallel Append plan nodes.
2018-03-22 [88ba0ae2a] Consider Parallel Append of partial paths for UNION [ALL
-->

       <para>
        Allow <literal>UNION</literal> to run each
        <command>SELECT</command> in parallel if the individual
        <command>SELECT</command>s cannot be parallelized (Amit Khandekar,
        Robert Haas, Amul Sul)
       </para>
      </listitem>

      <listitem>
<!--
same commits as above
2017-12-05 [ab7271677] Support Parallel Append plan nodes.
2018-03-22 [88ba0ae2a] Consider Parallel Append of partial paths for UNION [ALL
-->

       <para>
        Allow partition scans to more efficiently use parallel workers
        (Amit Khandekar, Robert Haas, Amul Sul)
       </para>
      </listitem>

      <listitem>
<!--
2017-08-29 [3452dc524] Push tuple limits through Gather and Gather Merge.
-->

       <para>
        Allow <literal>LIMIT</literal> to be passed to parallel workers
        (Robert Haas, Tom Lane)
       </para>

       <para>
        This allows workers to reduce returned results and use targeted
        index scans.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-16 [e89a71fb4] Pass InitPlan values to workers via Gather (Merge).
2018-03-29 [3f90ec859] Postpone generate_gather_paths for topmost scan/join rel
2018-03-29 [11cf92f6e] Rewrite the code that applies scan/join targets to paths
-->

       <para>
        Allow single-evaluation queries, e.g. <literal>WHERE</literal>
        clause aggregate queries, and functions in the target list to be
        parallelized (Amit Kapila, Robert Haas)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-15 [e5253fdc4] Add parallel_leader_participation GUC.
-->

       <para>
        Add server option <link
        linkend="guc-parallel-leader-participation"><varname>parallel_leader_participation</varname></link>
        to control if the leader executes subplans (Thomas Munro)
       </para>

       <para>
        The default is enabled, meaning the leader will execute subplans.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-05 [e9baa5e9f] Allow DML commands that create tables to use parallel qu
-->

       <para>
        Allow parallelization of commands <command>CREATE TABLE
        .. AS</command>, <command>SELECT INTO</command>, and
        <command>CREATE MATERIALIZED VIEW</command> (Haribabu Kommi)
       </para>
      </listitem>

      <listitem>
<!--
2017-08-16 [3cda10f41] Use atomic ops to hand out pages to scan in parallel sca

-->

       <para>
        Improve performance of sequential scans with many parallel workers
        (David Rowley)
       </para>
      </listitem>

      <listitem>
<!--
2017-08-29 [bf11e7ee2] Propagate sort instrumentation from workers back to lead
-->

       <para>
        Add reporting of parallel worker sort activity to
        <command>EXPLAIN</command> (Robert Haas, Tom Lane)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>Indexes</title>

     <itemizedlist>

      <listitem>
<!--
2018-04-07 [8224de4f4] Indexes with INCLUDE columns and their support in B-tree
-->

       <para>
        Allow indexes to <link
        linkend="sql-createindex"><literal>INCLUDE</literal></link> columns
        that are not part of the unique constraint but are available
        for index-only scans (Anastasia Lubennikova, Alexander Korotkov,
        Teodor Sigaev)
       </para>

       <para>
        This is also useful for including columns that don't have btree
        support.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-26 [2b2727343] Optimize btree insertions for common case of increasing
2018-04-10 [074251db6] Adjustments to the btree fastpath optimization.
-->

       <para>
        Remember the highest btree index page to optimize future
        monotonically increasing index additions (Pavan Deolasee, Peter
        Geoghegan)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-22 [7c75ef571] hash: Implement page-at-a-time scan.
-->

       <para>
        Allow entire hash index pages to be scanned (Ashutosh Sharma)
       </para>

       <para>
        Previously for each hash index entry, we need to refind the scan
        position within the page.  This cuts down on lock/unlock traffic.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-27 [3ad55863e] Add predicate locking for GiST
2018-03-30 [43d1ed60f] Predicate locking in GIN index
2018-04-07 [b508a56f2] Predicate locking in hash indexes.
-->

       <para>
        Add predicate locking for hash, GiST and GIN indexes (Shubham
        Barai)
       </para>

       <para>
        This reduces the likelihood of serialization conflicts.  ACCURATE?
       </para>
      </listitem>

      <listitem>
<!--
2018-03-27 [c203d6cf8] Allow HOT updates for some expression indexes
-->

       <para>
        Allow heap-only-tuple (<acronym>HOT</acronym>) updates for
        expression indexes when the values of the expressions are unchanged
        (Konstantin Knizhnik)
       </para>

      </listitem>

     </itemizedlist>

     <sect5>
      <title><link linkend="spgist">SP-Gist</link></title>

      <itemizedlist>

      <listitem>
<!--
2018-04-03 [710d90da1] Add prefix operator for TEXT type.
-->

       <para>
        Add <type>TEXT</type> prefix operator ^@ which is supported by
        SP-GiST (Ildus Kurbangaliev)
       </para>

       <para>
        This is similar to using <literal>LIKE</literal> 'word%' with
        btree indexes, but is more efficient.
       </para>
      </listitem>

      <listitem>
<!--
2017-12-25 [ff963b393] Add polygon opclass for SP-GiST
-->

       <para>
        Allow polygons to be indexed with SP-GiST (Nikita Glukhov,
        Alexander Korotkov)
       </para>
      </listitem>

      <listitem>
<!--
2017-12-22 [854823fa3] Add optional compression method to SP-GiST
-->

       <para>
        Allow SP-GiST indexes to optionally use compression (Teodor Sigaev,
        Heikki Linnakangas, Alexander Korotkov, Nikita Glukhov)
       </para>

      </listitem>

      </itemizedlist>

     </sect5>

    </sect4>

    <sect4>
     <title>Optimizer</title>

     <itemizedlist>

      <listitem>
<!--
2018-03-22 [b5db1d93d] Improve ANALYZE's strategy for finding MCVs.
-->

       <para>
        Improve the selection of the optimizer statistics'
        most-common-values (Jeff Janes, Dean Rasheed)
       </para>

       <para>
        Previously most-common-values (<acronym>MCV</acronym>) were
        chosen based on their significance compared to all column
        values.  Now, <acronym>MCV</acronym> are chosen based on their
        significance compared to the non-<acronym>MCV</acronym> values.
        This improves the statistics for uniform (fewer) and non-uniform
        (more) distributions.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-13 [7d08ce286] Distinguish selectivity of &lt; from &lt;= and &gt; from &gt;=.
-->

       <para>
        Improve selectivity estimates for &gt;= and &lt;= when the
        constants are not common values (Tom Lane)
       </para>

       <para>
        Previously such cases used the same selectivity as &gt; and
        &lt;, respectively.  This change is particularly useful for
        <literal>BETWEEN</literal> with small ranges.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-08 [8ec5429e2] Reduce "X = X" to "X IS NOT NULL", if it's easy to do so
-->

       <para>
        Optimize var = var to var <literal>IS NOT NULL</literal> where
        equivalent (Tom Lane)
       </para>

       <para>
        This leads to better selectivity estimates.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-29 [7ca25b7de] Fix neqjoinsel's behavior for semi/anti join cases.
-->

       <para>
        Improve row count optimizer estimates for <literal>EXISTS</literal>
        and <literal>NOT EXISTS</literal> queries (Tom Lane)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-02 [7b6c07547] Teach planner to account for HAVING quals in aggregation
-->

       <para>
        Add optimizer selectivity costs for <literal>HAVING</literal>
        clauses (Tom Lane)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>General Performance</title>

     <itemizedlist>

      <listitem>
<!--
2018-03-21 [432bb9e04] Basic JIT provider and error handling infrastructure.
2018-03-22 [b96d550eb] Support for optimizing and emitting code in LLVM JIT pro
2018-03-22 [cc415a56d] Basic planner and executor integration for JIT.
2018-03-26 [32af96b2b] JIT tuple deforming in LLVM JIT provider.
2018-03-27 [f4f5845b3] Quick adaption of JIT tuple deforming to the fast defaul
2018-03-28 [9370462e9] Add inlining support to LLVM JIT provider.
-->

       <para>
        Add <link linkend="jit">Just-In-Time</link>
        (<acronym>JIT</acronym>) compilation of some parts of query plans
        to improve execution speed (Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-01 [7c70996eb] Allow bitmap scans to operate as index-only scans when p
-->

       <para>
        Allow bitmap scans to perform index-only scans when possible
        (Alexander Kuzmenkov)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-29 [851a26e26] While vacuuming a large table, update upper-level <acronym>FSM</acronym> da
2018-03-30 [c79f6df75] Do index FSM vacuuming sooner.
-->

       <para>
        Update the free space map during vacuum (Claudio Freire)
       </para>

       <para>
        This allows free space to be reused more quickly.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-04 [857f9c36c] Skip full index scan during cleanup of B-tree indexes wh
-->

       <para>
        Allow vacuum to avoid unnecesary index scans (Masahiko Sawada,
        Alexander Korotkov)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-01 [baaf272ac] Use group updates when setting transaction status in clo
-->

       <para>
        Improve performance of committing multiple concurrent transactions
        (Amit Kapila)
       </para>
      </listitem>

      <listitem>
<!--
2017-10-08 [84ad4b036] Reduce memory usage of targetlist SRFs.
-->

       <para>
        Reduce memory usage for queries using set-returning functions in
        their target lists (Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2018-02-07 [1bc0100d2] postgres_fdw: Push down UPDATE/DELETE joins to remote se
-->

       <para>
        Allow <link
        linkend="postgres-fdw"><application>postgres_fdw</application></link>
        to push <command>UPDATE</command>s and <command>DELETE</command>s
        using joins to foreign servers (Etsuro Fujita)
       </para>

       <para>
        Previously only non-join <command>UPDATE</command>s and
        <command>DELETE</command>s were pushed.
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>Monitoring</title>

     <itemizedlist>

      <listitem>
<!--
2017-09-01 [c039ba071] Add memory info to getrusage output
-->

       <para>
        Show memory usage in <link
        linkend="runtime-config-statistics-monitor"><varname>log_statement_stats</varname></link>,
        <varname>log_parser_stats</varname>,
        <varname>log_planner_stats</varname>,
        <varname>log_executor_stats</varname> (Justin Pryzby, Peter
        Eisentraut)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-29 [5373bc2a0] Add background worker type
-->

       <para>
        Add <link
        linkend="pg-stat-activity-view"><structname>pg_stat_activity</structname>.<structfield>backend_type</structfield></link>
        now shows the type of background worker (Peter Eisentraut)
       </para>

       <para>
        Add <structfield>bgw_type</structfield> to the background worker
        C structure (Peter Eisentraut)
       </para>

       <para>
        This is displayed to the user in
        <structname>pg_stat_activity</structname>.<structfield>backend_type</structfield>
        and <application>ps</application> output.
       </para>
      </listitem>

      <listitem>
<!--
2017-12-04 [ab6eaee88] When VACUUM or ANALYZE skips a concurrently dropped tabl
-->

       <para>
        Have <link
        linkend="guc-log-autovacuum-min-duration"><varname>log_autovacuum_min_duration</varname></link>
        log skipped tables that are concurrently being dropped (Nathan
        Bossart)
       </para>

      </listitem>

     </itemizedlist>

     <sect5>
      <title><link linkend="infoschema-tables">Information Schema</link></title>

      <itemizedlist>

      <listitem>
<!--
2018-02-07 [32ff26911] Add more information_schema columns
-->

       <para>
        Add information_schema columns related to table constraints and
        triggers (Peter Eisentraut)
       </para>

       <para>
        Specifically,
        <structname>table_constraints</structname>.<structfield>enforced</structfield>,
        <structname>triggers</structname>.<structfield>action_order</structfield>,
        <structname>triggers</structname>.<structfield>action_reference_old_table</structfield>,
        and
        <structname>triggers</structname>.<structfield>action_reference_new_table</structfield>.
       </para>

      </listitem>

      </itemizedlist>

     </sect5>
    </sect4>

    <sect4>
     <title><acronym>Authentication</acronym></title>

     <itemizedlist>

      <listitem>
<!--
2017-11-18 [9288d62bb] Support channel binding 'tls-unique' in SCRAM
2017-12-19 [4bbf110d2] Add libpq connection parameter "scram_channel_binding"
2018-01-04 [d3fb72ea6] Implement channel binding tls-server-end-point for SCRAM
-->

       <para>
        Add libpq option to support channel binding when using <link
        linkend="auth-password"><acronym>SCRAM</acronym></link>
        authentication (Michael Paquier)
       </para>

       <para>
        While <acronym>SCRAM</acronym> always prevents the
        replay of transmitted hashed passwords in a later
        session, <acronym>SCRAM</acronym> with channel binding
        also prevents man-in-the-middle attacks.  The options are <link
        linkend="libpq-scram-channel-binding"><option>scram_channel_binding=tls-unique</option></link>
        and <option>scram_channel_binding=tls-server-end-point</option>.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-12 [83aaac41c] Allow custom search filters to be configured for LDAP au
-->

       <para>
        Allow the server to specify more complex <link
        linkend="auth-ldap"><acronym>LDAP</acronym></link> specifications
        in search+bind mode (Thomas Munro)
       </para>

       <para>
        Specifically, "ldapsearchfilter" allows pattern matching using
        combinations of <acronym>LDAP</acronym> attributes.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-03 [35c0754fa] Allow ldaps when using ldap authentication
2018-01-04 [3ad2afc2e] Define LDAPS_PORT if it's missing and disable implicit L
-->

       <para>
        Allow <acronym>LDAP</acronym> authentication to use ldaps
        (Thomas Munro)
       </para>

       <para>
        We already supported <acronym>LDAP</acronym> over
        <acronym>TLS</acronym> by using ldaptls=1.  This new
        <acronym>TLS</acronym> <acronym>LDAP</acronym> method of encrypted
        <acronym>LDAP</acronym> is enabled with ldapscheme=ldaps or
        ldapurl=ldaps://.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-12 [cf1238cd9] Log diagnostic messages if errors occur during LDAP auth
-->

       <para>
        Improve <acronym>LDAP</acronym> logging of errors (Thomas Munro)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>Permissions</title>

     <itemizedlist>

      <listitem>
<!--
2018-04-06 [0fdc8495b] Add default roles for file/program access
2018-04-07 [da9b580d8] Refactor dir/file permissions
-->

       <para>
        Add default roles which controls file system access (Stephen Frost)
       </para>

       <para>
        Specifically, the new roles are: <link
        linkend="default-roles-table"><literal>pg_read_server_files</literal></link>,
        <literal>pg_write_server_files</literal>,
        <literal>pg_execute_server_program</literal>.  These roles now also
        control who can use <command>COPY</command> and extension <link
        linkend="file-fdw"><application>file_fdw</application></link>.
        Previously only super-users could use these functions, and that
        is still the default behavior.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-06 [e79350fef] Remove explicit superuser checks in favor of ACLs
-->

       <para>
        Allow access to file system functions to be controlled by
        <command>GRANT</command>/<command>REVOKE</command> permissions,
        rather than super-user checks (Stephen Frost)
       </para>

       <para>
        Specifically, these functions were modified:  <link
        linkend="functions-admin-genfile-table"><function>pg_ls_dir()</function></link>,
        <function>pg_read_file()</function>,
        <function>pg_read_binary_file()</function>,
        <function>pg_stat_file()</function>.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-09 [5ecc0d738] Restrict lo_import()/lo_export() via SQL permissions not
2017-11-14 [6d776522d] Document changes in large-object privilege checking.
-->

       <para>
        Use <command>GRANT</command>/<command>REVOKE</command>
        to control access to <link
        linkend="lo-import"><function>lo_import()</function></link>
        and <function>lo_export()</function> (Michael Paquier, Tom Lane)
       </para>

       <para>
        Previously super users were exclusively granted to access these
        functions.
       </para>

       <para>
        Compile-time option <literal>ALLOW_DANGEROUS_LO_FUNCTIONS</literal>
        has been removed.
       </para>
      </listitem>

      <listitem>
<!--
2017-12-05 [ab3f008a2] postgres_fdw: Judge password use by run-as user, not ses
-->

       <para>
        Use view owner not session owner when
        preventing non-password access to <link
        linkend="postgres-fdw"><application>postgres_fdw</application></link>
        tables (Robert Haas)
       </para>

       <para>
        <productname>PostgreSQL</productname> only allows super-users to
        access <application>postgres_fdw</application> tables without
        passwords, e.g. via <literal>peer</literal>.  Previously the
        session owner had to be a super-user to allow such access;  now
        the view owner is checked instead.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-14 [50c6bb022] Fix enforcement of SELECT FOR UPDATE permissions with ne
-->

       <para>
        Fix invalid locking permission check in <command>SELECT FOR
        UPDATE</command> on views (Tom Lane)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

    <sect4>
     <title>Server Configuration</title>

     <itemizedlist>

      <listitem>
<!--
2018-03-17 [8a3d94252] Add ssl_passphrase_command setting
-->

       <para>
        Add server setting <link
        linkend="guc-ssl-passphrase-command"><varname>ssl_passphrase_command</varname></link>
        to allow supplying of the the passphrase for <acronym>SSL</acronym>
        key files (Peter Eisentraut)
       </para>

       <para>
        Also add <link
        linkend="guc-ssl-passphrase-command-supports-reload"><varname>ssl_passphrase_command_supports_reload</varname></link>
        to specify whether the the <acronym>SSL</acronym> configuration
        should be reloaded and <varname>ssl_passphrase_command</varname>
        called during a server configuration reload.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-20 [c2513365a] Parameter toast_tuple_target controls TOAST for new rows
-->

       <para>
        Add storage parameter <link
        linkend="sql-createtable-storage-parameters"><varname>toast_tuple_target</varname></link>
        to control the minimum length before <acronym>TOAST</acronym>
        storage will be considered for new rows (Simon Riggs)
       </para>

       <para>
        The default <acronym>TOAST</acronym> threshold has not been
        changed.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-12 [6e7baa322] Introduce BYTES unit for GUCs.
-->

       <para>
        Allow server options related to memory and file sizes to be
        specified as number of bytes (Beena Emerson)
       </para>

       <para>
        The new unit is "B".  This is in addition to "kB", "MB", "GB"
        and "TB", which were accepted previously.
       </para>

      </listitem>

    </itemizedlist>

    </sect4>

    <sect4>
     <title><link linkend="wal">Write-Ahead Log</link> (<acronym>WAL</acronym>)</title>

     <itemizedlist>

      <listitem>
<!--
2017-09-19 [fc49e24fa] Make WAL segment size configurable at initdb time.
-->

       <para>
        Allow the <acronym>WAL</acronym> file size to be set via initdb
        (Beena Emerson)
       </para>

       <para>
        Previously the 16MB default could only be changed at compile time.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-07 [4b0d28de0] Remove secondary checkpoint
-->

       <para>
        No longer retain <acronym>WAL</acronym> that spans two checkpoints
        (Simon Riggs)
       </para>

       <para>
        The retention of <acronym>WAL</acronym> records for only one
        checkpoint is required.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-30 [4a33bb59d] Ensure that WAL pages skipped by a forced WAL switch are
-->

       <para>
        Fill the unused portion of force-switched <acronym>WAL</acronym>
        segment files with zeros for improved compressibility (Chapman
        Flack)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

   </sect3>

   <sect3>
    <title>Base Backup and Streaming Replication</title>

    <itemizedlist>

      <listitem>
<!--
2018-04-07 [5dfd1e5a6] Logical decoding of TRUNCATE
2018-04-07 [039eb6e92] Logical replication support for TRUNCATE
-->

       <para>
        Replicate <command>TRUNCATE</command> activity when using logical
        replication (Simon Riggs, Marco Nenciarini, Peter Eisentraut)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-28 [1eb6d6527] Store 2PC GID in commit/abort WAL recs for logical decod
-->

       <para>
        Pass prepared transaction information to logical replication
        subscribers (Nikhil Sontakke, Stas Kelvich)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-23 [8694cc96b] Exclude unlogged tables from base backups
2018-03-27 [920a5e500] Skip temp tables from basebackup.
2017-11-07 [98267ee83] Exclude pg_internal.init from BASE_BACKUP
-->

       <para>
        Exclude unlogged, temporary tables, and
        <filename>pg_internal.init</filename> files from streaming base
        backups (David Steele)
       </para>

       <para>
        There is no need to copy such files.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-03 [4eb77d50c] Validate page level checksums in base backups
-->

       <para>
        Allow heap pages checksums to be checked during streaming base
        backup (Michael Banck)
       </para>
      </listitem>

      <listitem>
<!--
2018-01-17 [9c7d06d60] Ability to advance replication slots
-->

       <para>
        Allow replication slots to be advanced programatically, rather
        than be consumed by subscribers (Petr Jelinek)
       </para>

       <para>
        This allows efficient advancement replication slots when the
        contents do not need to be consumed.  This is performed by
        <function>pg_replication_slot_advance()</function>.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-06 [6271fceb8] Add TIMELINE to backup_label file
-->

       <para>
        Add timeline information to the <link
        linkend="backup-lowlevel-base-backup"><filename>backup_label</filename></link>
        file (Michael Paquier)
       </para>

       <para>
        Also add a check that the <acronym>WAL</acronym> timeline matches
        the <filename>backup_label</filename> file's timeline.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-31 [9a895462d] Enhance pg_stat_wal_receiver view to display host and po
-->

       <para>
        Add host and port connection information to the
        <structname>pg_stat_wal_receiver</structname> system view
        (Haribabu Kommi)
       </para>
      </listitem>

    </itemizedlist>

   </sect3>

   <sect3>
    <title><link linkend="sql-window">Window Functions</link></title>

    <itemizedlist>

      <listitem>
<!--
2018-02-07 [0a459cec9] Support all SQL:2011 options for window frame clauses.
2018-02-24 [8b29e88cd] Add window RANGE support for float4, float8, numeric.
-->

       <para>
        Add window function features to complete SQL:2011 compliance
        (Oliver Ford, Tom Lane)
       </para>

       <para>
        Specifically, allow <literal>RANGE</literal> mode to use
        <literal>PRECEDING</literal> and <literal>FOLLOWING</literal> to
        specify peer groups with values plus or minus the specified offset.
        Add <literal>GROUPS</literal> mode to include plus or minus the
        number of peer groups.  Frame exclusion syntax was also added.
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

   <sect3>
    <title>Utility Commands</title>

    <itemizedlist>

      <listitem>
<!--
2018-03-28 [16828d5c0] Fast ALTER TABLE ADD COLUMN with a non-NULL default
-->

       <para>
        Allow <command>ALTER TABLE</command> to add a column with
        a non-null default without a table rewrite (Andrew Dunstan,
        Serge Rielau)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-30 [34c20de4d] Allow to lock views.
2018-03-31 [1b26bd408] Fix bug with view locking code.
-->

       <para>
        Allow views to be locked by locking the underlying tables
        (Yugo Nagata)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-06 [5b6d13eec] Allow SET STATISTICS on expression indexes
-->

       <para>
        Allow <command>ALTER INDEX</command> to set statistics-gathering
        targets for expression indexes (Alexander Korotkov, Adrien nayrat)
       </para>

       <para>
        In <application>psql</application>, \d+ now shows the statistics
        target for indexes.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-03 [11d8d72c2] Allow multiple tables to be specified in one VACUUM or A
-->

       <para>
        Allow multiple tables to be specified in one
        <command>VACUUM</command> or <command>ANALYZE</command> command
        (Nathan Bossart)
       </para>

       <para>
        Also, if any table mentioned in <command>VACUUM</command> uses
        a column list, then <command>ANALYZE</command> keyword must be
        supplied;  previously <command>ANALYZE</command> was implied in
        such cases.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-05 [854dd8cff] Add parenthesized options syntax for ANALYZE.
-->

       <para>
        Add parenthesized options syntax to <command>ANALYZE</command>
        (Nathan Bossart)
       </para>

       <para>
        This is similar to the syntax supported by
        <command>VACUUM</command>.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-14 [4de2d4fba] Explicitly track whether aggregate final functions modif
2017-10-16 [be0ebb65f] Allow the built-in ordered-set aggregates to share trans
-->

       <para>
        Add <command>CREATE AGGREGATE</command> option to specify the
        behavior of the aggregate finalization function (Tom Lane)
       </para>

       <para>
        This is useful for allowing aggregate functions be optimized and
        to work as window functions.
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

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

    <itemizedlist>

      <listitem>
<!--
2017-09-30 [c12d570fa] Support arrays over domains.
-->

       <para>
        Allow the creation of arrays of domains (Tom Lane)
       </para>

       <para>
        This also allows <function>array_agg()</function> to be used
        on domains.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-26 [37a795a60] Support domains over composite types.
2017-10-26 [820c0305f] Support domains over composite types in PL/Tcl.
2017-10-28 [60651e4cd] Support domains over composite types in PL/Perl.
2017-11-16 [687f096ea] Make PL/Python handle domain-type conversions correctly.
-->

       <para>
        Support domains over composite types (Tom Lane)
       </para>

       <para>
        Also allow PL/PL/Perl, PL/Python, and PL/Tcl to handle
        composite-domain function arguments and results.  Also improve
        PL/Python domain handling.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-29 [c0cbe00fe] Add casts from jsonb
-->

       <para>
        Add casts from jsonb scalars to numeric and boolean data types
        (Anastasia Lubennikova)
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

   <sect3>
    <title>Functions</title>

    <itemizedlist>

      <listitem>
<!--
2018-02-22 [10cfce34c] Add user-callable SHA-2 functions
-->

       <para>
        Add <acronym>SHA-2</acronym> family of hash functions (Peter
        Eisentraut)
       </para>

       <para>
        Specifically, <link
        linkend="functions-binarystring-other"><function>sha224()</function></link>,
        <function>sha256()</function>, <function>sha384()</function>,
        <function>sha512()</function> were added.
       </para>
      </listitem>

      <listitem>
<!--
2017-08-31 [81c5e46c4] Introduce 64-bit hash functions with a 64-bit seed.
-->

       <para>
        Add support for 64-bit non-cryptographic hash functions (Robert
        Haas, Amul Sul)
       </para>
      </listitem>

      <listitem>
<!--
2018-01-09 [11b623dd0] Implement TZH and TZM timestamp format patterns
-->

       <para>
        Allow <function>to_char()</function> and
        <function>to_timestamp()</function> to specify the time zone's
        hours and minutes from <acronym>UTC</acronym> (Nikita Glukhov,
        Andrew Dunstan)
       </para>

       <para>
        This is done with format specifications <link
        linkend="functions-formatting-datetime-table"><literal>TZH</literal></link>
        and <literal>TZM</literal>.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-09 [69c3936a1] Expression evaluation based aggregate transition invocat
-->

       <para>
        Improve the speed of aggregate computations (Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-05 [1664ae197] Add websearch_to_tsquery
-->

       <para>
        Add text search function <link
        linkend="textsearch-functions-table"><function>websearch_to_tsquery()</function></link>
        that supports a queries syntax similar to that used by web search
        engines (Victor Drobny, Dmitry Ivanov)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-07 [1c1791e00] Add json(b)_to_tsvector function
-->

       <para>
        Add function <link
        linkend="textsearch-functions-table"><function>json(b)_to_tsvector()</function></link>
        to create text search query for matching
        <type>JSON</type>/<type>JSONB </type>values (Dmitry Dolgov)
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

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

    <itemizedlist>

      <listitem>
<!--
2017-11-30 [e4128ee76] SQL procedures
2018-02-22 [76b6aa41f] Support parameters in CALL
2018-03-14 [33803f67f] Support INOUT arguments in procedures
2018-04-14 [a8677e3ff] Support named and default arguments in CALL
-->

       <para>
        Add SQL procedures, which can start and commit their own
        transactions (Peter Eisentraut)
       </para>

       <para>
        They are created with the new <link
        linkend="sql-createprocedure"><command>CREATE
        PROCEDURE</command></link> command and invoked via <link
        linkend="sql-call"><command>CALL</command></link>.  The new
        <command>ALTER</command>/<command>DROP ROUTINE</command> commands
        allows altering/dropping of procedures, functions, and aggregates.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-22 [8561e4840] Transaction control in PL procedures
2018-03-28 [d92bc83c4] PL/pgSQL: Nested CALL with transactions
2018-03-28 [056a5a3f6] Allow committing inside cursor loop
2018-04-05 [b981275b6] PL/pgSQL: Add support for SET TRANSACTION
-->

       <para>
        Add transaction control to PL/pgSQL, PL/Perl, PL/Python, PL/Tcl,
        and <acronym>SPI</acronym> server-side languages (Peter Eisentraut)
       </para>

       <para>
        Transaction control is only available to top-transaction-level
        <command>CALL</command>s or in nested PL/pgSQL DO and
        <command>CALL</command> blocks that only contain other PL/pgSQL
        <command>DO</command> and <command>CALL</command> blocks.
        ACCURATE?
       </para>
      </listitem>

      <listitem>
<!--
2018-02-13 [f9263006d] Support CONSTANT/NOT NULL/initial value for plpgsql comp
-->

       <para>
        Add the ability to define PL/pgSQL record types as not null,
        constant, or with initial values (Tom Lane)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-28 [3f44e3db7] Transforms for jsonb to PL/Python
-->

       <para>
        Add extension <application>jsonb_plpython</application> to
        transform <type>JSONB </type>to/from PL/Python types (Anthony
        Bykov)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-03 [341e16618] Transforms for jsonb to PL/Perl
-->

       <para>
        Add extension <application>jsonb_plperl</application> to transform
        <type>JSONB </type>to/from PL/Perl types (Anthony Bykov)
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

   <sect3>
    <title>Client Interfaces</title>

    <itemizedlist>

      <listitem>
<!--
2018-03-17 [e3bdb2d92] Set libpq sslcompression to off by default
-->

       <para>
        Change libpq to disable compression by default (Peter Eisentraut)
       </para>

       <para>
        Compression is already disabled in modern OpenSSL versions and
        the libpq setting had no effect in that case.
       </para>
      </listitem>

      <listitem>
<!--
2017-08-25 [d22e9d530] Implement <literal>DO CONTINUE</literal> action for <literal>ECPG WHENEVER</literal> statement
-->

       <para>
        Add <literal>DO CONTINUE</literal> action to the <literal>ECPG
        WHENEVER</literal> statement (Vinayak Pokale)
       </para>

       <para>
        This generates a C 'continue' statement, causing a return to the
        top of the contained loop when the specified condition occurs.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-14 [3b7ab4380] Add Oracle like handling of char arrays.
-->

       <para>
        Add ecpg mode to enable Oracle Pro*C handling of char arrays.
       </para>

       <para>
        This mode is enabled with <option>-C</option>.
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

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

    <sect4>
     <title><xref linkend="app-psql"/></title>

     <itemizedlist>

      <listitem>
<!--
2017-09-05 [49ca462eb] Add \gdesc psql command.
-->

       <para>
        Add <application>psql</application> command \gdesc to display
        the column names and types of the query output (Pavel Stehule)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-12 [69835bc89] Add psql variables to track success/failure of SQL queri
-->

       <para>
        Add <application>psql</application> variables to report query
        activity and errors (Fabien Coelho)
       </para>

       <para>
        Specifically, the new variables are <literal>ERROR</literal>,
        <literal>SQLSTATE</literal>, <literal>ROW_COUNT</literal>,
        <literal>LAST_ERROR_MESSAGE</literal>, and
        <literal>LAST_ERROR_SQLSTATE</literal>.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-21 [d57c7a7c5] Provide a test for variable existence in psql
-->

       <para>
        Allow <application>psql</application> to test for the existence
        of a variable (Fabien Coelho)
       </para>

       <para>
        Specifically , the syntax <literal>:{?variable_name}</literal>
        allows a variable's existence to be tested in an \if statement.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-05 [5e8304fdc] In psql, use PSQL_PAGER in preference to PAGER, if it's
-->

       <para>
        Add <envar>PSQL_PAGER</envar> to control
        <application>psql</application>'s pager (Pavel Stehule)
       </para>

       <para>
        This allows <application>psql</application>'s default pager to
        be specified as a separate environment variable from the pager
        for other applications.  <envar>PAGER</envar> is still honored
        if <envar>PSQL_PAGER</envar> is not set.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-23 [05b6ec39d] Show partition info from psql \d+
-->

       <para>
        Have psql \d+ always show the partition information (Amit Langote,
        Ashutosh Bapat)
       </para>

       <para>
        Previously partition information would not be displayed for a
        partitioned table if it had no partitions.  Also indicate which
        partitions are themselves partitioned.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-29 [15be27460] Avoid misleading psql password prompt when username is m
-->

       <para>
        Have <application>psql</application> report the proper user name
        before the password prompt (Tom Lane)
       </para>

       <para>
        Previously, combinations of <option>-U</option> and a user name
        embedded in a <acronym>URI</acronym> caused incorrect reporting.
        Also suppress the user name before the password prompt when
        <option>--password</option> is specified.
       </para>
      </listitem>

      <listitem>
<!--
2018-02-01 [df9f599bc] psql:  Add quit/help behavior/hint, for other tool porta
-->

       <para>
        Allow <command>quit</command> and <command>exit</command> to
        exit <application>psql</application> when used in an empty buffer
        (Bruce Momjian)
       </para>

       <para>
        Also add hints of how to exit when <command>quit</command> and
        <command>exit</command> are used alone on a line in a non-empty
        buffer.  Add a similar hint for <command>help</command>.
       </para>
      </listitem>

      <listitem>
<!--
2018-02-12 [91389228a] psql:  give ^D hint for \q in place where \q is ignored
-->

       <para>
        Have <application>psql</application> hint at using control-D
        when <command>\q</command> is entered alone on a line but ignored
        (Bruce Momjian)
       </para>

       <para>
        For example, <command>\q</command> does not exit when supplied
        in character strings.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-03 [2b8c94e1b] Improve tab-completion for ALTER INDEX RESET/SET.
-->

       <para>
        Improve tab-completion for <command>ALTER INDEX
        RESET</command>/<command>SET</command> (Masahiko Sawada)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-05 [722408bcd] Add infrastructure to support server-version-dependent t
-->

       <para>
        Add infrastructure to allow <application>psql</application>
        to customize tab completion queries based on the server version
        (Tom Lane)
       </para>

       <para>
        Previously tab completion queries could fail.
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

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

     <itemizedlist>

      <listitem>
<!--
2018-01-09 [bc7fa0c15] Improve scripting language in pgbench
-->

       <para>
        Add <application>pgbench</application> expressions support for
        NULLs, booleans, and some functions and operators (Fabien Coelho)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-22 [f67b113ac] Add \if support to pgbench
-->

       <para>
        Add <literal>\if</literal> conditional support to
        <application>pgbench</application> (Fabien Coelho)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-04 [9d36a3866] Adjust pgbench to allow non-ASCII characters in variable
-->

       <para>
        Allow the use of non-<acronym>ASCII</acronym> characters in
        <application>pgbench</application> variable names (Fabien Coelho)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-13 [591c504fa] Allow running just selected steps of pgbench's initializ
-->

       <para>
        Add <application>pgbench</application> option
        <option>--init-steps</option> to control the initialization steps
        performed (Masahiko Sawada)
       </para>
      </listitem>

      <listitem>
<!--
2017-12-14 [1fcd0adeb] Add approximated Zipfian-distributed random generator to
-->

       <para>
        Add approximated Zipfian-distributed random generator to
        <application>pgbench</application> (Alik Khilazhev)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-26 [64f85894a] Set random seed for pgbench.
-->

       <para>
        Allow the random seed to be set in
        <application>pgbench</application> (Fabien Coelho)
       </para>
      </listitem>

      <listitem>
<!--
2017-12-27 [7a727c180] Add pow(), aka power(), function to pgbench.
-->

       <para>
        Allow <application>pgbench</application> to do exponentiation
        with <function>pow()</function> and  <function>power()</function>
        (Ra&uacute;l Mar&iacute;n Rodr&iacute;guez)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-21 [e51a04840] Add general purpose hasing functions to pgbench.
-->

       <para>
        Add hashing functions to <application>pgbench</application>
        (Ildar Musin)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-04 [c23bb6bad] Fix some subtle problems in pgbench transaction stats co
2017-11-21 [16827d442] pgbench: fix stats reporting when some transactions are
-->

       <para>
        Make <application>pgbench</application> statistics more
        accurate when using <option>--latency-limit</option> and
        <option>--rate</option> (Fabien Coelho)
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

   </sect3>

   <sect3>
    <title>Server Applications</title>

    <itemizedlist>

      <listitem>
<!--
2017-09-27 [3709ca1cf] pg_basebackup: Add option to create replication slot
-->

       <para>
        Add <link
        linkend="app-pgbasebackup"><application>pg_basebackup</application></link>
        option to create a named replication slot (Michael Banck)
       </para>

       <para>
        The option <option>--create-slot</option> creates
        the named replication slot (<option>--slot</option>)
        when the <acronym>WAL</acronym> streaming method
        (<option>-wal-method=stream</option>) is used.
       </para>

       <para>
        IS IT CLEAR FROM THE DOCS THAT THE REPLICATION SLOT IS NOT
        TEMPORARY?
       </para>
      </listitem>

      <listitem>
<!--
2018-04-07 [c37b3d08c] Allow group access on PGDATA
-->

       <para>
        Allow <link
        linkend="app-initdb"><application>initdb</application></link>
        to set group read access to the data directory (David Steele)
       </para>

       <para>
        This is accomplished with the initdb
        <option>--allow-group-access</option> flag.  Administrators
        can also set group permissions on the empty data
        directory before running initdb.  Server variable <link
        linkend="guc-data-directory"><varname>data_directory_mode</varname></link>
        allows reading of data directory group permissions.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-05 [1fde38bea] Allow on-line enabling and disabling of data checksums
2018-04-09 [a228cc13a] Revert "Allow on-line enabling and disabling of data che
-->

       <para>
        Add <link
        linkend="pgverifychecksums"><application>pg_verify_checksums</application></link>
        tool to verify database checksums while offline (Magnus Hagander)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-25 [bf4a8676c] pg_resetwal: Allow users to change the WAL segment size
-->

       <para>
        Allow <link
        linkend="app-pgresetwal"><application>pg_resetwal</application></link>
        to change the <acronym>WAL</acronym> segment size via
        <option>--wal-segsize</option> (Nathan Bossart)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-24 [e22b27f0c] Add long options to pg_resetwal and pg_controldata
-->

       <para>
        Add long options to <application>pg_resetwal</application>
        and <application>pg_controldata</application> (Nathan Bossart,
        Peter Eisentraut)
       </para>
      </listitem>

      <listitem>
<!--
2017-10-29 [5f3971291] pg_receivewal: Add - -no-sync option.
-->

       <para>
        Add <link
        linkend="app-pgreceivewal"><application>pg_receivewal</application></link>
        option <option>--no-sync</option> to prevent synchronous
        <acronym>WAL</acronym> writes, for testing (Michael Paquier)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-11 [6d9fa5264] pg_receivewal: Add - -endpos option
-->

       <para>
        Add <application>pg_receivewal</application> option
        <option>--endpos</option> to specify when <acronym>WAL</acronym>
        receiving should stop (Michael Paquier)
       </para>
      </listitem>

      <listitem>
<!--
2017-10-01 [2e83db3ad] Allow pg_ctl kill to send SIGKILL.
-->

       <para>
        Allow <link
        linkend="app-pg-ctl"><application>pg_ctl</application></link>
        to send the <literal>SIGKILL</literal> signal to processes
        (Andres Freund)
       </para>

       <para>
        This was originally unsupported due to concerns over its misuse.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-29 [266b6acb3] Make pg_rewind skip files and directories that are remov
-->

       <para>
        Reduce the number of files copied by <link
        linkend="app-pgrewind"><application>pg_rewind</application></link>
        (Michael Paquier)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-09 [5d5aeddab] Make sure pg_rewind can't run as root
-->

       <para>
        Prevent <application>pg_rewind</application> from running as
        <literal>root</literal> (Michael Paquier)
       </para>

      </listitem>

     </itemizedlist>

    <sect4>
     <title><link linkend="app-pgdump"><application>pg_dump</application></link>,
     <link linkend="app-pg-dumpall"><application>pg_dumpall</application></link>,
     <link linkend="app-pgrestore"><application>pg_restore</application></link></title>

     <itemizedlist>

      <listitem>
<!--
2017-09-01 [84be67181] pg_dumpall: Add a -E flag to set the encoding, like pg_d
-->

       <para>
        Add <application>pg_dumpall</application> option
        <option>--encoding</option> to control encoding (Michael Paquier)
       </para>

       <para>
        <application>pg_dump</application> already had this option.
       </para>
      </listitem>

      <listitem>
<!--
2017-08-14 [23d7680d0] pg_dump: Add a - -load-via-partition-root option.
-->

       <para>
        Add <application>pg_dump</application> option
        <option>--load-via-partition-root</option> to force loading of
        data into the partition's root table, rather than the original
        partitions
(Rushabh Lathia)
       </para>

       <para>
        This is useful if the system to be loaded has a different collation
        definitions or endianness, requiring the rows to be stored in
        different partitions.
       </para>
      </listitem>

      <listitem>
<!--
2018-01-25 [1368e92e1] Support - -no-comments in pg_dump, pg_dumpall, pg_restore
-->

       <para>
        Add ability to suppress dumping and restoring of comments
        (Robins Tharakan)
       </para>

       <para>
        The new <application>pg_dump</application>,
        <application>pg_dumpall</application>, and
        <application>pg_restore</application> option is
        <option>--no-comments</option>.
       </para>

      </listitem>

     </itemizedlist>

    </sect4>

   </sect3>

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

    <itemizedlist>

      <listitem>
<!--
2018-01-21 [1cc4f536e] Support huge pages on Windows
-->

       <para>
        Add support for <firstterm>large pages</firstterm> on Windows
        (Takayuki Tsunakawa, Thomas Munro)
       </para>

       <para>
        This is controlled by the <link
        linkend="guc-huge-pages">huge_pages</link> configuration
        parameter.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-04 [f044d71e3] Use ARMv8 CRC instructions where available.
-->

       <para>
        Add support for <productname>ARMv8</productname> hardware
        <acronym>CRC</acronym> calculations (Yuqi Gu, Heikki Linnakangas)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-06 [1c53f612b] Escape &lt; and &amp; in SGML
2017-10-17 [c29c57890] Don't use SGML empty tags
2017-10-20 [1ff01b390] Convert SGML IDs to lower case
2017-11-23 [3c49c6fac] Convert documentation to DocBook XML
-->

       <para>
        Convert documentation to DocBook <acronym>XML</acronym> (Peter
        Eisentraut, Alexander Lakhin, J&uuml;rgen Purtz)
       </para>

       <para>
        The file names still use an <filename>sgml</filename> extension
        for compatibility with back branches.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-03 [a351679c8] Trivial adjustments in preparation for bootstrap data co
2018-04-08 [372728b0d] Replace our traditional initial-catalog-data format with
2018-04-26 [a0854f107] Avoid parsing catalog data twice during BKI file constru
-->

       <para>
        Overhaul the way system tables are defined for bootstrap use
        (John Naylor)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-05 [eed1ce72e] Allow background workers to bypass datallowconn
-->

       <para>
        Allow background workers to attach to databases that normally
        disallow connections (Magnus Hagander)
       </para>
      </listitem>

      <listitem>
<!--
2017-10-04 [212e6f34d] Replace binary search in fmgr_isbuiltin with a lookup ar
-->

       <para>
        Speed up lookups of builtin function names matching oids (Andres
        Freund)
       </para>

       <para>
        The previous binary search now uses a lookup array.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-11 [1de09ad8e] Add more efficient functions to pqformat API.
-->

       <para>
        Speed up construction of query results (Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2017-10-13 [141fd1b66] Improve sys/catcache performance.
-->

       <para>
        Improve access speed to system caches (Andres Freund)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-23 [a4ccc1cef] Generational memory allocator
-->

       <para>
        Add a generational memory allocator which is optimized for serial
        allocation/deallocation (Tomas Vondra)
       </para>

       <para>
        This reduces memory usage for logical decoding.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-22 [7c91a0364] Sync up our various ways of estimating pg_class.reltuple
-->

       <para>
        Make the computation of system column
        <structname>pg_class</structname>.<structfield>reltuples</structfield>
        consistent (Tomas Vondra)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-25 [46cda5bf7] Change pgindent/README to specify that we use perltidy v
-->

       <para>
        Update to use <application>perltidy</application> version
        <literal>20170521</literal> (Tom Lane)
       </para>
      </listitem>

    </itemizedlist>

   </sect3>

   <sect3>
    <title>Additional Modules</title>

    <itemizedlist>

      <listitem>
<!--
2017-08-21 [79ccd7cbd] pg_prewarm: Add automatic prewarm feature.
-->

       <para>
        Allow extension <link
        linkend="pgprewarm"><application>pg_prewarm</application></link>
        to restore the previous shared buffer contents on startup (Mithun
        Cy, Robert Haas)
       </para>

       <para>
        This is accomplished by having
        <application>pg_prewarm</application> store the shared buffer
        relation/offset values to disk occasionally during server operation
        and shutdown.
       </para>
      </listitem>

      <listitem>
<!--
2018-03-21 [be8a7a686] Add strict_word_similarity to pg_trgm module
-->

       <para>
        Add <link linkend="pgtrgm"><application>pgtrgm</application></link>
        function <function>strict_word_similarity()</function> to compute
        the similarity of whole words (Alexander Korotkov)
       </para>

       <para>
        The function <function>word_similarity()</function> already
        existed for this purpose, but it was designed to find similar
        parts of words, while <function>strict_word_similarity()</function>
        computes the similarity to whole words.
       </para>
      </listitem>

      <listitem>
<!--
2017-09-19 [f24649976] Add citext_pattern_ops for citext contrib module
-->

       <para>
        Allow creation of indexes on <link
        linkend="citext"><application>citext</application></link> extension
        columns that can be used by <literal>LIKE</literal> comparisons
        (Alexey Chernyshov)
       </para>

       <para>
        Specifically, indexes must be created using the
        <literal>citext_pattern_ops</literal> operator class.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-05 [f4cd7102b] Add support of bool, bpchar, name and uuid to btree_gin
-->

       <para>
        Allow <link
        linkend="btree-gin"><application>btree_gin</application></link>
        to index <type>bool</type>, <type>bpchar</type>, <type>name</type>
        and <type>uuid</type> data types (Matheus Oliveira)
       </para>
      </listitem>

      <listitem>
<!--
2017-11-20 [de1d042f5] Support index-only scans in contrib/cube and contrib/seg
-->

       <para>
        Allow <link linkend="cube"><application>cube</application></link>
        and <link linkend="seg"><application>seg</application></link>
        extensions using GiST indexes to perform index-only scans
        (Andrey Borodin)
       </para>
      </listitem>

      <listitem>
<!--
2018-01-11 [f50c80dbb] llow negative coordinate for ~&gt; (cube, int) operator
-->

       <para>
        Allow retrieval of negative cube coordinates using the ~&gt;
        operator (Alexander Korotkov)
       </para>

       <para>
        This is useful for KNN-GiST searches.  HOW?
       </para>
      </listitem>

      <listitem>
<!--
2017-08-16 [ec0a69e49] Extend the default rules file for contrib/unaccent with
-->

       <para>
        Add Vietnamese letter detection to the <link
        linkend="unaccent"><application>unaccent</application></link>
        extension (Dang Minh Huong, Michael Paquier)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-31 [7f563c09f] Add amcheck verification of heap relations belonging to
-->

       <para>
        Enhance <link
        linkend="amcheck"><application>amcheck</application></link>
        to check that each heap tuple has an index entry (Peter Geoghegan)
       </para>
      </listitem>

      <listitem>
<!--
2018-04-06 [11523e860] Support new default roles with adminpack
-->

       <para>
        Have <link
        linkend="adminpack"><application>adminpack</application></link>
        use the new default file system access roles (Stephen Frost)
       </para>

       <para>
        Previously only super-users could call adminpack functions;
        now role permissions are checked.
       </para>
      </listitem>

      <listitem>
<!--
2017-10-11 [cff440d36] pg_stat_statements: Widen query IDs from 32 bits to 64 b
-->

       <para>
        Increase  <structname>pg_stat_statement</structname>'s query id
        to 64 bits (Robert Haas)
       </para>

       <para>
        This greatly reduces the chance of query id hash collisions.
        The query id can now potentially display as a negative value.
       </para>
      </listitem>

      <listitem>
<!--
2018-04-05 [1fd869066] Install errcodes.txt for use by extensions.
-->

       <para>
        Install <filename>errcodes.txt</filename> to provide access to
        the error codes reported by <productname>PostgreSQL</productname>
        (Thomas Munro)
       </para>
      </listitem>

      <listitem>
<!--
2018-03-21 [846b5a525] Prevent extensions from creating custom GUCs that are GU
-->

       <para>
        Prevent extensions from creating custom server variables that
        take a quoted list of values (Tom Lane)
       </para>

       <para>
        This was never intended to be supported.
       </para>
      </listitem>

      <listitem>
<!--
2017-11-17 [527878635] Remove contrib/start-scripts/osx/.
-->

       <para>
        Remove <filename>contrib/start-scripts/osx</filename> since they
        are no longer recommended (Tom Lane)
       </para>
      </listitem>

      <listitem>
<!--
2017-09-22 [5d3cad564] Remove contrib/chkpass
-->

       <para>
        Remove extension chkpass (Peter Eisentraut)
       </para>

       <para>
        This extension no longer served as a usable security tool or
        example of how to write an extension.
       </para>

      </listitem>

    </itemizedlist>

   </sect3>

  </sect2>

  <sect2>
   <title>Acknowledgments</title>

   <para>
    The following individuals (in alphabetical order) have contributed to this
    release as patch authors, committers, reviewers, testers, or reporters of
    issues.
   </para>

   <simplelist>
    <member>XXX</member>
   </simplelist>
  </sect2>

 </sect1>
