↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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

文档版本对比

POSTGRESQL · VERSION COMPARE

PostgreSQL 9.6 的版本变更

本次发布的完整功能、修复与兼容性说明,以及它们在其他版本中的关联记录。

查看该版本全部变更
查看该版本全部变更

从起始版本之后,看到目标版本为止。大版本名称代表该系列首个正式版本。

收录 PostgreSQL 9.0 起的 17 个大版本、352 份发布说明;数据更新于 2026-09-26。

本次发布的全部变更

9.6

2016-09-29

导出 JSON
214项变更功能、修复与改进
1次版本发布按发行版本归档
0个 CVE本版说明中提及的漏洞编号

9.6.0 历史版本维护截止 2021-11-11

PostgreSQL 9.6

升级与兼容性说明

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

版本 9.6 包含许多可能影响与以前版本兼容性的更改。注意以下不兼容之处:

兼容性变化改进 pg_stat_activity 视图关于进程在等待什么的信息

兼容性

改进 pg_stat_activity 视图关于进程在等待什么的信息(Amit Kapila、Ildus Kurbangaliev)

历史上只有进程在等待重量级锁时才显示为等待中。现在等待轻量级锁和缓冲区 pin 也会显示在 pg_stat_activity 中。此外,所等待的锁类型现在也可见。这些更改用 wait_event_type 和 wait_event 列替换了 waiting 列。

兼容性变化在 to_char() 中,(需要时的)减号不再计为时间相关字段宽度的一部分

兼容性

在 to_char() 中,(需要时的)减号不再计为时间相关字段宽度的一部分(Bruce Momjian)

例如 to_char('-4 years'::interval, 'YY') 现在返回 -04 而不是 -4。

兼容性变化使 extract() 对无穷大输入的表现更合理

兼容性

使 extract() 对无穷大输入的表现更合理(Vitaly Burovoy)

历史上 extract() 函数给定无穷时间戳时只是返回零,无论给定的字段名是什么。现在当请求的字段是单调递增的(如 year、epoch)时返回 infinity 或 -infinity,不是时(如 day、hour)返回 NULL。此外,对坏字段名抛出预期的错误。

兼容性变化移除 PL/pgSQL 中抑制 RAISE 命令发出消息的 CONTEXT 最内层的“特性”

兼容性

移除 PL/pgSQL 中抑制 RAISE 命令发出消息的 CONTEXT 最内层的“特性”(Pavel Stehule)

这一古老的向后兼容 hack 被认为已失去用处。

关联记录(2)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

兼容性变化修复默认文本搜索解析器允许 email 和 host 记号中的前导数字

兼容性

修复默认文本搜索解析器允许 email 和 host 记号中的前导数字(Artur Zakirov)

大多数情况下这只会导致文本解析的少量变化。但如果你有这种地址频繁出现的数据,可能值得重建相关的 tsvector 列和索引,使这种形式的地址能被文本搜索正确找到。

兼容性变化扩展 contrib/unaccent 的标准 unaccent.rules 文件以处理 Unicode 已知的所有变音符号,并正确展开连字

兼容性

扩展 contrib/unaccent 的标准 unaccent.rules 文件以处理 Unicode 已知的所有变音符号,并正确展开连字(Thomas Munro、Léonard Benedetti)

以前的版本漏掉了转换一些较不常见的带变音符号字母。此外连字现在被展开为单独的字母。使用此规则文件的安装可能希望重建依赖其结果的 tsvector 列和索引。

兼容性变化从 CREATE ROLE 及相关命令中移除早已弃用的 CREATEUSER/NOCREATEUSER 选项

兼容性

从 CREATE ROLE 及相关命令中移除早已弃用的 CREATEUSER/NOCREATEUSER 选项(Tom Lane)

由于古老的向后兼容原因,CREATEUSER 实际上意味着 SUPERUSER。这一直是(合理地)期望它表示 CREATEROLE 的人们的持续困惑源。它已被弃用十年,因此通过移除来修复问题。

兼容性变化把以 pg_ 开头的角色名视为保留

兼容性

把以 pg_ 开头的角色名视为保留(Stephen Frost)

现在不允许用户创建这种角色名。这防止与 initdb 创建的内建角色冲突。

兼容性变化把 information_schema.routines 视图中的列名 result_cast_character_set_name 改为 result_cast_char_set_name

兼容性

把 information_schema.routines 视图中的列名 result_cast_character_set_name 改为 result_cast_char_set_name(Clément Prévost)

SQL:2011 标准指定了较长的名字,但这看起来是个错误,因为相邻列名和其他 information_schema 视图都使用较短的风格。

兼容性变化psql 的 -c 选项不再隐含 --no-psqlrc

兼容性

psql 的 -c 选项不再隐含 --no-psqlrc(Pavel Stehule、Catalin Iacob)

显式写 --no-psqlrc(或其缩写 -X)来获得旧行为。这样修改后的脚本在旧版本 psql 中仍能工作。

关联记录(1)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

兼容性变化改进 pg_restore 的 -t 选项匹配所有类型的关系,而不只是普通表

兼容性

改进 pg_restore 的 -t 选项匹配所有类型的关系,而不只是普通表(Craig Ringer)

兼容性变化更改 pg_controldata 及相关地方用于 NextXID 的显示格式

兼容性

更改 pg_controldata 及相关地方用于 NextXID 的显示格式(Joe Conway、Bruce Momjian)

以 number:number 格式显示纪元加事务 ID 值。以前的格式 number/number 与 LSN 使用的格式惊人地相似。

兼容性变化更新扩展函数在适当之处标记为并行安全

兼容性

更新扩展函数在适当之处标记为并行安全(Andreas Karlsson)

许多标准扩展已被更新以允许其函数在并行查询工作者进程中执行。这些更改在从以前版本 pg_upgrade 过来的数据库中不会生效,除非对每个这种扩展(在集簇的每个数据库中)应用 ALTER EXTENSION UPDATE。

新功能并行查询(Robert Haas、Amit Kapila、David Rowley 等许多人)

服务器 / 并行查询

并行查询(Robert Haas、Amit Kapila、David Rowley 等许多人)

在 9.6 中,PostgreSQL 引入了对大查询并行执行的初步支持。只有驱动表通过顺序扫描访问的严格只读查询可以并行化。哈希连接和嵌套循环可以并行执行,聚合(对受支持的聚合)也是。还有很多工作要做,但这已经是一组有用的特性。

并行查询执行(还)没有默认启用。要允许它,把新配置参数max_parallel_workers_per_gather设为大于零的值。对并行性使用的额外控制可通过其他新配置参数force_parallel_mode、parallel_setup_cost、parallel_tuple_cost和min_parallel_relation_size获得。

新功能提供标记函数并行安全状态的基础设施

服务器 / 并行查询

提供标记函数并行安全状态的基础设施(Robert Haas、Amit Kapila)

新功能允许 GIN 索引构建有效利用大于 1 GB 的maintenance_work_mem设置

服务器 / 索引

允许 GIN 索引构建有效利用大于 1 GB 的maintenance_work_mem设置(Robert Abraham、Teodor Sigaev)

新功能把从 GIN 索引未决列表删除的页立即加入空闲空间映射

服务器 / 索引

把从 GIN 索引未决列表删除的页立即加入空闲空间映射(Jeff Janes、Teodor Sigaev)

这减少了表不常清理时的膨胀。

新功能添加 gin_clean_pending_list() 函数以允许手动调用 GIN 索引的未决列表清理

服务器 / 索引

添加 gin_clean_pending_list() 函数以允许手动调用 GIN 索引的未决列表清理(Jeff Janes)

以前这种清理只作为清理或分析父表的副产品发生。

新功能改进 GiST 索引中死索引元组的处理

服务器 / 索引

改进 GiST 索引中死索引元组的处理(Anastasia Lubennikova)

现在当索引扫描注意到相应的堆元组已死时,死索引元组会被如此标记。插入元组时,标记为死的元组将在需要为页面腾出空间时被移除。

新功能为 box 类型添加 SP-GiST 操作符类

服务器 / 索引

为 box 类型添加 SP-GiST 操作符类(Alexander Lebedev)

性能改进通过在执行外部排序步骤时使用快速排序而非替换选择排序来改进排序性能

服务器 / 排序

通过在执行外部排序步骤时使用快速排序而非替换选择排序来改进排序性能(Peter Geoghegan)

新方法对典型缓存大小和数据量更好地利用了 CPU 缓存。必要时可以通过新配置参数replacement_sort_tuples调整行为。

性能改进加速同一字符串出现多次的文本排序

服务器 / 排序

加速同一字符串出现多次的文本排序(Peter Geoghegan)

性能改进通过使用“缩写”键加速 uuid、bytea 和 char(n) 字段的排序

服务器 / 排序

