This release has been largely focused on performance improvements, though
new SQL features are not lacking. Work also continues in the area of
replication support. Major enhancements include:
Allow queries to retrieve data only from indexes, avoiding heap
access (index-only scans)
Allow the planner to generate custom plans for specific parameter
values even when using prepared statements
Improve the planner's ability to use nested loops with inner
index scans
Allow streaming replication slaves to forward data to other slaves
(cascading
replication)
Allow pg_basebackup
to make base backups from standby servers
Add a pg_receivexlog
tool to archive WAL file changes as they are written
Add the SP-GiST (Space-Partitioned
GiST) index access method
Remove the spclocation field from pg_tablespace
(Magnus Hagander)
This field was duplicative of the symbolic links that actually define
tablespace locations, and thus risked errors of omission when moving
a tablespace. This change allows tablespace directories to be moved
while the server is down, by manually adjusting the symbolic links.
To replace this field, we have added pg_tablespace_location()
to allow querying of the symbolic links.
Move tsvector most-common-element statistics to new
pg_stats columns
(Alexander Korotkov)
Consult most_common_elems
and most_common_elem_freqs for the data formerly
available in most_common_vals
and most_common_freqs for a tsvector column.
Users should now use hstore(text, text). Since
PostgreSQL 9.0, a warning message has been
emitted when an operator named => is created because
the SQL standard reserves that token for
another use.
Ensure that xpath()
escapes special characters in string values (Florian Pflug)
Without this it is possible for the result not to be valid
XML.
Make pg_relation_size()
and friends return NULL if the object does not exist (Phil Sorber)
This prevents queries that call these functions from returning
errors immediately after a concurrent DROP.
This change reverts an ill-considered change made in release 7.3.
Measuring from UTC midnight was inconsistent
because it made the result dependent on the timezone setting, which
computations for timestamp without time zone should not be.
The previous behavior remains available by casting the input value
to timestamp with time zone.
Properly parse time strings with trailing yesterday,
today, and tomorrow (Dean Rasheed)
Previously, SELECT '04:00:00 yesterday'::timestamp
returned yesterday's date at midnight.
Fix to_date() and
to_timestamp() to wrap incomplete dates toward 2020
(Bruce Momjian)
Previously, supplied years and year masks of less than four digits
wrapped inconsistently.
Prevent ALTER
DOMAIN from working on non-domain types (Peter
Eisentraut)
Owner and schema changes were previously possible on non-domain
types.
No longer forcibly lowercase procedural language names in CREATE FUNCTION
(Robert Haas)
While unquoted language identifiers are still lowercased, strings
and quoted identifiers are no longer forcibly down-cased.
Thus for example CREATE FUNCTION ... LANGUAGE 'C'
will no longer work; it must be spelled 'c', or better
omit the quotes.
Change system-generated names of foreign key enforcement triggers
(Tom Lane)
This change ensures that the triggers fire in the correct order in
some corner cases involving self-referential foreign key constraints.
Provide consistent backquote, variable
expansion, and quoted substring behavior in psql meta-command
arguments (Tom Lane)
Previously, such references were treated oddly when not separated by
whitespace from adjacent text. For example 'FOO'BAR was
output as FOO BAR (unexpected insertion of a space) and
FOO'BAR'BAZ was output unchanged (not removing the quotes
as most would expect).
No longer treat clusterdb
table names as double-quoted; no longer treat reindexdb table
and index names as double-quoted (Bruce Momjian)
Users must now include double-quotes in the command arguments if
quoting is wanted.
createuser
no longer prompts for option settings by default (Peter Eisentraut)
Use --interactive to obtain the old behavior.
Disable prompting for the user name in dropuser unless
--interactive is specified (Peter Eisentraut)
This allows changing the names and locations of the files that were
previously hard-coded as server.crt,
server.key, root.crt, and
root.crl in the data directory.
The server will no longer examine root.crt or
root.crl by default; to load these files, the
associated parameters must be set to non-default values.
Remove the silent_mode parameter (Heikki Linnakangas)
Similar behavior can be obtained with pg_ctl start
-l postmaster.log.
Remove the wal_sender_delay parameter,
as it is no longer needed (Tom Lane)
Remove the custom_variable_classes parameter (Tom Lane)
The checking provided by this setting was dubious. Now any
setting can be prefixed by any class name.
Rename pg_stat_activity.procpid
to pid, to match other system tables (Magnus Hagander)
Create a separate pg_stat_activity column to
report process state (Scott Mead, Magnus Hagander)
The previous query and query_start
values now remain available for an idle session, allowing enhanced
analysis.
Rename pg_stat_activity.current_query to
query because it is not cleared when the query
completes (Magnus Hagander)
Change all SQL-level statistics timing values
to be float8 columns measured in milliseconds (Tom Lane)
This change eliminates the designed-in assumption that the values
are accurate to microseconds and no more (since the float8
values can be fractional).
The columns affected are
pg_stat_user_functions.total_time,
pg_stat_user_functions.self_time,
pg_stat_xact_user_functions.total_time,
and
pg_stat_xact_user_functions.self_time.
The statistics functions underlying these columns now also return
float8 milliseconds, rather than bigint
microseconds.
contrib/pg_stat_statements'
total_time column is now also measured in
milliseconds.
Allow queries to retrieve data only from indexes, avoiding heap
access (Robert Haas, Ibrar Ahmed, Heikki Linnakangas, Tom Lane)
This feature is often called index-only scans.
Heap access can be skipped for heap pages containing only tuples that
are visible to all sessions, as reported by the visibility map; so
the benefit applies mainly to mostly-static data. The visibility map
was made crash-safe as a necessary part of implementing this feature.
Add the SP-GiST (Space-Partitioned
GiST) index access method (Teodor Sigaev, Oleg Bartunov, Tom
Lane)
SP-GiST is comparable to GiST in flexibility, but supports
unbalanced partitioned search structures rather than balanced
trees. For suitable problems, SP-GiST can be faster than GiST in both
index build time and search time.
Allow group commit to work effectively under heavy load (Peter
Geoghegan, Simon Riggs, Heikki Linnakangas)
Previously, batching of commits became ineffective as the write
workload increased, because of internal lock contention.
Allow uncontended locks to be managed using a new
fast-path lock mechanism (Robert Haas)
Reduce overhead of creating virtual transaction ID locks (Robert
Haas)
Reduce the overhead of serializable isolation level locks (Dan
Ports)
Improve PowerPC and Itanium spinlock performance (Manabu Ori,
Robert Haas, Tom Lane)
Reduce overhead for shared invalidation cache messages (Robert
Haas)
Move the frequently accessed members of the PGPROC
shared memory array to a separate array (Pavan
Deolasee, Heikki Linnakangas, Robert Haas)
Improve COPY performance by adding tuples to
the heap in batches (Heikki Linnakangas)
Improve GiST index performance for geometric data types by producing
better trees with less memory allocation overhead (Alexander Korotkov)
Improve GiST index build times (Alexander Korotkov, Heikki
Linnakangas)
Allow hint bits to be set sooner for temporary and unlogged tables
(Robert Haas)
Allow sorting to be performed by inlined,
non-SQL-callable comparison functions (Peter
Geoghegan, Robert Haas, Tom Lane)
Make the number of CLOG buffers scale based on shared_buffers
(Robert Haas, Simon Riggs, Tom Lane)
Improve performance of buffer pool scans that occur when tables or
databases are dropped (Jeff Janes, Simon Riggs)
Improve performance of checkpointer's fsync-request queue
when many tables are being dropped or truncated (Tom Lane)
Pass the safe number of file descriptors to child processes on Windows
(Heikki Linnakangas)
This allows Windows sessions to use more open file descriptors than
before.
Create a dedicated background process to perform checkpoints (Simon
Riggs)
Formerly the background writer did both dirty-page writing and
checkpointing. Separating this into two processes allows each goal
to be accomplished more predictably.
Improve asynchronous commit behavior by waking the walwriter sooner
(Simon Riggs)
Previously, only wal_writer_delay
triggered WAL flushing to disk; now filling a
WAL buffer also triggers WAL
writes.
Allow the bgwriter, walwriter, checkpointer, statistics collector,
log collector, and archiver background processes to sleep more
efficiently during periods of inactivity (Peter Geoghegan, Tom Lane)
This series of changes reduces the frequency of process wake-ups when
there is nothing to do, dramatically reducing power consumption on
idle servers.
Allow the planner to generate custom plans for specific parameter
values even when using prepared statements
(Tom Lane)
In the past, a prepared statement always had a single
"generic" plan that was used for all parameter values, which
was frequently much inferior to the plans used for non-prepared
statements containing explicit constant values. Now, the planner
attempts to generate custom plans for specific parameter values.
A generic plan will only be used after custom plans have repeatedly
proven to provide no benefit. This change should eliminate the
performance penalties formerly seen from use of prepared statements
(including non-dynamic statements in PL/pgSQL).
Improve the planner's ability to use nested loops with inner
index scans (Tom Lane)
The new "parameterized path" mechanism allows inner
index scans to use values from relations that are more than one join
level up from the scan. This can greatly improve performance in
situations where semantic restrictions (such as outer joins) limit
the allowed join orderings.
Improve the planning API for foreign data wrappers
(Etsuro Fujita, Shigeru Hanada, Tom Lane)
Wrappers can now provide multiple access "paths" for their
tables, allowing more flexibility in join planning.
Recognize self-contradictory restriction clauses for non-table
relations (Tom Lane)
Make WAL replay report failures sooner
(Fujii Masao)
There were some cases where failures were only reported once the
server went into master mode.
Add pg_xlog_location_diff()
to simplify WAL location comparisons (Euler Taveira de Oliveira)
This is useful for computing replication lag.
Support configurable event log application names on Windows
(MauMau, Magnus Hagander)
This allows different instances to use the event log
with different identifiers, by setting the event_source
server parameter, which is similar to how syslog_ident works.
Change "unexpected EOF" messages to DEBUG1 level,
except when there is an open transaction (Magnus Hagander)
This change reduces log chatter caused by applications that close
database connections ungracefully.
Silently ignore nonexistent schemas specified in search_path (Tom Lane)
This makes it more convenient to use generic path settings, which
might include some schemas that don't exist in all databases.
Allow superusers to set deadlock_timeout
per-session, not just per-cluster (Noah Misch)
This allows deadlock_timeout to be reduced for
transactions that are likely to be involved in a deadlock, thus
detecting the failure more quickly. Alternatively, increasing the
value can be used to reduce the chances of a session being chosen for
cancellation due to a deadlock.
Add a server parameter temp_file_limit
to constrain temporary file space usage per session (Mark Kirkwood)
Allow a superuser to SET an extension's
superuser-only custom variable before loading the associated
extension (Tom Lane)
The system now remembers whether a SET was
performed by a superuser, so that proper privilege checking can be
done when the extension is loaded.
Add postmaster-C
option to query configuration parameters (Bruce Momjian)
This allows pg_ctl to better handle cases where
PGDATA or -D points to a configuration-only
directory.
Replace an empty locale name with the implied value in
CREATE DATABASE
(Tom Lane)
This prevents cases where
pg_database.datcollate or
datctype could be interpreted differently after a
server restart.
Allow multiple errors in postgresql.conf
to be reported, rather than just the first one (Alexey Klyukin,
Tom Lane)
Allow a reload of postgresql.conf to be
processed by all sessions, even if there are some settings that
are invalid for particular sessions (Alexey Klyukin)
Previously, such not-valid-within-session values would cause all
setting changes to be ignored by that session.
Add an include_if_exists facility for configuration
files (Greg Smith)
This works the same as include, except that an error
is not thrown if the file is missing.
Identify the server time zone during initdb, and set
postgresql.conf entries
timezone and
log_timezone
accordingly (Tom Lane)
This avoids expensive time zone probes during server start.
Fix pg_settings to
report postgresql.conf line numbers on Windows
(Tom Lane)
This mode waits for the standby server to write transaction data to
its own operating system, but does not wait for the data to be
flushed to the standby's disk.
Add a pg_receivexlog
tool to archive WAL file changes as they are written, rather
than waiting for completed WAL files (Magnus Hagander)
Allow pg_basebackup
to make base backups from standby servers (Jun Ishizuka, Fujii Masao)
This feature lets the work of making new base backups be off-loaded
from the primary server.
Allow streaming of WAL files while pg_basebackup
is performing a backup (Magnus Hagander)
This allows passing of WAL files to the standby before they are
discarded on the primary.
Cancel the running query if the client gets disconnected
(Florian Pflug)
If the backend detects loss of client connection during a query, it
will now cancel the query rather than attempting to finish it.
Retain column names at run time for row expressions
(Andrew Dunstan, Tom Lane)
This change allows better results when a row value is converted to
hstore or json type: the fields of the resulting
value will now have the expected names.
Improve column labels used for sub-SELECT results
(Marti Raudsepp)
Previously, the generic label ?column? was used.
Improve heuristics for determining the types of unknown values
(Tom Lane)
The longstanding rule that an unknown constant might have the
same type as the value on the other side of the operator using it
is now applied when considering polymorphic operators, not only
for simple operator matches.
Warn about creating casts to or from domain types (Robert Haas)
Such casts have no effect.
When a row fails a CHECK or NOT NULL
constraint, show the row's contents as error detail (Jan
Kundrát)
This should make it easier to identify which row is problematic
when an insert or update is processing many rows.
Provide more reliable operation during concurrent
DDL (Robert Haas, Noah Misch)
This change adds locking that should eliminate "cache lookup
failed" errors in many scenarios. Also, it is no longer possible
to add relations to a schema that is being concurrently dropped, a
scenario that formerly led to inconsistent system catalog contents.
Add CONCURRENTLY option to DROP INDEX
(Simon Riggs)
This allows index removal without blocking other sessions.
Allow foreign data wrappers to have per-column options (Shigeru Hanada)
Improve pretty-printing of view definitions (Andrew Dunstan)
Allow CHECK
constraints to be declared NOT VALID (Álvaro
Herrera)
Adding a NOT VALID constraint does not cause the table to
be scanned to verify that existing rows meet the constraint.
Subsequently, newly added or updated rows are checked.
Such constraints are ignored by the planner when considering
constraint_exclusion, since it is not certain that all
rows meet the constraint.
The new ALTER TABLE VALIDATE command allows NOT
VALID constraints to be checked for existing rows, after which
they are converted into ordinary constraints.
Allow CHECK constraints to be declared NO
INHERIT (Nikhil Sontakke, Alex Hunsaker, Álvaro Herrera)
This makes them enforceable only on the parent table, not on
child tables.
Add the ability to rename
constraints (Peter Eisentraut)
Reduce need to rebuild tables and indexes for certain ALTER TABLE
... ALTER COLUMN TYPE operations (Noah Misch)
Increasing the length limit for a varchar or varbit
column, or removing the limit altogether, no longer requires a table
rewrite. Similarly, increasing the allowable precision of a
numeric column, or changing a column from constrained
numeric to unconstrained numeric, no longer
requires a table rewrite. Table rewrites are also avoided in similar
cases involving the interval, timestamp, and
timestamptz types.
Avoid having ALTER
TABLE revalidate foreign key constraints in some
cases where it is not necessary (Noah Misch)
Add IF EXISTS options to some ALTER
commands (Pavel Stehule)
For example, ALTER FOREIGN TABLE IF EXISTS foo RENAME
TO bar.
Add a security_barrier
option for views (KaiGai Kohei, Robert Haas)
This option prevents optimizations that might allow view-protected
data to be exposed to users, for example pushing a clause involving
an insecure function into the WHERE clause of the view.
Such views can be expected to perform more poorly than ordinary
views.
Add a new LEAKPROOF function
attribute to mark functions that can safely be pushed down
into security_barrier views (KaiGai Kohei)
Add support for privileges on data types (Peter Eisentraut)
This adds support for the SQL-conforming
USAGE privilege on types and domains. The intent is
to be able to restrict which users can create dependencies on types,
since such dependencies limit the owner's ability to alter the type.
Check for INSERT privileges in SELECT
INTO / CREATE TABLE AS (KaiGai Kohei)
Because the object is being created by SELECT INTO
or CREATE TABLE AS, the creator would ordinarily
have insert permissions; but there are corner cases where this is not
true, such as when ALTER DEFAULT PRIVILEGES has removed
such permissions.
This is like SERIAL, except it stores the sequence in
a two-byte integer column (int2).
Allow domains to be
declared NOT VALID (Álvaro Herrera)
This option can be set at domain creation time, or via ALTER
DOMAIN ... ADD CONSTRAINT ... NOT
VALID. ALTER DOMAIN ... VALIDATE
CONSTRAINT fully validates the constraint.
Support more locale-specific formatting options for the money data type (Tom Lane)
Specifically, honor all the POSIX options for ordering of the value,
sign, and currency symbol in monetary output. Also, make sure that
the thousands separator is only inserted to the left of the decimal
point, as required by POSIX.
Add bitwise "and", "or", and "not"
operators for the macaddr data type (Brendan Jurd)
Allow xpath() to
return a single-element XML array when supplied a
scalar value (Florian Pflug)
Previously, it returned an empty array. This change will also
cause xpath_exists() to return true, not false,
for such expressions.
Improve XML error handling to be more robust
(Florian Pflug)
Allow non-superusers to use pg_cancel_backend()
and pg_terminate_backend()
on other sessions belonging to the same user
(Magnus Hagander, Josh Kupershmidt, Dan Farina)
Previously only superusers were allowed to use these functions.
Allow importing and exporting of transaction snapshots (Joachim
Wieland, Tom Lane)
This allows multiple transactions to share identical views of the
database state.
Snapshots are exported via pg_export_snapshot()
and imported via SET
TRANSACTION SNAPSHOT. Only snapshots from
currently-running transactions can be imported.
Support COLLATION
FOR on expressions (Peter Eisentraut)
This returns a string representing the collation of the expression.
Add initdb
options --auth-local and --auth-host
(Peter Eisentraut)
This allows separate control of local and
hostpg_hba.conf authentication
settings. --auth still controls both.
Add --replication/--no-replication flags to
createuser
to control replication permission (Fujii Masao)
Add the --if-exists option to dropdb and dropuser (Josh
Kupershmidt)
Give command-line tools the ability to specify the name of the
database to connect to, and fall back to template1
if a postgres database connection fails (Robert Haas)
Add an --exclude-table-data option to
pg_dump (Andrew Dunstan)
This allows dumping of a table's definition but not its data,
on a per-table basis.
Add a --section option to pg_dump
and pg_restore (Andrew Dunstan)
Valid values are pre-data, data,
and post-data. The option can be
given more than once to select two or more sections.
Make pg_dumpall dump all
roles first, then all configuration settings on roles (Phil Sorber)
This allows a role's configuration settings to mention other
roles without generating an error.
Allow pg_dumpall to avoid errors if the
postgres database is missing in the new cluster
(Robert Haas)
Dump foreign server user mappings in user name order (Peter
Eisentraut)
This helps produce deterministic dump files.
Dump operators in a predictable order (Peter Eisentraut)
Tighten rules for when extension configuration tables are dumped
by pg_dump (Tom Lane)
Make pg_dump emit more useful dependency
information (Tom Lane)
The dependency links included in archive-format dumps were formerly
of very limited use, because they frequently referenced objects that
appeared nowhere in the dump. Now they represent actual dependencies
(possibly indirect) among the dumped objects.
Improve pg_dump's performance when dumping many
database objects (Tom Lane)
Rename data, bin, and port environment
variables to begin with PG, and support
PGPORTOLD/PGPORTNEW, to replace
PGPORT.
Overhaul pg_upgrade logging and failure reporting
(Bruce Momjian)
Create four append-only log files, and delete them on success.
Add -r/--retain option to unconditionally
retain these files. Also remove pg_upgrade options
-g/-G/-l options as unnecessary,
and tighten log file permissions.
Make pg_upgrade create a script to incrementally
generate more accurate optimizer statistics (Bruce Momjian)
This reduces the time needed to generate minimal cluster statistics
after an upgrade.
Allow pg_upgrade to upgrade an old cluster that
does not have a postgres database (Bruce Momjian)
Allow pg_upgrade to handle cases where some
old or new databases are missing, as long as they are empty
(Bruce Momjian)
Allow pg_upgrade to handle configuration-only
directory installations (Bruce Momjian)
In pg_upgrade, add -o/-O
options to pass parameters to the servers (Bruce Momjian)
This is useful for configuration-only directory installs.
Change pg_upgrade to use port 50432 by default
(Bruce Momjian)
This helps avoid unintended client connections during the upgrade.
Reduce cluster locking in pg_upgrade (Bruce
Momjian)
Specifically, only lock the old cluster if link mode is used,
and do it right after the schema is restored.
Add a rule to optionally build HTML documentation using the
stylesheet from the website (Magnus Hagander)
Use gmake STYLE=website draft.
Improve EXPLAIN documentation (Tom Lane)
Document that user/database names are preserved with double-quoting
by command-line tools like vacuumdb (Bruce
Momjian)
Document the actual string returned by the client for MD5
authentication (Cyan Ogilvie)
Deprecate use of GLOBAL and LOCAL in
CREATE TEMP TABLE (Noah Misch)
PostgreSQL has long treated these keyword as no-ops,
and continues to do so; but in future they might mean what the SQL
standard says they mean, so applications should avoid using them.