选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.1 已于 2016 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

E.72. 版本 8.4 #

发行日期

2009-07-01

E.72.1. 概述

经过多年开发,PostgreSQL 在许多领域已经功能完备。此发行版展示了添加特性的针对性方法(例如认证、监控、空间复用),并增加了后续 SQL 标准中定义的能力。主要的增强领域是:

  • 窗口函数

  • 公共表表达式和递归查询

  • 函数的默认参数和可变参数

  • 并行恢复

  • 列权限

  • 逐数据库的区域设置

  • 改进的哈希索引

  • 改进 EXISTSNOT EXISTS 查询的连接性能

  • 更易用的热备

  • 自动调整空闲空间映射的大小

  • 可见性映射(大幅降低变化缓慢的表的清理开销)

  • 版本感知的 psql(反斜杠命令可针对较旧的服务器工作)

  • 支持用 SSL 证书进行用户认证

  • 逐函数的运行时统计

  • 在 psql 中轻松编辑函数

  • 新增 contrib 模块:pg_stat_statements、auto_explain、citext、btree_gin

上述各项在下面的章节中有更详细的说明。

E.72.2. 迁移到版本 8.4

希望从任何以前的版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复。

请注意以下不兼容之处:

E.72.2.1. 常规

  • 默认使用 64 位整数日期时间(Neil Conway)

    此前这由 configure--enable-integer-datetimes 选项选择。要保留旧行为,请用 --disable-integer-datetimes 构建。

  • 移除 ipcclean 工具命令(Bruce)

    该工具只在少数平台上有效。用户应改用其操作系统的工具。

E.72.2.2. 服务器设置

  • log_min_messages 的默认设置改为 warning(以前是 notice),以减少日志文件量(Tom)

  • max_prepared_transactions 的默认设置改为零(以前是 5)(Tom)

  • debug_print_parsedebug_print_rewrittendebug_print_plan 的输出以 LOG 消息级别出现,而不是以前的 DEBUG1(Tom)

  • debug_pretty_print 默认为 on(Tom)

  • 移除 explain_pretty_print 参数(不再需要)(Tom)

  • log_temp_files 仅超级用户可设置,与其他日志选项一样(Simon Riggs)

  • 移除当 log_filename 中没有 % 转义时自动追加纪元时间戳的行为(Robert Haas)

    此变更是因为一些用户想要固定的日志文件名,以便与外部日志轮转工具配合使用。

  • recovery.conf 中移除 log_restartpoints;改用 log_checkpoints(Simon)

  • 移除 krb_realmkrb_server_hostname;它们现在改在 pg_hba.conf 中设置(Magnus)

  • pg_hba.conf 中也有重大变更,如下所述。

E.72.2.3. 查询

  • 更改 TRUNCATELOCK,使其应用于指定表的子表(Peter)

    这些命令现在接受阻止处理子表的 ONLY 选项;如果需要旧行为,必须使用此选项。

  • SELECT DISTINCTUNION/INTERSECT/EXCEPT 不再总是产生排序的输出(Tom)

    此前,这类查询总是通过排序/唯一处理(即先排序再删除相邻重复项)来删除重复行。现在它们可以用哈希实现,这不会产生排序的输出。如果应用程序依赖输出按排序顺序,推荐的解决办法是添加 ORDER BY 子句。作为短期变通,可以通过禁用 enable_hashagg 恢复以前的行为,但那是非常耗费性能的解决办法。不过 SELECT DISTINCT ON 从不使用哈希,因此其行为不变。

  • 强制子表从父表继承 CHECK 约束(Alex Hunsaker、Nikhil Sontakke、Tom)

    此前可以从子表删除这样的约束,使违反约束的行在扫描父表时可见。这被认为不一致,也违背 SQL 标准。

  • 不允许负的 LIMITOFFSET 值,而不是把它们当作零(Simon)

  • 不允许在事务块之外使用 LOCK TABLE(Tom)

    这样的操作毫无用处,因为锁会被立即释放。

  • 序列现在包含一个额外的 start_value 列(Zoltan Boszormenyi)

    这支持 ALTER SEQUENCE ... RESTART

E.72.2.4. 函数和操作符

  • numeric 零的分数次幂返回 0 而不是抛出错误,并让 numeric 零的零次幂返回 1 而不是出错(Bruce)

    这与 float8 长期的行为一致。

  • 允许浮点值的一元减产生负零(Tom)

    更改后的行为更符合 IEEE 标准。

  • 如果转义字符是 LIKE 模式的最后一个字符(即它没有可转义的内容),抛出错误(Tom)

    此前这样的转义字符被静默忽略,因此可能掩盖应用程序逻辑错误。

  • 移除以前用于 LIKE 索引比较的 ~=~~<>~ 操作符(Tom)

    模式索引现在使用常规的相等操作符。

  • xpath() 现在把它的参数不做任何更改地传递给 libxml(Andrew)

    这意味着 XML 参数必须是格式良好的 XML 文档。以前的编码试图允许 XML 片段,但效果不好。

  • xmlelement() 像格式化内容值一样格式化属性值(Peter)

    此前属性值按照常规 SQL 输出行为格式化,这有时与 XML 规则相悖。

  • 重写使用 libxml 的函数的内存管理(Tom)

    此变更应能避免在 PL/Perl 和其他附加代码中使用 libxml 的一些兼容性问题。

  • 为哈希函数采用更快的算法(Kenneth Marshall,基于 Bob Jenkins 的工作)

    许多内建哈希函数现在在小端和大端平台上产生不同的结果。