通过使用“缩写”键加速 uuid、bytea 和 char(n) 字段的排序(Peter Geoghegan)

对非默认操作符类 text_pattern_ops、varchar_pattern_ops 和 bpchar_pattern_ops 也添加了缩写键支持。有序集聚合的处理现在也可以利用缩写键。

性能改进通过在排序期间把 TID 当作 64 位整数加速 CREATE INDEX CONCURRENTLY

服务器 / 排序

通过在排序期间把 TID 当作 64 位整数加速 CREATE INDEX CONCURRENTLY(Peter Geoghegan)

新功能减少对 ProcArrayLock 的争用

服务器 / 锁定

减少对 ProcArrayLock 的争用(Amit Kapila、Robert Haas)

性能改进通过把缓冲区内容锁移入缓冲区描述符来改进性能

服务器 / 锁定

通过把缓冲区内容锁移入缓冲区描述符来改进性能(Andres Freund、Simon Riggs)

新功能用原子操作替换共享缓冲区头自旋锁以改进可伸缩性

服务器 / 锁定

用原子操作替换共享缓冲区头自旋锁以改进可伸缩性(Alexander Korotkov、Andres Freund)

新功能使用原子操作而非自旋锁保护 LWLock 的等待队列

服务器 / 锁定

使用原子操作而非自旋锁保护 LWLock 的等待队列(Andres Freund)

新功能对共享哈希表空闲列表分区以减少多 CPU 插槽服务器上的争用

服务器 / 锁定

对共享哈希表空闲列表分区以减少多 CPU 插槽服务器上的争用(Aleksander Alekseev)

新功能减少备库服务器重放 btree 索引清理操作期间的互锁

服务器 / 锁定

减少备库服务器重放 btree 索引清理操作期间的互锁(Simon Riggs)

此更改避免了重放这种操作期间有时发生的显著复制延迟。

新功能改进 ANALYZE 对有许多空值的列的估计

服务器 / 优化器统计信息

改进 ANALYZE 对有许多空值的列的估计(Tomas Vondra、Alex Shulgin)

此前 ANALYZE 倾向于低估有许多 NULL 的列中非 NULL 不同值的数量,计算最常见值也不准确。

新功能改进规划器对查询结果中不同值数量的估计

服务器 / 优化器统计信息

改进规划器对查询结果中不同值数量的估计(Tomas Vondra)

新功能使用外键关系推断连接谓词的选择率

服务器 / 优化器统计信息

使用外键关系推断连接谓词的选择率(Tomas Vondra、David Rowley)

如果表 t 有外键限制,比如 (a,b) REFERENCES r (x,y),那么诸如 t.a = r.x AND t.b = r.y 的 WHERE 条件对每个 t 行最多只能选择一个 r 行。规划器以前把这些 AND 条件视为独立的,因此常常严重误估选择率。现在它把 WHERE 条件与适用的外键约束比较并产生更好的估计。

新功能避免重新清理只包含冻结元组的页

服务器 / VACUUM

避免重新清理只包含冻结元组的页(Masahiko Sawada、Robert Haas、Andres Freund)

以前防回卷清理必须访问表的每一页,即使无事可做的页。现在只包含已冻结元组的页会在表的可见性映射中被标识,即使在防止事务回卷时也可以被清理跳过。这应能大大降低维护大部分数据不变的大表的代价。

必要时可以用新的 DISABLE_PAGE_SKIPPING 选项强制清理处理全冻结页。通常永远不需要这样做,但它可能有助于从可见性映射损坏中恢复。

新功能避免 VACUUM 期间无用的堆截断尝试

服务器 / VACUUM

避免 VACUUM 期间无用的堆截断尝试(Jeff Janes、Tom Lane)

此更改在某些不可能截断的情况下避免取得排他表锁。主要好处是避免备库服务器上不必要的查询取消。

性能改进允许旧的 MVCC 快照在可配置的超时后失效

服务器 / 一般性能

允许旧的 MVCC 快照在可配置的超时后失效(Kevin Grittner)

通常,被删除的元组在最后一个可能“看到”它们的事务消失之前不能被清理物理移除。因此保持打开很长时间的事务可能因为空间无法回收而导致相当大的表膨胀。此特性允许通过新配置参数old_snapshot_threshold对 MVCC 快照保证有效的时间设置基于时间的限制。之后死元组就成为移除候选。使用过期快照的事务如果试图读取可能包含过这种数据的页,就会得到错误。

性能改进忽略功能上依赖于其他列的 GROUP BY 列

服务器 / 一般性能

忽略功能上依赖于其他列的 GROUP BY 列(David Rowley)

如果 GROUP BY 子句包含非延迟主键的所有列以及同一表的其他列,那些其他列是冗余的、可以从分组中丢弃。这在许多常见场景中节省计算。

性能改进当部分索引的 WHERE 子句引用未被索引的列时,允许对它使用仅索引扫描

服务器 / 一般性能

当部分索引的 WHERE 子句引用未被索引的列时,允许对它使用仅索引扫描(Tomas Vondra、Kyotaro Horiguchi)

例如由 CREATE INDEX tidx_partial ON t(b) WHERE a > 0 定义的索引现在可以被指定了 WHERE a > 0 且不以其他方式使用 a 的查询用于仅索引扫描。以前这是不允许的,因为 a 未被列为索引列。

性能改进按排序顺序执行检查点写

服务器 / 一般性能

按排序顺序执行检查点写(Fabien Coelho、Andres Freund)

以前检查点以脏页碰巧出现在共享缓冲区中的顺序(通常近乎随机)写出它们。这性能很差,特别是在旋转介质上。此更改使检查点驱动的写按文件和块号顺序执行,并在表空间之间平衡。

性能改进在可行之处,在可配置次数的写之后触发内核回写,以防止内核磁盘缓冲区中脏数据的积累

服务器 / 一般性能

在可行之处,在可配置次数的写之后触发内核回写,以防止内核磁盘缓冲区中脏数据的积累(Fabien Coelho、Andres Freund)

PostgreSQL 把数据写入内核的磁盘缓存,之后在适当时候被刷到物理存储。许多操作系统对此管理不善,允许大量脏数据积累后才决定一次全部刷出,导致新 I/O 请求长时间延迟直到刷写完成。此更改尝试通过在可配置间隔后显式请求数据刷写来缓解此问题。

在 Linux 上为此使用 sync_file_range(),并且该特性在 Linux 上默认打开,因为该函数几乎没有缺点。如果其他平台有 msync() 或 posix_fadvise(),这种刷写能力也可用,但这些接口有一些不良副作用,因此该特性在非 Linux 平台上默认禁用。

新配置参数backend_flush_after、bgwriter_flush_after、checkpoint_flush_after和wal_writer_flush_after控制这一行为。

性能改进通过在多个聚合有相同参数和转换函数时共享计算来改进聚合函数性能

服务器 / 一般性能

通过在多个聚合有相同参数和转换函数时共享计算来改进聚合函数性能(David Rowley)

例如 SELECT AVG(x), VARIANCE(x) FROM tab 可以对两个聚合使用单次逐行计算。

性能改进通过检查当前事务的快照而非 pg_clog 来决定源事务是否应被视为已提交,加速最近创建元组的可见性测试

服务器 / 一般性能

通过检查当前事务的快照而非 pg_clog 来决定源事务是否应被视为已提交,加速最近创建元组的可见性测试(Jeff Janes、Tom Lane)

性能改进允许比以前更早设置元组提示位

服务器 / 一般性能

允许比以前更早设置元组提示位(Andres Freund)

性能改进改进短命预备事务的性能

服务器 / 一般性能

改进短命预备事务的性能(Stas Kelvich、Simon Riggs、Pavan Deolasee)

两阶段提交信息现在只在 PREPARE TRANSACTION 期间写入 WAL,如果紧接着提交,将在 COMMIT PREPARED 期间从 WAL 读回。只有当未决事务在下一次检查点之前没有被提交或中止时才创建单独的状态文件。

性能改进改进内存上下文销毁的性能

服务器 / 一般性能

改进内存上下文销毁的性能(Jan Wieck)

性能改进改进有多个被跟踪对象的资源所有者的性能

服务器 / 一般性能

改进有多个被跟踪对象的资源所有者的性能(Aleksander Alekseev)

性能改进加速 timestamp、time 和 date 数据类型的输出函数

服务器 / 一般性能

加速 timestamp、time 和 date 数据类型的输出函数(David Rowley、Andres Freund)

性能改进避免重放取得 AccessExclusive 锁的操作期间热备查询的一些不必要取消

服务器 / 一般性能

避免重放取得 AccessExclusive 锁的操作期间热备查询的一些不必要取消(Jeff Janes)

性能改进当关系的扩展锁有争用时一次扩展关系多个块

服务器 / 一般性能

