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

PostgreSQL 周刊新闻 - 2020 年 12 月 6 日

发布于 2020-12-07,作者 PWN
PWN

PostgreSQL 周刊新闻 - 2020 年 12 月 6 日

本周人物:https://postgresql.life/post/stephane_schildknecht/

PostgreSQL 产品新闻

check_pgactivity 2.5 发布,这是一个用于监控 PostgreSQL 的 Nagios 远程代理。https://github.com/OPMDG/check_pgactivity/releases/latest

WAL-G 0.2.19 发布,这是一个用 Go 编写的 PostgreSQL 备份管理系统。https://github.com/wal-g/wal-g/releases

12 月 PostgreSQL 工作岗位

http://archives.postgresql.org/pgsql-jobs/2020-12/

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

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

== 已应用补丁 ==

Tom Lane 提交

  • 修复最近引入的 psql 的 \connect 命令的错误。由于我误读了现有代码的作用,提交 85c54287a 等错误地处理了 "\c connstring" 在 connstring 中提供密码的情况。在这种情况下,我们应该使用该密码,但在 85c54287a 中,我们忽略了它(而是提示输入密码)。提交 94929f1cf 在 HEAD 中修复了这个问题,但由于我认为它只是清理了一个长期存在的错误行为,而不是我刚刚造成的,所以我没有回溯补丁。因此,回溯 94929f1cf 中与密码管理相关的部分。除了修复引入的错误外,这意味着 "\c -reuse-previous=on connstring" 将允许重用现有连接的密码,如果 connstring 中的用户/主机/端口未更改。这之前没有发生,但看起来像是一个错误修复,而且我也不想在不同版本之间存在此代码的显著差异。还修复了一个具有相同根本原因的错误,该错误与是否覆盖 connstring 中的 client_encoding 设置有关。在 85c54287a 中,我们总是这样做的;恢复之前的行为,只在 stdin/stdout 是终端且没有 PGCLIENTENCODING 环境变量设置时覆盖。 (我发现这个定义有点令人惊讶,但现在似乎不是重新审视它的时机。)根据 Krzysztof Gradek 的 bug #16746。与之前的补丁一样,回溯到所有支持的分支。讨论:https://postgr.es/m/16746-44b30e2edf4335d4@postgresql.org https://git.postgresql.org/pg/commitdiff/7e5e1bba034ee02245e8a3833aa1f6ea7253b584

  • 修复 join relations 的 direct_lateral_relids 的错误计算。如果一个 PlaceHolderVar 需要在 join relation 中进行评估,但其值只在那里需要,而不是在更高级别需要,我们就忽略了更新 joinrel 的 direct_lateral_relids 以包含 PHV 的源 rel。这会导致问题,因为 join_is_legal() 将不允许 joinrel 与 PHV 的源 rel 连接,导致“无法构建任何 N 路连接”的规划器失败。根据 Andreas Seltenreich 的报告。回溯到问题起源的 9.5 版本。讨论:https://postgr.es/m/87blfgqa4t.fsf@aurora.ydns.eu https://git.postgresql.org/pg/commitdiff/b1738ff6ab73203cbbc02d7fb82941dbc061d301

  • 防止独立后端进行并行索引构建。如果没有 postmaster,这行不通,并且代码确实会因尝试而失败断言。应该有一个 IsUnderPostmaster 检查来限制并行性的使用,就像规划器对普通并行查询所做的那样。提交 40d964ec9 正确地做到了这一点,所以遵循其模型,在检查 max_parallel_maintenance_workers == 0 的地方进行 IsUnderPostmaster 检查。总的来说,实现并行实用程序操作的新代码也应该这样做。Yulin Pei 报告并提供了补丁,我进行了化妆调整。回溯到此代码引入的 v11 版本。讨论:https://postgr.es/m/HK0PR01MB22747D839F77142D7E76A45DF4F50@HK0PR01MB2274.apcprd01.prod.exchangelabs.com https://git.postgresql.org/pg/commitdiff/275b3411d9189b3974687766db06727d64d22979

  • 删除 DocBook DTD 的配置时间探测。在 OpenSP 文档工具链上时,检查 DocBook 是否已安装很有价值,因为该工具链很难完全安装。如今,只要安装了 xmllint 和 xsltproc,您就万事俱备了,因为这些程序会在需要时从网络获取 DocBook 文件。此外,在配置时进行此测试意味着即使您以后不感兴趣构建文档,也可能会发生网络访问。这可能很慢(通常为 2 到 3 秒,尽管有报道称延迟更高),而且在未发出警告的情况下进行非机器访问似乎也不是很好。因此,删除 PGAC_CHECK_DOCBOOK 探测,并调整相关文档。没有那个宏,config/docbook.m4 就没什么内容了,所以我直接删除了它。回溯到 v11,我们开始在该宏的 PGAC_CHECK_DOCBOOK 探测中使用 xmllint。讨论:https://postgr.es/m/E2EE6B76-2D96-408A-B961-CAE47D1A86F0@yesql.se 讨论:https://postgr.es/m/A55A7FC9-FA60-47FE-98B5-139CDC57CE6E@gmail.com https://git.postgresql.org/pg/commitdiff/4823c4f6ac770ebd49b63b0ce64ecfe82987af57

  • 修复 IncrementalSortPath 所需的 outfuncs.c 支持的缺失。出于调试目的,Path 节点应该有 outfuncs 支持,但这在原始增量排序补丁中被忽略了。同时,清理了其他几个小的疏忽,以及 create_incremental_sort_path() 的返回类型选择非常奇怪。(所有现有的调用者都立即将其转换为 "Path *",所以他们不关心,但未来的调用者可能会关心。) outfuncs.c 的修复由 Zhijie Hou 完成,其余部分由我完成。讨论:https://postgr.es/m/324c4d81d8134117972a5b1f6cdf9560@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/8286223f3d820c39f2d5f14222f7ccde53bdf502

  • 确保 expandTableLikeClause() 重新检查相同的表。在现有的实现中,expandTableLikeClause() 会重新执行 transformTableLikeClause() 已经执行过的 relation_openrv 调用。然而,在某些情况下,这可能找不到预期的相同表。我们持有 LIKE 源表的锁,因此它不能被重命名或删除,但搜索路径中可能会出现另一个表排在它前面。这解释了在 bug #16758 中将表克隆为同名临时表时出现的奇怪行为。该情况在 commit 502898192 引入需要两次打开源表的需求之前一直按预期工作,所以我们应该修复它。为了确保我们获得相同的表,让我们通过 OID 而不是名称来重新打开它。这需要在 TableLikeClause 结构体中添加一个 OID 字段,这从 ABI 的角度来看有点令人担忧,但只要它在最后,我认为就没有严重的风险。根据 Marc Boeren 的 bug #16758。与之前的补丁一样,回溯到所有支持的分支。讨论:https://postgr.es/m/16758-840e84a6cfab276d@postgresql.org https://git.postgresql.org/pg/commitdiff/f7f83a55bf6051818a0e4387d718867ecfa8561b

  • 修复规划器中删除无用的 RESULT RTE 时遗漏的步骤。Commit 4be058fe9 忘记了 append_rel_list 在我们删除无用的结果 RTE 时已经填充,它可能包含需要调整的 PlaceHolderVars,就像主解析树中的那些一样。这可能导致以后规划器尝试处理未调整的 PHV 时出现“relid N 的关系条目不存在”的失败。根据 Tom Ellis 的报告。回溯到 bug 引入的 v12 版本。讨论:https://postgr.es/m/20201205173056.GF30712@cloudinit-builder https://git.postgresql.org/pg/commitdiff/e98c900993e89ad9278cdfbf0ba5495381a1faac

