选择 打开 改范围 完整检索页
不受支持的版本: 12
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本手册首页的对应页面,或其他在上面列出的活跃大版本。

E.23. 发布版本 12 #

发布日期:. 2019-10-03

E.23.1. 概述

PostgreSQL 12 的主要增强包括:

  • 整体性能改进,包括:

    • 优化 B-树索引的空间利用率和读写性能

    • 增强分区性能,包括提高包含数千个分区的表的查询性能,提高 INSERTCOPY 的插入性能,以及支持在不阻塞查询的情况下执行 ALTER TABLE ATTACH PARTITION

    • 自动内联公共表表达式CTEs),并允许覆盖此行为

    • 减少创建 GiSTGINSP-GiST 索引时的 WAL 开销

    • 通过 INCLUDE 子句支持覆盖 GiST 索引

    • 可通过 CREATE STATISTICS 定义多列最常见值(MCV)统计信息,为测试多个分布不均匀列的查询提供更好的计划

  • 管理功能增强,包括:

  • 支持 SQL/JSON 路径语言

  • 存储的生成列

  • 非确定性 ICU 排序规则,支持不区分大小写和重音的分组与排序

  • 新的认证特性,包括:

    • 在使用 GSSAPI 认证时加密 TCP/IP 连接

    • 使用 DNS SRV 记录发现 LDAP 服务器

    • 多因素认证,在 pg_hba.conf 中将 clientcert=verify-full 选项与其他认证方法结合使用

以下各节将更详细地说明上述项目。

E.23.2. 迁移到版本 12

对于希望从任何先前版本迁移数据的用户,需要使用 pg_dumpall 进行导出/恢复,或使用 pg_upgrade 或逻辑复制。 有关迁移到新主版本的一般信息,请参见 Section 18.6

版本 12 包含许多可能影响与先前版本兼容性的变更。 请注意以下不兼容性:

  • 移除 oid 列的特殊行为(Andres Freund,John Naylor) §

    以前,可以在建表时使用 WITH OIDS 指定一个通常不可见的 oid 列;此功能已被移除。仍可将列显式声明为 oid 类型。对于包含使用 WITH OIDS 创建的列的表,其相关操作需要作出调整。

    以前带有隐藏 oid 列的系统目录,现在改为具有普通的 oid 列。因此,SELECT * 现在会输出这些列,而以前只有显式选择时才会显示它们。

  • 移除数据类型 abstimereltimetinterval(Andres Freund) §

    这些类型已被 timestamp 等 SQL 标准类型取代。

  • 移除 timetravel 扩展(Andres Freund) §

  • recovery.conf 设置移入 postgresql.conf(Masao Fujii,Simon Riggs,Abhijit Menon-Sen,Sergei Kornilov) §

    不再使用 recovery.conf,如果该文件存在,服务器将无法启动。现在通过 recovery.signalstandby.signal 文件切换到非主库模式。trigger_file 设置已重命名为 promote_trigger_filestandby_mode 设置已被移除。

  • 不再允许指定多个相互冲突的 recovery_target* 设置(Peter Eisentraut) §

    具体而言,recovery_targetrecovery_target_lsnrecovery_target_namerecovery_target_timerecovery_target_xid 中只允许指定一个。以前可以指定这些参数中的多个不同参数,并采用最后一个。现在只能指定其中一个,但同一个参数可以重复指定,并采用最后一次指定的值。

  • 使恢复默认推进到最新时间线(Peter Eisentraut) §

    具体而言,recovery_target_timeline 现在默认为 latest,而以前默认为 current

  • 重构几何函数和操作符的代码(Emre Hasegeli) § § §

    这可能产生比以前版本更精确但略有不同的结果。特别是,涉及 NaN、下溢、溢出和除以零的情况现在得到比以前更一致的处理。

  • 采用新算法输出 realdouble precision 值,以提高性能(Andrew Gierth) § §

    以前,显示的浮点值默认舍入到 6 位(real)或 15 位(double precision),并根据 extra_float_digits 的值进行调整。现在,只要 extra_float_digits 大于零(这也是现在的默认值),就只输出保留精确二进制值所需的最少位数。当 extra_float_digits 设置为零或更小时,行为与以前相同。

    此外,浮点指数的格式现在在各平台上一致:除非必须使用三位数字,否则使用两位。在以前的版本中,Windows 构建始终输出三位数字。

  • random()setseed() 现在在各平台上行为一致(Tom Lane) § §

    使用特定种子值调用 setseed() 后生成的 random() 值序列,现在可能与以前不同。不过,该序列也将是可重复的;以前由于服务器内部其他随机数用途的干扰,无法保证这一点。SQL random() 函数现在具有每个会话独立的私有状态,以防止这种干扰。

  • 更改 SQL 风格的 substring(),使其具有符合标准的贪婪匹配行为(Tom Lane) §

    当模式可以以多种方式匹配时,起始子模式现在会匹配尽可能少的文本,而非尽可能多的文本。例如,%#"aa*#"% 这样的模式现在会从输入中选择第一组 a,而非最后一组。

  • 不再对 xpath()XMLTABLE 结构的结果进行美化输出(Tom Lane) §

    在某些情况下,这些函数会在节点集值中插入额外的空白(换行和/或空格)。这并不合适,因为根据具体用途,这些空白可能具有语义意义。

  • 将命令行工具 pg_verify_checksums 重命名为 pg_checksums(Michaël Paquier) §

  • pg_restore 中,要求指定 -f - 才能将转储内容发送到标准输出(Euler Taveira) §

    以前,如果未指定目标位置,默认会这样做,但这种行为被认为不够友好。

  • psql\pset format 命令中禁止不唯一的缩写(Daniel Vérité) § §

    例如,以前 \pset format a 会选择 aligned;现在它会失败,因为这也可能表示 asciidoc

  • 在新建的 B-树索引中,将索引条目的最大长度减少八字节,以改进对重复条目的处理(Peter Geoghegan) §

    这意味着,对通过 pg_upgrade 从以前版本升级而来的索引执行 REINDEX 操作时,可能会失败。

  • 如果没有提供参数列表且存在多个匹配对象,则使 DROP IF EXISTS FUNCTION/PROCEDURE/AGGREGATE/ROUTINE 报错(David Rowley) §

    同时改进此类情况下的错误消息。

  • pg_statistic_ext 目录拆分为两个目录,并添加相应的 pg_stats_ext 视图(Dean Rasheed,Tomas Vondra) § §

    此更改支持向无特权用户隐藏可能敏感的统计数据。

  • 移除过时的 pg_constraint.consrc 列(Peter Eisentraut) §

    此列早已弃用,因为它不会随其他目录变更(如列重命名)而更新。从 pg_constraint 获取检查约束表达式文本形式的推荐方法是 pg_get_expr(conbin, conrelid)pg_get_constraintdef() 也是一种有用的替代方法。

  • 移除过时的 pg_attrdef.adsrc 列(Peter Eisentraut) §

    此列早已弃用,因为它不会随其他目录变更(如列重命名)而更新。从 pg_attrdef 获取默认值表达式文本形式的推荐方法是 pg_get_expr(adbin, adrelid)

  • name 类型的表列标记为默认使用 C 排序规则(Tom Lane,Daniel Vérité) § §

    数据类型 name 的比较操作符现在可以使用任何排序规则,而不再总是使用 C 排序规则。为保留查询以前的语义,现在将 name 类型的列显式标记为使用 C 排序规则。这一改动的副作用是,name 列上的正则表达式操作符现在默认使用 C 排序规则,而非数据库的排序规则,来确定依赖区域设置的正则表达式模式(例如 \w)的行为。如果希望 name 列上的正则表达式具有非 C 行为,请附加一个显式的 COLLATE 子句。(对于用户定义的 name 列,另一种方法是在建表时指定不同的排序规则;但这只是将向后不兼容性转移到了比较操作符上。)

  • information_schema 视图中的对象名列视为 name 类型,而非 varchar 类型(Tom Lane) § § §

    按照 SQL 标准,information_schema 视图中的对象名列被声明为域类型 sql_identifier。在 PostgreSQL 中,底层目录列实际为 name 类型。此更改使 sql_identifier 成为基于 name 的域,而非原来的 varchar。这消除了比较和排序行为中的语义不一致,可显著提高对 information_schema 视图中的对象名列施加限制的查询性能。不过请注意,不等式限制,例如

    SELECT ... FROM information_schema.tables WHERE table_name < 'foo';
    

    现在默认使用 C 区域设置的比较语义,而非像以前那样使用数据库的默认排序规则。对这些列进行排序也将遵循 C 排序规则。通过添加 COLLATE "default" 子句,可以强制使用以前的行为(及其低效率)。

  • 移除禁用动态共享内存的功能(Kyotaro Horiguchi) §

    具体而言,dynamic_shared_memory_type 不再能够设置为 none

  • 更严格地解析 libpq 整数连接参数(Fabien Coelho) §

    在以前的版本中,为连接参数 connect_timeoutkeepaliveskeepalives_countkeepalives_idlekeepalives_intervalport 使用不正确的整数值,会导致 libpq 忽略这些值,或失败并给出不正确的错误消息。