E.72.2.4.1. 时间函数和操作符
  • DateStyle 不再控制 interval 输出格式化;改为有一个新变量 IntervalStyle(Ron Mayer)

  • 改进 timestampinterval 输出中小数秒处理的一致性(Ron Mayer)

    这可能导致显示的小数位数与以前不同,或者四舍五入而不是截断。

  • to_char() 的本地化月/日名称依赖于 LC_TIME 而不是 LC_MESSAGES(Euler Taveira de Oliveira)

  • to_date()to_timestamp() 更一致地对无效输入报告错误(Brendan Jurd)

    以前的版本常常忽略或静默误读与格式字符串不匹配的输入。这类情形现在将导致错误。

  • 修复 to_timestamp(),使其不要求上/下午(AM/PM)和纪元(BC/AD)格式标志的大/小写匹配(Brendan Jurd)

    例如,输入值 ad 现在匹配格式字符串 AD

E.72.3. 变更

下面你将找到 PostgreSQL 8.4 与上一个主版本之间变更的详细说明。

E.72.3.1. 性能

  • 改进优化器统计信息计算(Jan Urbanski、Tom)

    特别是,全文搜索操作符的估计得到极大改进。

  • 允许 SELECT DISTINCTUNION/INTERSECT/EXCEPT 使用哈希(Tom)

    这意味着这类查询不再自动产生排序的输出。

  • 创建半连接和反连接的显式概念(Tom)

    此工作把我们以前对 IN (SELECT ...) 子句的临时处理形式化,并将其扩展到 EXISTSNOT EXISTS 子句。它应能显著改善 EXISTSNOT EXISTS 查询的规划。一般而言,逻辑上等价的 INEXISTS 子句现在应有相近的性能,而以前 IN 常常胜出。

  • 改进外连接之下子查询的优化(Tom)

    此前,如果子查询或视图出现在外连接的可空侧且其结果列表中包含非严格表达式(例如常量),就无法很好地优化。

  • 通过使用 Boyer-Moore-Horspool 搜索改进 text_position() 及相关函数的性能(David Rowley)

    这对长搜索模式特别有帮助。

  • 通过仅在请求时写入统计信息收集文件来降低其写入的 I/O 负载(Martin Pihlak)

  • 改进批量插入的性能(Robert Haas、Simon)

  • default_statistics_target 的默认值从 10 提高到 100(Greg Sabino Mullane、Tom)

    最大值也从 1000 提高到 10000

  • 在涉及继承或 UNION ALL 的查询中默认执行 constraint_exclusion 检查(Tom)

    新增了 constraint_exclusion 设置 partition 来指定此行为。

  • 允许位图索引扫描的 I/O 预读(Greg Stark)

    预读量由 effective_io_concurrency 控制。此特性仅在内核支持 posix_fadvise() 时可用。

  • FROM 子句中内联简单的返回集合的 SQL 函数(Richard Rowell)

  • 通过为外部关系中特别常见的连接键值提供特殊情形,改进多批哈希连接的性能(Bryce Cutt、Ramon Lawrence)

  • 通过抑制物理 tlist优化减少多批哈希连接中的临时数据量(Michael Henderson、Ramon Lawrence)

  • 避免 CREATE INDEX CONCURRENTLY 期间等待空闲在事务中的会话(Simon)

  • 改进共享缓存失效的性能(Tom)

E.72.3.2. 服务器

E.72.3.2.1. 设置
  • 把许多 postgresql.conf 设置转换为枚举值,使 pg_settings 能显示有效值(Magnus)

  • 新增 cursor_tuple_fraction 参数,控制规划器假定会被获取的游标行的比例(Robert Hell)

  • 允许 postgresql.conf 中自定义变量类名称包含下划线(Tom)

E.72.3.2.2. 认证与安全
  • 移除对(不安全的)crypt 认证方法的支持(Magnus)

    这实际上使 PostgreSQL 7.2 之前的客户端库过时,因为它们不再有任何可用的非明文口令方法。

  • 支持 pg_ident.conf 中的正则表达式(Magnus)

  • 允许不重启 postmaster 即可更改 Kerberos/GSSAPI 参数(Magnus)

  • 支持服务器证书文件中的 SSL 证书链(Andrew Gierth)

    包含完整证书链使客户端能够验证证书,而无需在本地存储中拥有所有中间 CA 证书——商业 CA 常是这种情形。

  • MD5 认证与 db_user_namespace 同时启用的组合报告适当的错误消息(Bruce)

E.72.3.2.3. pg_hba.conf #
  • 把所有认证选项改为使用 name=value 语法(Magnus)

    这对 ldappamident 认证方法做了不兼容的变更。所有使用这些方法的 pg_hba.conf 条目都需要用新格式重写。

  • 移除 ident sameuser 选项,改为在未指定 usermap 时以该行为为默认(Magnus)

  • 允许所有外部认证方法使用 usermap 参数(Magnus)

    此前 usermap 只在 ident 认证中受支持。

  • 新增 clientcert 选项,控制是否请求客户端证书(Magnus)

    此前这由服务器数据目录中是否存在根证书文件控制。

  • 新增 cert 认证方法,允许通过 SSL 证书进行用户认证(Magnus)

    此前 SSL 证书只能验证客户端拥有某证书的访问权,而不能认证用户。

  • 允许在 pg_hba.conf 中指定 krb5gssapisspi 的 realm 以及 krb5 主机设置(Magnus)

    它们覆盖 postgresql.conf 中的设置。

  • krb5gssapisspi 方法新增 include_realm 参数(Magnus)

    这允许使用 usermap 把来自不同 realm 的相同用户名认证为不同的数据库用户。

  • 装载时完整解析 pg_hba.conf,以便立即报告错误(Magnus)

    此前,文件中的大多数错误直到客户端尝试连接时才会被发现,因此一个有错误的文件可能使系统不可用。按照新行为,如果重载期间检测到错误,则拒绝坏文件,postmaster 继续使用其旧副本。

  • 显示 pg_hba.conf 中的所有解析错误,而不是在第一个之后中止(Selena Deckelmann)

  • 支持在 Solaris 上通过 Unix 域套接字进行 ident 认证(Garick Hamlin)