当关系的扩展锁有争用时一次扩展关系多个块(Dilip Kumar)

这通过减少争用改进可伸缩性。

性能改进增加 clog 缓冲区数量以获得更好的可伸缩性

服务器 / 一般性能

增加 clog 缓冲区数量以获得更好的可伸缩性(Amit Kapila、Andres Freund)

性能改进通过始终保持简单变量的 ParamListInfo 条目有效,加速 PL/pgSQL 中的表达式求值

服务器 / 一般性能

通过始终保持简单变量的 ParamListInfo 条目有效,加速 PL/pgSQL 中的表达式求值(Tom Lane)

性能改进避免在最近的 Windows 版本上把 SO_SNDBUF 设置降低到默认值以下

服务器 / 一般性能

避免在最近的 Windows 版本上把 SO_SNDBUF 设置降低到默认值以下(Chen Huajun)

性能改进在 Windows 上默认禁用update_process_title

服务器 / 一般性能

在 Windows 上默认禁用update_process_title(Takayuki Tsunakawa)

更新进程标题的开销在 Windows 上比大多数其他平台大得多,而且由于大多数 Windows 用户没有能显示进程标题的工具,这样做也没那么有用。

新功能添加 pg_stat_progress_vacuum 系统视图以为 VACUUM 操作提供进度报告

服务器 / 监控

添加 pg_stat_progress_vacuum 系统视图以为 VACUUM 操作提供进度报告(Amit Langote、Robert Haas、Vinayak Pokale、Rahila Syed)

新功能添加 pg_control_system()、pg_control_checkpoint()、pg_control_recovery() 和 pg_control_init() 函数以把 pg_control 的字段暴露给 SQL

服务器 / 监控

添加 pg_control_system()、pg_control_checkpoint()、pg_control_recovery() 和 pg_control_init() 函数以把 pg_control 的字段暴露给 SQL(Joe Conway、Michael Paquier)

新功能添加 pg_config 系统视图

服务器 / 监控

添加 pg_config 系统视图(Joe Conway)

此视图暴露与 pg_config 命令行实用程序相同的信息,即 PostgreSQL 的各种编译时配置信息。

新功能在 pg_replication_slots 系统视图中添加 confirmed_flush_lsn 列

服务器 / 监控

在 pg_replication_slots 系统视图中添加 confirmed_flush_lsn 列(Marko Tiikkaja)

新功能添加 pg_stat_wal_receiver 系统视图以提供热备服务器 WAL 接收器进程的状态信息

服务器 / 监控

添加 pg_stat_wal_receiver 系统视图以提供热备服务器 WAL 接收器进程的状态信息(Michael Paquier)

新功能添加 pg_blocking_pids() 函数以可靠地识别哪些会话阻塞哪些会话

服务器 / 监控

添加 pg_blocking_pids() 函数以可靠地识别哪些会话阻塞哪些会话(Tom Lane)

此函数返回阻塞具有给定进程 ID 的会话的任何会话的进程 ID 数组。历史上用户通过对 pg_locks 视图自连接获得这种信息。但以任何正确性这样做都异常繁琐,而且并行查询的加入使旧方法完全不实用,因为锁可能被子工作者进程而非会话的主进程持有或等待。

新功能添加函数 pg_current_xlog_flush_location() 以暴露当前事务日志刷写位置

服务器 / 监控

添加函数 pg_current_xlog_flush_location() 以暴露当前事务日志刷写位置(Tomas Vondra)

新功能添加函数 pg_notification_queue_usage() 以报告 NOTIFY 队列的占用程度

服务器 / 监控

添加函数 pg_notification_queue_usage() 以报告 NOTIFY 队列的占用程度(Brendan Jurd)

新功能限制内存上下文统计转储的冗长程度

服务器 / 监控

限制内存上下文统计转储的冗长程度(Tom Lane)

内存不足失败期间输出到 postmaster 日志的内存使用转储现在在有大量内存上下文时汇总统计,而不是可能生成非常大的报告。现在还有“总计”汇总行。

新功能添加 BSD 认证方法以允许 PostgreSQL 客户端认证使用 BSD 认证服务

服务器 / Authentication

添加 BSD 认证方法以允许 PostgreSQL 客户端认证使用 BSD 认证服务(Marisa Emerson)

BSD 认证当前只在 OpenBSD 上可用。

新功能使用 PAM 认证时,通过 PAM_RHOST 项向 PAM 模块提供客户端 IP 地址或主机名

服务器 / Authentication

使用 PAM 认证时,通过 PAM_RHOST 项向 PAM 模块提供客户端 IP 地址或主机名(Grzegorz Sampolski)

新功能在 postmaster 日志中为更多类型的密码认证失败提供细节

服务器 / Authentication

在 postmaster 日志中为更多类型的密码认证失败提供细节(Tom Lane)

所有通常可达的密码认证失败情况现在都应在日志中提供具体的 DETAIL 字段。

新功能支持长达 128 个字符的 RADIUS 密码

服务器 / Authentication

支持长达 128 个字符的 RADIUS 密码(Marko Tiikkaja)

新功能添加新的 SSPI 认证参数 compat_realm 和 upn_username,控制 SSPI 认证期间使用 NetBIOS 还是 Kerberos 领域名和用户名

服务器 / Authentication

添加新的 SSPI 认证参数 compat_realm 和 upn_username,控制 SSPI 认证期间使用 NetBIOS 还是 Kerberos 领域名和用户名(Christian Ullrich)

新功能允许处于空闲于事务状态过久的会话被自动终止

服务器 / 服务器配置

允许处于空闲于事务状态过久的会话被自动终止(Vik Fearing)

这一行为由新配置参数idle_in_transaction_session_timeout控制。它有助于防止被遗忘的事务过久持有锁或妨碍清理。

新功能把checkpoint_timeout允许的最大值提高到 24 小时

服务器 / 服务器配置

把checkpoint_timeout允许的最大值提高到 24 小时(Simon Riggs)

新功能允许 effective_io_concurrency 按表空间设置,以支持不同表空间有不同 I/O 特性的情况

服务器 / 服务器配置

允许 effective_io_concurrency 按表空间设置,以支持不同表空间有不同 I/O 特性的情况(Julien Rouhaud)

新功能添加log_line_prefix选项 %n 以 Unix 纪元形式(带毫秒)打印当前时间

服务器 / 服务器配置

添加log_line_prefix选项 %n 以 Unix 纪元形式(带毫秒)打印当前时间(Tomas Vondra、Jeff Davis)

新功能添加syslog_sequence_numbers和syslog_split_messages配置参数,为记录到 syslog 时的消息格式提供更多控制

服务器 / 服务器配置

添加syslog_sequence_numbers和syslog_split_messages配置参数,为记录到 syslog 时的消息格式提供更多控制(Peter Eisentraut)

新功能把wal_level配置参数的 archive 和 hot_standby 值合并为单一新值 replica

服务器 / 服务器配置

把wal_level配置参数的 archive 和 hot_standby 值合并为单一新值 replica(Peter Eisentraut)

区分这些设置不再有用,合并它们是朝计划中的未来复制设置简化迈出的一步。旧名字仍被接受但在内部转换为 replica。

新功能添加 configure 选项 --with-systemd 以在服务器启动和停止时启用调用 sd_notify()

服务器 / 服务器配置

添加 configure 选项 --with-systemd 以在服务器启动和停止时启用调用 sd_notify()(Peter Eisentraut)

这允许使用 notify 类型的 systemd 服务单元,大大简化了 PostgreSQL 在 systemd 下的管理。

新功能允许服务器的 SSL 密钥文件在由 root 拥有时具有组读访问

服务器 / 服务器配置

允许服务器的 SSL 密钥文件在由 root 拥有时具有组读访问(Christoph Berg)

以前我们坚持密钥文件由运行 PostgreSQL 服务器的用户拥有,但在配置为集中管理证书的一些系统(如 Debian)上这不方便。因此允许密钥文件由 root 拥有并具有组读访问的情况。由操作系统管理员确保该组不包含任何不受信任的用户。

新功能如果 postmaster 死亡,强制后端退出

服务器 / 可靠性

如果 postmaster 死亡,强制后端退出(Rajeev Rastogi、Robert Haas)

在正常情况下 postmaster 总是比其子进程活得长。如果 postmaster 因某种原因死亡,强制后端会话报错退出。以前现有的后端会继续运行直到其客户端断开,但那既不安全又低效。它还阻止新的 postmaster 启动,直到最后一个旧后端退出。后端将在等待客户端 I/O 时检测 postmaster 死亡,所以退出不是瞬时的,但不会晚于当前查询结束。

新功能在报告约束违反失败之前检查可序列化冲突

服务器 / 可靠性

在报告约束违反失败之前检查可序列化冲突(Thomas Munro)