Fujii Masao 提交

Heikki Linnakangas 提交

Michaël Paquier 提交

  • 重构 EXPLAIN、VACUUM 和 ANALYZE 的选项列表的解析规则。这三个命令一直使用相同的语法规则来处理一组括号内的选项。这重构了代码,使它们使用相同的解析规则,从而减少了一些代码。未来的提交将利用这些选项解析规则为更多的实用程序命令,如 REINDEX 和 CLUSTER。作者:Alexey Kondratov、Justin Pryzby 讨论:https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru https://git.postgresql.org/pg/commitdiff/873ea9ee692e7829614f913685db540b17998ba6

  • 文档:删除更多关于与旧版本兼容性的说明。这是 fa42c2e 中工作的后续,该工作没有包含所有之前商定的修复。此处删除的内容可能会使读者感到困惑,因为它们指的是相当旧的服务器版本。作者:Stephen Frost、Tom Lane、Heikki Linnakangas、Yaroslav Schekin 讨论:https://postgr.es/m/CAB8KJ=jYHgnxLLZSNJz7gBTck4TxomngCmGkw3nEMSNF0yL6wA@mail.gmail.com 讨论:https://postgr.es/m/1599765595731-0.post@n3.nabble.com https://git.postgresql.org/pg/commitdiff/8a17f44c1e7a9f3d2a9da97dc3eba4184a2a453c

  • 将 SHA2 例程移至新的通用 API 层用于加密哈希。创建了两个新例程来分配哈希上下文并释放它,因为这对于重构的目标是必要的:将所有 OpenSSL 的加密哈希实现切换为使用 EVP(用于 FIPS,也因为上游不推荐使用低级加密哈希函数已有 20 年)。请注意,自 1.1.0 起,OpenSSL 会隐藏加密哈希上下文的内部细节,因此有必要将分配留给 OpenSSL 本身,这解释了这两个新例程的必要性。这部分工作需要更多工作来正确跟踪具有资源所有者的哈希上下文,但此处并未引入。尽管如此,这次重构使得迁移成为可能。通过将哈希类型直接集成到哈希上下文数据中,将所有 SHA2 实现的例程数量从十二个(SHA{224,256,386,512} 带有 init、update 和 final 调用)减少到五个(create、free、init、update 和 final 调用)。新的加密哈希例程已移至一个名为 cryptohash.c 的新文件中,用于回退实现,SHA2 的特定部分成为 src/common/ 的内部部分。OpenSSL 的特定部分是 cryptohash_openssl.c 的一部分。此基础设施可用于更多哈希类型,如 MD5 或 HMAC。使用内部 SHA2 例程的任何代码路径都已适应正确报告错误,这是此提交的大部分更改。受影响的区域主要是 checksum manifest、libpq 和 SCRAM。请注意,e21cbb4 是首次尝试将 SHA2 切换到 EVP,但它缺乏 libpq 所需的重构,正如此处完成的。此补丁已在 Linux 和 Windows 上进行测试,带或不带 OpenSSL,并且向下支持到 HEAD 支持的最旧版本 1.0.1。作者:Michael Paquier 审阅者:Daniel Gustafsson 讨论:https://postgr.es/m/20200924025314.GE7405@paquier.xyz https://git.postgresql.org/pg/commitdiff/87ae9691d25379785f8c0f81b06a14818cfd8c56

  • 修复 cryptohash_openssl.c 中的编译警告。这些警告是在使用 -O2 编译时出现的。87ae969 中的疏忽。作者:Fujii Masao 讨论:https://postgr.es/m/cee3df00-566a-400c-1252-67c3701f918a@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/91624c2ff8809145880383b0fa84be0ee98f55b5

  • 重构 CLUSTER 和 REINDEX 语法以使用 DefElem 作为选项列表。这改变了 CLUSTER 和 REINDEX,使其成为可能使用括号内的语法来处理选项,同时将选项列表的语法解析规则与现有规则统一起来。这是 873ea9e 对 VACUUM、ANALYZE 和 EXPLAIN 所做工作的一个后续。这有利于 REINDEX,以便对可排序索引和 TABLESPACE 进行潜在的后端过滤,而 CLUSTER 则受益于后者。作者:Alexey Kondratov、Justin Pryzby 讨论:https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru https://git.postgresql.org/pg/commitdiff/b5913f6120792465f4394b93c15c2e2ac0c08376

  • 将基于 OpenSSL 的 SHA2 实现更改为使用 EVP digest 例程。上游 OpenSSL 自 2000 年以来就不推荐使用低级哈希例程,并且 pgcrypto 自 5ff4a67 起已切换到 EVP。这利用了 87ae969 中进行的重构,该重构引入了用于加密哈希的分配和释放例程。自 1.1.0 起,OpenSSL 不再发布加密哈希上下文的内容,迫使任何消费者依赖 OpenSSL 进行所有分配。因此,资源所有者回调机制获得了一组新的例程,用于在 OpenSSL 中跟踪和释放加密哈希上下文,防止后端出现任何泄漏风险。由于 87ae969 的重构,前端不需要任何东西,并且 resowner 知识被隔离到 cryptohash_openssl.c 中。请注意,这也修复了在使用 OpenSSL 中 FIPS 进行 SCRAM 身份验证时发生的错误,但由于对此问题的抱怨很少,并且这会导致 ABI 破坏,因此没有进行回溯补丁。作者:Michael Paquier 审阅者:Daniel Gustafsson、Heikki Linnakangas 讨论:https://postgr.es/m/20200924025314.GE7405@paquier.xyz 讨论:https://postgr.es/m/20180911030250.GA27115@paquier.xyz https://git.postgresql.org/pg/commitdiff/4f48a6fbe2b28d8281dbbfa2d334fa2ed8472734

  • 将 cryptohashes.c 重命名为 cryptohashfuncs.c。87ae969 在 src/common/ 中创建了两个名为 cryptohash{_openssl}.c 的新文件,其名称与现有的后端文件 cryptohashes.c 重叠,该文件专用于 SHA2 和 MD5 的 SQL 包装器。此文件被重命名为 cryptohashfuncs.c,以便与 src/common/ 的新 cryptohash 接口更具一致性并减少混淆。作者:Michael Paquier 审阅者:Daniel Gustafsson 讨论:https://postgr.es/m/X8hHhaQgbMbW+aGU@paquier.xyz https://git.postgresql.org/pg/commitdiff/bd94a9c04e04bb3b626e88981a50fcca2bd99d60

