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

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/

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。

已应用补丁

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 的问题。测试表明,这是唯一会因使用 -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

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

  • 修复提交 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 的建议,使用一个 stamp 文件来控制何时运行检查,避免在“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 用 GUC 替换了 "#define CLOBBER_CACHE_ALWAYS" 测试机制,这在以更有效的方式进行缓存破坏测试方面提供了极大的帮助;但实现上存在一个不足。在 initdb 运行期间进行缓存破坏测试的唯一方法是使用旧的 #define 方法,因为无法从外部设置 GUC。通过向 initdb 添加一个用于此目的的开关来改进这一点。(也许有一天我们应该允许 initdb 传递任意的 "-c NAME=VALUE" 开关。引用方面的困难让我暂时放弃了尝试。)向 4656e3d66 引入的版本 14 回溯。讨论:https://postgr.es/m/1582507.1624227029@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b741f4c3ee67666aa333dbb25bd71906b3474def

  • 在 slot_store_error_callback() 中不要尝试打印数据类型名称。现有代码尝试在已失败的事务中进行 syscache 查找,这至少是有问题的。经过对替代方案的仔细考虑,最好的修复似乎是完全从错误消息中删除类型名称。表名和列名似乎足以进行本地化。如果用户不确定涉及的类型,她可以查看本地和远程表定义。完成此操作后,我们还可以丢弃 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

  • 进一步限制 no-exit()-in-libpq 测试的范围。完全禁用 --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" 语句就足够了。在这两个地方都只添加了 1 个项目,因此循环最多只能迭代一次。将循环更改为 if 语句使代码稍微更优化,因为条件只检查一次而不是两次。仍然有相当多的地方以以下形式增加缓冲区大小:while (reqsize >= buflen) { buflen *= 2; buf = repalloc(buf, buflen); } 这些在本次提交中未被触及。repalloc 会因大于 MaxAllocSize 的大小而报错。将这些更改为使用 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 提交了 Expose 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 提交了一个允许向 pg_rewind 提供 restore_command 作为命令行选项的补丁。

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

Andrey V. Lepikhov 提交了一个向 pg_regress 添加 '--ignore-errors' 选项的补丁。

Jacob Champion 提交了 rework 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 提交了一个使 numeric x^y 对负数 x 有效的补丁。

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

Dean Rasheed 提交了两个版本的补丁,放宽了对 numeric 标度的约束,例如允许 NUMERIC(3,-3),它会将值四舍五入到最近的千位并存储高达 999000 的值,或者 NUMERIC(3,6) 可以存储高达 0.000999 的“微量”值。

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

Masahiko Sawada 提交了一个使其能够进行涉及多个 postgres 外部服务器的事务的补丁的又一次修订。

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

Takashi Menjo 提交了一个将 WAL 段文件映射到 PMEM 作为 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 提交了将通用 SASL 框架从 SCRAM 代码中提取出来的又一次修订。

David Rowley 提交了一个记录非剪枝分区 Bitmapset 的补丁。

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

David Christensen 和 Fabien COELHO 交换了向 pgbench 添加 multiconnect 选项的补丁。

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

Rahila Syed 提交了一个为逻辑复制添加列过滤的补丁。

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

Yugo Nagata 提交了旨在修复 pgbench 序列化和死锁错误的补丁的又一次修订。

Amit Langote 提交了一个明确跟踪关系 RT 索引以检查权限的补丁。

Richard Guo 提交了另外两个版本的补丁,以便对反连接使用每个 rel 作为外连接和内连接。

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

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

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

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

Greg Smith 提交了一个改进 pgbench 工作负载的补丁,涉及 INSERT 工作负载、FK 索引和填充程序。

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 提交了五个修订的补丁,用于将 rand48 替换为更好的 PRNG。

Haotian Wu 提交了 pg_dump/restore 的 --drop-cascade 选项的又一次修订。

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 rangetable 限制。

Andy Fan 提交了一个为 RelOptInfo 添加 not null attrs 的补丁。

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

Gilles Darold 提交了在 XactCommand 级别添加钩子的又一次修订。

Zhihong Yu 提交了一个移除 check_safe_enum_use 中事务进行中的冗余检查的补丁。

Tatsuo Ishii 提交了一个在 pgbench 中使用 COPY FREEZE 的补丁的又一次修订。

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