使用可序列化事务隔离时,希望任何因并发事务导致的错误都表现为序列化失败,从而提示应用重试可能成功。不幸的是,对并发插入导致的重复键失败这不能可靠发生。此更改确保如果应用在事务中早些时候显式检查过冲突键的存在(且未找到),这种错误将被报告为序列化错误。

新功能确保失效消息即使由未分配 XID 的事务发出也被记录到 WAL 中

服务器 / 可靠性

确保失效消息即使由未分配 XID 的事务发出也被记录到 WAL 中(Andres Freund)

这修复了一些备库服务器上的事务没有注意到更改(如新索引)的边界情况。

新功能防止多个进程并发尝试清理 GIN 索引的未决列表

服务器 / 可靠性

防止多个进程并发尝试清理 GIN 索引的未决列表(Teodor Sigaev、Jeff Janes)

这是有意允许的,但它导致的竞态条件可能使清理遗漏它需要删除的索引条目。

新功能允许同步复制支持多个同时的同步备库服务器而不只是一个

复制与恢复

允许同步复制支持多个同时的同步备库服务器而不只是一个(Masahiko Sawada、Beena Emerson、Michael Paquier、Fujii Masao、Kyotaro Horiguchi)

提交被认为完成之前必须确认的备库服务器数量现在可作为synchronous_standby_names参数的一部分进行配置。

新功能为配置参数synchronous_commit添加新设置 remote_apply

复制与恢复

为配置参数synchronous_commit添加新设置 remote_apply(Thomas Munro)

在这种模式下,主库等待事务在备库服务器上被应用而不只是写入磁盘。这意味着你可以指望备库上启动的事务看到主库先前确认的所有提交。

新功能为复制协议添加一项特性,并为 pg_create_physical_replication_slot() 添加相应选项,允许在创建复制槽时立即保留 WAL

复制与恢复

为复制协议添加一项特性,并为 pg_create_physical_replication_slot() 添加相应选项,允许在创建复制槽时立即保留 WAL(Gurjeet Singh、Michael Paquier)

这允许创建复制槽来保证基础备份所需的所有 WAL 都可用。

新功能为pg_basebackup添加 --slot 选项

复制与恢复

为pg_basebackup添加 --slot 选项(Peter Eisentraut)

这让 pg_basebackup 能使用为 WAL 流式传输定义的复制槽。基础备份完成后,为常规流复制选择同一槽允许新的备库服务器无缝启动。

新功能扩展 pg_start_backup() 和 pg_stop_backup() 以支持非独占备份

复制与恢复

扩展 pg_start_backup() 和 pg_stop_backup() 以支持非独占备份(Magnus Hagander)

新功能允许返回元组集合的函数返回简单的 NULL

查询

允许返回元组集合的函数返回简单的 NULL(Andrew Gierth、Tom Lane)

在 SELECT FROM function(...) 的上下文中,返回复合值集合的函数以前不允许作为集合的一部分返回普通的 NULL 值。现在这是允许的并被解释为一行 NULL。这避免了例如展开复合值数组时的边界错误。

新功能完全支持带多行 VALUES 的 INSERT 的目标列列表中的数组下标和字段选择

查询

完全支持带多行 VALUES 的 INSERT 的目标列列表中的数组下标和字段选择(Tom Lane)

以前这种情况下如果同一目标列被提及多于一次就会失败,例如 INSERT INTO tab (x[1], x[2]) VALUES (...)。

新功能在适当之处把 SELECT 输出表达式的求值推迟到 ORDER BY 排序之后

查询

在适当之处把 SELECT 输出表达式的求值推迟到 ORDER BY 排序之后(Konstantin Knizhnik)

此更改确保输出列表中的易变或昂贵函数按 ORDER BY 建议的顺序执行,并且当有 LIMIT 子句时不会被求值超过需要的次数。以前如果排序由索引扫描或合并前排序执行这些性质成立,但由顶层排序执行时不成立。

新功能把记录已处理元组数的计数器加宽到 64 位

查询

把记录已处理元组数的计数器加宽到 64 位(Andreas Scherbaum)

此更改允许命令标记(如 SELECT)正确报告超过 40 亿的元组数。这也适用于 PL/pgSQL 的 GET DIAGNOSTICS ... ROW_COUNT 命令。

新功能避免通过 MULE_INTERNAL 编码进行编码转换

查询

避免通过 MULE_INTERNAL 编码进行编码转换(Tom Lane)

以前西里尔和中欧单字节编码的许多转换是通过转换到相关的 MULE_INTERNAL 编码方案再转到目标编码完成的。除了低效之外,这意味着当转换遇到不可翻译字符时,错误消息会令人困惑地抱怨无法转换到或从 MULE_INTERNAL,而不是用户可见的编码。

新功能只有当外部表将在同一角色 ID 下被访问时才考虑远程执行外部表的连接

查询

只有当外部表将在同一角色 ID 下被访问时才考虑远程执行外部表的连接(Shigeru Hanada、Ashutosh Bapat、Etsuro Fujita)

以前外部连接下推基础设施把安全问题完全留给各个外部数据包装器,但这使 FDW 太容易无意中创建微妙的安全漏洞。因此改为核心代码决定哪个角色 ID 将访问每个表,除非所有相关关系的角色相同,否则不尝试连接下推。

新功能允许 COPY 复制 INSERT/UPDATE/DELETE ... RETURNING 查询的输出

工具命令

允许 COPY 复制 INSERT/UPDATE/DELETE ... RETURNING 查询的输出(Marko Tiikkaja)

以前必须编写中间 CTE 才能得到这个结果。

新功能引入 ALTER object DEPENDS ON EXTENSION

工具命令

引入 ALTER object DEPENDS ON EXTENSION(Abhijit Menon-Sen)

此命令允许把数据库对象标记为依赖于某个扩展,使它在扩展被删除时自动删除(不需要 CASCADE)。但该对象不是扩展的一部分,因此 pg_dump 会单独转储它。

新功能使 ALTER object SET SCHEMA 在对象已位于请求的模式中时不做任何事,而不是像历史上对大多数对象类型那样抛出错误

工具命令

使 ALTER object SET SCHEMA 在对象已位于请求的模式中时不做任何事,而不是像历史上对大多数对象类型那样抛出错误(Marti Raudsepp)

新功能为 ALTER OPERATOR 添加选项以允许更改与现有操作符关联的选择率函数

工具命令

为 ALTER OPERATOR 添加选项以允许更改与现有操作符关联的选择率函数(Yury Zhuravlev)

新功能为 ALTER TABLE ADD COLUMN 添加 IF NOT EXISTS 选项

工具命令

为 ALTER TABLE ADD COLUMN 添加 IF NOT EXISTS 选项(Fabrízio de Royes Mello)

新功能降低 ALTER TABLE 在设置 fillfactor 和自动清理相关关系选项时所需的锁强度

工具命令

降低 ALTER TABLE 在设置 fillfactor 和自动清理相关关系选项时所需的锁强度(Fabrízio de Royes Mello、Simon Riggs)

新功能引入 CREATE ACCESS METHOD 以允许扩展创建索引访问方法

工具命令

引入 CREATE ACCESS METHOD 以允许扩展创建索引访问方法(Alexander Korotkov、Petr Jelínek)

新功能为 CREATE EXTENSION 添加 CASCADE 选项以自动创建所请求扩展依赖的任何扩展

工具命令

为 CREATE EXTENSION 添加 CASCADE 选项以自动创建所请求扩展依赖的任何扩展(Petr Jelínek)

新功能使 CREATE TABLE ... LIKE 在任何源表有 OID 列时包含 OID 列

工具命令

使 CREATE TABLE ... LIKE 在任何源表有 OID 列时包含 OID 列(Bruce Momjian)

新功能如果 CHECK 约束在表创建命令中被声明为 NOT VALID,自动把它标记为有效

工具命令

如果 CHECK 约束在表创建命令中被声明为 NOT VALID,自动把它标记为有效(Amit Langote、Amul Sul)

这是安全的,因为表没有现有行。这与 FOREIGN KEY 约束的长期行为一致。

BUG 修复修复 DROP OPERATOR 清除指向被删除操作符的 pg_operator.oprcom 和 pg_operator.oprnegate 链接

工具命令

修复 DROP OPERATOR 清除指向被删除操作符的 pg_operator.oprcom 和 pg_operator.oprnegate 链接(Roma Sokolov)

以前这种链接保持原样,在被删除操作符的 OID 被复用于另一个操作符这种不太可能的事件中可能造成问题。

新功能不在 EXPLAIN 输出中两次显示同一子计划

工具命令

不在 EXPLAIN 输出中两次显示同一子计划(Tom Lane)

某些情况下(通常涉及索引条件中的 SubPlan 节点),EXPLAIN 会两次打印同一子计划的数据。

新功能禁止在系统列上创建索引,OID 列除外