E.72.3.2.4. 连续归档
  • pg_start_backup() 提供一个选项,强制其隐含的检查点尽快完成(Tom)

    默认行为避免过多的 I/O 消耗,但如果没有并发查询活动在进行,那就没有意义。

  • pg_stop_backup() 等待已修改的 WAL 文件被归档(Simon)

    这保证备份在 pg_stop_backup() 完成时是有效的。

  • 启用归档时,在关闭时轮转最后一个 WAL 段,使所有事务可以立即归档(Guillaume Smet、Heikki)

  • 当连续归档基础备份正在进行时,延迟智能关闭(Laurenz Albe)

  • 如果请求快速关闭,则取消正在进行的连续归档基础备份(Laurenz Albe)

  • 允许 recovery.conf 布尔变量接受与 postgresql.conf 布尔变量相同的字符串值范围(Bruce)

E.72.3.2.5. 监控
  • 新增 pg_conf_load_time(),报告 PostgreSQL 配置文件上次装载的时间(George Gensure)

  • 新增 pg_terminate_backend() 以安全地终止后端(SIGTERM 信号也可行)(Tom、Bruce)

    虽然一直可以用 SIGTERM 终止单个后端,但这此前被认为不受支持;对该情形的测试发现了一些现已修复的缺陷。

  • 新增跟踪用户定义函数调用次数和运行时间的能力(Martin Pihlak)

    函数统计信息出现在新系统视图 pg_stat_user_functions 中。跟踪由新参数 track_functions 控制。

  • 通过新参数 track_activity_query_size 允许指定 pg_stat_activity 中查询字符串的最大大小(Thomas Lee)

  • 增加发送到 syslog 的最大行长度,希望以此改进性能(Tom)

  • 新增只读配置变量 segment_sizewal_block_sizewal_segment_size(Bernd Helmle)

  • 报告死锁时,把死锁涉及的所有查询的文本报告给服务器日志(Itagaki Takahiro)

  • 新增 pg_stat_get_activity(pid) 函数,返回特定进程 id 的信息(Magnus)

  • 允许通过 stats_temp_directory 指定服务器统计信息文件的位置(Magnus)

    这允许把统计信息文件放在 RAM 驻留目录中以降低 I/O 需求。在启动/关闭时,该文件被复制到其传统位置($PGDATA/global/),因此跨重启保留。

E.72.3.3. 查询

  • 新增对 WINDOW 函数的支持(Hitoshi Harada)

  • 新增对 WITH 子句(CTE)的支持,包括 WITH RECURSIVE(Yoshiyuki Asaba、Tatsuo Ishii、Tom)

  • 新增 TABLE 命令(Peter)

    TABLE tablenameSELECT * FROM tablename 的 SQL 标准简写。

  • 允许在指定 SELECT(或 RETURNING)列输出标签时省略 AS(Hiroshi Saito)

    只要列标签不是任何 PostgreSQL 关键字,这就能工作;否则仍需要 AS

  • 支持 SELECT 结果列表中的返回集合的函数,包括通过 tuplestore 返回结果的函数(Tom)

    特别是,这意味着用 PL/pgSQL 和其他 PL 语言编写的函数现在可以这样调用。

  • 支持聚合和分组查询输出中的返回集合的函数(Tom)

  • 允许 SELECT FOR UPDATE/SHARE 在继承树上工作(Tom)

  • SQL/MED 新增基础设施(Martin Pihlak、Peter)

    目前还没有远程或外部 SQL/MED 能力,但此变更为管理 dblinkplproxy 等模块的连接信息提供了一个标准化且面向未来的系统。

  • 当被引用的模式、函数、操作符或操作符类被修改时使缓存计划失效(Martin Pihlak、Tom)

    这改进了系统对即时 DDL 变更的响应能力。

  • 允许组合类型的比较,并允许匿名组合类型的数组(Tom)

    这允许诸如 row(1, 1.1) = any (array[row(7, 7.7), row(1, 1.0)]) 的构造。这在递归查询中特别有用。

  • 新增对用码点指定 Unicode 字符串字面量和标识符的支持,例如 U&'d\0061t\+000061'(Peter)

  • 拒绝字符串字面量和 COPY 数据中的 \000(Tom)

    此前这被接受,但效果是终止字符串内容。

  • 改进解析器报告错误位置的能力(Tom)

    现在许多此前无法定位的语义错误(如数据类型不匹配)也会报告错误位置。

E.72.3.3.1. TRUNCATE
  • 支持语句级 ON TRUNCATE 触发器(Simon)

  • TRUNCATE TABLE 新增 RESTART/CONTINUE IDENTITY 选项(Zoltan Boszormenyi)

    序列的起始值可以通过 ALTER SEQUENCE START WITH 更改。

  • 允许 TRUNCATE tab1, tab1 成功(Bruce)

  • 新增单独的 TRUNCATE 权限(Robert Haas)

E.72.3.3.2. EXPLAIN
  • EXPLAIN VERBOSE 显示每个计划节点的输出列(Tom)

    此前 EXPLAIN VERBOSE 输出查询计划的内部表示。(该行为现在可通过 debug_print_plan 获得。)

  • EXPLAIN 用各自的标签标识子计划和 initplan(Tom)

  • EXPLAIN 遵循 debug_print_plan(Tom)

  • 允许对 CREATE TABLE AS 使用 EXPLAIN(Peter)

