2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 每周新闻 - 2021 年 7 月 25 日

发布于 2021-07-26 by PWN
PWN

PostgreSQL 每周新闻 - 2021 年 7 月 25 日

本周人物

奥地利 pgDay 将于 2021 年 9 月 17 日在维也纳的美泉宫(药剂师庭)举行。https://pgday.at/en/

PostgreSQL 产品新闻

pgSCV 0.7.0 发布,这是一个兼容 Prometheus 的 PostgreSQL 监控代理和指标导出器。https://github.com/weaponry/pgscv

pg_validate_extugprade 1.0.0beta 发布,这是一个用于测试扩展升级过程各种组合的工具。https://github.com/rjuju/pg_validate_extupgrade

pspg 5.1.0 发布,这是一个为 PostgreSQL 设计的分页器。https://github.com/okbob/pspg/releases/tag/5.1.0

Database Lab 2.4 发布,这是一个用于快速克隆大型 PostgreSQL 数据库以构建非生产环境的工具:https://gitlab.com/postgres-ai/database-lab/-/releases

PostgreSQL 职位(7 月份)

https://archives.postgresql.org/pgsql-jobs/2021-07/

PostgreSQL 相关新闻

Planet PostgreSQL:https://planet.postgresql.org/

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

Thomas Munro 推送

Amit Kapila 提交

Michaël Paquier 提交

  • doc:提及 DROP STATISTICS 的 CASCADE/RESTRICT。此语法没有效果,因为对统计信息没有依赖关系,但解析器支持它。这与其他 DROP 命令更一致。Author: Vignesh C Discussion: https://postgr.es/m/CALDaNm1LA=yNmzcSfy+0oe6CEAgsxXRf_-UutE3ZncFi8QkFNQ@mail.gmail.com Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/d1216635610a9855a8ec139e55cd852f67d5ee81

  • 修复 pg_receivewal --compress 的 WAL 段打开的一些问题。当使用 --compress 并且在存储这些文件的存储库中存在同名的部分未压缩段时,处理新 WAL 段打开的逻辑会变得模糊。在这种情况下,使用 --compress 会导致代码首先检查未压缩段的存在性和大小,然后打开一个新的压缩的部分段。代码在大多数平台上意外地正常工作(正如构建农场所证明的),除了 bowerbird,其中 gzflush() 在此代码路径中可能失败。无论如何,在创建新的部分未压缩段时使用填充前的代码路径是错误的,所以让我们修复它。请注意,当用户混合使用(或不使用)压缩的 pg_receivewal 连续运行时,此问题也会存在,如 ffc9dda 引入的测试所发现的。同时,这次重构了代码,使得 walmethods.c 中需要了解 ".gz" 后缀的代码路径从四个减少到一个,从而更容易引入新的压缩方法。这解决了第二个问题,即为意外失败生成的日志消息不会显示涉及的压缩段名称,这令人困惑,而是打印非压缩等效段的名称。Reported-by: Georgios Kokolatos Discussion: https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/7fbe0c8c4d4fe429ee1d6383706ea5ccb0f639d3

  • 重新启用 pg_receivewal 在 Windows 上的 ZLIB TAP 测试。这是对 6cea447 的恢复,该提交暂时在 Windows 上禁用这些测试,因为 bowerbird 出现了故障,gzflush() 在新打开的压缩部分段上执行时会失败。感谢 7fbe0c8,现在应该解决了这个问题,所以让我们看看构建农场在 Windows 上对这些测试的反馈。Discussion: https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz https://git.postgresql.org/pg/commitdiff/91d395f47aa92849b2556b1a4d6bc1ff34121a30

  • 禁用 pg_receivewal 在 Windows 上的 ZLIB TAP 测试。这恢复了提交 91d395f,以避免在 Windows 上运行这些测试。这些测试在所有构建农场成员之间基本稳定,除了 fairywren(pg_receivewal 崩溃)和 bowerdird(SIGBREAK 阻止构建农场运行完成)。这些错误有些奇怪,因为其他具有非常相似特征的主机能够轻松运行这些测试。目前,在 Windows 上禁用这些测试以使构建农场恢复正常。根据与 Andrew Dunstan 的讨论。Discussion: https://postgr.es/m/9040d5ed-6462-66a4-07ac-2923785ae563@dunslane.net https://git.postgresql.org/pg/commitdiff/6a2c532c2230159b909382cfa58494ef9d6df703

  • 统一命令行整数选项的解析逻辑。命令行二进制文件的大多数整数选项现在使用一个单一的例程来完成工作,修复了由于使用 atoi() 等导致的不精确值检测问题,atoi() 在以数字字符开头但后面带有垃圾字符的字符串上会失败。根据我的计算,此提交将需要翻译的字符串数量减少了 26 个,并将代码切换为对无效值和超出范围值使用两种错误类型。这方面还有更多工作要做,例如浮点数甚至 int64 选项,但 int32 是最吸引人的情况,因为可以依赖 strtol() 可靠地完成这项工作。请注意,目前有一些例外,例如 pg_ctl 或 pg_upgrade 使用自己的日志记录逻辑。几个负面的 TAP 测试需要针对新生成的错误进行一些调整。pg_dump 和 pg_restore 在选项解析过程中跟踪并行作业的最大数量。代码进行了一些重构,以便在专门处理并行的代码中跟踪该数量。Author: Kyotaro Horiguchi, Michael Paquier Reviewed-by: David Rowley, Álvaro Herrera Discussion: https://postgr.es/m/CALj2ACXqdG9WhqVoJ9zYf-iZt7sgK7Szv5USs=he6NnWQ2ofTA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f164e6d17616a157ea5d9e34dbb1b211c080c41

  • 为 pg_basebackup 和 pg_{dump,restore} 添加缺失的头文件声明。这修复了由 6f164e6 引起的两个编译失败。有趣的是,缺失 <limits.h> 在 Linux 甚至 Windows 上都不会导致失败。在 MacOS 上,它会失败。根据各种构建农场成员。https://git.postgresql.org/pg/commitdiff/bc0cc68f8a1648029424e9300b2e4457acd474a6