E.23.3. 变更

以下是 PostgreSQL 12 与上一个主版本之间变更的详细说明。

E.23.3.1. 服务器

E.23.3.1.1. 分区
  • 提高分区表上许多操作的性能(Amit Langote,David Rowley,Tom Lane,Álvaro Herrera) § § § § §

    对于拥有数千个子分区的表,只影响少量分区的操作现在能够高效处理。

  • 允许外键引用分区表(Álvaro Herrera) §

  • 提高向分区表执行 COPY 的速度(David Rowley) §

  • 允许分区边界使用任意表达式(Kyotaro Horiguchi,Tom Lane,Amit Langote) §

    此类表达式在创建分区表时求值。以前,只允许将简单常量用作分区边界。

  • 允许 CREATE TABLE 为分区表指定的表空间影响其子分区的表空间(David Rowley,Álvaro Herrera) §

  • 如果已经按所需顺序扫描分区,则避免排序(David Rowley) §

  • 降低执行 ALTER TABLE ATTACH PARTITION 的锁定要求(Robert Haas) §

  • 添加分区自省函数(Michaël Paquier,Álvaro Herrera,Amit Langote) § § §

    新函数 pg_partition_root() 返回分区树的最顶层父表,pg_partition_ancestors() 报告分区的所有祖先,pg_partition_tree() 显示分区信息。

  • 在系统视图 pg_indexes 中包含分区索引(Suraj Kharage) §

  • 添加 psql 命令 \dP,用于列出分区表和索引(Pavel Stehule) §

  • 改进 psql\d\z 对分区表的显示(Pavel Stehule,Michaël Paquier,Álvaro Herrera) § § §

  • 修复可能导致 ALTER TABLE DETACH PARTITION 留下不正确依赖状态的缺陷;这可能使后续操作行为异常,例如在删除表时未删除曾属于分区的子索引(Tom Lane) §

