Change the row
constructor syntax (ROW(...)) so that
list elements foo.* will be expanded to a list
of their member fields, rather than creating a nested
row type field as formerly (Tom)
The new behavior is substantially more useful since it
allows, for example, triggers to check for data changes
with IF row(new.*) IS DISTINCT FROM row(old.*).
The old behavior is still available by omitting .*.
Make row comparisons
follow SQL standard semantics and allow them
to be used in index scans (Tom)
Previously, row = and <> comparisons followed the
standard but < <= > >= did not. A row comparison
can now be used as an index constraint for a multicolumn
index matching the row value.
The former behavior conformed to the standard for simple cases
with IS NULL, but IS NOT NULL would return
true if any row field was non-null, whereas the standard says it
should return true only when all fields are non-null.
Make SET
CONSTRAINT affect only one constraint (Kris Jurka)
In previous releases, SET CONSTRAINT modified
all constraints with a matching name. In this release,
the schema search path is used to modify only the first
matching constraint. A schema specification is also
supported. This more nearly conforms to the SQL standard.
Remove RULE permission for tables, for security reasons
(Tom)
As of this release, only a table's owner can create or modify
rules for the table. For backwards compatibility,
GRANT/REVOKE RULE is still accepted,
but it does nothing.
This changes the previous behavior where concatenation
would modify the array lower bound.
Make command-line options of postmaster
and postgres
identical (Peter)
This allows the postmaster to pass arguments to each backend
without using -o. Note that some options are now
only available as long-form options, because there were conflicting
single-letter options.
Deprecate use of postmaster symbolic link (Peter)
postmaster and postgres
commands now act identically, with the behavior determined
by command-line options. The postmaster symbolic link is
kept for compatibility, but is not really needed.
Change log_duration
to output even if the query is not output (Tom)
In prior releases, log_duration only printed if
the query appeared earlier in the log.
This variable has been superseded by a more general facility
for configuring timezone abbreviations.
Improve cost estimation for nested-loop index scans (Tom)
This might eliminate the need to set unrealistically small
values of random_page_cost.
If you have been using a very small random_page_cost,
please recheck your test cases.
Change behavior of pg_dump-n and
-t options. (Greg Sabino Mullane)
See the pg_dump manual page for details.
Change libpqPQdsplen() to return a useful value (Martijn
van Oosterhout)
Declare libpqPQgetssl() as returning void *,
rather than SSL * (Martijn van Oosterhout)
This allows applications to use the function without including
the OpenSSL headers.
C-language loadable modules must now include a
PG_MODULE_MAGIC
macro call for version compatibility checking
(Martijn van Oosterhout)
For security's sake, modules used by a PL/PerlU function are no
longer available to PL/Perl functions (Andrew)
Note: This also implies that data can no longer be shared between a PL/Perl
function and a PL/PerlU function.
Some Perl installations have not been compiled with the correct flags
to allow multiple interpreters to exist within a single process.
In this situation PL/Perl and PL/PerlU cannot both be used in a
single backend. The solution is to get a Perl installation which
supports multiple interpreters.
In contrib/xml2/, rename xml_valid() to
xml_is_well_formed() (Tom)
xml_valid() will remain for backward compatibility,
but its behavior will change to do schema checking in a future
release.
Allow the planner to reorder outer
joins in some circumstances (Tom)
In previous releases, outer joins would always be evaluated in
the order written in the query. This change allows the
query optimizer to consider reordering outer joins, in cases where
it can determine that the join order can be changed without
altering the meaning of the query. This can make a
considerable performance difference for queries involving
multiple outer joins or mixed inner and outer joins.
Add FILLFACTOR to table and index creation (ITAGAKI
Takahiro)
This leaves extra free space in each table or index page,
allowing improved performance as the database grows. This
is particularly valuable to maintain clustering.
Increase default values for shared_buffers
and max_fsm_pages
(Andrew)
Improve locking performance by breaking the lock manager tables into
sections
(Tom)
This allows locking to be more fine-grained, reducing
contention.
Reduce locking requirements of sequential scans (Qingqing
Zhou)
Reduce locking required for database creation and destruction
(Tom)
Allow a forced switch to a new transaction log file (Simon, Tom)
This is valuable for keeping warm standby slave servers
in sync with the master. Transaction log file switching now also happens
automatically during pg_stop_backup().
This ensures that all
transaction log files needed for recovery can be archived immediately.
Add WAL informational functions (Simon)
Add functions for interrogating the current transaction log insertion
point and determining WAL filenames from the
hex WAL locations displayed by pg_stop_backup()
and related functions.
Improve recovery from a crash during WAL replay (Simon)
The server now does periodic checkpoints during WAL
recovery, so if there is a crash, future WAL
recovery is shortened. This also eliminates the need for
warm standby servers to replay the entire log since the
base backup if they crash.
Improve reliability of long-term WAL replay
(Heikki, Simon, Tom)
Formerly, trying to roll forward through more than 2 billion
transactions would not work due to XID wraparound. This meant
warm standby servers had to be reloaded
from fresh base backups periodically.
Add archive_timeout
to force transaction log file switches at a given interval (Simon)
This enforces a maximum replication delay for warm standby servers.
Improve performance of statistics monitoring, especially
stats_command_string
(Tom, Bruce)
This release enables stats_command_string by
default, now that its overhead is minimal. This means
pg_stat_activity
will now show all active queries by default.
This allows pg_stat_activity to show all the
information included in the ps display.
Add configuration parameter update_process_title
to control whether the ps display is updated
for every command (Bruce)
On platforms where it is expensive to update the ps
display, it might be worthwhile to turn this off and rely solely on
pg_stat_activity for status information.
Allow units to be specified in configuration settings
(Peter)
For example, you can now set shared_buffers
to 32MB rather than mentally converting sizes.
Improve logging of protocol-level prepare/bind/execute
messages (Bruce, Tom)
Such logging now shows statement names, bind parameter
values, and the text of the query being executed. Also,
the query text is properly included in logged error messages
when enabled by log_min_error_statement.
On platforms where we can determine the actual kernel stack depth
limit (which is most), make sure that the initial default value of
max_stack_depth is safe, and reject attempts to set it
to unsafely large values.
Enable highlighting of error location in query in more
cases (Tom)
The server is now able to report a specific error location for
some semantic errors (such as unrecognized column name), rather
than just for basic syntax errors as before.
Fix "failed to re-find parent key" errors in
VACUUM (Tom)
Clean out pg_internal.init cache files during server
restart (Simon)
This avoids a hazard that the cache files might contain stale
data after PITR recovery.
Fix race condition for truncation of a large relation across a
gigabyte boundary by VACUUM (Tom)
Fix bug causing needless deadlock errors on row-level locks (Tom)
This allows these commands to return values, such as the
computed serial key for a new row. In the UPDATE
case, values from the updated version of the row are returned.
Add support for multiple-row VALUES clauses,
per SQL standard (Joe, Tom)
This allows INSERT to insert multiple rows of
constants, or queries to generate result sets using constants.
For example, INSERT ... VALUES (...), (...),
...., and SELECT * FROM (VALUES (...), (...),
....) AS alias(f1, ...).
Allow UPDATE
and DELETE
to use an alias for the target table (Atsushi Ogawa)
The SQL standard does not permit an alias in these commands, but
many database systems allow one anyway for notational convenience.
Allow UPDATE
to set multiple columns with a list of values (Susanne
Ebrecht)
This is basically a short-hand for assigning the columns
and values in pairs. The syntax is UPDATE tab
SET (column, ...) = (val, ...).
Make row comparisons work per standard (Tom)
The forms <, <=, >, >= now compare rows lexicographically,
that is, compare the first elements, if equal compare the second
elements, and so on. Formerly they expanded to an AND condition
across all the elements, which was neither standard nor very useful.
This causes TRUNCATE to automatically include all tables
that reference the specified table(s) via foreign keys. While
convenient, this is a dangerous tool — use with caution!
Support FOR UPDATE and FOR SHARE
in the same SELECT
command (Tom)
This operator is similar to equality (=), but
evaluates to true when both left and right operands are
NULL, and to false when just one is, rather than
yielding NULL in these cases.
Improve the length output used by UNION/INTERSECT/EXCEPT
(Tom)
When all corresponding columns are of the same defined length, that
length is used for the result, rather than a generic length.
Allow ILIKE
to work for multi-byte encodings (Tom)
Internally, ILIKE now calls lower()
and then uses LIKE. Locale-specific regular
expression patterns still do not work in these encodings.
This allows backslash escaping in strings to be disabled,
making PostgreSQL more
standards-compliant. The default is off for backwards
compatibility, but future releases will default this to on.
Do not flatten subqueries that contain volatile
functions in their target lists (Jaime Casanova)
This prevents surprising behavior due to multiple evaluation
of a volatile function (such as random()
or nextval()). It might cause performance
degradation in the presence of functions that are unnecessarily
marked as volatile.
This allows easy copying of CHECK constraints to a new
table.
Allow the creation of placeholder (shell) types (Martijn van Oosterhout)
A shell type declaration creates a type name, without specifying
any of the details of the type. Making a shell type is useful
because it allows cleaner declaration of the type's input/output
functions, which must exist before the type can be defined "for
real". The syntax is CREATE TYPE typename.
Aggregate functions
now support multiple input parameters (Sergey Koposov, Tom)
The new syntax is CREATE AGGREGATE
aggname (input_type)
(parameter_list). This more
naturally supports the new multi-parameter aggregate
functionality. The previous syntax is still supported.
This was added for setting sequence-specific permissions.
GRANT ON TABLE for sequences is still supported
for backward compatibility.
Add USAGE
permission for sequences that allows only currval()
and nextval(), not setval()
(Bruce)
USAGE permission allows more fine-grained
control over sequence access. Granting USAGE
allows users to increment
a sequence, but prevents them from setting the sequence to
an arbitrary value using setval().
This allows inheritance to be adjusted dynamically, rather than
just at table creation and destruction. This is very valuable
when using inheritance to implement table partitioning.
Allow comments on global
objects to be stored globally (Kris Jurka)
Previously, comments attached to databases were stored in individual
databases, making them ineffective, and there was no provision
at all for comments on roles or tablespaces. This change adds a new
shared catalog pg_shdescription
and stores comments on databases, roles, and tablespaces therein.
clock_timestamp() is the current wall-clock time,
statement_timestamp() is the time the current
statement arrived at the server, and
transaction_timestamp() is an alias for
now().
Allow to_char()
to print localized month and day names (Euler Taveira de
Oliveira)
The new functions are var_pop(),
var_samp(), stddev_pop(), and
stddev_samp(). var_samp() and
stddev_samp() are merely renamings of the
existing aggregates variance() and
stddev(). The latter names remain available
for backward compatibility.
For example, the result of a user-defined function that is
declared to return a domain type is now checked against the
domain's constraints. This closes a significant hole in the domain
implementation.
Fix problems with dumping renamed SERIAL columns
(Tom)
The fix is to dump a SERIAL column by explicitly
specifying its DEFAULT and sequence elements,
and reconstructing the SERIAL column on reload
using a new ALTER
SEQUENCE OWNED BY command. This also allows
dropping a SERIAL column specification.
Add a server-side sleep function pg_sleep()
(Joachim Wieland)
Add all comparison operators for the tid (tuple id) data
type (Mark Kirkwood, Greg Stark, Tom)
Add table_name and table_schema to
trigger parameters (Adam Sjøgren)
Add prepared queries (Dmitry Karasik)
Make $_TD trigger data a global variable (Andrew)
Previously, it was lexical, which caused unexpected sharing
violations.
Run PL/Perl and PL/PerlU in separate interpreters, for security
reasons (Andrew)
In consequence, they can no longer share data nor loaded modules.
Also, if Perl has not been compiled with the requisite flags to
allow multiple interpreters, only one of these languages can be used
in any given backend process.
Add new command \password for changing role
password with client-side password encryption (Peter)
Allow \c to connect to a new host and port
number (David, Volkan YAZICI)
Add tablespace display to \l+ (Philip Yarra)
Improve \df slash command to include the argument
names and modes (OUT or INOUT) of
the function (David Fetter)
Support binary COPY (Andreas Pflug)
Add option to run the entire session in a single transaction
(Simon)
Use option -1 or --single-transaction.
Support for automatically retrieving SELECT
results in batches using a cursor (Chris Mair)
This is enabled using \set FETCH_COUNT
n. This
feature allows large result sets to be retrieved in
psql without attempting to buffer the entire
result set in memory.
Make multi-line values align in the proper column
(Martijn van Oosterhout)
Field values containing newlines are now displayed in a more
readable fashion.
Save multi-line statements as a single entry, rather than
one line at a time (Sergey E. Koposov)
This makes up-arrow recall of queries easier. (This is
not available on Windows, because that platform uses the native
command-line editing present in the operating system.)
Make the line counter 64-bit so it can handle files with more
than two billion lines (David Fetter)
Report both the returned data and the command status tag
for INSERT/UPDATE/DELETE
RETURNING (Tom)
Allow complex selection of objects to be included or excluded
by pg_dump (Greg Sabino Mullane)
pg_dump now supports multiple -n
(schema) and -t (table) options, and adds
-N and -T options to exclude objects.
Also, the arguments of these switches can now be wild-card expressions
rather than single object names, for example
-t 'foo*', and a schema can be part of
a -t or -T switch, for example
-t schema1.table1.
Add pg_restore--no-data-for-failed-tables option to suppress
loading data if table creation failed (i.e., the table already
exists) (Martin Pitt)
Add pg_restore
option to run the entire session in a single transaction
(Simon)
This allows applications to query the thread-safety status
of the library.
Add PQdescribePrepared(),
PQdescribePortal(),
and related functions to return information about previously
prepared statements and open cursors (Volkan YAZICI)
Allow a hostname in ~/.pgpass
to match the default socket directory (Bruce)
A blank hostname continues to match any Unix-socket connection,
but this addition allows entries that are specific to one of
several postmasters on the machine.
Add GIN (Generalized
Inverted iNdex) index access method (Teodor, Oleg)
Remove R-tree indexing (Tom)
Rtree has been re-implemented using GiST. Among other
differences, this means that rtree indexes now have support
for crash recovery via write-ahead logging (WAL).
Reduce libraries needlessly linked into the backend (Martijn
van Oosterhout, Tom)
Add a configure flag to allow libedit to be preferred over
GNU readline (Bruce)
Allow installation into directories containing spaces
(Peter)
Improve ability to relocate installation directories (Tom)
Add support for Solaris x86_64 using the
Solaris compiler (Pierre Girard, Theo
Schlossnagle, Bruce)
Add DTrace support (Robert Lor)
Add PG_VERSION_NUM for use by third-party
applications wanting to test the backend version in C using >
and < comparisons (Bruce)
Add XLOG_BLCKSZ as independent from BLCKSZ
(Mark Wong)
Add LWLOCK_STATS define to report locking
activity (Tom)
Emit warnings for unknown configure options
(Martijn van Oosterhout)
Add server support for "plugin" libraries
that can be used for add-on tasks such as debugging and performance
measurement (Korry Douglas)
This consists of two features: a table of "rendezvous
variables" that allows separately-loaded shared libraries to
communicate, and a new configuration parameter local_preload_libraries
that allows libraries to be loaded into specific sessions without
explicit cooperation from the client application. This allows
external add-ons to implement features such as a PL/pgSQL debugger.
Re-implement the regression test script as a C program
(Magnus, Tom)
Allow loadable modules to allocate shared memory and
lightweight locks (Marc Munro)
Add automatic initialization and finalization of dynamically
loaded libraries (Ralf Engelschall, Tom)
New functions_PG_init() and _PG_fini() are
called if the library defines such symbols. Hence we no
longer need to specify an initialization function in
shared_preload_libraries; we can assume that
the library used the _PG_init() convention
instead.
Add PG_MODULE_MAGIC
header block to all shared object files (Martijn van
Oosterhout)
The magic block prevents version mismatches between loadable object
files and servers.
This new implementation supports EAN13, UPC,
ISBN (books), ISMN (music), and
ISSN (serials).
Add index information functions to pgstattuple (ITAGAKI Takahiro,
Satoshi Nagayasu)
Add pg_freespacemap module to display free space map information
(Mark Kirkwood)
pgcrypto now has all planned functionality (Marko Kreen)
Include iMath library in pgcrypto to have the public-key encryption
functions always available.
Add SHA224 algorithm that was missing in OpenBSD code.
Activate builtin code for SHA224/256/384/512 hashes on older
OpenSSL to have those algorithms always available.
New function gen_random_bytes() that returns cryptographically strong
randomness. Useful for generating encryption keys.
Remove digest_exists(), hmac_exists() and cipher_exists() functions.
Improvements to cube module (Joshua Reich)
New functions are cube(float[]),
cube(float[], float[]), and
cube_subset(cube, int4[]).
Add async query capability to dblink (Kai Londenberg,
Joe Conway)
New operators for array-subset comparisons (@>,
<@, &&) (Tom)
Various contrib packages already had these operators for their
datatypes, but the naming wasn't consistent. We have now added
consistently named array-subset comparison operators to the core code
and all the contrib packages that have such functionality.
(The old names remain available, but are deprecated.)
Add uninstall scripts for all contrib packages that have install
scripts (David, Josh Drake)