Peter Eisentraut 提交

Álvaro Herrera 提交

Peter Geoghegan 提交

  • vacuumdb:修正关于 --force-index-cleanup 的注释。提交 3499df0d 添加了一个注释,错误地暗示 --force-index-cleanup 没有出现在与类似选项 --no-index-cleanup 相同的次要版本中。事实上,这两个选项都是 PostgreSQL 14 的新功能。Backpatch:14-,其中引入了这两个选项。https://git.postgresql.org/pg/commitdiff/28766c054f8cc6a7bbcf99497954e7a259d3edb2

  • Doc:说明 vacuum_multixact_failsafe_age 是基于 multixact 的。提交 1e55e7d1 中的疏忽,该提交为 VACUUM 添加了一个防回绕保护机制。Backpatch:14-,VACUUM 防回绕机制在此引入。https://git.postgresql.org/pg/commitdiff/dd498998a374b3d2a7f5211504f1f1aa15348cf1

Tom Lane 提交

  • 修复 plpgsql 中一些角落的未初始化变量问题。如果在我们首次尝试检查已成功编译的表达式是否为“简单”时引发了错误,后续对 exec_stmt_execsql 的调用将假定 stmt->mod_stmt 已计算完成,而实际上并未计算。这可能导致调试版本中的断言失败;在生产版本中,效果通常是即使未指定 INTO STRICT,也会假定已指定。当然,这只有在后续尝试执行表达式成功时才相关,因此此问题只能通过在一个会话中修复某个引用的、可内联的 SQL 函数中的失败,然后重试调用 plpgsql 函数来达到。(可能还有更多晦涩的方式可以在不更改 plpgsql 函数的情况下更改表达式的行为,但那种方式似乎是人们在实践中可能遇到的唯一一种。)最可靠的修复方法是安排 exec_prepare_plan 在我们完成附属的简单表达式检查之前不要设置 expr->plan。但这似乎很难做到而不产生引用计数泄漏问题。因此,我们选择在注释中记录此风险,并修复 exec_stmt_execsql 以单独测试 stmt->mod_stmt 是否已计算。 (这会增加每次执行的测试和分支,但希望在上下文中可以忽略不计。)在 v11 及更高版本中,也修复了 exec_stmt_call,它具有相同问题的变种。根据 Alexander Lakhin 的 bug #17113。回溯到所有支持的分支。Discussion: https://postgr.es/m/17113-077605ce00e0e7ec@postgresql.org https://git.postgresql.org/pg/commitdiff/d9809bf8694c17e05537c5dd96cde3e67c02d52a

  • Doc:改进关于幂运算符的文档。既然我们不必将其塞入旧的运算符表格式的约束中,我们可以再添加一个示例来阐明左结合性的问题。根据 mdione at grulic.org.ar 的建议。https://postgr.es/m/162661954599.693.13700316547731859171@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7fa1e1ef741964eeb50f33d7c72622658bb7e5f4

  • 修复一些头文件“独立”编译失败的问题。最近添加的对 ParseState 的引用未被 #include 引用覆盖,为这些头文件的用户创建了不必要的顺序依赖。提交 2bfb50b3d 中的疏忽。根据 headerscheck/cpluspluscheck。https://git.postgresql.org/pg/commitdiff/678f5448c2d86976a98b402ef14482a8ba3b159b

  • 删除 configure 时期的线程安全检查 (thread_test.c)。这个测试在二十年前编写时很有用,但对于过去十多年来构建的任何平台来说,它似乎都毫无意义。(同时比较 8a2121185 的注释。)此外,我们现在收到报告说测试程序本身在 ThreadSanitizer 下会失败。与其投入精力修复它,不如直接删除它,并假设少数仍然关心的人已经知道他们需要使用 --disable-thread-safety。回溯到 v14,以与 8a2121185 保持一致。Discussion: https://postgr.es/m/CADhDkKzPSiNvA3Hyq+wSR_icuPmazG0cFe=YnC3U-CFcYLc8Xw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76fa3db33654e543b5c796e28c6fc5b505a19c2a

  • 使 printf("%s", NULL) 打印 "(null)" 而不是崩溃。我们之前采取了强硬态度,认为调用者绝不应该打印空字符串指针,这样做值得断言失败或崩溃。然而,我们早就清除了所有容易发现的此类错误。剩下的代码可能在难以触及的角落情况下会以这种方式失败。例如,在 ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("constraint \"%s\" for table \"%s\" does not exist", conname, get_rel_name(relid)))); 这样简单的代码中,人们必须怀疑 get_rel_name 在此上下文中不能返回 NULL 是否完全保证。如果出现这种情况,现有策略会将可能是一个很小的错误变成服务器崩溃条件。这不利于健壮性。因此,让我们效仿 glibc 的做法,打印 "(null)" 而不是失败。当然,如果这种行为在普通使用中可以达到,我们仍然认为它是一个错误;但崩溃似乎比不崩溃更不可取。此修复在 v12 及更高版本中全面有效,因为我们始终使用 src/port/snprintf.c。在此之前,在大多数平台上,我们受制于本地 libc,但似乎 Solaris 10 是唯一支持的仍然会崩溃的平台。大多数其他平台,如 *BSD、macOS 和 Solaris 11,在某个时候都采用了 glibc 的行为。(AIX 和 HPUX 只打印 "" 而不是 "(null)",但这足够接近了。)我没有检查 Windows 的原生 printf 会做什么,但这无关紧要,因为我们很早就在这个平台上使用了 snprintf.c。在 v12 及更高版本中,还对相关代码进行了 const 处理,这样我们就不会丢弃常量字符串的 const。这只是整洁的习惯,因为几乎没有编译器会对此发出警告。Discussion: https://postgr.es/m/17098-b960f3616c861f83@postgresql.org https://git.postgresql.org/pg/commitdiff/3779ac62d709467fe6331c8f0285d42e7487a01c

  • 修复冲突的会话级与事务级锁的检查。我们有一个实现限制,PREPARE TRANSACTION 不能处理同时持有同一可锁对象上的会话生命周期锁和事务生命周期锁的情况。(这是因为否则我们需要在准备后清理期间获取一个新的 PROCLOCK 条目,这是一个可能失败的操作。这种情况只会由于咨询锁的奇特用法而出现,因此删除此限制可能不值得付出大量努力。)AtPrepare_Locks 试图强制执行此规则,但其逻辑相差甚远,因为它只检测会话锁和事务锁具有相同锁模式的情况。不同模式的锁在同一对象上会导致相当无用的消息“PANIC:我们似乎在某处丢失了一个位”。为了修复,构建一个每个锁标签只有一个条目的临时哈希表,而不是每个锁标签 + 模式一个条目,并使用它来检测冲突。根据 Alexander Pyhalov 的 bug #17122。此 bug 很古老,因此回溯到所有支持的分支。Discussion: https://postgr.es/m/17122-04f3c32098a62233@postgresql.org https://git.postgresql.org/pg/commitdiff/6310809c4aa146b3996a35524955c6c6943d241a

  • 摆脱 Windows 上哈希表大小的人工限制。引入 hash_mem_multiplier GUC 的目的是让用户重现哈希聚合的旧行为,即它可以根据需要使用超过 work_mem 的内存。然而,在 Win64 上,实现未能完成工作,因为 work_mem 被限制在 2GB,以保护各种计算内存大小使用“long int”的地方。原样,相同的限制也应用于 hash_mem。这导致需要超过 2GB 进行哈希聚合的查询出现严重的性能回归,因为它们现在溢出到磁盘,并且无法阻止这种情况。摆脱 work_mem 限制似乎是个好主意,但这是一项艰巨的任务,而且不可能回溯。然而,只有少数几个地方关心 hash_mem 值,而且发现可以在不进行过多代码变动或 ABI 破坏的情况下移除该限制。因此,现在就先这样做以修复回归,并将更大的任务留待以后。此补丁确实引入了更多基础设施,这些基础设施应该有助于这项更大的任务,即 pg_bitutils.h 支持处理 size_t 值。根据 Laurent Hasson 的抱怨。回溯到 v13,行为更改在此版本中引入。Discussion: https://postgr.es/m/997817.1627074924@sss.pgh.pa.us Discussion: https://postgr.es/m/MN2PR15MB25601E80A9B6D1BA6F592B1985E39@MN2PR15MB2560.namprd15.prod.outlook.com https://git.postgresql.org/pg/commitdiff/28d936031a86d94806c6604480ff3f3f169b371c

