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

发布于 2021-07-05,作者:PWN
PWN

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

祝贺新的 PostgreSQL 提交者 Daniel Gustafsson 和 John Naylor!

PostgreSQL 产品新闻

pg_dumpbinary 2.4 发布,该程序用于以二进制格式转储 PostgreSQL 数据库。https://github.com/lzlabs/pg_dumpbinary/releases/

7 月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

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

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

已应用的补丁

Michaël Paquier 推送了

Thomas Munro 推送了

Amit Kapila 推送了

Peter Eisentraut 推送

Andrew Dunstan 推送

Peter Geoghegan 推送

Tom Lane 推送

  • 不要依赖 pgbench 的 random() 函数中的 -fwrapv 语义。而是使用 common/int.h 函数以更符合 C 标准的方式检查整数溢出。这是由于最近在 buildfarm 成员 moonjelly 上出现的故障所致,其中开发版 gcc 似乎在优化时忽略了 -fwrapv 开关。据推测,这是一个 gcc 错误,很快就会修复,但我们最好在这里安装更清晰的编码,而不是等待。(这没有解决我们是否能够摆脱使用 -fwrapv 的问题。测试表明,这个位置是唯一一个这样做会产生可见回归测试失败的地方,但不幸的是,这证明不了什么。)向后移植到 v12。common/int.h 函数存在于 v11 中,但该分支在任何客户端代码中都没有使用它们。我认为这种情况在现实世界中不够有趣,不值得冒哪怕很小的风险来成为第一个这样的使用。Tom Lane 和 Fabien Coelho 讨论:https://postgr.es/m/73927.1624815543@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/01697e92a460b10fde43707b29391c8deb69573e

  • 不要在 libpq 的 fe-print.c 中使用 abort(3)。在内存不足时导致核心转储似乎很不友好,并且肯定远远超出了通用库的预期行为。只需打印一条错误消息(我们已经这样做了)并返回。不幸的是,这些函数没有错误返回约定,但使用它们的代码可能只是在寻找一种快速而肮脏的打印方法,并且无论如何都不会费心检查。尽管这些函数已被部分弃用,但向后移植此功能仍然是合适的。顺便说一句,也向后移植 b90e6cef1,只是为了减少分支之间的外观差异。讨论:https://postgr.es/m/3122443.1624735363@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6f5d9bce57a7bb29ba61f0bf4fd465a26de9fc28

  • 文档:进一步更新 RELEASE_CHANGES 过程说明。提及在创建或停用分支时通过电子邮件通知适当列表的预期。(我多年来一直非正式地这样做,但最好将其写下来。) https://git.postgresql.org/pg/commitdiff/14b2ffaf7ffdd199937e8bcba8b459da5491bcb6

  • 删除 libpq 对 abort(3) 的使用以处理互斥失败的情况。在开发版本中执行 abort() 似乎是正确的,但在通用库的生产版本中则不是。但是,执行此操作的函数没有任何方法可以将失败报告回给它们的调用者。似乎我们可以忽略生产版本中的失败,因为 (a) 自该代码存在十几年以来,没有报告过此类失败,并且 (b) 在 fe-auth.c 操作期间未能强制执行互斥在大多数情况下可能不会导致任何问题。(使用此宏的 OpenSSL 回调已过时,因此更不可能导致有趣的问题。)可能更好的答案是打破 pgthreadlock_t 回调 API 的兼容性,但在没有现场问题报告的情况下,似乎不值得麻烦。讨论:https://postgr.es/m/3131385.1624746109@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aaddf6ba09e25878e792f0d15f725370e19396df

  • 添加一个构建时检查,确保 libpq 不调用 exit() 或 abort()。直接退出或中止对于通用库来说似乎不是很好的形式。既然 libpq 自由地使用 src/common/ 中的位,那么很容易意外包含在 OOM 后执行诸如调用 exit(1) 之类的操作的代码 — 例如参见 8ec00dc5c。因此,添加一个简单的交叉检查,确保没有此类调用进入 libpq.so。交叉检查取决于 nm(1) 的可用性以及能够在共享库上运行的能力,这在某些地方可能不成立。但是,如果 nm 失败,我们可以让测试静默地不执行任何操作。只要检查在通用平台上有效,那就足够了。(按照相同的逻辑,我没有担心在 MSVC 构建中提供等效的测试。) 讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/dc227eb82ea8bf6919cd81a182a084589ddce7f3

  • 修复报告哪个哈希分区冲突的虚假逻辑。Commit efbfb6424 添加了逻辑,用于在抱怨新的哈希分区的模数与现有分区不兼容时,准确报告哪个现有分区冲突。但是,它误解了分区数据结构,并且在某些情况下会选择错误的分区,或者在其他情况下由于获取虚假的表 OID 而完全崩溃。根据 Alexander Lakhin 的 bug #17076。由 Amit Langote 修复;我进一步修改了代码注释。讨论:https://postgr.es/m/17076-89a16ae835d329b9@postgresql.org https://git.postgresql.org/pg/commitdiff/dd2364ced98553e0217bfe8f621cd4b0970db74a

  • 修复 commit dc227eb82 带来的可移植性问题。放弃尝试以机械方式禁止在 libpq 中使用 abort()。即使源代码中没有此类调用,我们现在也看到了三种不同的场景,其中构建工具链会静默插入此类调用:gcc 为分析执行此操作,某些平台使用它来实现 assert(),而 icc 这样做没有任何明显的原因。检查意外使用 exit() 似乎比检查 abort() 重要得多,因此我们现在将满足于执行此操作。此外,过滤掉 __cxa_atexit() 以避免错误匹配。似乎 OpenBSD 会插入对它的调用,尽管 libpq 不包含 C++ 代码。讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e45b0dfa1f1028948decad3abd3b0f6e913a44b0

  • 改进构建时检查,确保 libpq 不调用 exit()。进一步修复提交 dc227eb82。根据 Peter Eisentraut 的建议,使用一个标记文件来控制检查的运行时间,避免在“make all”期间重复执行。此外,删除 nm 的 “-g” 开关:它没有用处,并且某些版本的 nm 认为它与 “-u” 冲突。(感谢 Noah Misch 解决了这个可移植性问题。)讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2f7bae2f924d8213a76370f825dc15eb0aa79796

  • 为 initdb 添加 --clobber-cache 选项,用于 CCA 测试。提交 4656e3d66 将 “#define CLOBBER_CACHE_ALWAYS” 测试机制替换为一个 GUC,这对于以更有效的方式进行缓存清除测试有很大帮助;但该实现存在一个漏洞。在 initdb 运行期间进行缓存清除测试的唯一方法是使用旧的 #define 方法,因为无法从外部设置 GUC。通过为此目的向 initdb 添加一个开关来改进这一点。(也许有一天我们应该允许 initdb 传递任意的 “-c NAME=VALUE” 开关。但是,引用困难让我现在没有尝试这样做。)回溯到 v14,其中引入了 4656e3d66。讨论:https://postgr.es/m/1582507.1624227029@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b741f4c3ee67666aa333dbb25bd71906b3474def

  • 不要尝试在 slot_store_error_callback() 中打印数据类型名称。现有代码试图在已经失败的事务中进行系统缓存查找,这至少可以说是有问题的。在考虑了一些替代方案后,最好的修复方法似乎是将错误消息中的类型名称完全删除。表名和列名似乎足以进行本地化。如果用户不确定涉及哪些类型,她可以检查本地和远程表定义。完成此操作后,我们还可以丢弃 LogicalRepTypMap 哈希表,该哈希表没有其他用途。可以说,LOGICAL_REP_MSG_TYPE 复制消息现在也已过时;但我们可能应该保留它们,以防出现其他用途。(无论如何,从复制协议中删除某些东西的复杂性可能会超过任何节省。)Masahiko Sawada 和 Bharath Rupireddy,根据 Andres Freund 的投诉。回溯到 v10,其中起源于此代码。讨论:https://postgr.es/m/20210106020229.ne5xnuu6wlondjpe@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/50371df266d4c8f4faaf448cbd789d9697443952

  • 进一步限制 libpq 中无 exit() 测试的范围。在 --enable-coverage 构建中完全禁用此检查,因为较新版本的 gcc 也为此插入 exit() 以及 abort() 调用。此外,在 AIX 和 Solaris 上禁用它,因为这些平台倾向于将 libldap 等工具作为静态库提供,然后将其包含在 libpq 的 shlib 中。我们不能期望此类库遵守我们的编码规则。(该平台列表可能需要额外的调整,但我认为这足以让 buildfarm 满意。)根据 Jacob Champion 和 Noah Misch 的报告。讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/792259591c0fc19c42247fc7668b1064d1e850d4