工具命令

禁止在系统列上创建索引,OID 列除外(David Rowley)

这种索引从未被视为受支持,而且很可能行为不当,因为系统可能在不更新索引的情况下更改元组的系统列字段。但以前没有防止创建它们的错误检查。

新功能使用权限系统管理对敏感函数的访问

权限管理

使用权限系统管理对敏感函数的访问(Stephen Frost)

以前许多安全敏感函数包含硬编码的检查,在被非超级用户调用时会抛出错误。这迫使一些相对平常的任务使用超级用户角色。硬编码的错误检查现已移除,改为让 initdb 撤销这些函数上的公共 EXECUTE 权限。这允许安装选择把这种函数的使用权授予不需要全部超级用户权限的可信角色。

新功能创建一些内建角色,可用于授予对以前仅限超级用户的函数的访问

权限管理

创建一些内建角色,可用于授予对以前仅限超级用户的函数的访问(Stephen Frost)

当前唯一这种角色是 pg_signal_backend,但预计未来会添加更多。

新功能改进全文搜索以支持搜索短语,即以特定顺序相邻出现或之间有指定距离的词素

数据类型

改进全文搜索以支持搜索短语,即以特定顺序相邻出现或之间有指定距离的词素(Teodor Sigaev、Oleg Bartunov、Dmitry Ivanov)

短语搜索查询可以在 tsquery 输入中用新操作符 <-> 和 <N> 指定。前者表示它前后的词素必须以该顺序相邻出现。后者表示它们必须恰好相隔 N 个词素。

新功能允许在数组切片说明符中省略一个或两个边界,例如 array_col[3:]

数据类型

允许在数组切片说明符中省略一个或两个边界,例如 array_col[3:](Yury Zhuravlev)

省略的边界被当作相应数组下标的上限或下限。这使许多常见用例的指定更简单。

新功能更谨慎地处理超出范围的日期和时间戳

数据类型

更谨慎地处理超出范围的日期和时间戳(Vitaly Burovoy)

此更改防止对非常接近实现限制的 timestamp with time zone 值出现意外的超出范围错误。以前“同一”值可能被接受也可能不被接受,取决于 timezone 设置,这意味着转储和重新装载可能在一个先前被接受的值上失败。现在限制根据等价的 UTC 时间而非本地时间执行,因此与 timezone 无关。

此外,PostgreSQL 现在更谨慎地检测计算新日期或时间戳值的操作(如 date + integer)中的溢出。

新功能对几何数据类型,确保 infinity 和 NaN 分量值在输入和输出期间被一致处理

数据类型

对几何数据类型,确保 infinity 和 NaN 分量值在输入和输出期间被一致处理(Tom Lane)

这种值现在总是与它们在简单 float8 列中打印的方式相同地打印,输入时以相同方式接受。以前行为与平台相关。

新功能升级 ispell 词典类型以处理现代 Hunspell 文件并支持更多语言

数据类型

升级 ispell 词典类型以处理现代 Hunspell 文件并支持更多语言(Artur Zakirov)

新功能在正则表达式中实现后顾约束

数据类型

在正则表达式中实现后顾约束(Tom Lane)

后顾约束与前瞻约束类似,不消耗文本;但它检查在字符串当前点结束的匹配(或不存在),而不是在当前点开始的匹配。许多其他正则表达式引擎中存在类似特性。

新功能在正则表达式中,如果表面上的三位八进制转义 \nnn 会超过 377(十进制 255),就假定它是两位八进制转义

数据类型

在正则表达式中,如果表面上的三位八进制转义 \nnn 会超过 377(十进制 255),就假定它是两位八进制转义(Tom Lane)

这使行为与当前的 Tcl 版本匹配。

新功能添加事务 ID 操作符 xid <> xid 和 xid <> int4,以与相应的相等操作符保持一致

数据类型

添加事务 ID 操作符 xid <> xid 和 xid <> int4,以与相应的相等操作符保持一致(Michael Paquier)

新功能添加 jsonb_insert() 函数,用于向 jsonb 数组插入新元素,或向 jsonb 对象插入此前不存在的键

函数

添加 jsonb_insert() 函数,用于向 jsonb 数组插入新元素,或向 jsonb 对象插入此前不存在的键(Dmitry Dolgov)

新功能提高 ln()、log()、exp() 和 pow() 函数在 numeric 类型上的计算精度

函数

提高 ln()、log()、exp() 和 pow() 函数在 numeric 类型上的计算精度(Dean Rasheed)

新功能添加 scale(numeric) 函数以提取 numeric 值的显示标度

函数

添加 scale(numeric) 函数以提取 numeric 值的显示标度(Marko Tiikkaja)

新功能添加以度为单位的三角函数

函数

添加以度为单位的三角函数(Dean Rasheed)

例如 sind() 以度度量其参数,而 sin() 以弧度度量。这些函数竭力在可以期待精确结果的值上给出精确结果,例如 sind(30) = 0.5。

新功能确保三角函数按照 POSIX 标准处理 infinity 和 NaN 输入

函数

确保三角函数按照 POSIX 标准处理 infinity 和 NaN 输入(Dean Rasheed)

POSIX 标准说这些函数对 NaN 输入应返回 NaN,对包括 infinity 在内的超出范围输入应抛出错误。以前我们的行为随平台而异。

新功能使 to_timestamp(float8) 把浮点 infinity 转换为时间戳 infinity

函数

使 to_timestamp(float8) 把浮点 infinity 转换为时间戳 infinity(Vitaly Burovoy)

以前它对无穷输入只会失败。

新功能为 tsvector 数据添加新函数

函数

为 tsvector 数据添加新函数(Stas Kelvich)

新函数是 ts_delete()、ts_filter()、unnest()、tsvector_to_array()、array_to_tsvector(),以及只为指定词素设置权重的 setweight() 变体。

新功能允许 ts_stat() 和 tsvector_update_trigger() 对与预期参数类型二进制兼容的类型(而不只是恰好该类型)的值进行操作;例如在期望 text 之处允许 citext

函数

允许 ts_stat() 和 tsvector_update_trigger() 对与预期参数类型二进制兼容的类型(而不只是恰好该类型)的值进行操作;例如在期望 text 之处允许 citext(Teodor Sigaev)

新功能添加可变参数函数 num_nulls() 和 num_nonnulls(),统计其参数中空或非空的数量

函数

添加可变参数函数 num_nulls() 和 num_nonnulls(),统计其参数中空或非空的数量(Marko Tiikkaja)

一个用法示例是 CHECK(num_nonnulls(a,b,c) = 1),断言 a,b,c 中恰好有一个不为 NULL。这些函数还可用于统计数组中空或非空元素的数量。

新功能添加函数 parse_ident() 以把限定的、可能带引号的 SQL 标识符拆分成各部分

函数

添加函数 parse_ident() 以把限定的、可能带引号的 SQL 标识符拆分成各部分(Pavel Stehule)

新功能在 to_number() 中,把 V 格式代码解释为除以 10 的 V 后数字次数幂

函数

在 to_number() 中,把 V 格式代码解释为除以 10 的 V 后数字次数幂(Bruce Momjian)

这使它以与 to_char() 相逆的方式操作。

新功能使 to_reg*() 函数接受 text 类型而非 cstring

函数

使 to_reg*() 函数接受 text 类型而非 cstring(Petr Korobeinikov)

这避免了在参数不是简单字面常量的大多数情况下编写显式强制转换的需要。

新功能添加 pg_size_bytes() 函数以把人类可读的大小字符串转换为数字

函数

添加 pg_size_bytes() 函数以把人类可读的大小字符串转换为数字(Pavel Stehule、Vitaly Burovoy、Dean Rasheed)

此函数把 pg_size_pretty() 产生的字符串转换为字节。一个用法示例是 SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB')。

新功能在 pg_size_pretty() 中,负数的格式化与正数相似

函数

在 pg_size_pretty() 中,负数的格式化与正数相似(Adrian Vondendriesch)

以前负数从不缩写,只是以字节打印。

新功能为 current_setting() 函数添加可选的 missing_ok 参数

函数

为 current_setting() 函数添加可选的 missing_ok 参数(David Christensen)

这允许对无法识别的参数名避免错误,改为返回 NULL。

新功能更改各种目录检查函数对无效输入返回 NULL

函数

更改各种目录检查函数对无效输入返回 NULL(Michael Paquier)

pg_get_viewdef() 现在给定无效的视图 OID 时返回 NULL,几个类似函数对坏输入同样返回 NULL。以前这种情况通常导致 “cache lookup failed” 错误,这些错误本不应在面向用户的情况中出现。

BUG 修复修复 pg_replication_origin_xact_reset() 使之不带任何参数

函数

修复 pg_replication_origin_xact_reset() 使之不带任何参数(Fujii Masao)