Álvaro Herrera 提交

Thomas Munro 推送

Bruce Momjian 已推送

Stephen Frost 已推送

Dean Rasheed 已推送

  • 改进使用扩展统计信息的 OR 子句估计。以前,我们只在 OR 子句作为隐式 AND 列表的一部分出现在 clauselist_selectivity() 代码路径中时,才将扩展统计信息应用于 OR 子句。这意味着它只能在 OR 子句的所有子句都被单个扩展统计对象覆盖时才起作用。相反,通过以类似于隐式 AND 的子句列表的方式处理 OR 子句的 ORed 子句列表,来教会 clause_selectivity() 如何将扩展统计信息应用于 OR 子句,但具有不同的组合规则。这允许使用一个或多个扩展统计对象来估计子句列表的全部或部分。任何剩余的子句都将被视为独立的。此外,为了避免重复应用扩展统计信息,这引入了 clause_selectivity() 和 clauselist_selectivity() 的“扩展”版本,其中包含一个忽略扩展统计信息的选项。这取代了旧的 clauselist_selectivity_simple() 函数,该函数在从扩展统计信息代码调用时未能完全忽略扩展统计信息。当前基础设施的一个已知限制是,OR 子句下的 AND 子句不被视为与扩展统计信息兼容(因为我们不为这些子 AND 子句构建 RestrictInfos)。因此,例如,“(a=1 AND b=1) OR (a=2 AND b=2)”目前将被视为两个独立的 AND 子句(每个子句都可以使用扩展统计信息进行估计),但扩展统计信息目前不会用于考虑这些子句之间可能存在的任何重叠。改进这一点留待未来完成。原始补丁由 Tomas Vondra 提供,并由我进行了其他改进。讨论:https://postgr.es/m/20200113230008.g67iyk4cs3xbnjju@development https://git.postgresql.org/pg/commitdiff/25a9e54d2db31b8031c2d8166114b187e8347098