Noah Misch 推送

Álvaro Herrera 推送

Alexander Korotkov 推送

Fujii Masao 推送

David Rowley 推送

  • 改进了多个使缓冲区大小加倍的地方。有几个地方执行了一个紧密的循环来确定第一个大于或等于 2 的幂的数

    = 所需的内存。我们可以使用 pg_nextpower2_32 或 pg_nextpower2_64,而不是使用循环来实现。当我们需要一个等于或大于给定数值的 2 的幂时,我们只需将该数值传递给 nextpower2 函数。当我们需要一个大于该数值的 2 的幂时,我们只需传递该数值 + 1。此外,在 tsearch 中,有几个地方在执行 while 循环时,一个简单的 "if" 语句就足够了。在这两个位置,都只添加了一个项目,因此循环最多只会迭代一次。将循环更改为 if 语句会使代码稍微更优化,因为条件只检查一次,而不是两次。还有相当多的地方以以下形式增加缓冲区的大小:while (reqsize >= buflen) { buflen *= 2; buf = repalloc(buf, buflen); } 这些在此提交中未触及。对于大于 MaxAllocSize 的大小,repalloc 将会报错。将这些更改为使用 pg_nextpower2_32 将消除引发该错误的可能性。从代码中尚不清楚这些大小是否会变得那么大,因此最好谨慎行事。讨论:https://postgr.es/m/CAApHDvp=tns7RL4PH0ZR0M+M-YFLquK7218x=0B_zO+DbOma+w@mail.gmail.com 审查人:Zhihong Yu https://git.postgresql.org/pg/commitdiff/3788c66788e9f8c6904c6fe903724c1f44812c4d

  • 清理执行器中的一些聚合代码。这里我们更改了调用 build_pertrans_for_aggref() 的代码,以便该函数不再需要特殊处理是处理 aggtransfn 还是 aggcombinefn。这允许我们重用 build_aggregate_transfn_expr() 函数,并完全删除 build_aggregate_combinefn_expr()。build_pertrans_for_aggref() 中的所有特殊情况代码都已移至调用函数。这在 nodeAgg.c 中节省了大约十几行代码,在 parse_agg.c 中节省了几十行代码。此外,重命名了 nodeAgg.c 中的一些变量,以使其更清楚我们正在处理 aggtransfn 还是 aggcombinefn。一些旧名称会让您以为我们一直在处理 aggtransfn。讨论:https://postgr.es/m/CAApHDvptMQ9FmF0D67zC_w88yVnoNVR2+kkOQGUrCmdxWxLULQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/63b1af94375cc2be06a5d6a932db24cd8e9f45e9

  • 文档:提及 VACUUM 不能使用超过 1GB 的 RAM。文档说明将 maintenance_work_mem 设置为超过 1GB 的值对 VACUUM 没有影响。报告人:Martín Marqués 作者:Laurenz Albe 讨论:https://postgr.es/m/CABeG9LsZ2ozUMcqtqWu_-GiFKB17ih3p8wBHXcpfnHqhCnsc7A%40mail.gmail.com 向后移植至:9.6,最旧支持的版本 https://git.postgresql.org/pg/commitdiff/ec34040af104a1d25233eccd5715863ace6cbb10