E.23.3.1.2. 索引
  • 提高具有大量重复值的 B-树索引的性能和空间利用率(Peter Geoghegan,Heikki Linnakangas) § § §

    以前,重复索引条目在其重复值组内无序存储。这会增加索引插入的开销,因过多的页面分裂浪费空间,并降低 VACUUM 回收整个页面的能力。现在,重复索引条目按堆存储顺序排序。

    通过 pg_upgrade 从以前版本升级而来的索引无法获得这些好处。

  • 允许多列 B-树索引占用更少空间(Peter Geoghegan,Heikki Linnakangas)

    内部页面和叶子页面的最小/最大值指示项现在只存储到发生差异的键为止的索引键,而非全部索引键。这也提高了索引访问的局部性。

    通过 pg_upgrade 从以前版本升级而来的索引无法获得这些好处。

  • 通过减少锁定开销提高 B-树索引插入速度(Alexander Korotkov) §

  • GiST 索引中支持 INCLUDE 列(Andrey Borodin) §

  • 添加对 SP-GiST 索引的最近邻(KNN)搜索的支持(Nikita Glukhov,Alexander Korotkov,Vlad Sterzhanov) §

  • 减少创建 GiSTGINSP-GiST 索引时的 WAL 写入开销(Anastasia Lubennikova,Andrey V. Lepikhov) §

  • 提高多列索引上仅索引扫描的效率(Konstantin Knizhnik) §

  • 提高 GiST 索引清理扫描的性能(Andrey Borodin,Konstantin Kuznetsov,Heikki Linnakangas) §

  • GiST VACUUM 期间删除空的叶子页面(Andrey Borodin) §

  • 降低索引重命名的锁定要求(Peter Eisentraut) §

E.23.3.1.3. 优化器
  • 允许 CREATE STATISTICS 创建多列最常见值统计信息(Tomas Vondra) § §

    这改进了对多个列进行测试、需要估算多个 WHERE 子句综合效果的查询的优化。如果这些列彼此相关且分布不均匀,多列统计信息将使估算显著改善。

  • 允许将公共表表达式CTEs)内联到外层查询中(Andreas Karlsson,Andrew Gierth,David Fetter,Tom Lane) § §

    具体而言,如果 CTE 没有副作用、不是递归的,且在查询中只被引用一次,就会被自动内联。可以指定 MATERIALIZED 来阻止内联,也可以指定 NOT MATERIALIZED,强制内联被多次引用的 CTE。以前,CTE 从不被内联,总是在查询其余部分之前求值。

  • 允许控制何时为预备语句使用通用计划(Pavel Stehule) §

    这由服务器参数 plan_cache_mode 控制。

  • 改进只有一个子项的分区查询和 UNION ALL 查询的优化(David Rowley) §

  • 改进对没有检查约束的的处理(Tom Lane) §

    仅用作类型别名的域不再给优化带来困难。

  • 当参数为常量时,预先计算 LEASTGREATEST 调用(Vik Fearing) §

  • 提高优化器验证带有 IS NOT NULL 条件的部分索引可用于查询的能力(Tom Lane,James Coleman) § §

    当调用查询包含类型转换或大型 x IN (array) 子句时,现在可以在更多情况下识别索引的可用性。

  • 使用为每列定义的排序规则计算 ANALYZE 统计信息(Tom Lane) §

    以前,所有统计信息都使用数据库的默认排序规则。对于使用非默认排序规则的列,这可能改善优化器行为。

  • 改进对 ctid 列进行不等式比较时的选择率估算(Edmund Horner) §

  • 改进对 tid 类型列进行连接时的优化(Tom Lane) § §

    这些更改主要提高了对 ctid 列进行自连接的效率。

  • 修复某些 B-树比较操作符和支持函数的防泄漏属性标记(Tom Lane) § §

    这使一些以前在存在安全屏障视图或行级安全时无法应用的优化得以应用。

E.23.3.1.4. 一般性能
  • 如果服务器构建时包含相应支持,则默认启用即时JIT)编译(Andres Freund) §

    请注意,默认构建不包含此支持,必须在配置构建时显式选择。

  • 加快关键字查找速度(John Naylor,Joerg Sonnenberger,Tom Lane) § §

  • 提高 position() 及相关函数中多字节字符的搜索性能(Heikki Linnakangas) §

  • 允许对经过 TOAST 处理的值仅解压所需的最小部分(Paul Ramsey) §

    这对只需检查经过 TOAST 处理的字段起始部分的例程很有用。

  • 允许 ALTER TABLE ... SET NOT NULL 避免不必要的表扫描(Sergei Kornilov) §

    当可以识别出表的列约束不允许空值时,就能进行此项优化。

  • 会话时区为 UTC 时,允许使用 ALTER TABLE ... SET DATA TYPEtimestamptimestamptz 之间转换,而无需重写表(Noah Misch) §

    UTC 时区中,这两种数据类型是二进制兼容的。

  • 提高将字符串转换为 int2int4 整数的速度(Andres Freund) §

  • 允许在 SERIALIZABLE 隔离模式下使用并行查询(Thomas Munro) §

    以前,在此模式下会禁用并行执行。

  • 使用 pread()pwrite() 执行随机 I/O(Oskari Saarenmaa,Thomas Munro) § §

    这减少了 I/O 所需的系统调用次数。

  • 提高在 FreeBSD 上设置进程标题的速度(Thomas Munro) §