文档说它没有参数,C 代码也不期望任何参数,但 pg_proc 中的条目错误地指定了两个参数。

新功能在 PL/pgSQL 中,在编译函数时检测不匹配的 CONTINUE 和 EXIT 语句,而不是在执行时

服务器端语言

在 PL/pgSQL 中,在编译函数时检测不匹配的 CONTINUE 和 EXIT 语句,而不是在执行时(Jim Nasby)

新功能扩展 PL/Python 的错误报告和消息报告函数,允许指定主错误消息之外的其他消息字段

服务器端语言

扩展 PL/Python 的错误报告和消息报告函数,允许指定主错误消息之外的其他消息字段(Pavel Stehule)

BUG 修复允许 PL/Python 函数通过 SPI 递归调用自身,并修复在一个查询中调用多个返回集合的 PL/Python 函数时的行为

服务器端语言

允许 PL/Python 函数通过 SPI 递归调用自身,并修复在一个查询中调用多个返回集合的 PL/Python 函数时的行为(Alexey Grishchenko、Tom Lane)

BUG 修复修复 PL/Python 中的会话生命周期内存泄漏

服务器端语言

修复 PL/Python 中的会话生命周期内存泄漏(Heikki Linnakangas、Haribabu Kommi、Tom Lane)

新功能使 PL/Tcl 现代化,使用 Tcl 的“对象” API 而非简单字符串

服务器端语言

使 PL/Tcl 现代化,使用 Tcl 的“对象” API 而非简单字符串(Jim Nasby、Karl Lehenbauer)

这在某些情况下可以显著改进性能。注意 PL/Tcl 现在要求 Tcl 8.4 或更新版本。

新功能在 PL/Tcl 中,使数据库报告的错误在 Tcl 的 errorCode 全局变量中返回附加信息

服务器端语言

在 PL/Tcl 中,使数据库报告的错误在 Tcl 的 errorCode 全局变量中返回附加信息(Jim Nasby、Tom Lane)

此特性遵循 Tcl 返回错误辅助数据的惯例。

BUG 修复修复 PL/Tcl 在数据库编码和 UTF-8(Tcl 所期望的)之间执行编码转换

服务器端语言

修复 PL/Tcl 在数据库编码和 UTF-8(Tcl 所期望的)之间执行编码转换(Tom Lane)

以前字符串不经转换直接传递,当数据库编码不是 UTF-8 时导致非 ASCII 字符的错误行为。

新功能在错误和通知消息中添加 severity 字段的未本地化版本

客户端接口

在错误和通知消息中添加 severity 字段的未本地化版本(Tom Lane)

此更改允许客户端代码确定错误或通知的严重性,而不必担心 severity 字符串的本地化变体。

新功能在 libpq 中引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段

客户端接口

在 libpq 中引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段(Pavel Stehule)

PQerrorMessage() 的默认行为现在只对错误打印 CONTEXT。新函数 PQsetErrorContextVisibility() 可用于调整这一点。

关联记录(2)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

新功能在 libpq 中添加以不同详细级别重新生成错误消息的支持

客户端接口

在 libpq 中添加以不同详细级别重新生成错误消息的支持(Alex Shulgin)

这通过新函数 PQresultVerboseErrorMessage() 完成。这支持 psql 的新 \errverbose 特性,对其他客户端也可能有用。

新功能改进 libpq 的 PQhost() 函数,为默认 Unix 套接字连接返回有用数据

客户端接口

改进 libpq 的 PQhost() 函数,为默认 Unix 套接字连接返回有用数据(Tom Lane)

以前如果没有给出显式主机说明它会返回 NULL;现在返回默认套接字目录路径。

BUG 修复修复 ecpg 的词法分析器处理预处理指令行上注释中的换行

客户端接口

修复 ecpg 的词法分析器处理预处理指令行上注释中的换行(Michael Meskes)

新功能为pg_dump和pg_restore添加 --strict-names 选项

客户端应用程序

为pg_dump和pg_restore添加 --strict-names 选项(Pavel Stehule)

此选项使程序在 -t 或 -n 选项没有匹配时报怨,而不是静默地不做任何事。

新功能在 pg_dump 中,转储对系统对象的本地权限分配更改

客户端应用程序

在 pg_dump 中,转储对系统对象的本地权限分配更改(Stephen Frost)

虽然超级user总是可以更改内建或扩展创建对象的权限分配,但这种更改以前在转储和重新装载中丢失。现在 pg_dump 识别并转储这种更改。(但这只在从 9.6 或更晚服务器转储时有效。)

新功能允许 pg_dump 转储扩展拥有的模式中的非扩展拥有对象

客户端应用程序

允许 pg_dump 转储扩展拥有的模式中的非扩展拥有对象(Martín Marqués)

以前这种对象被忽略,因为被错误地假定属于拥有其模式的扩展。

新功能在 pg_dump 输出中,对只在每表内唯一命名的对象类型(例如触发器)的对象标记中包含表名

客户端应用程序

在 pg_dump 输出中,对只在每表内唯一命名的对象类型(例如触发器)的对象标记中包含表名(Peter Eisentraut)

新功能支持多个 -c 和 -f 命令行选项

客户端应用程序 / psql

支持多个 -c 和 -f 命令行选项(Pavel Stehule、Catalin Iacob)

指定的操作按给出选项的顺序执行,然后 psql 终止。

关联记录(1)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

新功能添加以交叉表显示打印查询结果的 \crosstabview 命令

客户端应用程序 / psql

添加以交叉表显示打印查询结果的 \crosstabview 命令(Daniel Vérité)

在交叉表显示中,来自一个查询结果列的数据值被放在一个网格中,其列和行标题来自其他查询结果列。

新功能添加以完整详细程度显示最后一个服务器错误的 \errverbose 命令

客户端应用程序 / psql

添加以完整详细程度显示最后一个服务器错误的 \errverbose 命令(Alex Shulgin)

这在得到意外错误之后很有用——不再需要调整 VERBOSITY 变量并重现失败来查看默认不显示的错误字段。

新功能添加用于编辑和显示视图定义的 \ev 和 \sv 命令

客户端应用程序 / psql

添加用于编辑和显示视图定义的 \ev 和 \sv 命令(Petr Korobeinikov)

它们与现有的用于函数的 \ef 和 \sf 命令平行。

新功能添加执行查询并把结果重新作为新查询提交的 \gexec 命令

客户端应用程序 / psql

添加执行查询并把结果重新作为新查询提交的 \gexec 命令(Corey Huinker)

新功能允许 \pset C string 设置表标题,与 \C string 一致

客户端应用程序 / psql

允许 \pset C string 设置表标题,与 \C string 一致(Bruce Momjian)

新功能在 \pset expanded auto 模式下,对只有一列的查询结果不使用扩展格式

客户端应用程序 / psql

在 \pset expanded auto 模式下,对只有一列的查询结果不使用扩展格式(Andreas Karlsson、Robert Haas)

新功能改进 \watch 命令输出的头

客户端应用程序 / psql

改进 \watch 命令输出的头(Michael Paquier、Tom Lane)

包括 \pset title 字符串(如果已设置),并把头部预制部分缩短为 timestamp (every Ns)。此外时间戳格式现在遵循 psql 的区域环境。

新功能改进 Tab 补全逻辑以考虑整个输入查询,而不只是当前行

客户端应用程序 / psql

改进 Tab 补全逻辑以考虑整个输入查询,而不只是当前行(Tom Lane)

以前把命令拆成多行会击败任何需要看到前几行单词的 Tab 补全规则。

新功能Tab 补全行为的大量小改进

客户端应用程序 / psql

Tab 补全行为的大量小改进(Peter Eisentraut、Vik Fearing、Kevin Grittner、Kyotaro Horiguchi、Jeff Janes、Andreas Karlsson、Fujii Masao、Thomas Munro、Masahiko Sawada、Pavel Stehule)

新功能添加 PROMPT 选项 %p 以插入所连接后端的进程 ID

客户端应用程序 / psql

添加 PROMPT 选项 %p 以插入所连接后端的进程 ID(Julien Rouhaud)

新功能引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段

客户端应用程序 / psql

引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段(Pavel Stehule)

只对错误打印 CONTEXT 现在是默认行为。可以通过设置特殊变量 SHOW_CONTEXT 更改。

关联记录(2)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

新功能使 \df+ 显示函数访问权限和并行安全属性

客户端应用程序 / psql

使 \df+ 显示函数访问权限和并行安全属性(Michael Paquier)

新功能pgbench 脚本中的 SQL 命令现在以分号而非换行结束

客户端应用程序 / pgbench

pgbench 脚本中的 SQL 命令现在以分号而非换行结束(Kyotaro Horiguchi、Tom Lane)