Heikki Linnakangas 推送了代码

Bruce Momjian 推送了代码

待处理的补丁

Anna Akenteva 提交了另一个修订版的补丁,用于在 CLUSTER/VACUUM FULL 期间写入可见性映射。

Julien Rouhaud 提交了另一个修订版的补丁,用于公开 get_query_def()。

Arne Roland 提交了另一个修订版的补丁,用于重命名分区表的触发器。

Peter Eisentraut 提交了一个补丁,用于删除冗余的初始化。

Andrew Dunstan 提交了一个补丁,用于清理 PostgresNode.pm。

Masahiko Sawada 提交了一个补丁,用于添加 ALTER SUBSCRIPTION SET SKIP TRANSACTION,向应用逻辑复制更改的错误添加 errcontext,并添加 pg_stat_logical_replication_error 统计信息视图。

Bharath Rupireddy、Amit Kapila 和 Álvaro Herrera 交换了补丁,以重构函数 parse_subscription_options。不要在 parse_subscription_options 函数签名中使用多个参数,而是使用封装了所有订阅选项及其值的结构 SubOpts。这对于未来我们需要在订阅中添加其他选项的工作很有用。此外,使用位图来传递受支持的选项并检索指定的选项。

Jeff Davis 提交了一个补丁,用于添加 synchronous_replication_interrupt GUC。