E.23.3.1.5. 监控
  • 允许仅记录一定比例事务中的语句(Adrien Nayrat) §

    这由参数 log_transaction_sample_rate 控制。

  • CREATE INDEXREINDEX 操作添加进度报告(Álvaro Herrera,Peter Eisentraut) § §

    进度通过 pg_stat_progress_create_index 系统视图报告。

  • CLUSTERVACUUM FULL 添加进度报告(Tatsuro Yamada) §

    进度通过 pg_stat_progress_cluster 系统视图报告。

  • pg_checksums 添加进度报告(Michael Banck,Bernd Helmle) §

    可通过 --progress 选项启用此功能。

  • pg_stat_database 中添加校验和失败计数器(Magnus Hagander) §

  • 在系统视图 pg_stat_database 中添加对全局对象的跟踪(Julien Rouhaud) §

    全局对象对应的 pg_stat_database.datid 值显示为零。

  • 添加列出归档目录内容的功能(Christoph Moench-Tegeder) §

    相应函数为 pg_ls_archive_statusdir()

  • 添加列出临时目录内容的功能(Nathan Bossart) §

    相应函数 pg_ls_tmpdir() 允许选择性地指定表空间。

  • 在系统视图 pg_stat_ssl 中添加客户端证书信息(Peter Eisentraut) §

    新增列为 client_serialissuer_dn。为使含义更清楚,将 clientdn 列重命名为 client_dn

  • 限制无特权用户在 pg_stat_ssl 中可见的行(Peter Eisentraut) §

  • 服务器启动时输出包含服务器版本号的日志消息(Christoph Berg) §

  • 如果新连接立即被关闭,则避免记录 incomplete startup packet(Tom Lane) §

    这避免了某些监控方式产生大量无用日志。

  • 如果设置了 application_name,则在 log_connections 日志消息中包含它(Don Seiler) §

  • 如果设置了集群名称,则让 WAL 接收进程 将其应用名称设置为该集群名称(Peter Eisentraut) §

  • pg_stat_replication 中添加最后收到的备库消息的时间戳(Lim Myungkyu) §

  • WAL 段的 fsync 添加等待事件(Konstantin Knizhnik) §

E.23.3.1.6. Authentication
  • 添加 GSSAPI 加密支持(Robbie Harwood,Stephen Frost) §

    此特性允许在使用 GSSAPI 认证时加密 TCP/IP 连接,无需另外配置 SSL 等加密设施。为支持此功能,在 pg_hba.conf 中增加了 hostgssenchostnogssenc 记录类型,用于选择使用或不使用 GSSAPI 加密的连接,分别对应现有的 hostsslhostnossl 记录类型。另外,还增加了 libpq 选项 gssencmode 和系统视图 pg_stat_gssapi

  • 允许 pg_hba.confclientcert 选项检查数据库用户名是否与客户端证书的通用名匹配(Julian Markwort,Marius Timmer) §

    此项新检查通过 clientcert=verify-full 启用。

  • 允许使用 DNS SRV 记录发现 LDAP 服务器(Thomas Munro) §

    这使指定 ldapserver 不再是必需的。仅当 PostgreSQL 使用 OpenLDAP 编译时才支持此功能。

E.23.3.1.7. 服务器配置
  • 添加使用 pg_checksums 启用/禁用集群校验和的功能(Michael Banck,Michaël Paquier) §

    执行这些操作时必须关闭集群。

  • autovacuum_vacuum_cost_delay 的默认值降低到 2ms(Tom Lane) §

    这使自动清理操作默认能够更快地执行。

  • 允许 vacuum_cost_delay 接受小数值,以指定亚毫秒级延迟(Tom Lane) §

  • 允许时间类服务器参数使用微秒us)单位(Tom Lane) §

  • 允许整数服务器参数接受小数输入(Tom Lane) §

    例如,虽然 work_mem 是整数参数,现在也允许执行 SET work_mem = '30.1GB'。完成所有必要的单位转换后,该值会被舍入为整数。

  • 允许为浮点服务器参数定义单位(Tom Lane) §

  • 添加服务器参数 wal_recyclewal_init_zero,以控制 WAL 文件的循环利用(Jerry Jelinek) §

    ZFS 等写时复制文件系统上,避免文件循环利用可能有益。

  • 添加服务器参数 tcp_user_timeout,以控制服务器的 TCP 超时(Ryohei Nagaura) §

  • 允许控制最低和最高 SSL 协议版本(Peter Eisentraut) §

    相应服务器参数为 ssl_min_protocol_versionssl_max_protocol_version

  • 添加服务器参数 ssl_library,以报告服务器使用的 SSL 库版本(Peter Eisentraut) §

  • 添加服务器参数 shared_memory_type,以控制所使用的共享内存类型(Andres Freund) §

    这允许在需要时选择 System V 共享内存。

E.23.3.2. 流复制和恢复

E.23.3.3. 工具命令

  • REINDEX 添加 CONCURRENTLY 选项,以允许在不阻塞写入的情况下重建索引(Michaël Paquier,Andreas Karlsson,Peter Eisentraut) §

    这也可以通过 reindexdb 应用的 --concurrently 选项控制。

  • 添加对生成列的支持(Peter Eisentraut) §

    生成列的内容由表达式计算得出(可以引用同一表中的其他列),而非由 INSERTUPDATE 命令指定。

  • COPY FROM 添加 WHERE 子句,以控制接受哪些行(Surafel Temesgen) §

    这提供了过滤传入数据的简单方法。

  • 允许更灵活地添加枚举值(Andrew Dunstan,Tom Lane,Thomas Munro) §

    以前,不能在事务块中调用 ALTER TYPE ... ADD VALUE,除非它与创建该枚举类型的操作处于同一事务。现在可以在后续事务中调用,只要在提交之后才引用新的枚举值即可。

  • 添加结束当前事务并开始新事务的命令(Peter Eisentraut) §

    这些命令为 COMMIT AND CHAINROLLBACK AND CHAIN

  • VACUUMCREATE TABLE 添加选项,以阻止 VACUUM 截断尾部空页面(Takayuki Tsunakawa) § §

    这些选项是 vacuum_truncatetoast.vacuum_truncate。使用这些选项可降低 VACUUM 的锁定要求,但会使其无法将磁盘空间归还给操作系统。

  • 允许 VACUUM 跳过索引清理(Masahiko Sawada) § §

    此更改添加了 VACUUM 命令选项 INDEX_CLEANUP,以及表存储选项 vacuum_index_cleanup。使用此选项会降低空间回收能力,并可能导致索引膨胀,但在主要目标是冻结旧元组时很有帮助。

  • 添加跳过无法立即锁定的表上的 VACUUMANALYZE 操作的功能(Nathan Bossart) §

    此选项名为 SKIP_LOCKED

  • 允许为 VACUUMANALYZE 的选项指定可选的布尔参数(Masahiko Sawada) §

  • 防止 TRUNCATEVACUUMANALYZE 对用户没有权限的表请求锁(Michaël Paquier) § §

    这可防止未经授权的锁定干扰用户查询。

  • EXPLAIN 添加 SETTINGS 选项,以输出非默认的优化器设置(Tomas Vondra) §

    使用 auto_explain 时,也可通过设置 auto_explain.log_settings 获取这些输出。

  • CREATE AGGREGATE 添加 OR REPLACE 选项(Andrew Gierth) §

  • 允许使用 ALTER TABLE 修改系统目录的选项(Peter Eisentraut) §

    现在支持修改目录的 reloptions 和自动清理设置。(仍然需要设置 allow_system_table_mods。)

  • 为外键选择默认约束名时,使用所有键列的名称(Peter Eisentraut) §

    以前,约束名中只包含第一个列名,导致多列外键存在歧义。