此更改允许脚本中的 SQL 命令跨多行。现有的自定义脚本需要修改,在每个还没有分号的行尾添加分号。(这样做不会破坏脚本在旧版本 pgbench 中的使用。)

新功能支持反斜杠命令表达式中的浮点运算以及一些内建函数

客户端应用程序 / pgbench

支持反斜杠命令表达式中的浮点运算以及一些内建函数(Fabien Coelho)

新功能用内建函数替换 \setrandom

客户端应用程序 / pgbench

用内建函数替换 \setrandom(Fabien Coelho)

新内建函数包括 random()、random_exponential() 和 random_gaussian(),它们执行与 \setrandom 相同的工作,但更易于使用,因为可以嵌入更大的表达式。由于这些添加使 \setrandom 过时,将其移除。

新功能允许调用内建脚本的多个副本,而不只是自定义脚本

客户端应用程序 / pgbench

允许调用内建脚本的多个副本,而不只是自定义脚本(Fabien Coelho)

这通过新的 -b 开关完成,它对自定义脚本的作用类似于 -f。

新功能允许更改脚本的选择概率(权重)

客户端应用程序 / pgbench

允许更改脚本的选择概率(权重)(Fabien Coelho)

当指定多个脚本时,每个 pgbench 事务随机选择一个执行。以前这总是以均匀概率完成,但现在可以为不同脚本指定不同的选择概率。

新功能在多脚本运行中为每个脚本收集统计信息

客户端应用程序 / pgbench

在多脚本运行中为每个脚本收集统计信息(Fabien Coelho)

此特性为现有的全局和逐命令统计输出添加了一个中间细节级别。

新功能添加 --progress-timestamp 选项以用 Unix 纪元时间戳报告进度,而不是自运行开始以来的时间

客户端应用程序 / pgbench

添加 --progress-timestamp 选项以用 Unix 纪元时间戳报告进度,而不是自运行开始以来的时间(Fabien Coelho)

新功能允许客户端连接数(-c)不必是线程数(-j)的精确倍数

客户端应用程序 / pgbench

允许客户端连接数(-c)不必是线程数(-j)的精确倍数(Fabien Coelho)

新功能使用 -T 选项时,在指定时间结束时及时停止

客户端应用程序 / pgbench

使用 -T 选项时,在指定时间结束时及时停止(Fabien Coelho)

以前指定低事务速率可能导致 pgbench 等待明显长于指定的时间。

新功能改进 initdb 引导后阶段的错误报告

服务器应用程序

改进 initdb 引导后阶段的错误报告(Tom Lane)

以前这里的错误导致把整个输入文件报告为“失败的查询”;现在只报告当前查询。为获得期望的行为, initdb 输入文件中的查询必须用空行分隔。

性能改进通过为所有引导后步骤只使用一个独立后端会话来加速 initdb

服务器应用程序

通过为所有引导后步骤只使用一个独立后端会话来加速 initdb(Tom Lane)

新功能改进pg_rewind使它能在目标时间线更改时工作

服务器应用程序

改进pg_rewind使它能在目标时间线更改时工作(Alexander Korotkov)

这允许例如把已提升的备库回卷到旧主库时间线的某个状态。

新功能移除过时的 heap_formtuple/ heap_modifytuple/ heap_deformtuple 函数

源代码

移除过时的 heap_formtuple/ heap_modifytuple/ heap_deformtuple 函数(Peter Geoghegan)

新功能添加宏使 AllocSetContextCreate() 调用更简单、更安全

源代码

添加宏使 AllocSetContextCreate() 调用更简单、更安全(Tom Lane)

现在不推荐为内存上下文写出各个大小参数,改为使用新宏 ALLOCSET_DEFAULT_SIZES、ALLOCSET_SMALL_SIZES 或 ALLOCSET_START_SMALL_SIZES 之一。但现有代码仍然工作。

新功能在头文件中无条件使用 static inline 函数

源代码

在头文件中无条件使用 static inline 函数(Andres Freund)

这对非常老的编译器可能导致警告和/或浪费代码空间,但记法上的改进看来值得。

新功能改进 TAP 测试基础设施

源代码

改进 TAP 测试基础设施(Michael Paquier、Craig Ringer、Álvaro Herrera、Stephen Frost)

值得注意的是,现在可以使用此基础设施测试恢复场景。

新功能使 trace_lwlocks 按名称标识各个锁

源代码

使 trace_lwlocks 按名称标识各个锁(Robert Haas)

新功能改进 psql 的 Tab 补全代码基础设施

源代码

改进 psql 的 Tab 补全代码基础设施(Thomas Munro、Michael Paquier)

Tab 补全规则现在编写起来相当容易,也更紧凑。

新功能把 pg_shseclabel 系统目录钉入缓存,使它在连接认证期间可被访问

源代码

把 pg_shseclabel 系统目录钉入缓存,使它在连接认证期间可被访问(Adam Brightwell)

核心代码不把此目录用于认证,但扩展可能希望查询它。

新功能重构索引访问方法 API,在 C 层面隐藏其大部分

源代码

重构索引访问方法 API,在 C 层面隐藏其大部分(Alexander Korotkov、Andrew Gierth)

此更改把索引 AM API 现代化,使其看起来更像我们为外部数据包装器和 tablesample 处理器采用的设计。这简化了 C 代码并使在可安装扩展中定义索引访问方法实际可行。结果是 pg_am 系统目录的大多数列消失了。添加了新的检查函数,允许 SQL 查询确定以前可以从 pg_am 发现的索引 AM 属性。。

新功能添加 pg_init_privs 系统目录以保存 initdb 创建和扩展创建对象的原始权限

源代码

添加 pg_init_privs 系统目录以保存 initdb 创建和扩展创建对象的原始权限(Stephen Frost)

此基础设施允许 pg_dump 转储安装可能对附加到系统对象的权限所做的更改。以前这种更改在转储和重新装载中丢失,但现在被保留。

新功能更改扩展分配自定义 LWLock 的方式

源代码

更改扩展分配自定义 LWLock 的方式(Amit Kapila、Robert Haas)

RequestAddinLWLocks() 函数被移除,替换为 RequestNamedLWLockTranche()。这允许更好地标识自定义 LWLock,也更不容易出错。

新功能改进隔离测试器以允许多个会话并发等待,允许测试死锁场景

源代码

改进隔离测试器以允许多个会话并发等待,允许测试死锁场景(Robert Haas)

新功能引入可扩展节点类型

源代码

引入可扩展节点类型(KaiGai Kohei)

此更改允许 FDW 或自定义扫描提供者以比以前更方便的格式在计划树中存储数据。

新功能使规划器通过生成和比较 Path 来处理扫描/连接之后的查询步骤,替换大量特设逻辑

源代码

使规划器通过生成和比较 Path 来处理扫描/连接之后的查询步骤,替换大量特设逻辑(Tom Lane)

此更改今天只提供边际的用户可见改进,但它使将来许多上层规划器改进成为可能,这些在旧代码结构下不切实际。

新功能支持部分聚合

源代码

支持部分聚合(David Rowley、Simon Riggs)

此更改允许把聚合函数的计算拆分为单独的部分,例如使并行工作者进程能够协作计算聚合。将来它可能允许跨本地和远程数据的聚合部分在远程端发生。

新功能添加通用命令进度报告设施

源代码

添加通用命令进度报告设施(Vinayak Pokale、Rahila Syed、Amit Langote、Robert Haas)

新功能把 psql 的 flex 词法分析器分离出来供其他客户端程序使用

源代码

把 psql 的 flex 词法分析器分离出来供其他客户端程序使用(Tom Lane、Kyotaro Horiguchi)

这消除了需要能够很好地解析 SQL 命令以识别命令边界的程序中的代码重复。以完整的一般性做到这一点比人们希望的更痛苦,到目前为止在我们支持的客户端程序中只有 psql 真正做对了。

创建了新的源代码子目录 src/fe_utils/ 来保存这个和其他在客户端程序之间共享的代码。以前这种共享是通过在构建时符号链接或复制源文件完成的,这很丑陋且需要重复编译。

新功能引入 WaitEventSet API 以允许高效等待通常不会在两次等待之间更改的事件集

源代码

引入 WaitEventSet API 以允许高效等待通常不会在两次等待之间更改的事件集(Andres Freund、Amit Kapila)

新功能添加用于写 WAL 记录的通用接口

源代码

添加用于写 WAL 记录的通用接口(Alexander Korotkov、Petr Jelínek、Markus Nullmeier)

此更改允许扩展使用标准布局为页更改写 WAL 记录。需要在无法访问扩展的情况下重放 WAL 的问题通过通用重放代码解决。这允许扩展实现例如索引访问方法并让它们有 WAL 支持。

新功能支持逻辑解码的通用 WAL 消息

源代码

支持逻辑解码的通用 WAL 消息(Petr Jelínek、Andres Freund)