Daniel Gustafsson 提交了两个修订版的补丁,用于修复 pg_basebackup 和 pg_dump 中的 sscanf 限制,并通过取消阴影变量名来修复 TOC 文件错误消息打印中的错误。

Dean Rasheed 提交了三个修订版的补丁,旨在修复一个在 NUMERIC 的乘法中表现为溢出的错误。

Michaël Paquier 提交了另一个修订版的补丁,用于添加 wal_compression=zstd。

Magnus Hagander 提交了另外两个修订版的补丁,用于添加 PROXY 协议支持。

Peter Eisentraut 提交了另一个修订版的补丁,用于使 psql 显示多个结果集,而不是默默地丢弃除了第一个之外的所有结果集,并使过程可以返回动态结果集。

Ranier Vilela 提交了一个补丁,用于防止在 src/backend/executor/nodeAgg.c 中选择无效的分区数。

Aleksey Kondratov 提交了一个补丁,用于允许将 restore_command 作为命令行选项提供给 pg_rewind。

David Christensen 提交了一个补丁,用于扩展大小的可能单位,并重构 pg_size_pretty 和 pg_size_bytes 以允许支持的单位扩展。

Andrey V. Lepikhov 提交了一个补丁,用于向 pg_regress 添加“--ignore-errors”选项。

Jacob Champion 提交了另一个修订版的补丁,用于重新设计 sslfiles Makefile 目标。

Josef Šimánek 提交了两个修订版的补丁,用于防止 BRIN 索引更新阻止 HOT 更新。

Michaël Paquier 提交了另一个修订版的补丁,用于在校验和已设置的情况下加速 pg_checksums。

Anastasia Lubennikova 和 Yura Sokolov 交换了补丁,以通过新的挂钩 smgr_hook、smgr_init_hook 和 smgr_shutdown_hook 使 smgr API 可扩展。

John Naylor 和 Heikki Linnakangas 交换了补丁,以提高 pg_utf8_verifystr() 的速度。

Dean Rasheed 提交了一个补丁,用于使数值 x^y 对负数 x 起作用。

Georgios Kokolatos 提交了一个补丁,用于教 pg_receivewal 使用 lz4 压缩。

Dean Rasheed 提交了两个修订版的补丁,用于放宽数值刻度的约束,例如允许 NUMERIC(3,-3),它将值四舍五入到最接近的千位,并保留高达 999000 的值,或者允许 NUMERIC(3,6),它可以保留高达 0.000999 的“微”量。

Thomas Munro 和 John Naylor 交换了补丁,以加速常见类型的元组排序。

Masahiko Sawada 提交了另一个修订版的补丁,用于使涉及多个 PostgreSQL 外部服务器的事务成为可能。

Andrey V. Lepikhov 提交了一个补丁,用于在初始执行阶段选择异步追加子计划。

Takashi Menjo 提交了另一个修订版的补丁,用于将 PMEM 上的 WAL 段文件映射为 WAL 缓冲区。

Yugo Nagata 提交了另外两个修订版的补丁,用于修复 pgbench 中的 conn_duration。

Simon Riggs 提交了一个补丁,用于增强 PITR 中的 getRecordTimestamp(),以包含所有包含时间的记录类型,添加对检查点、恢复结束和准备好的 xact 记录类型的处理,并允许选项 recovery_target_use_origin_time = off (默认) | on。

Vigneshwaran C 提交了另一个修订版的补丁,用于确保错误消息包含冗余选项错误的提示消息。

Vigneshwaran C 提交了另一个修订版的补丁,用于在 CREATE/ALTER SUBSCRIPTION 期间识别发布者中缺少的发布。

Álvaro Herrera 提交了一个补丁,用于在 Perl 的 system() 失败时澄清错误消息。

Antonin Houska 提交了另一个修订版的补丁,用于使用撤消日志清理孤立文件。

Jacob Champion 提交了另一个修订版的补丁,用于从 SCRAM 代码中提取通用的 SASL 框架。