E.72.3.3.3. LIMIT/OFFSET
  • 允许 LIMITOFFSET 中的子查询(Tom)

  • LIMIT/OFFSET 能力新增 SQL 标准语法(Peter)

    OFFSET num {ROW|ROWS} FETCH {FIRST|NEXT} [num] {ROW|ROWS} ONLY

E.72.3.4. 对象操作

  • 新增对列级权限的支持(Stephen Frost、KaiGai Kohei)

  • 重构多对象 DROP 操作以减少对 CASCADE 的需要(Alex Hunsaker)

    例如,如果表 B 依赖于表 A,命令 DROP TABLE A, B 不再需要 CASCADE 选项。

  • 通过确保在开始删除对象依赖之前获取锁,修复并发 DROP 命令的各种问题(Tom)

  • 改进 DROP 命令期间依赖的报告(Tom)

  • 按照 SQL 标准为 CREATE TABLE AS 新增 WITH [NO] DATA 子句(Peter、Tom)

  • 新增对用户定义 I/O 转换转换的支持(Heikki)

  • 允许 CREATE AGGREGATE 使用 internal 转换数据类型(Tom)

  • CREATE TYPE 新增 LIKE 子句(Tom)

    这简化了创建与现有类型使用相同内部表示的数据类型。

  • 允许为用户定义基本类型指定类型类别和首选状态(Tom)

    这允许对用户定义类型的强制转换行为有更多控制。

  • 允许 CREATE OR REPLACE VIEW 向视图末尾添加列(Robert Haas)

E.72.3.4.1. ALTER
  • 新增 ALTER TYPE RENAME(Petr Jelinek)

  • 新增 ALTER SEQUENCE ... RESTART(不带参数),把序列重置为其初始值(Zoltan Boszormenyi)

  • 修改 ALTER TABLE 语法,允许对表、索引、序列和视图的所有合理组合(Tom)

    此变更允许以下新语法:

    • ALTER SEQUENCE OWNER TO

    • ALTER VIEW ALTER COLUMN SET/DROP DEFAULT

    • ALTER VIEW OWNER TO

    • ALTER VIEW SET SCHEMA

    这里并没有实际的新功能,但以前你必须使用 ALTER TABLE 来做这些事情,这容易引起混淆。

  • 新增对语法 ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE 的支持(Peter)

    这是已支持功能的 SQL 标准语法。

  • ALTER TABLE SET WITHOUT OIDS 重写表以物理移除 OID 值(Tom)

    另外,新增 ALTER TABLE SET WITH OIDS 以重写表来添加 OID

E.72.3.4.2. 数据库操作
  • 当未提交的预备事务是原因时,改进 CREATE/DROP/RENAME DATABASE 失败的报告(Tom)

  • LC_COLLATELC_CTYPE 改为逐数据库的设置(Radek Strnad、Heikki)

    这使排序规则类似于编码——后者一直可以逐数据库配置。

  • 改进对数据库编码、排序规则(LC_COLLATE)和字符分类(LC_CTYPE)匹配的检查(Heikki、Tom)

    特别注意,新数据库的编码和区域设置只有在从 template0 复制时才能更改。这防止可能复制与设置不匹配的数据。

  • 新增 ALTER DATABASE SET TABLESPACE,把数据库移到新表空间(Guillaume Lelarge、Bernd Helmle)

E.72.3.5. 工具操作

  • CLUSTER 命令和 clusterdb 新增 VERBOSE 选项(Jim Cox)

  • 降低记录待处理触发器事件的内存需求(Tom)

E.72.3.5.1. 索引
  • 显著改进构建和访问哈希索引的速度(Tom Raney、Shreya Bhargava)

    这使哈希索引有时可以比 btree 索引更快。但哈希索引仍然不是崩溃安全的。

  • 让哈希索引只存储哈希码,而不是被索引列的完整值(Xiao Meng)

    这大幅减小长索引值下哈希索引的大小,改进了性能。

  • 实现 GIN 索引的快速更新选项(Teodor、Oleg)

    此选项以搜索速度的小幅损失大幅改进更新速度。

  • xxx_pattern_ops 索引现在可用于简单相等比较,而不仅用于 LIKE(Tom)

E.72.3.5.2. 全文索引
  • 移除在全文本索引上进行 GIN 加权查找时必须使用 @@@ 的要求(Tom、Teodor)

    可以改用常规的 @@ 文本搜索操作符。

  • @@ 文本搜索操作新增优化器选择率函数(Jan Urbanski)

  • 允许全文搜索中的前缀匹配(Teodor Sigaev、Oleg Bartunov)

  • 支持多列 GIN 索引(Teodor Sigaev)

  • 改进对尼泊尔语和天城文的支持(Teodor)

E.72.3.5.3. VACUUM
  • 在单独的逐关系分叉文件中跟踪空闲空间(Heikki)

    VACUUM 发现的空闲空间现在记录在 *_fsm 文件中,而不是固定大小的共享内存区域。max_fsm_pagesmax_fsm_relations 设置已被移除,大幅简化了空闲空间管理。

  • 新增可见性映射来跟踪不需要清理的页(Heikki)

    这允许 VACUUM 在只有表的一部分需要清理时避免扫描整表。可见性映射存储在逐关系的分叉文件中。

  • 新增 vacuum_freeze_table_age 参数,控制 VACUUM 何时应忽略可见性映射并做全表扫描以冻结元组(Heikki)

  • 更仔细地跟踪事务快照(Alvaro)

    这改进了 VACUUM 在存在长运行事务时回收空间的能力。

  • 新增在 CREATE TABLE 中指定逐关系 autovacuum 和 TOAST 参数的能力(Alvaro、Euler Taveira de Oliveira)

    Autovacuum 选项以前存储在系统表中。

  • vacuumdb 新增 --freeze 选项(Bruce)