Peter Eisentraut 提交

Amit Kapila 提交

  • 删除 reorderbuffer.c 中不正确的断言。我们甚至在达到 SNAPBUILD_CONSISTENT 状态之前就开始在 ReorderBufferTXN 中记录更改,以便如果在达到该状态后遇到提交,我们应该能够发送整个事务的更改。现在,在记录更改时,如果 reorder buffer 内存已超过 logical_decoding_work_mem,则我们可以开始流式传输(如果允许),并且我们尚未流式传输该数据。但是,我们必须在快照达到 SNAPBUILD_CONSISTENT 状态之前不允许开始流式传输。顺便,改进 ReorderBufferResetTXN 上方的注释,以提及在遇到错误后需要继续流式传输的情况。作者:Amit Kapila 审阅者:Dilip Kumar 讨论:https://postgr.es/m/CAA4eK1KoOH0byboyYY40NBcC7Fe812trwTa+WY3jQF7WQWZbQg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8ae4ef4fb0e0331f02c4615182600546c8e5c4d4

== 待定补丁 ==

Tatsuro Yamada 发送了另一个版本的补丁,用于向 psql 添加 \dX(扩展统计信息)。

Andrey V. Lepikhov 发送了另一个版本的补丁,用于删除不必要的自连接。

David G. Johnston 发送了另一个版本的补丁,用于对 plpgsql 文档进行一些小的清理和改写。

