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 新闻

PostgreSQL 星球: http://planet.postgresql.org/

本周 PostgreSQL 每周新闻由 David Fetter 为您带来

请在太平洋标准时间(PST8PDT)周日下午 3:00 前将新闻和公告提交至 david@fetter.org。

== 应用的补丁 ==

Tom Lane 推送了

  • 修复了 psql 的 \connect 命令中最近引入的故障。由于我误读了现有代码的实际作用,提交 85c54287a 等破坏了 psql 在“\c connstring”在连接字符串中提供密码的情况下的行为。在这种情况下,我们应该使用该密码,但从 85c54287a 开始,我们忽略了它(而是提示输入密码)。提交 94929f1cf 在 HEAD 中修复了该问题,但由于我以为它是在清理一个长期存在的错误行为,而不是我刚刚创建的错误行为,因此我没有对其进行反向移植。因此,反向移植了 94929f1cf 中与密码管理相关的部分。除了修复引入的错误之外,这意味着如果连接字符串不更改用户/主机/端口,“\c -reuse-previous=on 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

  • 修复了连接关系的 direct_lateral_relids 的错误计算。如果 PlaceHolderVar 要在连接关系处计算,但其值仅在那里需要,而在更高级别不需要,我们忽略了更新连接关系的 direct_lateral_relids 以包含 PHV 的源关系。这会导致问题,因为 join_is_legal() 然后将不允许将连接关系完全连接到 PHV 的源关系,从而导致“无法构建任何 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 *”,因此他们不在乎,但将来的某些调用者可能会在乎。)Zhijie Hou 提供的 outfuncs.c 修复程序,其余由我提供。讨论:https://postgr.es/m/324c4d81d8134117972a5b1f6cdf9560@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/8286223f3d820c39f2d5f14222f7ccde53bdf502

  • 确保 expandTableLikeClause() 重新检查同一张表。就像以前一样,expandTableLikeClause() 重新执行了 transformTableLikeClause() 完成的相同的 relation_openrv 调用。但是,在某些情况下,这不会找到预期的同一张表。我们持有 LIKE 源表上的锁,因此它不能被重命名或删除,但是另一张表可能会在搜索路径中出现在它之前。这解释了在将表克隆为同名的临时表时,错误 #16758 中报告的奇怪行为。在提交 502898192 引入需要两次打开源表之前,这种情况按预期工作,因此我们应该修复它。为了真正确保我们得到同一张表,让我们通过 OID 而不是名称重新打开它。这需要在 TableLikeClause 结构中添加一个 OID 字段,从 ABI 的角度来看这有点令人不安,但是只要它在末尾,我认为没有任何严重的风险。根据 Marc Boeren 的错误 #16758。与之前的补丁一样,反向移植到所有受支持的分支。讨论:https://postgr.es/m/16758-840e84a6cfab276d@postgresql.org https://git.postgresql.org/pg/commitdiff/f7f83a55bf6051818a0e4387d718867ecfa8561b

  • 修复了计划器中删除无用 RESULT RTE 时遗漏的步骤。提交 4be058fe9 忘记了在删除无用的结果 RTE 时,append_rel_list 已经被填充,并且它可能包含需要像主解析树中的那些一样调整的 PlaceHolderVar。这可能会导致以后出现“关系 ID N 没有关系条目”失败,当计划器尝试对未调整的 PHV 执行某些操作时。根据 Tom Ellis 的报告。反向移植到 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 的 cryptohash 实现以使用 EVP(用于 FIPS,并且还因为上游不建议使用低级 cryptohash 函数 20 年)。请注意,OpenSSL 从 1.1.0 开始隐藏了 cryptohash 上下文的内部结构,因此有必要将分配留给 OpenSSL 本身,这解释了为什么需要这两个新例程。这部分将需要更多的工作来正确跟踪具有资源所有者的哈希上下文,但这不在此处引入。不过,此重构使移动成为可能。通过将哈希类型直接合并到哈希上下文数据中,这减少了所有 SHA2 实现的例程数量,从十二个(SHA{224,256,386,512},带有 init、update 和 final 调用)到五个(create、free、init、update 和 final 调用)。新的 cryptohash 例程被移动到一个名为 cryptohash.c 的新文件中,用于后备实现,而 SHA2 特定的部分成为 src/common/ 的内部组成部分。OpenSSL 特定的部分是 cryptohash_openssl.c 的一部分。此基础结构可用于更多哈希类型,如 MD5 或 HMAC。任何使用内部 SHA2 例程的代码路径都会进行调整以正确报告错误,这是此提交的大部分更改。受影响最大的区域是校验和清单、libpq 和 SCRAM。请注意,e21cbb4 是尝试将 SHA2 切换到 EVP 的第一次尝试,但它缺少 libpq 所需的重构,如此处所做的那样。此补丁已在 Linux 和 Windows 上进行了测试,无论是否使用 OpenSSL,并且可追溯到 1.0.1,这是 HEAD 上支持的最旧版本。作者:Michael Paquier 审核人:Daniel Gustafsson 讨论:https://postgr.es/m/20200924025314.GE7405@paquier.xyz https://git.postgresql.org/pg/commitdiff/87ae9691d25379785f8c0f81b06a14818cfd8c56

  • 修复 cryptohash_openssl.c 中的编译警告。这些警告使用 -O2 出现。在 87ae969 中被忽略。作者:藤井雅雄 讨论: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 摘要例程。自 2000 年以来,上游 OpenSSL 不建议使用低级哈希例程,并且 pgcrypto 从 5ff4a67 开始已切换到 EVP。这利用了 87ae969 中完成的重构,该重构引入了加密哈希的分配和释放例程。自 1.1.0 起,OpenSSL 不再发布 cryptohash 上下文的内容,迫使任何使用者都依赖 OpenSSL 进行所有分配。因此,资源所有者回调机制获得了一组新的例程,用于在使用 OpenSSL 时跟踪和释放 cryptohash 上下文,从而防止后端出现任何泄漏风险。由于 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 子句的估计。以前,我们仅将扩展统计信息应用于 clauselist_selectivity() 代码路径中的 OR 子句,该子句出现在隐式 AND 子句列表中。这意味着它只能在 OR 子句的所有子句都由单个扩展统计信息对象覆盖时才能使用扩展统计信息。相反,教导 clause_selectivity() 如何通过以类似于隐式 AND 子句列表的方式处理其 ORed 子句列表,但具有不同的组合规则,从而将扩展统计信息应用于 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 中记录更改,以便如果在达到该状态后遇到提交,我们应该能够发送整个事务的更改。现在,在记录更改时,如果重排序缓冲区内存超出了 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 发送了另一个补丁修订版,以将 \dX (扩展统计信息) 添加到 psql。

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 发送了补丁的另一个修订版本,以修复一个错误,该错误表现为如果 pg_database 元组包含 TOAST 属性,则 vac_update_datfrozenxid 会引发“错误的元组长度”错误。

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 发送了补丁的另一个修订版本,如果收集合并路径没有充分排序,则会报错。

James Coleman 发送了补丁的另一个修订版本,以确保 generate_useful_gather_paths 不会跳过未排序的子路径,强制执行 generate_useful_gather_paths 中路径键的并行安全性,禁止在主动排序中使用 SRF,删除易失性 expr 目标搜索,并在 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 发送了一个补丁,用 lappend 和 list_delete_last 替换 plan_union_children() 中的 lcons 和 list_delete_first

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

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

Fujii Masao 发送了补丁的另一个修订版本,以向 pg_stat_wal view 添加基本统计信息。