Fujii Masao 提交

John Naylor 提交了

David Rowley 提交

  • 使 nodeSort.c 使用 Datum 排序进行单列排序。Datum 排序可能比元组排序快得多,尤其是在排序的数据类型是按值传递的类型时。大约 50-70% 的性能改进似乎是可能的。以防万一有任何混淆;Datum 排序仅在 Sort 节点的 targetlist 包含单列时使用,而不是在排序键中有一个单列且 target list 中有多个项时使用。Author: Ronan Dunklau Reviewed-by: James Coleman, David Rowley, Ranier Vilela, Hou Zhijie Tested-by: John Naylor Discussion: https://postgr.es/m/3177670.itZtoPt7T5@aivenronan https://git.postgresql.org/pg/commitdiff/91e9e89dccdfdf4216953d3d8f5515dcdef177fb

Andres Freund 提交

待处理补丁

Dilip Kumar 发送了另一个修订的补丁,用于添加 TOAST 压缩方法选项。

Kyotaro HORIGUCHI 发送了另外两个修订的补丁,用于防止恢复期间的 xlog 页头错误。

Greg Nancarrow 发送了另一个修订的补丁,用于添加一个新的“client_connection”事件和客户端连接触发器支持。

Jacob Champion 发送了另一个修订的补丁,用于支持 NSS 作为 libpq TLS 后端。