Seino Yuki 发送了另一个版本的补丁,用于向 pg_stat_statements_info 添加一个新列 reset-time。

Justin Pryzby 发送了一个补丁,用于使 \dt+ pg_toast.* 在 psql 中工作。

Justin Pryzby 发送了另一个版本的补丁,用于使 EXPLAIN 在非文本格式下显示 JIT 详细信息,即使数量为零。

Peter Eisentraut 发送了另一个版本的补丁,用于暂停因参数设置不足而导致的恢复。

Michaël Paquier 发送了另一个版本的补丁,用于修复一个错误,该错误表现为 vac_update_datfrozenxid 在 pg_database 元组包含 toast 属性时会引发“错误的元组长度”。

Michaël Paquier 发送了另一个版本的补丁,用于删除一些关于已废弃行为的引用。

Peter Geoghegan 发送了另一个版本的补丁,用于使 heapam 支持自底向上的索引删除,传递“逻辑上未更改的索引”提示,并使 nbtree 支持自底向上的索引删除。

Bertrand Drouvot 发送了两个版本的补丁,用于防止函数因删除其所在的模式而变成孤立状态。

Andrey V. Lepikhov 发送了一个补丁,用于修复对外部连接成本的严重高估。

Konstantin Knizhnik 发送了另一个版本的补丁,用于为 libpq 实现自定义压缩。

Álvaro Herrera 发送了一个补丁,用于改进类似 INDEX CONCURRENTLY 的操作。

Peter Eisentraut 发送了另一个版本的补丁,用于将 pageinspect 中的块号参数更改为 bigint,因为这实际上适合 uint32。

Aleksey Kondratov、Michaël Paquier 和 Justin Pryzby 交换了补丁,允许 CLUSTER 和 VACUUM FULL 动态更改表空间。

Bertrand Drouvot 和 Fujii Masao 交换了补丁,用于记录备用恢复冲突等待。

Justin Pryzby 发送了另外两个版本的补丁,使 INSERT SELECT 能够使用 BulkInsertState。

Bharath Rupireddy 发送了另外两个版本的补丁,使 CREATE TABLE AS 中的并行插入成为可能。

James Coleman 发送了另一个版本的补丁,用于在 gather merge 路径未充分排序时报错。

James Coleman 发送了另一个版本的补丁,用于确保 generate_useful_gather_paths 不会跳过未排序的子路径,在 generate_useful_gather_paths 中强制执行路径键的并行安全性,禁止在主动排序中使用 SRF,移除易失性表达式目标搜索,并在 prepare_sort_from_pathkeys 中记录 find_em_expr_usable_for_sorting_rel

Craig Ringer 发送了一个补丁,用于实现一个 TAP 测试实用程序模块 PG_LSN.pm 来测试涉及逻辑序列号的内容。

Greg Nancarrow 发送了另一个版本的补丁,用于向 in_hot_standby 添加一个可报告的 GUC 并使 transaction_read_only GUC 可报告,并增强连接参数 target_session_attrs 以支持新值:read-only/primary/standby/prefer-standby。

Jürgen Purtz 发送了另一个版本的补丁,在教程中加入更明确的 JOIN。

Zhihong Yu 发送了另一个版本的补丁,用于在定义索引时检查 nparts。

Hou Zhejie 发送了一个补丁,用于在 plan_union_children() 中用 lappend 和 list_delete_last 替换 lcons 和 list_delete_first

Laurenz Albe 发送了一个补丁,用于在 psql 的 \e 中退出编辑器时丢弃查询缓冲区。

Andres Freund 发送了一个补丁,用于修复 LLVM 12 时出现的一个 JIT 问题。

Fujii Masao 发送了另一个版本的补丁,用于向 pg_stat_wal 视图添加基本统计信息。