David Rowley 提交了一个补丁,用于记录未剪枝分区的一个 Bitmapset。

Fabien COELHO 提交了另外三个修订版的补丁,用于修复 pgbench 日志记录中的一个错误,该错误是由最近对时间逻辑的一些更改引起的。

David Christensen 和 Fabien COELHO 交换了补丁,用于向 pgbench 添加多连接选项。

Bharath Rupireddy 提交了另外两个修订版的补丁,用于针对 postgres_fdw 中的非数值值收紧 batch_size、fetch_size 选项。

Rahila Syed 提交了一个补丁,用于向逻辑复制添加列过滤。

Mark Dilger 提交了另外两个修订版的补丁,用于为管理逻辑复制、主机安全操作、网络安全操作和数据库操作添加默认角色,并允许非超级用户执行 SET 和 ALTER SYSTEM SET。

Yugo Nagata 提交了另一个修订版的补丁,旨在修复一个表现为 pgbench 序列化和死锁错误的错误。

Amit Langote 提交了一个补丁,用于显式跟踪关系的 RT 索引以检查权限。

Richard Guo 提交了另外两个修订版的补丁,用于将每个 rel 用作反连接的外部和内部。

Vigneshwaran C 提交了另一个修订版的补丁,用于为 PUBLICATION 添加模式级别支持。

Paul A Jungwirth 提交了另外三个修订版的补丁,用于实现 SQL 标准应用程序时间。

Gurjeet Singh 提交了一个补丁,用于添加顶级事务 ID 的自动通知。

David Rowley 提交了一个补丁,允许一些窗口函数提前完成执行。

Greg Smith 提交了一个补丁,用于改进 INSERT 工作负载、FK 索引和填充器领域中的一些 pgbench 工作负载。

Euler Taveira de Oliveira 提交了另一个修订版的补丁,用于添加与 SSL/TLS 相关的首字母缩写词 MITM 和 SNI,并将 SSL 的用法更改为更现代和通用的 SSL/TLS。

Kyotaro HORIGUCHI 提交了两个修订版的补丁,用于修复一个通过避免接触解析树结构并使用 ExecuteStmt.type 来通知返回的字符串是语句名称还是完整语句,从而导致 ECPG 将 CREATE AS EXECUTE 预编译为不可编译的 C 语句的错误。

Euler Taveira de Oliveira 和 Peter Smith 交换了补丁,用于为逻辑复制实现行过滤。

Ranier Vilela 提交了一个补丁,用于修复 src/backend/utils/mmgr/freepage.c 中未初始化的变量访问。

Fabien COELHO 提交了另外五个修订版的补丁,用于用更好的 PRNG 替换 rand48。

Haotian Wu 提交了另一个修订版的补丁,用于添加 --drop-cascade 选项 pg_dump/restore。

Pavel Stěhule 提交了另一个修订版的补丁,用于实现模式变量。

Hayato Kuroda 提交了另一个修订版的补丁,用于修复 ECPG 的 DECLARE STATEMENT、DEALLOCATE 和 DESCRIBE 中的错误。

Justin Pryzby 提交了另一个修订版的补丁,用于使 pg_ls_* 显示目录和共享文件集。

Fabien COELHO 提交了另一个修订版的补丁,用于分解 psql 的 echo 代码。

Vigneshwaran C 提交了一个补丁,通过为模式更改添加回调,确保逻辑复制关系在模式更改时获得所需的缓存失效。

Tom Lane 提交了另外两个修订版的补丁,用于避免在 conversion_error_calls 中访问目录。

Tom Lane 提交了另一个修订版的补丁,用于删除 64k 范围表限制。

Andy Fan 提交了一个补丁,用于为 RelOptInfo 添加非空属性。

Peter Eisentraut 提交了一个补丁,用于使用 EVP_EncryptFinal_ex() 和 EVP_DecryptFinal_ex() 以兼容 OpenSSL 3.0。

Gilles Darold 提交了另一个修订版的补丁,用于在 XactCommand 级别添加挂钩。

Zhihong Yu 提交了一个补丁,用于删除 check_safe_enum_use 中对正在进行事务的冗余检查。

石井達夫提交了另一个补丁修订版,以在 pgbench 中使用 COPY FREEZE。

David Rowley 提交了一个补丁,以更好地记录附加和删除分区时的锁定行为。