此特性允许扩展把数据插入 WAL 流中,逻辑解码插件可以读取它,但它与物理数据恢复无关。

新功能允许 SP-GiST 操作符类在沿索引下降时存储任意“遍历值”

源代码

允许 SP-GiST 操作符类在沿索引下降时存储任意“遍历值”(Alexander Lebedev、Teodor Sigaev)

这有点像“重建值”,但它可以是任意数据块,不一定是与被索引列相同的数据类型。

新功能为 ereport() 引入 LOG_SERVER_ONLY 消息级别

源代码

为 ereport() 引入 LOG_SERVER_ONLY 消息级别(David Steele)

此级别的行为像 LOG,只是消息永远不会发送到客户端。它用于审计和类似应用。

新功能提供构建所有生成头文件的 Makefile 目标

源代码

提供构建所有生成头文件的 Makefile 目标(Michael Paquier、Tom Lane)

现在可以调用 submake-generated-headers 来确保生成的后端头文件是最新的。这在可能“独立”构建的子目录中有用。

新功能支持 OpenSSL 1.1.0

源代码

支持 OpenSSL 1.1.0(Andreas Karlsson、Heikki Linnakangas)

关联记录(1)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

新功能添加配置参数 auto_explain.sample_rate,允许 contrib/auto_explain 只捕获所有查询的可配置比例

附加模块

添加配置参数 auto_explain.sample_rate,允许 contrib/auto_explain 只捕获所有查询的可配置比例(Craig Ringer、Julien Rouhaud)

这允许减少重查询流量的开销,同时仍平均获得有用信息。

新功能添加 contrib/bloom 模块,实现基于 Bloom 过滤的索引访问方法

附加模块

添加 contrib/bloom 模块,实现基于 Bloom 过滤的索引访问方法(Teodor Sigaev、Alexander Korotkov)

这主要是非核心索引访问方法的概念验证,但对搜索许多列的查询本身也可能有用。

新功能在 contrib/cube 中,为 cube 引入距离操作符,并支持 cube 列上 GiST 索引中的 kNN 式搜索

附加模块

在 contrib/cube 中,为 cube 引入距离操作符,并支持 cube 列上 GiST 索引中的 kNN 式搜索(Stas Kelvich)

新功能使 contrib/hstore 的 hstore_to_jsonb_loose() 和 hstore_to_json_loose() 函数对什么算数字达成一致

附加模块

使 contrib/hstore 的 hstore_to_jsonb_loose() 和 hstore_to_json_loose() 函数对什么算数字达成一致(Tom Lane)

以前 hstore_to_jsonb_loose() 会把数字样子的字符串转换为 JSON 数字而不是字符串,即使它们不完全匹配 JSON 的数字语法规范。这与 hstore_to_json_loose() 不一致,因此收紧测试以匹配 JSON 语法。

新功能为 contrib/intarray 操作符添加选择率估计函数,以改进使用这些操作符的查询的计划

附加模块

为 contrib/intarray 操作符添加选择率估计函数,以改进使用这些操作符的查询的计划(Yury Zhuravlev、Alexander Korotkov)

新功能使 contrib/pageinspect 的 heap_page_items() 函数显示每个元组中的原始数据,并添加新函数 tuple_data_split() 和 heap_page_item_attrs() 用于检查单个元组字段

附加模块

使 contrib/pageinspect 的 heap_page_items() 函数显示每个元组中的原始数据,并添加新函数 tuple_data_split() 和 heap_page_item_attrs() 用于检查单个元组字段(Nikolay Shaplov)

新功能为 contrib/pgcrypto 的 pgp_sym_encrypt() 函数添加可选的 S2K 迭代计数参数

附加模块

为 contrib/pgcrypto 的 pgp_sym_encrypt() 函数添加可选的 S2K 迭代计数参数(Jeff Janes)

新功能为 contrib/pg_trgm 添加对“单词相似度”的支持

附加模块

为 contrib/pg_trgm 添加对“单词相似度”的支持(Alexander Korotkov、Artur Zakirov)

这些函数和操作符度量一个字符串与另一个字符串中最相似的单个单词之间的相似度。

新功能为 contrib/pg_trgm 的相似度阈值添加配置参数 pg_trgm.similarity_threshold

附加模块

为 contrib/pg_trgm 的相似度阈值添加配置参数 pg_trgm.similarity_threshold(Artur Zakirov)

此阈值一直可配置,但以前由特殊用途函数 set_limit() 和 show_limit() 控制。它们现在被弃用。

性能改进改进 contrib/pg_trgm 的 GIN 操作符类,加速同时出现常见和罕见键的索引搜索

附加模块

改进 contrib/pg_trgm 的 GIN 操作符类,加速同时出现常见和罕见键的索引搜索(Jeff Janes)

性能改进改进 contrib/pg_trgm GIN 索引中相似度搜索的性能

附加模块

改进 contrib/pg_trgm GIN 索引中相似度搜索的性能(Christophe Fornaroli)

新功能添加 contrib/pg_visibility 模块以允许检查表可见性映射

附加模块

添加 contrib/pg_visibility 模块以允许检查表可见性映射(Robert Haas)

新功能向 contrib/sslinfo 添加 ssl_extension_info() 函数,打印当前连接所用 X509 证书中存在的 SSL 扩展信息

附加模块

向 contrib/sslinfo 添加 ssl_extension_info() 函数,打印当前连接所用 X509 证书中存在的 SSL 扩展信息(Dmitry Voronin)

新功能如果扩展在外部服务器的选项中被列入白名单,允许扩展提供的操作符和函数被发送到远程执行

附加模块 / postgres_fdw

如果扩展在外部服务器的选项中被列入白名单,允许扩展提供的操作符和函数被发送到远程执行(Paul Ramsey)

当已知远程数据库中存在兼容版本的扩展时,用户可以启用此特性。它允许更高效地执行涉及扩展操作符的查询。

新功能考虑在远程服务器上执行排序

附加模块 / postgres_fdw

考虑在远程服务器上执行排序(Ashutosh Bapat)

新功能考虑在远程服务器上执行连接

附加模块 / postgres_fdw

考虑在远程服务器上执行连接(Shigeru Hanada、Ashutosh Bapat)

新功能在可行之处完全在远程服务器上执行 UPDATE 或 DELETE

附加模块 / postgres_fdw

在可行之处完全在远程服务器上执行 UPDATE 或 DELETE(Etsuro Fujita)

以前远程更新涉及发送 SELECT FOR UPDATE 命令然后逐个更新或删除选中的行。虽然如果操作需要任何本地处理那仍然必要,但如果查询的所有元素都可以安全地发送到远程服务器,现在可以远程完成。

新功能允许把获取大小设置为服务器或表选项

附加模块 / postgres_fdw

允许把获取大小设置为服务器或表选项(Corey Huinker)

以前 postgres_fdw 总是从远程查询每次获取 100 行;现在该行为可配置。

新功能对全部映射到同一远程用户的本地用户 ID 使用单一外部服务器连接

附加模块 / postgres_fdw

对全部映射到同一远程用户的本地用户 ID 使用单一外部服务器连接(Ashutosh Bapat)

新功能把查询取消请求传输到远程服务器

附加模块 / postgres_fdw

把查询取消请求传输到远程服务器(Michael Paquier、Etsuro Fujita)

以前本地查询取消请求不会导致已发送的远程查询提前终止。

这份对比如何生成?

对比以 PostgreSQL 发行说明为依据,汇总起始版本之后、目标版本及之前的变更,支持同一大版本内的小版本更新,以及跨大版本升级。跨大版本时,旧分支的维护记录只纳入到下一大版本首次发布之日,所有记录均不晚于目标版本的发布日期。大版本名称(如 18)指首个正式版本(18.0);测试版与开发快照会单独标注。

条目正文来自本站中文手册,版本清单、条目覆盖与提交依据逐一核对上游英文原文。每条变更保留完整说明与原文链接;分类用于辅助浏览,具体影响、适用条件与升级操作请阅读条目正文和各版本的升级说明。

同一修复可能回补到多个版本分支。对比会保守合并可确认相同的条目,并保留各分支完整说明;已知由起始版本包含的修复会排除。一条说明包含多个独立修复时,只有全部已包含才排除。大版本新功能不因与旧版补丁存在提交关联而合并,不能确认相同的条目继续保留。这是发行说明的累计差异,不能覆盖二进制程序之间的每一处代码变化。

CVE 独立依据 PostgreSQL 官方安全公告与漏洞记录计算:起始版本受影响、目标版本已修复或不受影响的漏洞才计入,按编号去重。目标版本仍受影响的漏洞另行提示;安全变更条数与 CVE 数量分别统计。

交互参考 pgversions.com 与 pgversionreport,内容来自 PostgreSQL 发行说明。更多历史资料见发行说明归档。