Thomas Munro 发送了一个补丁,用于支持 Solaris 上的直接 I/O。

Andres Freund 发送了两个修订的 WIP 补丁,用于通过分离热路径和冷路径来优化分配,并通过避免在分配新块时迭代所有块的需要来改进 slab 性能。

Daniel Gustafsson 发送了一个补丁,用于禁用 pgcrypto 中的 OpenSSL EVP 摘要填充,并为不加载旧版 OpenSSL 3 添加了替代输出。

Ranier Vilela 发送了两个修订的补丁,用于避免一些 strlen 调用。

Masahiko Sawada 发送了另外两个修订的补丁,用于在应用逻辑复制更改时发生的错误中添加 errcontext,添加 pg_stat_logical_replication_error 统计视图,并向 ALTER SUBSCRIPTION 添加 skip_xid 选项。

Peter Smith 发送了另外两个修订的补丁,用于为流式事务添加 prepare API 支持。

Dipesh Pandit 发送了另外两个修订的补丁,用于通过维护当前归档文件的日志段号并将其加 1 来获取下一个 WAL 文件,而不是默认扫描目录,从而减轻 WAL 归档程序的目录扫描。

Andres Freund 和 Yura Sokolov 交换了补丁,以改进惰性 vacuum 的死元组存储:Andres 通过添加基数树实现,Yura 通过添加专用 vacuum tid map。

