E.3. 版本 12

E.3.1. 概览
E.3.2. 迁移到版本 12
E.3.3. 变更列表
E.3.4. 鸣谢

发行日期: 2019-10-03

E.3.1. 概览

PostgreSQL12中的主要改进包括:

  • 一般性能改进,包括:

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

    • 分区性能增强,包括改进了对具有数千个分区的表的查询性能,改进了INSERTCOPY的插入性能,以及能够执行ALTER TABLE ATTACH PARTITION而不阻塞查询。

    • 自动(但可覆盖)内联常用表表达式CTEs)。

    • 减少创建GiST,GINSP-GiST索引的WAL开销。

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

    • 可以通过CREATE STATISTICS来定义多列最常见值(MCV)统计,以支持更好的计划来测试几个非均匀分布的列的查询。

  • 增强管理功能,包括:

  • 支持SQL/JSON path语言。

  • 存储生成的列

  • Nondeterministic ICU collations,可以进行不分大小写和不分重音的分组和排序。

  • 新的认证功能,包括:

    • 使用 GSSAPI验证时,对TCP/IP连接进行加密。

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

    • 多因素验证,使用 clientcert=verify-full 选项,并结合 pg_hba.conf 中的额外验证方法。

以上项目将在下面的章节中详细解释。

E.3.2. 迁移到版本 12

对于希望从以前的版本迁移数据的用户,需要使用pg_dumpall或使用pg_upgrade或逻辑复制进行转储/恢复。 请参阅第 18.6 节了解关于迁移到新的主要版本的一般信息。

第12版包含一些可能影响与以前版本兼容性的变化。 请注意以下不兼容的地方:

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

    以前,在创建表的过程中,可以使用WITH OIDS来指定一个通常不可见的oid列;这一功能已经被删除。 列仍然可以显式声明为oid类型。 对具有使用WITH OIDS创建的列的表的操作将需要调整。

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

  • 删除数据类型abstimereltimetinterval。 (Andres Freund)

    这些类型已经被SQL标准类型(如timestamp)所淘汰。

  • 删除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_file。 删除了standby_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大于零时(现在是默认值),只输出保留精确二进制值所需的最小数字。

    此外,浮点指数的格式现在在各个平台上都是统一的:除非需要三位数,否则使用两位数。在以前的版本中,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 -来将dump内容发送到标准输出。 (Euler Taveira)

    以前,如果没有指定目的地,这种情况会默认发生,但这被认为是不友好的。

  • psql/pset format命令中不允许使用非唯一的缩写。(Daniel Vérité)

    例如,以前,/pset format a选择了aligned;现在它将失败,因为它同样可以意味着asciidoc

  • 在新的btree索引中,最大索引条目长度减少了8个字节,以改善对重复条目的处理。 (Peter Geoghegan)

    这意味着,对以前版本的索引pg_upgradeREINDEX操作可能会失败。

  • 如果没有提供参数列表,并且有多个匹配的对象,导致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类型的。 这消除了在比较和排序行为中的语义不匹配,这可以极大地提高在限制对象名列的information_schema视图上的查询性能。例如

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

    现在将默认使用 C-locale 比较语义,而不是像以前那样使用数据库的默认整理。在这些列上的排序也将遵循C排序规则。 可以通过添加COLLATE "default"子句来强制执行之前的行为(和低效率)。

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

    具体来说,dynamic_shared_memory_type不能再设置为none

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

    在以前的版本中,如果在连接参数connect_timeoutkeepaliveskeepalives_countkeepalives_idlekeepalives_intervalport中使用错误的整数值,会导致libpq忽略这些值或以错误的错误信息失败。

E.3.3. 变更列表

以下是PostgreSQL12和上一个主要版本之间的详细说明。

