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

Observe the following incompatibilities:

Set escape_string_warning to on by default (Bruce) This issues a warning if backslash escapes are used in non-escape (non- E'' ) strings.

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.

Make row IS [NOT] NULL tests follow SQL standard semantics (Tom) 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.

Array comparison improvements (Tom) Now array dimensions are also compared.

Change array concatenation to match documented behavior (Tom) 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.

Make to_char(time) and to_char(interval) treat HH and HH12 as 12-hour intervals Most applications should use HH24 unless they want a 12-hour display.

Zero unmasked bits in conversion from INET to CIDR (Tom) This ensures that the converted value is actually valid for CIDR .

Remove australian_timezones configuration variable (Joachim Wieland) 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 libpq PQdsplen() to return a useful value (Martijn van Oosterhout)

Declare libpq PQgetssl() 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.

Remove contrib/ora2pg/ , now at http://www.samse.fr/GPL/ora2pg

Remove contrib modules that have been migrated to PgFoundry: adddepend , dbase , dbmirror , fulltextindex , mac , userlock

Remove abandoned contrib modules: mSQL-interface , tips