E.72.3.6. 数据类型

  • 为文本搜索同义词词典新增 CaseSensitive 选项(Simon)

  • 改进 NUMERIC 除法的精度(Tom)

  • 新增 int2int8 的基本算术操作符(Tom)

    这消除了某些情况下显式转换的需要。

  • 允许 UUID 输入在每四个数字后接受可选的连字符(Robert Haas)

  • 允许 on/off 作为布尔数据类型的输入(Itagaki Takahiro)

  • 允许 numeric 类型输入字符串中 NaN 周围有空格(Sam Mason)

E.72.3.6.1. 时间数据类型
  • 拒绝年份 0 BC 以及 0000000(Tom)

    此前它们被解释为 1 BC。(注意:年份 000 仍被假定为 2000 年。)

  • SGT(新加坡时间)加入已知时区缩写的默认列表(Tom)

  • 支持 infinity-infinity 作为 date 类型的值(Tom)

  • 使 interval 字面量的解析更符合标准(Tom、Ron Mayer)

    例如,INTERVAL '1' YEAR 现在做它本应做的事。

  • 允许 interval 的小数秒精度指定在 second 关键字之后,以符合 SQL 标准(Tom)

    此前精度必须指定在 interval 关键字之后。(为向后兼容,该语法仍受支持,但已废弃。)数据类型定义现在将使用标准格式输出。

  • 支持 IS0 8601 interval 语法(Ron Mayer、Kevin Grittner)

    例如,INTERVAL 'P1Y2M3DT4H5M6.7S' 现在受支持。

  • 新增 IntervalStyle 参数,控制 interval 值的输出方式(Ron Mayer)

    有效值为:postgrespostgres_verbosesql_standardiso_8601。此设置还控制只有部分字段带正/负标志的负 interval 输入的处理。

  • 改进 timestampinterval 输出中小数秒处理的一致性(Ron Mayer)

E.72.3.6.2. 数组
  • 改进应用于 ARRAY[] 构造的转换的处理,例如 ARRAY[...]::integer[](Brendan Jurd)

    此前 PostgreSQL 试图在不参考后续转换的情况下确定 ARRAY[] 构造的数据类型。这在许多情况下会不必要地失败,特别是当 ARRAY[] 构造为空或只包含 NULL 等含糊条目时。现在会参考转换来确定数组元素必须的类型。

  • SQL 语法的 ARRAY 维度可选,以匹配 SQL 标准(Peter)

  • 新增 array_ndims(),返回数组的维数(Robert Haas)

  • 新增 array_length(),返回数组指定维度的长度(Jim Nasby、Robert Haas、Peter Eisentraut)

  • 新增聚合函数 array_agg(),把所有聚合值作为单个数组返回(Robert Haas、Jeff Davis、Peter)

  • 新增 unnest(),把数组转换为单独的行值(Tom)

    它与 array_agg() 相反。

  • 新增 array_fill(),创建用某值初始化的数组(Pavel Stehule)

  • 新增 generate_subscripts(),简化生成数组下标范围(Pavel Stehule)

E.72.3.6.3. Wide-Value Storage (TOAST)
  • 对短至 32 字节的值考虑 TOAST 压缩(以前是 256 字节)(Greg Stark)

  • 要求至少 25% 的空间节省才使用 TOAST 压缩(以前小值为 20%,大值为有任何节省即可)(Greg)

  • 改进对混合大小可 TOAST 字段的行的 TOAST 启发式,使我们倾向于把大值推出行外并且不必要地压缩小值(Greg、Tom)

E.72.3.7. 函数

  • 文档说明 setseed() 允许 -11 的值(不只是 01),并强制有效范围(Kris Jurka)

  • 新增服务器端函数 lo_import(filename, oid)(Tatsuo)

  • 新增 quote_nullable(),行为类似 quote_literal(),但对空参数返回字符串 NULL(Brendan Jurd)

  • 改进全文搜索的 headline() 函数,允许提取多个文本片段(Sushant Sinha)

  • 新增 suppress_redundant_updates_trigger() 触发器函数,避免非数据更改更新的开销(Andrew)

  • 新增 div(numeric, numeric),执行不舍入的 numeric 除法(Tom)

  • 新增 generate_series()timestamptimestamptz 版本(Hitoshi Harada)

E.72.3.7.1. 对象信息函数
  • 实现 current_query(),供需要知道当前运行查询的函数使用(Tomas Doran)

  • 新增 pg_get_keywords(),返回解析器关键字列表(Dave Page)

  • 新增 pg_get_functiondef(),查看函数的定义(Abhijit Menon-Sen)

  • 当反解析不含变量的表达式时,允许 pg_get_expr() 的第二个参数为零(Tom)

  • 修改 pg_relation_size() 以使用 regclass(Heikki)

    pg_relation_size(data_type_name) 不再有效。

  • pg_settings 输出新增 boot_valreset_val 列(Greg Smith)

  • pg_settings 输出为在配置文件中设置的变量新增源文件名和行号列(Magnus、Alvaro)

    出于安全原因,这些列只有超级用户可见。

  • 新增对 CURRENT_CATALOGCURRENT_SCHEMASET CATALOGSET SCHEMA 的支持(Peter)

    它们为现有特性提供 SQL 标准语法。

  • 新增 pg_typeof(),返回任意值的数据类型(Brendan Jurd)

  • version() 返回服务器是 32 位还是 64 位二进制的信息(Bruce)

  • 修复信息模式列 is_insertable_intois_updatable 的行为使其一致(Peter)

  • 改进信息模式 datetime_precision 列的行为(Peter)

    这些列现在对 date 列显示零,对未声明精度的 timetimestampinterval 显示 6(默认精度),而不是像以前那样显示空值。

  • 把剩余的内建返回集合的函数转换为使用 OUT 参数(Jaime Casanova)

    这使调用这些函数无需指定列列表成为可能:pg_show_all_settings()pg_lock_status()pg_prepared_xact()pg_prepared_statement()pg_cursor()

  • pg_*_is_visible()has_*_privilege() 函数对无效 OID 返回 NULL,而不是报告错误(Tom)

  • 扩展 has_*_privilege() 函数,允许一次调用查询多个权限的 OR(Stephen Frost、Tom)

  • 新增 has_column_privilege()has_any_column_privilege() 函数(Stephen Frost、Tom)