E.23.3.4. 数据类型

  • 更新各项 Unicode 相关信息,使其与 Unicode 12.1.0 一致(Peter Eisentraut) § §

    例如,这修复了 psql 对包含组合字符的输出进行错误排版的情况。

  • 更新 Snowball 词干提取词典,支持新的语言(Arthur Zakirov) §

    这为全文搜索添加了阿拉伯语、印度尼西亚语、爱尔兰语、立陶宛语、尼泊尔语和泰米尔语的词干提取支持。

  • 允许创建将按位不同的字符串判定为相等的排序规则(Peter Eisentraut) §

    此功能支持非确定性排序规则,可以定义不区分大小写和重音的相等比较。因此,例如在文本列上创建不区分大小写的唯一约束,会比以前更容易。只有 ICU 排序规则支持此功能。

  • 添加对旧版 ICU 中 ICU 排序规则属性的支持(Peter Eisentraut) §

    这使所有 ICU 版本都能以一致的方式自定义排序规则。

  • 允许 name 数据类型与其他文本类型更顺畅地比较(Tom Lane) §

    name 类型现在的行为很像基于 text 类型、默认排序规则为 C 的域。这使跨类型比较能够得到更高效的处理。

E.23.3.5. 函数

  • 添加对 SQL/JSON 路径语言的支持(Nikita Glukhov,Teodor Sigaev,Alexander Korotkov,Oleg Bartunov,Liudmila Mantrova) § § §

    这允许使用符合 SQL 标准的语言对 JSON 值执行复杂查询。

  • 添加对双曲函数的支持(Lætitia Avrot) §

    同时为符合标准,添加 log10() 作为 log() 的别名。

  • 采用更精确的算法,提高 variance() 等统计聚合的精度(Dean Rasheed) §

  • 允许 date_trunc() 接受额外参数来控制时区(Vik Fearing,Tom Lane) §

    这比使用 AT TIME ZONE 子句更快、更简单。

  • 调整 to_timestamp()/to_date() 函数,使其对模板不匹配更加宽容(Artur Zakirov,Alexander Korotkov,Liudmila Mantrova) §

    这种新行为更接近 Oracle 的同名函数。

  • 修复 XML 函数中的各类缺陷(Pavel Stehule,Markus Winand,Chapman Flack) §

    具体而言,修复 XMLTABLExpath()xmlexists() 中某些节点没有输出、抛出意外错误,或遗漏 XML 特殊字符必要转义的情况。

  • 允许在 XMLEXISTSXMLTABLE 中使用 BY VALUE 子句(Chapman Flack) §

    这个 SQL 标准子句在 PostgreSQL 的实现中没有作用,但以前被不必要地拒绝。

  • 防止并行工作进程运行 current_schema()current_schemas(),因为它们并非并行安全(Michaël Paquier) §

  • 对于声明返回 RECORD表函数,允许在查询的列定义列表中使用 RECORDRECORD[] 作为列类型(Elvis Pranskevichus) §

E.23.3.6. PL/pgSQL

  • 允许在同一 PL/pgSQL 函数中使用 SQL 命令及与这些命令同名的变量(Tom Lane) §

    例如,允许在调用 COMMENT SQL 命令的函数中存在名为 comment 的变量。以前,这种组合会导致解析错误。

  • 为 PL/pgSQL 添加新的可选警告和错误检查(Pavel Stehule) §

    这些新检查允许在运行时验证 INTO 的列数以及结果是否为单行。

E.23.3.7. 客户端接口

  • 添加连接参数 tcp_user_timeout,以控制 libpqTCP 超时(Ryohei Nagaura) §

  • 允许 libpq(以及 psql)在错误消息中仅报告 SQLSTATE 值(Didier Gautheron) §

  • 添加 libpq 函数 PQresultMemorySize(),以报告查询结果使用的内存(Lars Kanis,Tom Lane) §

  • 移除 libpqoptions 连接参数上的不显示/调试标志(Peter Eisentraut) §

    这允许 postgres_fdw 设置该参数。

  • 允许 ecpg 创建 bytea 数据类型的变量(Ryo Matsumura) §

    这允许 ECPG 客户端直接处理 bytea 数据,而无需使用编码形式。

  • ECPG 添加 PREPARE AS 支持(Ryo Matsumura) §

E.23.3.8. 客户端应用程序

  • 允许 vacuumdb 根据表的回卷视界选择需要清理的表(Nathan Bossart) §

    相应选项为 --min-xid-age--min-mxid-age

  • 允许 vacuumdb 禁用锁等待或禁用对全可见页面的跳过(Nathan Bossart) §

    相应选项为 --skip-locked--disable-page-skipping

  • 为命令行工具的输出添加着色(Peter Eisentraut) §

    将环境变量 PG_COLOR 设置为 alwaysauto 即可启用此功能。可以设置环境变量 PG_COLORS,使用 ANSI 颜色转义码调整具体颜色。例如,默认行为等同于 PG_COLORS="error=01;31:warning=01;35:locus=01"