Denis Hirn 发送了另一个修订的补丁,用于允许 CTE 中存在多个线性递归自引用。

Peter Eisentraut 发送了一个补丁,用于使 Unicode makefile 具有并行安全性。

Ronan Dunklau 发送了另一个修订的补丁,用于标记并删除为 SortGroupClause 添加的 resjunk,并使 sort 和 result 节点执行简化的投影版本。

Filip Gospodinov 发送了另一个修订的补丁,通过硬编码 Libs.private 中的 -lpgcommon 和 -lpgport 来修复静态链接的 pkg-config 文件。

Tomáš Vondra 发送了另一个修订的补丁,用于实现序列的逻辑解码/复制。

Tomáš Vondra 发送了另一个修订的补丁,用于在扩展统计信息中处理 Expr op Expr 子句。

Tomáš Vondra 发送了另外两个修订的补丁,以提高 GROUP BY 的效率。

David Rowley 发送了另一个修订的补丁,用于使 nodeSort.c 对单列排序执行 Datum 排序。

Peifeng Qiu 发送了两个修订的补丁,用于向 libpq 添加 kerberos 委托支持。

John Naylor 发送了另一个修订的补丁,用于重写 pg_verify_str 以提高速度。

Hou Zhijie 和 Greg Nancarrow 交换了补丁,以允许用户声明表的并行数据修改安全性,启用并行 select 用于 insert,并添加一个 pg_get_table_parallel_dml_safety(regclass) 函数,该函数返回 (objid, classid, parallel_safety) 记录。

Ranier Vilela 和 Aleksander Alekseev 交换了补丁,以取消遮蔽几个变量。

Simon Riggs 发送了另外两个修订的补丁,使得哈希索引可以支持 UNIQUE 约束,并允许多列哈希索引。

Bruce Momjian 发送了另外四个修订的补丁,用于修复分数区间算术中的一个错误。

Yugo Nagata 发送了一个补丁,用于纠正 libpq 文档中的一个错误,其中说明了命令在刷新输出缓冲区之前会存储在本地。

Yugo Nagata 发送了另一个修订的补丁,旨在修复一个 bug,该 bug 表现为在 pgbench 的流水线中使用 prepared BEGIN 语句可能导致错误。

Richard Guo 发送了另一个修订的补丁,用于修复分区 JOIN 中的一些不当之处。

David Rowley 发送了另一个修订的补丁,用于为 ORDER BY 聚合添加规划器支持。

Ronan Dunklau 和 Ranier Vilela 交换了补丁,以修复 postgres_fdw PathKey 的处理,方法是注意用于排序的运算符族。

Thomas Munro 发送了两个修订的补丁,用于使 SIMD 代码更具平台中立性,为 UTF-8 验证添加 ARM/NEON 支持,并为 UTF-8 验证添加 POWER AltiVec 支持。

Dean Rasheed 发送了另一个修订的补丁,以允许对 NUMERIC 使用负指数进行幂运算。

Peter Eisentraut 发送了一个补丁,用于在 psql 中测试查询取消。