E.72.3.7.2. 函数创建
  • 支持可变参数函数(参数数量可变的函数)(Pavel Stehule)

    只有尾部参数可以是可选的,且它们必须都是同一数据类型。

  • 支持函数参数的默认值(Pavel Stehule)

  • 新增 CREATE FUNCTION ... RETURNS TABLE 子句(Pavel Stehule)

  • 允许 SQL 语言函数返回 INSERT/UPDATE/DELETERETURNING 子句的输出(Tom)

E.72.3.7.3. PL/pgSQL 服务器端语言
  • 支持 EXECUTE USING,便于把数据值插入动态查询字符串(Pavel Stehule)

  • 允许用 FOR 循环遍历游标的结果(Pavel Stehule)

  • 支持 RETURN QUERY EXECUTE(Pavel Stehule)

  • 改进 RAISE 命令(Pavel Stehule)

    • 支持 DETAILHINT 字段

    • 支持指定 SQLSTATE 错误码

    • 支持异常名参数

    • 允许异常块中不带参数的 RAISE 重新抛出当前错误

  • 允许在 EXCEPTION 列表中指定 SQLSTATE 码(Pavel Stehule)

    这对处理自定义 SQLSTATE 码很有用。

  • 支持 CASE 语句(Pavel Stehule)

  • RETURN QUERY 设置特殊的 FOUNDGET DIAGNOSTICSROW_COUNT 变量(Pavel Stehule)

  • FETCHMOVE 设置 GET DIAGNOSTICSROW_COUNT 变量(Andrew Gierth)

  • 让不带标签的 EXIT 总是退出最内层循环(Tom)

    此前,如果存在比任何循环都更贴近嵌套的 BEGIN 块,它会退出那个块。新行为与 Oracle(TM) 匹配,也与我们自己文档此前的说法一致。

  • 使字符串字面量和嵌套块注释的处理与主 SQL 解析器的处理一致(Tom)

    特别是,RAISE 中的格式字符串现在与任何其他字符串字面字面量一样工作,包括受 standard_conforming_strings 约束。此变更还修复了 standard_conforming_strings 开启时有效命令会失败的其他情形。

  • 避免同一函数在不同异常块嵌套深度被调用时的内存泄漏(Tom)

E.72.3.8. 客户端应用程序

  • 修复 pg_ctl restart 以保留命令行参数(Bruce)

  • 新增 -w/--no-password 选项,在所有具有 -W/--password 选项的工具中阻止口令提示(Peter)

  • 移除 createdbcreateuserdropdbdropuser-q(安静)选项(Peter)

    这些选项自 PostgreSQL 8.3 起就没有效果。

E.72.3.8.1. psql
  • 移除冗长的启动横幅;现在只建议 help(Joshua Drake)

  • help 显示常用反斜杠命令(Greg Sabino Mullane)

  • 新增 \pset format wrapped 模式,把输出折行到屏幕宽度,或者在设置了 \pset columns 时也适用于文件/管道输出(Bryce Nesbitt)

  • 允许 \pset 中布尔值的所有受支持拼法,而不只是 onoff(Bruce)

    此前,除 off 外的任何字符串都被静默地当作 truepsql 现在会对无法识别的拼法抱怨(但仍把它们当作 true)。

  • 对宽输出使用分页器(Bruce)

  • 要求单字母反斜杠命令与其第一个参数之间有一个空格(Bernd Helmle)

    这消除了一个历史性的歧义来源。

  • 改进对模式限定和带引号标识符的 Tab 补全支持(Greg Sabino Mullane)

  • \timing 新增可选的 on/off 参数(David Fetter)

  • 在多行上显示访问控制权限(Brendan Jurd、Andreas Scherbaum)

  • \l 显示数据库访问权限(Andrew Gilligan)

  • \l+ 显示数据库大小(如果权限允许)(Andrew Gilligan)

  • 新增 \ef 命令来编辑函数定义(Abhijit Menon-Sen)