E.23.3.8.1. psql
  • psql 中添加 CSV 表格输出模式(Daniel Vérité) §

    这通过 \pset format csv 或命令行选项 --csv 控制。

  • psql 针对 SQL 命令的 \help 输出中显示手册页面的 URL(Peter Eisentraut) §

  • psql\conninfo 中显示 IP 地址(Fabien Coelho) § §

  • 改进 CREATE TABLECREATE TRIGGERCREATE EVENT TRIGGERANALYZEEXPLAINVACUUMALTER TABLEALTER INDEXALTER DATABASEALTER INDEX ALTER COLUMN 的 Tab 补全(Dagfinn Ilmari Mannsåker,Tatsuro Yamada,Michaël Paquier,Tom Lane,Justin Pryzby) § § § § § § § § §

E.23.3.8.2. pgbench
  • 允许将查询产生的值赋给 pgbench 变量(Fabien Coelho,Álvaro Herrera) § §

    相应命令为 \gset

  • 提高 pgbench--rate 选项的精度(Tom Lane) §

  • 以更清楚的消息和返回码改进 pgbench 的错误报告(Peter Eisentraut) §

E.23.3.9. 服务器应用程序

  • 允许通过 pg_ctl 控制日志文件轮转(Kyotaro Horiguchi,Alexander Kuzmenkov,Alexander Korotkov) §

    以前,只能通过 SQL 函数或进程信号来完成此操作。

  • pg_ctl start 期间正确分离新服务器进程(Paul Guo) §

    这可防止调用 pg_ctl 的 shell 脚本后来被中断时,服务器随之关闭。

  • 如果文件系统具有克隆功能,则允许 pg_upgrade 使用它(Peter Eisentraut) §

    --clone 选项具有 --link 的优点,同时可以防止新集群启动后旧集群被改动。

  • 允许指定 pg_upgrade 使用的套接字目录(Daniel Gustafsson) §

    这通过 --socketdir 控制,默认为当前目录。

  • 允许 pg_checksums 禁用 fsync 操作(Michaël Paquier) §

    这通过 --no-sync 选项控制。

  • 允许 pg_rewind 禁用 fsync 操作(Michaël Paquier) §

  • 修复 pg_test_fsync,使其在 Windows 上报告准确的 open_datasync 耗时(Laurenz Albe) § §

E.23.3.9.1. pg_dump, pg_dumpall, pg_restore
  • pg_dump 通过 INSERT 命令而非 COPY 输出数据时,允许每条 INSERT 包含多行数据(Surafel Temesgen,David Rowley) § §

    控制此行为的选项为 --rows-per-insert

  • 允许 pg_dump 输出 INSERT ... ON CONFLICT DO NOTHING(Surafel Temesgen) §

    这可避免恢复期间因冲突而失败。相应选项为 --on-conflict-do-nothing

  • 将并行 pg_dump 的操作顺序与后续并行 pg_restore 使用的顺序解耦(Tom Lane) §

    这使 pg_restore 能够以更充分的并行度执行恢复,尤其是在原始转储未并行执行的情况下。并行 pg_dump 的调度也有所改进。

  • 允许为 pg_dumppg_dumpall 指定 extra_float_digits 设置(Andrew Dunstan) §

    这主要用于生成能够在不同源服务器版本之间精确比较的转储。不建议在常规使用中这样做,因为恢复转储时可能丢失精度。

  • pg_dumpall 添加 --exclude-database 选项(Andrew Dunstan) §

E.23.3.10. 源代码

  • 添加 CREATE ACCESS METHOD 命令,用于创建新的表类型(Andres Freund,Haribabu Kommi,Álvaro Herrera,Alexander Korotkov,Dmitry Dolgov) § § § § § § § § §

    这使开发新的表访问方法成为可能,从而为不同使用场景优化存储。现有的 heap 访问方法仍是默认选项。

  • 添加规划器支持函数接口,以改进优化器对函数的估算、内联和索引使用(Tom Lane) § § §

    这允许扩展创建规划器支持函数,提供针对特定函数的选择率、代价和行数估算,这些估算可以依赖函数参数。支持函数还可以提供简化的表示和索引条件,大幅扩展优化的可能性。

  • 简化手动分配的 OID 的重新编号,并为此类 OID 的管理制定新的项目政策(John Naylor,Tom Lane) § §

    为新的内置对象(如新函数)手动分配 OID 的补丁,现在应在 8000—9999 范围内随机选择 OID。在开发周期结束时,已提交补丁使用的 OID 将通过新的 renumber_oids.pl 脚本重新编号为较小的数字,目前大约位于 4xxx 范围内。这种做法应能大幅降低不同开发中补丁之间发生 OID 冲突的概率。

    虽然没有专门为外部使用预留 OID 的政策,但建议分支项目及其他需要私有手动分配 OID 的项目,使用 7xxx 范围高端的编号。这将避免与最近合入的补丁冲突,而且核心项目应该要很久才会用到该范围。

  • 使用动态库而非静态库构建 Cygwin 二进制文件(Marco Atzeri) §

  • 移除 configure 开关 --disable-strong-random(Michaël Paquier) §

    现在必须有强随机数源。

  • 在 Postgres 代码中,printf 系列函数以及 strerrorstrerror_r 现在在各平台上行为一致(Tom Lane) § § § §

    特别是,printf 在所有平台上都能理解 %m;在 Windows 上,strerror 能够处理 Winsock 错误码(以前仅在后端代码中支持,前端代码不支持);strerror_r 则始终遵循 GNU 的返回约定。

  • 要求符合 C99 的编译器,并在 Windows 上要求 MSVC 2013 或更高版本(Andres Freund) §

  • 使用 pandoc 代替 lynx 生成纯文本文档输出文件(Peter Eisentraut) § §

    这仅影响 make dist 期间生成的 INSTALL 文件,以及很少使用的纯文本输出文件 postgres.txt。Pandoc 的输出优于 lynx,并能避免某些区域设置/编码问题。需要 Pandoc 1.13 或更高版本。

  • 支持在 PostgreSQL 文档中使用图像(Jürgen Purtz) §