E.3.3.1. 服务端

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

    允许对有数千个子分区的表,通过只影响少数分区的操作进行有效处理。

  • 允许foreign keys引用分区表。 (Á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/dz分区表的显示。(Pavel Stehule, Michaël Paquier, Álvaro Herrera)

  • 修复可能导致ALTER TABLE DETACH PARTITION留下不正确的依赖状态的bug,从而使后续的操作发生错误,例如当表被删除时,不删除前分区的子索引。 (Tom Lane)

E.3.3.1.2. 索引
  • 提高有许多重复的btree索引的性能和空间利用率。 (Peter Geoghegan, Heikki Linnakangas)

    以前,重复的索引条目在其重复的组中被无序存储。 这在索引插入时造成了开销,由于过度的页面分割而浪费了空间,并且降低了 VACUUM 回收整个页面的能力。重复的索引条目现在按堆存储顺序排序。

    以前版本的索引pg_upgrade将不会有这些优势。

  • 允许多列btree索引更小。 (Peter Geoghegan, Heikki Linnakangas)

    内部页和最小/最大叶页指示器现在只存储索引键,直到更改键,而不是所有索引键。这也提高了索引访问的局部性。

    以前版本的索引pg_upgrade将不会有这些优势。

  • 通过减少锁定开销来提高btree索引插入的速度。 (Alexander Korotkov)

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

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

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

  • 允许index-only扫描索引,以便在有很多列的索引上更有效率。 (Konstantin Knizhnik)

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

  • GiST VACUUM期间删除空叶页。(Andrey Borodin)

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

E.3.3.1.3. 优化器
  • 允许CREATE STATISTICS为多列创建最常见值统计。(Tomas Vondra)

    这改善了对测试多个列的查询的优化,需要估计几个WHERE子句的综合效果。 如果列是相关的,并且具有非均匀分布,那么多列统计将允许更好的估计。

  • 允许常用表表达式 (CTEs)内联到外部查询中。 (Andreas Karlsson, Andrew Gierth, David Fetter, Tom Lane)

    具体来说,如果CTE没有副作用,不是递归的,并且在查询中只引用一次,则会自动内联。 可以通过指定 MATERIALIZED 来阻止内联,或者通过指定 NOT MATERIALIZED 来强制多引用的 CTEs 内联。以前,CTEs 从不内联,总是在查询的其余部分之前被评估。

  • 允许控制何时将通用计划用于预备语句 (Pavel Stehule)

    这是由plan_cache_mode服务器参数控制的。

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

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

    纯粹作为类型别名的域不再造成优化困难。

  • LEASTGREATEST的参数为常数时,对其调用进行预评估。 (Vik Fearing)

  • 提高优化器验证部分索引是否可以在查询中使用IS NOT NULL条件的能力。 (Tom Lane, James Coleman)

    现在,在更多的情况下,当调用查询涉及转换或大的xIN (array)子句时,可以认识到可用性。

  • 使用为每一列定义的校对计算ANALYZE统计数据 (Tom Lane)

    以前,所有的统计数据都使用数据库的默认校对。 这有可能为具有非默认校对的列提供更好的优化行为。

  • 改进对不平等比较的选择性估计 在ctid列上。(Edmund Horner)

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

    这些变化主要提高了ctid列的自连接效率。

  • 修正部分btree比较运算符和支持函数的防泄密指定。(Tom Lane)

    这允许一些以前在安全屏障视图或行级安全的情况下无法应用的优化。

E.3.3.1.4. 一般性能
  • 如果服务器在编译时支持Just-in-Time (JIT)编译,则默认启用它。 (Andres Freund)

    需要注意的是,这个支持不是默认编译的,而是必须在配置编译时明确选择。

  • 提升关键词查询速度 (John Naylor, Joerg Sonnenberger, Tom Lane)

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

  • 允许toasted值被最小化解压。(Paul Ramsey)

    这对于只需要检查toasted的字段的初始部分的例程很有用。

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

    当表的列约束可以被识别为不允许有空值时,就可以进行优化。

  • 允许ALTER TABLE ... ... SET DATA TYPEtimestamptimestamptz之间改变,以避免在会话时区为UTC时重写表。 (Noah Misch)

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

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

  • 当处于SERIALIZABLE隔离模式时,允许并行查询。(Thomas Munro)

    以前,在该模式下,并行是被禁用的。

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

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

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

E.3.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值为0来显示。

  • 增加列出归档目录内容的功能。 (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)

  • 让walreceiver将其应用名称设置为集群名称,如果设置为集群名称的话。(Peter Eisentraut)

  • 将最后收到的备用消息的时间戳添加到pg_stat_replication。 (Lim Myungkyu)

  • 添加一个等待事件,用于WAL段的fsync。(Konstantin Knizhnik)

E.3.3.1.6. 认证
  • 添加GSSAPI加密支持。 (Robbie Harwood, Stephen Frost)

    该功能允许在使用GSSAPI认证时对TCP/IP连接进行加密,而无需设置单独的加密设施(如SSL)。 为了支持这一功能,在 pg_hba.conf 中添加 hostgssenchostnogssenc 记录类型,用于选择是否使用 GSSAPI 加密的连接,对应于现有的 hostsslhostnossl 记录类型。此外,还有一个新的 gssencmode libpq 选项,以及一个 pg_stat_gssapi 系统视图。

  • 允许使用 clientcert pg_hba.conf选项来检查数据库用户名是否与客户证书的通用名相匹配。 (Julian Markwort, Marius Timmer)

    这个新的检查是用clientcert=verify-full启用的。

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

    这避免了指定ldapserver的要求。只有当PostgreSQLOpenLDAP一起编译时,才支持它。

E.3.3.1.7. 服务器配置
  • 使用pg_checksums增加启用/禁用集群校验的能力。(Michael Banck, Michaël Paquier)

    为了进行这些操作,必须关闭集群。

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

    这使得autovacuum操作在默认情况下可以更快地进行。

  • 允许vacuum_cost_delay来指定 亚毫秒级的延迟,通过接受小数值来实现。 (Tom Lane)

  • 允许基于时间的服务器参数使用microseconds的单位(us)。(Tom Lane)

  • 允许对整数服务器参数进行小数输入(Tom Lane)

    例如,现在允许使用SET work_mem = '30.1GB',即使work_mem是一个整数参数。 在进行任何必要的单位转换后,该值将被四舍五入为整数。

  • 允许为浮点服务器参数定义单位。 (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.3.3.2. 流复制和恢复

E.3.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和autovacuum设置。 (仍然需要设置allow_system_table_mods。)

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

    以前,约束名称中只包含第一列名称,导致多列外键的模糊性。

E.3.3.4. 数据类型

  • 更新有关Unicode的各种知识,使之符合Unicode 12.1.0。 (Peter Eisentraut)

    例如,这修复了psql会对涉及组合字符的输出进行错误格式化的情况。

  • 更新雪球词干字典,支持新语言。 (Arthur Zakirov)

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

  • 允许创建collations,以报告字符串的平等性,对于非位相等的字符串,允许创建collations。 (Peter Eisentraut)

    此功能支持nondeterministic整理,可以定义大小写和口音无关的平等比较。因此,例如,可以比以前更容易地对文本列进行不区分大小写的唯一性约束。 这仅支持 ICU 的整理。

  • 在旧版ICU上增加对ICU校对属性的支持。 (Peter Eisentraut)

    这允许在所有ICU版本中以一致的方式定制校对规则。

  • 允许数据类型name与其他文本类型进行更无缝的比较。 (Tom Lane)

    类型name现在的行为很像一个域,在类型text上有默认的校对C.这允许更有效地处理跨类型比较。

E.3.3.5. 函数

  • 增加对SQL/JSON path语言的支持。 (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()被并行workers运行,因为它们不是并行安全的。(Michaël Paquier)

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

E.3.3.6. PL/pgSQL

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

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

  • 在PL/pgSQL中增加了新的可选的警告和错误检查。 (Pavel Stehule)

    新的检查允许对INTO列数和单行结果进行运行时验证。

E.3.3.7. 客户端接口

  • 添加连接参数tcp_user_timeout来控制libpqTCP超时。(Ryohei Nagaura)

  • 允许libpq(因此psql)在错误信息中只报告SQLSTATE值。(Didier Gautheron)

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

  • 删除libpqoptions连接参数中的no-display/debug标志。 (Peter Eisentraut)

    这样就可以通过postgres_fdw来设置这个参数。

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

    这允许ECPG客户端直接与bytea数据交互,而不是使用编码形式。

  • ECPG增加PREPARE AS支持。 (Ryo Matsumura)

E.3.3.8. 客户端应用

  • 允许vacuumdb根据表的纵贯线为选择表vacuum。(Nathan Bossart)

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

  • 允许vacuumdb禁止等待锁或跳过所有可见页面。 (Nathan Bossart)

    选项是--跳过锁定--禁用跳页

  • 在命令行实用程序的输出中添加着色功能。 (Peter Eisentraut)

    通过将环境变量PG_COLOR设置为always,可以启用此功能。 或auto。 可以通过设置环境变量PG_COLORS,使用ANSI转义码来调整特定的颜色。 例如,默认行为相当于 PG_COLORS="error=01;31:warning=01;35:locus=01"

E.3.3.8.1. psql
  • psql中增加CSV表输出模式。(Daniel Vérité)

    这是由//pset格式csv或命令行--csv选项控制的。

  • psql/help中显示手动页面URL为一个SQL命令的输出。 (Peter Eisentraut)

  • psql/conninfo中显示IP地址。 (Fabien Coelho)

  • 改进CREATE TABLE, CREATE TRIGGER, CREATE EVENT TRIGGER,ANALYZE,EXPLAIN的标签完成度。 VACUUMALTER TABLEALTER INDEXALTER DATABASEALTER INDEX ALTER COLUMN。 (Dagfinn Ilmari Mannsåker, Tatsuro Yamada, Michaël Paquier, Tom Lane, Justin Pryzby)

E.3.3.8.2. pgbench
  • 允许将查询产生的值分配给pgbench变量。 (Fabien Coelho, Álvaro Herrera)

    这方面的命令是/gset

  • 提高pgbench--速率选项的精度。(Tom Lane)

  • 用更清晰的信息和返回代码改进pgbench的错误报告。 (Peter Eisentraut)

E.3.3.9. 服务器应用

  • 允许通过pg_ctl来控制日志文件的旋转。 (Kyotaro Horiguchi, Alexander Kuzmenkov, Alexander Korotkov)

    以前,这只能通过SQL函数或进程信号来实现。

  • pg_ctlstart期间,适当地分离新的服务器进程。 (Paul Guo)

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

  • 允许pg_upgrade使用文件系统的克隆功能,如果有的话。(Peter Eisentraut)

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

  • 允许在pg_upgrade中指定使用的socket目录。(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)

  • pg_dumpINSERT命令而不是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可以执行更充分的并行还原,特别是在原始dump没有并行完成的情况下。 并行pg_dump的调度也得到了一定的改进。

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

    这主要用于制作不同源服务器版本之间完全可比的转储。 不建议正常使用,因为当还原转储时可能会导致精度损失。

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

E.3.3.10. 源代码

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

    这使得开发新的表访问方法成为可能,它可以针对不同的用例优化存储。 现有的heap访问方法仍然是默认的。

  • 增加planner支持函数接口,以改进优化器估计、内联和函数的索引。 (Tom Lane)

    这允许扩展创建规划师支持函数,这些函数可以提供特定函数的选择性、成本和行数估计,这些估计可以取决于函数的参数。 支持函数还可以提供简化的表示和索引条件,大大扩展了优化的可能性。

  • 简化人工分配的OID的重新编号,并为管理这些OID制定新的项目策略。 (John Naylor, Tom Lane)

    为新的内置对象(如新函数)手动分配 OID 的补丁现在应该随机选择 8000—9999 范围内的 OID。 在开发周期结束时,已提交的补丁所使用的 OID 将被重新编号为较低的数字,目前在 4xxx范围内,使用新的 renumber_oids.pl 脚本。 这种方法应该可以大大降低不同进程中补丁之间的 OID 冲突的几率。

    虽然没有特定的政策将任何OID保留给外部使用,但建议需要手动分配私人OID的fork和其他项目使用7xxx范围内的数字。 这将避免与最近合并的补丁发生冲突,而且核心项目达到这个范围应该还需要很长时间。

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

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

    现在需要一个强大的随机数源。

  • printf系列函数,以及 作为strerrorstrerror_r,现在在Postgres代码中跨平台的行为是统一的。 (Tom Lane)

    值得注意的是,printf在任何地方都能理解%m;在Windows上,strerror处理Winsock错误代码(过去在后端代码中是这样做的,但在前端代码中不是)。 strerror_r总是遵循GNU的返回约定。

  • 需要符合C99标准的编译器,以及MSVC2013或更高版本的Windows。(Andres Freund)

  • 使用pandoc,而不是lynx来生成纯文本文档输出文件。(Peter Eisentraut)

    这只影响到make dist过程中生成的INSTALL文件和很少使用的纯文本postgres.txt输出文件。Pandoc的输出比lynx更好,而且避免了一些本地/编码问题。 需要Pandoc 1.13或更高版本。

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

E.3.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。 以前,只有INSERTs和UPDATEs与RETURNING子句返回CHECK OPTION值时才会被验证。

  • 允许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.3.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