E.72.3.8.2. psql \d* commands
  • 让没有模式参数的 \d* 命令只在指定 S 修饰符时显示系统对象(Greg Sabino Mullane、Bruce)

    以前的行为在不同的 \d 变体之间不一致,而且在大多数情况下没有提供只查看用户对象的简便方法。

  • 改进 \d* 命令,使其能用于较旧的 PostgreSQL 服务器版本(可追溯到 7.4),而不仅是当前服务器版本(Guillaume Lelarge)

  • \d 显示引用所选表的外键约束(Kenneth D'Souza)

  • \d 对序列显示其列值(Euler Taveira de Oliveira)

  • \d+ 显示中添加列存储类型和其他关系选项(Gregory Stark、Euler Taveira de Oliveira)

  • \dt+ 输出中显示关系大小(Dickson S. Guedes)

  • \dT+ 中显示 enum 类型的可能值(David Fetter)

  • 允许 \dC 接受通配符模式,匹配转换涉及的任一数据类型(Tom)

  • \df 的输出新增函数类型列,并新增只列出所选类型函数的选项(David Fetter)

  • \df 不隐藏接受或返回 cstring 类型的函数(Tom)

    此前这类函数被隐藏,因为它们大多是数据类型 I/O 函数,被认为无趣。默认隐藏系统函数的新策略使这个瑕疵不再必要。

E.72.3.8.3. pg_dump
  • pg_dump/pg_dumpall/pg_restore 新增 --no-tablespaces 选项,使转储可以恢复到表空间布局不匹配的集群(Gavin Roy)

  • 移除 pg_dumppg_dumpall-d-D 选项(Tom)

    这些选项太容易与其他 PostgreSQL 客户端应用程序中选择数据库名的选项混淆。功能仍然可用,但现在必须拼出长选项名 --inserts--column-inserts

  • 移除 pg_dumppg_dumpall-i/--ignore-version 选项(Tom)

    使用此选项不会抛出错误,但它没有效果。移除此选项是因为版本检查对安全是必要的。

  • 在转储和恢复期间禁用 statement_timeout(Joshua Drake)

  • 新增 pg_dump/pg_dumpall 选项 --lock-wait-timeout(David Gould)

    这允许转储在指定时间内无法获得共享锁时失败。

  • 重排 pg_dump--data-only 输出,把被外键引用的表排在引用表之前转储(Tom)

    这允许在外键已存在时加载数据。如果循环引用使安全排序不可能,则发出 NOTICE

  • 允许 pg_dumppg_dumpallpg_restore 使用指定的角色(Benedek László)

  • 允许 pg_restore 使用多个并发连接执行恢复(Andrew)

    并发连接数由选项 --jobs 控制。这只对自定义格式归档受支持。

E.72.3.9. 编程工具

E.72.3.9.1. libpq
  • 允许在导入大对象时指定 OID,通过新函数 lo_import_with_oid()(Tatsuo)

  • 新增事件支持(Andrew Chernow、Merlin Moncure)

    这新增了注册回调来管理与 PGconnPGresult 对象关联的私有数据的能力。

  • 改进错误处理,允许多条错误消息作为多行错误报告返回(Magnus)

  • PQexecParams() 及相关函数对空查询返回 PGRES_EMPTY_QUERY(Tom)

    它们以前返回 PGRES_COMMAND_OK

  • 记录如何避免 Windows 上 WSACleanup() 的开销(Andrew Chernow)

  • 不依赖 Kerberos 票据来确定默认数据库用户名(Magnus)

    此前,支持 Kerberos 的 libpq 构建会把任何可用 Kerberos 票据中的主体名用作默认数据库用户名,即使连接没有使用 Kerberos 认证。这被认为不一致且令人困惑。现在默认用户名的确定方式在有或没有 Kerberos 时相同。但注意,使用 Kerberos 认证时数据库用户名仍必须与票据匹配。

E.72.3.9.2. libpq SSL (Secure Sockets Layer) support
  • 修复 SSL 连接的证书验证(Magnus)

    libpq 现在支持在建立 SSL 连接时同时验证证书和服务器名称。如果没有可用于验证的根证书,SSL 连接将失败。sslmode 参数用于启用证书验证并设置检查级别。默认仍是不做任何验证,允许连接到启用 SSL 的服务器而不要求客户端上有根证书。

  • 支持通配符服务器证书(Magnus)

    如果证书 CN* 开头,匹配主机名时它将被视为通配符,允许同一证书用于多个服务器。

  • 允许指定客户端证书的文件位置(Mark Woodward、Alvaro、Magnus)

  • 新增 PQinitOpenSSL 函数,允许对 OpenSSL/libcrypto 初始化有更多控制(Andrew Chernow)

  • 当没有数据库连接保持打开时,让 libpq 注销其 OpenSSL 回调(Bruce、Magnus、Russell Smith)

    这对卸载 libpq 库的应用程序是必需的,否则无效的 OpenSSL 回调将残留。

E.72.3.9.3. ecpg
  • 新增消息的本地化支持(Euler Taveira de Oliveira)

  • ecpg 解析器现在从服务器解析器自动生成(Michael)

    此前 ecpg 解析器是手工维护的。

E.72.3.9.4. Server Programming Interface (SPI)
  • 新增对外线参数的单次使用计划的支持(Tom)

  • SPI_execute() 新增 SPI_OK_REWRITTEN 返回码(Heikki)

    这在命令被重写为另一种类型的命令时使用。

  • executor/spi.h 中移除不必要的包含(Tom)

    使用 SPI 的模块如果依赖 spi.h 替它们包含内容,可能需要添加一些 #include 行。

E.72.3.10. 构建选项

  • 更新构建系统以使用 Autoconf 2.61(Peter)

  • 源代码构建需要 GNU bison(Peter)

    这实际上多年来已是必需,但现在不再有声称支持其他解析器工具的基础设施。

  • 新增 pg_config--htmldir 选项(Peter)

  • 在服务器内部按值传递 float4(Zoltan Boszormenyi)

    新增 configure 选项 --disable-float4-byval 以使用旧行为。使用旧式(版本 0)调用约定并传递或返回 float4 值的外部 C 函数将被此变更破坏,因此如果有这样的函数且不想更新它们,可能需要该 configure 选项。

  • 在 64 位平台上,服务器内部按值传递 float8int8 及相关数据类型(Zoltan Boszormenyi)

    新增 configure 选项 --disable-float8-byval 以使用旧行为。如上所述,此变更可能破坏旧式外部 C 函数。

  • 新增 configure 选项 --with-segsize--with-blocksize--with-wal-blocksize--with-wal-segsize(Zdenek Kotala、Tom)

    这简化了对几个常量的构建期控制,这些常量以前只能通过编辑 pg_config_manual.h 更改。

  • 允许在 Solaris 2.5 上进行线程化构建(Bruce)

  • Solaris 上使用系统的 getopt_long()(Zdenek Kotala、Tom)

    这使选项处理更符合 Solaris 用户的期望。

  • 新增对 LinuxSun Studio 编译器的支持(Julius Stroffek)

  • 把主版本号附加到后端 gettext 域,把 soname 主版本号附加到库的 gettext 域(Peter)

    这简化了多个版本的并行安装。

  • 新增用 gcov 进行代码覆盖率测试的支持(Michelle Caisse)

  • 允许在 MingwCygwin 上进行树外构建(Richard Evans)

  • 修复把 Mingw 用作交叉编译源平台的问题(Peter)

E.72.3.11. 源代码

  • 支持 64 位时区数据文件(Heikki)

    这新增了对 2038 年以后的夏令时(DST)计算的支持。

  • 弃用平台 time_t 数据类型的使用(Tom)

    一些平台已迁移到 64 位 time_t,一些没有,而 Windows 拿不定主意。定义 pg_time_t,其含义与 time_t 相同,但始终为 64 位(除非平台没有 64 位整数类型),并在所有模块 API 和磁盘上数据格式中使用该类型。

  • 修复交叉编译时处理时区数据库的缺陷(Richard Evans)

  • 一步链接后端目标文件,而不是分阶段(Peter)

  • 改进 gettext 支持以允许更好地翻译复数(Peter)

  • 为 PL 语言新增消息翻译支持(Alvaro、Peter)

  • 新增更多 DTrace 探针(Robert Lor)

  • Mac OS X Leopard 和其他非 Solaris 平台上启用 DTrace 支持(Robert Lor)

  • 通过提供通用函数来简化和标准化 C 字符串与 text datum 之间的转换(Brendan Jurd、Tom)

  • 清理 include/catalog/ 头文件,使前端程序可以包含它们而不必包含 postgres.h(Zdenek Kotala)

  • name 按 char 对齐,并抑制索引中 name 条目的零填充(Tom)

  • 如果动态装载的代码执行 exit(),更好地恢复(Tom)

  • 新增钩子让插件监控执行器(Itagaki Takahiro)

  • 新增钩子,允许覆盖规划器的统计信息查找行为(Simon Riggs)

  • 为自定义共享内存需求新增 shmem_startup_hook()(Tom)

  • 把索引访问方法 amgetmulti 入口点替换为 amgetbitmap,并扩展 amgettuple 的 API 以支持运行时确定操作符有损性(Heikki、Tom、Teodor)

    GIN 和 GiST 操作符类 consistent 函数的 API 也被扩展了。

  • 新增 GIN 索引中部分匹配搜索的支持(Teodor Sigaev、Oleg Bartunov)

  • pg_classreltriggers 替换为布尔 relhastriggers(Simon)

    同时移除未使用的 pg_classrelukeysrelfkeysrelrefs

  • pg_class 新增 relistemp 列,便于识别临时表(Tom)

  • 把平台 FAQ 移入主文档(Peter)

  • 防止解析器输入文件在有冲突的状态下构建(Peter)

  • 新增对 KOI8U(乌克兰语)编码的支持(Peter)

  • 新增日语消息翻译(Japan PostgreSQL Users Group)

    这以前作为独立项目维护。

  • 修复在 MSVC 构建的系统上设置 LC_MESSAGES 的问题(Hiroshi Inoue、Hiroshi Saito、Magnus)

E.72.3.12. 附加模块

  • 新增 contrib/auto_explain,对超过指定时长的查询自动运行 EXPLAIN(Itagaki Takahiro、Tom)

  • 新增 contrib/btree_gin,允许 GIN 索引处理更多数据类型(Oleg、Teodor)

  • 新增 contrib/citext,提供不区分大小写、多字节感知的文本数据类型(David Wheeler)

  • 新增 contrib/pg_stat_statements,用于服务器范围的语句执行统计跟踪(Itagaki Takahiro)

  • contrib/pgbench 新增时长和查询模式选项(Itagaki Takahiro)

  • contrib/pgbench 使用表名 pgbench_accountspgbench_branchespgbench_historypgbench_tellers,而不只是 accountsbrancheshistorytellers(Tom)

    这是为了降低运行 pgbench 时意外破坏真实数据的风险。

  • 修复 contrib/pgstattuple 以处理超过 20 亿页的表和索引(Tatsuhito Kasahara)

  • contrib/fuzzystrmatch 中,新增允许用户指定插入、删除和替换代价的 Levenshtein 字符串距离函数版本(Volkan Yazici)

  • contrib/ltree 支持多字节编码(laser)

  • 使 contrib/dblink 能使用存储在 SQL/MED 目录中的连接信息(Joe Conway)

  • 改进 contrib/dblink 对来自远程服务器错误的报告(Joe Conway)

  • contrib/dblink 设置 client_encoding 以匹配本地数据库的编码(Joe Conway)

    这防止与使用不同编码的远程数据库通信时的编码问题。

  • 确保 contrib/dblink 使用用户提供的口令,而不是意外地从服务器的 .pgpass 文件获取(Joe Conway)

    这是一个小的安全增强。

  • contrib/pageinspect 新增 fsm_page_contents()(Heikki)

  • 修改 get_raw_page() 以支持空闲空间映射(*_fsm)文件。同时更新 contrib/pg_freespacemap

  • contrib/pg_trgm 新增多字节编码支持(Teodor)

  • 重写 contrib/intagg 以使用新函数 array_agg()unnest()(Tom)

  • contrib/pg_standby 在故障转移前恢复所有可用 WAL(Fujii Masao、Simon、Heikki)

    为使这安全工作,现在需要在 recovery.conf 中设置新的 recovery_end_command 选项,以便在故障转移后清理触发器文件。pg_standby 将不再自行删除触发器文件。

  • 现在 contrib/pg_standby-l 选项是无操作,因为使用符号链接不安全(Simon)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。