E.23.3.11. 附加模块

  • 允许在更多情况下将 ORDER BY 排序和 LIMIT 子句下推到 postgres_fdw 外部服务器(Etsuro Fujita) § §

  • 改进优化器对 postgres_fdw 查询的代价计算(Etsuro Fujita) § § §

  • 正确遵循引用 postgres_fdw 表的视图上的 WITH CHECK OPTION(Etsuro Fujita) §

    虽然 postgres_fdw 表上的 CHECK OPTION 会被忽略(因为引用的是外部表),但此类表上的视图被视为本地视图,因此此更改会对它们实施 CHECK OPTION。以前,只有带有 RETURNING 子句且返回了 CHECK OPTION 值的 INSERTUPDATE 才会得到验证。

  • 允许 pg_stat_statements_reset() 提供更细的控制粒度(Haribabu Kommi,Amit Kapila) §

    此函数现在允许重置特定数据库、用户和查询的统计信息。

  • 允许控制 auto_explain 的日志级别(Tom Dunstan,Andrew Dunstan) §

    默认值为 LOG

  • 用新的标点和符号更新 unaccent 规则(Hugh Ranalli,Michaël Paquier) §

  • 允许 unaccent 处理某些以组合字符编码的重音(Hugh Ranalli) §

  • 允许 unaccent 移除希腊字符的重音(Tasos Maschalidis) §

  • amcheckbt_index_parent_check() 函数添加参数,以从树根开始检查每个索引元组(Peter Geoghegan) §

  • 改进 oid2namevacuumlo 的选项处理,使其与其他命令一致(Tatsuro Yamada) § §

E.23.4. 致谢 #

以下人员(按字母顺序排列)作为补丁作者、提交者、审查者、测试者 或问题报告者为本版本做出了贡献。