Pavel Stěhule 和 Aleksander Alekseev 交换了补丁,以增强 PL/pgsql 调试 API,增加返回变量内容文本值的功能。

Vigneshwaran C 发送了另外两个修订的补丁,用于为 PUBLICATION 添加模式级别的粒度。

Jacob Champion 发送了一个补丁,用于添加宽 Unicode 码点指示符,这些码点自 Unicode 5.0 以来已添加。

Thomas Munro 和 Soumyadeep Chakraborty 交换了补丁,以优化 ProcSendSignal(),方法是将跟踪目标后端的机制从 pid 更改为使用 pgprocno,后者不需要扫描 ProcArray。这样做的同时还消除了启动期间需要检查的一些特殊情况。

Andres Freund 发送了一个补丁到 pgbench,以限制流水线仅在需要时进行 PQconsumeInput()。

Nitin Jadhav 发送了另外两个修订的补丁,以显示启动过程中执行的操作的进度。

Ajin Cherian 发送了四个修订的补丁,用于从逻辑复制中删除空事务。

Thomas Munro 发送了一个补丁,用于教会 pgindent 关于特殊文件本地类型名称。

Erik Rijkers 发送了另一个修订的补丁,用于实现 SQL/JSON 规范中的 JSON_TABLE 部分。

Alexander Pyhalov 发送了另一个修订的补丁,以允许将 CASE 表达式推送到外部服务器。

Zeng Wenjing 发送了另一个版本的补丁,用于实现全局临时表。

Justin Pryzby 发送了另一个修订的补丁,用于实现 ALTER TABLE ... ACCESS METHOD,并允许指定分区表的表访问方法。

Hou Zhijie 发送了一个补丁,用于添加一个快速选择(quickselect)工具,该工具可用于快速计算中位数等。

Artur Zakirov 发送了一个补丁,旨在修复一个 bug,该 bug 表现为逻辑复制触发的存储过程无法使用通知事件,通过将 SignalBackends() 调用移到 AtCommit_Notify() 内部。

Peter Eisentraut 发送了一个补丁到 pg_amcheck,用于修复命令行上的块号解析,以便在 sizeof(long)==4 的系统上正确处理。

Haiying Tang 发送了一个补丁,用于支持包含等号的单引号输入的制表符自动补全。

Fabien COELHO 发送了另一个修订的补丁,用于向 psql 添加 SHOW_ALL_RESULTS 选项。

Dean Rasheed 和 Tom Lane 交换了补丁,允许 NUMERIC 具有负比例。

Michael Banck 发送了另一个修订的补丁,用于添加新的 PGC_ADMINSET GUC 上下文和新的 pg_change_role_settings 预定义角色。这些创建了一个介于超级用户和用户之间功能的管理员。

Greg Nancarrow 发送了另一个修订的补丁,用于修复并行工作进程失败的断言和核心转储。

Andrey Borodin 发送了一个补丁,用于避免 relcache 和 syscache 回调中的重复。

Vigneshwaran C 发送了另一个修订的补丁,用于在逻辑复制消息描述中包含所使用的实际数据类型。

Robert Haas 发送了一个补丁,用于将一些恢复结束代码从 StartupXLOG() 中重构出来,推迟与允许 WAL 相关的某些恢复结束操作,并创建一个 XLogAcceptWrites() 函数,其中包含 StartupXLOG() 中的代码。

Andrey Borodin 发送了一个补丁,用于改进 ReadPageInternal() 的错误报告,确保不再出现无用的错误“未找到记录”。

Tom Lane 发送了一个补丁,用于删除哈希表大小的“long int”相关限制。

Haiying Tang 发送了另一个修订的补丁,用于对回归示例进行一些小的修复。

Bharath Rupireddy 发送了另一个修订的补丁,用于对 {pre, post}_auth_delay 使用 WaitLatch。

Bharath Rupireddy 发送了另一个修订的补丁,用于禁止 CREATE SEQUENCE 的 RESTART 选项。

Julien Rouhaud 发送了一个补丁,用于使 pg_stat_statements 测试不受预处理语句无效的影响。