Abhijit Menon-Sen
Achilleas Mantzios
Adam Berlin
Adam Bielanski
Aditya Toshniwal
Adrien Nayrat
Alan Jackson
Albert Schabhuetl
Aleksander Alekseev
Alex Aktsipetrov
Alex Kliukin
Alex Macy
Alexander Korotkov
Alexander Kukushkin
Alexander Kuzmenkov
Alexander Lakhin
Alexandra Ryzhevich
Alexey Bashtanov
Alexey Ermakov
Alexey Kondratov
Alexey Kryuchkov
Alexey Stepanov
Allison Kaptur
Álvaro Herrera
Alyssa Ross
Amit Kapila
Amit Khandekar
Amit Langote
Amul Sul
Anastasia Lubennikova
André Hänsel
Andrea Gelmini
Andreas Joseph Krogh
Andreas Karlsson
Andreas Kunert
Andreas Scherbaum
Andreas Seltenreich
Andrei Yahorau
Andres Freund
Andrew Dunstan
Andrew Fletcher
Andrew Gierth
Andrew Krasichkov
Andrey Borodin
Andrey Klychkov
Andrey Lepikhov
Andy Abelisto
Anthony Greene
Anthony Skorski
Antonin Houska
Arne Roland
Arseny Sher
Arthur Zakirov
Ash Marath
Ashutosh Bapat
Ashutosh Sharma
Ashwin Agrawal
Aya Iwata
Bartosz Polnik
Basil Bourque
Bernd Helmle
Brad DeJong
Brigitte Blanc-Lafay
Bruce Klein
Bruce Momjian
Bruno Wolff
Chapman Flack
Chen Huajun
Chris Travers
Chris Wilson
Christian Hofstaedtler
Christoph Berg
Christoph Moench-Tegeder
Clemens Ladisch
Colm McHugh
Corey Huinker
Craig Ringer
Dagfinn Ilmari Mannsåker
Daisuke Higuchi
Daniel Fiori
Daniel Gustafsson
Daniel Vérité
Daniel Westermann
Daniel Wilches
Darafei Praliaskouski
Daryl Waycott
Dave Cramer
David Binderman
David Fetter
David G. Johnston
David Rowley
David Steele
Davy Machado
Dean Rasheed
Derek Hans
Derek Nelson
Devrim Gündüz
Dian Fay
Didier Gautheron
Dilip Kumar
Dmitry Dolgov
Dmitry Marakasov
Dmitry Molotkov
Dmitry Shalashov
Don Seiler
Donald Dong
Doug Rady
Edmund Horner
Eduards Bezverhijs
Elvis Pranskevichus
Emanuel Araújo
Emre Hasegeli
Eric Cyr
Erik Rijkers
Ertugrul Kahveci
Etsuro Fujita
Eugen Konkov
Euler Taveira
Fabien Coelho
Fabrízio de Royes Mello
Feike Steenbergen
Filip Rembialkowski
Gaby Schilders
Geert Lobbestael
George Tarasov
Georgios Kokolatos
Gianni Ciolli
Gilles Darold
Greg Stark
Grigory Smolkin
Guillaume Lelarge
Gunnlaugur Thor Briem
Gurjeet Singh
Hadi Moshayedi
Hailong Li
Hans Buschmann
Haribabu Kommi
Haruka Takatsuka
Hayato Kuroda
Heikki Linnakangas
Hironobu Suzuki
Hubert Lubaczewski
Hugh Ranalli
Ian Barwick
Ibrar Ahmed
Ildar Musin
Insung Moon
Ioseph Kim
Isaac Morland
Ivan Panchenko
Jack Kelly
Jacob Champion
Jaime Casanova
Jakob Egger
Jakub Glapa
Jakub Janecek
James Coleman
James Inform
James Robinson
James Sewell
James Tomson
Jan Chochol
Jaroslav Sivy
Jean-Christophe Arnu
Jean-Marc Voillequin
Jean-Pierre Pelletier
Jeevan Chalke
Jeevan Ladhe
Jeff Davis
Jeff Janes
Jeremy Evans
Jeremy Schneider
Jeremy Smith
Jerry Jelinek
Jesper Pedersen
Jianing Yang
Jie Zhang
Jim Nasby
Jimmy Yih
Joe Conway
Joe Wildish
Joerg Sonnenberger
John Klann
John Naylor
Jonah Harris
Jonathan S. Katz
Jorge Gustavo Rocha
José Arthur Benetasso Villanova
Joshua D. Drake
Juan José Santamaría Flecha
Julian Hsiao
Julian Markwort
Julian Schauder
Julien Rouhaud
Jürgen Purtz
Jürgen Strobel
Justin Pryzby
Kaiting Chen
Karen Huddleston
Karl Czajkowski
Karl O. Pinc
Keiichi Hirobe
Keith Fiske
Ken Tanzer
Kenji Uno
Kevin Grittner
Kevin Hale Boyes
Kieran McCusker
Kirk Jamison
Kohei KaiGai
Konstantin Knizhnik
Konstantin Kuznetsov
Kristjan Tammekivi
Kuntal Ghosh
Kyle Samson
Kyotaro Horiguchi
Lætitia Avrot
Lars Kanis
Laurenz Albe
Lim Myungkyu
Liu Huailing
Liudmila Mantrova
Lloyd Albin
Luca Ferrari
Luis M. Carril
Lukas Eder
Lukas Fittl
Madelaine Thibaut
Madeleine Thompson
Magnus Hagander
Mahendra Singh
Mai Peng
Maksim Milyutin
Maksym Boguk
Malthe Borch
Manuel Rigger
Marco Atzeri
Marco Slot
Marina Polyakova
Mario De Frutos Dieguez
Marius Timmer
Mark Chambers
Mark Dilger
Marko Tiikkaja
Markus Winand
Martín Marqués
Masahiko Sawada
Masao Fujii
Mateusz Guzik
Mathias Brossard
Matt Williams
Matthias Otterbach
Matvey Arye
Melanie Plageman
Mi Tar
Michael Banck
Michael Davidson
Michael Meskes
Michael Paquier
Michael Vitale
Michel Pelletier
Mikalai Keida
Mike Palmiotto
Mithun Cy
Morgan Owens
Murat Kabilov
Nathan Bossart
Nawaz Ahmed
Neeraj Kumar
Nick Barnes
Nico Williams
Nikita Glukhov
Nikolay Shaplov
Ning Yu
Nishant Fnu
Noah Misch
Norbert Benkocs
Noriyoshi Shinoda
Oleg Bartunov
Oleg Samoilov
Oleksii Kliukin
Ondrej Bouda
Oskari Saarenmaa
Pan Bian
Patrick Francelle
Patrick McHardy
Paul A. Jungwirth
Paul Bonaud
Paul Guo
Paul Martinez
Paul Ramsey
Paul Schaap
Paul van der Linden
Pavan Deolasee
Pavel Oskin
Pavel Raiskup
Pavel Stehule
Peifeng Qiu
Peter Billen
Peter Eisentraut
Peter Geoghegan
Peter Neave
Petr Fedorov
Petr Jelínek
Petr Slavov
Petru-Florin Mihancea
Phil Bayer
Phil Florent
Philip Dubé
Pierre Ducroquet
Piotr Gabriel Kosinski
Piotr Stefaniak
Piotr Wlodarczyk
Prabhat Sahu
Quentin Rameau
Rafael Castro
Rafia Sabih
Rahila Syed
Rajkumar Raghuwanshi
Rares Salcudean
Raúl Marín Rodríguez
Regina Obe
Renaud Navarro
Richard Guo
Rick Otten
Rikard Falkeborn
RK Korlapati
Robbie Harwood
Robert Haas
Robert Treat
Robert Vollmert
Roger Curley
Roman Zharkov
Ronan Dunklau
Rui Hai Jiang
Rushabh Lathia
Ryan Lambert
Ryo Matsumura
Ryohei Nagaura
Ryohei Takahashi
Samuel Williams
Sand Stone
Sanyo Capobiango
Satoru Koizumi
Sean Johnston
Serge Latyntsev
Sergei Kornilov
Sergey Pashkov
Sergio Conde Gómez
Shawn Debnath
Shay Rojansky
Sho Kato
Shohei Mochizuki
Shouyu Luo
Simon Riggs
Sivasubramanian Ramasubramanian
Slawomir Chodnicki
Stas Kelvish
Stefan Kadow
Stepan Yankevych
Stephen Amell
Stephen Frost
Steve Rogerson
Steve Singer
Steven Winfield
Surafel Temesgen
Suraj Kharage
Suresh Kumar R
Takayuki Tsunakawa
Takeshi Ideriha
Takuma Hoshiai
Tasos Maschalidis
Tatsuo Ishii
Tatsuro Yamada
Teodor Sigaev
Thom Brown
Thomas Munro
Thomas Poty
Tillmann Schulz
Tim Möhlmann
Timur Birsh
Tobias Bussmann
Tom Cassidy
Tom Dunstan
Tom Gottfried
Tom Lane
Tomas Vondra
Tushar Ahuja
Ulf Adams
Vaishnavi Prabakaran
Victor Petrovykh
Victor Wagner
Victor Yegorov
Vijaykumar Jain
Vik Fearing
Vlad Sterzhanov
Vladimir Baranoff
Vladimir Kriukov
Wu Fei
Yaroslav Schekin
Yi Huang
Yoshikazu Imai
Yugo Nagata
Yulian Khodorkovskiy
Yuming Wang
YunQiang Su
Yuri Kurenkov
Yusuke Egashira
Yuzuko Hosoya
Zhou Digoal