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

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

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

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

本周人物

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 提交

  • pageinspect: 改进 32kB 页的 page_header()。ld_upper、ld_lower、pd_special 和页面大小已使用 smallint 作为返回类型,在某些情况下,对于配置为 32kB 页面大小的构建,这可能导致这些字段返回负值。将 pageinspect 提升至 1.10。当使用较旧版本的扩展时,page_header() 能够处理这些字段的正确返回类型,并添加了一些测试来覆盖这种情况。作者:Quan Zongliang 审阅者:Michael Paquier, Bharath Rupireddy 讨论:https://postgr.es/m/8b8ec36e-61fe-14f9-005d-07bc85aa4eed@yeah.net https://git.postgresql.org/pg/commitdiff/127404fbe28455d6e8183fa58f3b7aefeba8f909

  • 修复 Windows stat() 在处理待删除文件时的问题。bed9075 引入的代码通过 NtQueryInformationFile() 或 GetFileInformationByHandleEx() 来增强 Windows 上大于 4GB 文件大小的 stat() 实现,但未能正确检测待删除的文件,Alexander Lakhin 在其自定义 TAP 测试中证明了这一点。open() 实现中使用的通过 sleep 和循环来处理 ERROR_ACCESS_DENIED (EACCES) 失败的方法显示出更强的稳定性,因此切换到该方法。如果权限问题持续时间超过 1 秒的超时时间,仍可能导致问题,但这(希望)在性能关键路径中永远不会发生。尽管如此,为了提高处理重载机器的性能,增加超时时间可能是个好主意。请注意,WIN32 的 open() 现在使用 microsoft_native_stat(),因为它在处理并发文件删除问题时应与 stat() 类似。我花了一些时间使用 pgbench 结合 genfile.c 中的 SQL 函数进行测试,并运行了该主题中提供的 MSVC 构建的 TAP 测试,这看起来比以前的方法稳定得多。作者:Alexander Lakhin 审阅者:Tom Lane, Michael Paquier, Justin Pryzby 讨论:https://postgr.es/m/c3427edf-d7c0-ff57-90f6-b5de3bb62709@gmail.com Backpatch-through:14 https://git.postgresql.org/pg/commitdiff/54fb8c7ddf152629021cab3ac3596354217b7d81

  • 撤销“修复 Windows stat() 在处理待删除文件时的问题”。此提交撤销了 commit 54fb8c7,因为 fairywren 报告了 MinGW 中由于缺少 microsoft_native_stat() 而出现的问题。仅对 MSVC 使用 stat() 不足以处理与待删除文件并发的问题。可能可以在代码中添加一些 MINGW64 标记来在此构建上下文中切换到不同的 stat() 实现,但我也不确定 MinGW 中 stat() 的实现是否足以解决我们试图解决的问题。因此,这需要进一步研究。讨论:https://postgr.es/m/YOvOlfRrIO0yGtgw@paquier.xyz Backpatch-through:14 https://git.postgresql.org/pg/commitdiff/2c9b46c090e76c62f24563b9be2c34e6b92e9329

  • 正确安装 fe-auth-sasl.h。前端 SASL 回调的内部实现位于 libpq-int.h 中,但该头文件未被安装。这会导致应用程序使用 libpq 内部功能时编译失败。此问题由 9fd8557 引入。作者:Mikhail Kulagin 审阅者:Jacob Champion 讨论:https://postgr.es/m/05ce01d777cb$40f31d60$c2d95820$@postgrespro.ru https://git.postgresql.org/pg/commitdiff/6c9c2831668345122fd0f92280b30f3bbe2dd4e6

  • 移除 postmaster.c 中不必要的断言。一个代码路径断言 archiver 已死,但一个检查使得这种情况不可能发生。作者:Bharath Rupireddy 讨论:https://postgr.es/m/CALj2ACW=CYE1ars+2XyPTEPq0wQvru4c0dPZ=Nrn3EqNBkksvQ@mail.gmail.com Backpatch-throgh:14 https://git.postgresql.org/pg/commitdiff/dc2db1eac365b97c9129393acfe11102859f9e23

  • 为 pg_receivewal 的 ZLIB 压缩添加 TAP 测试。pg_receivewal 中处理 ZLIB 压缩的代码量不小,从基本功能(如格式名称、起始流位置的计算)到压缩本身,但之前没有自动覆盖。此提交引入了一组条件测试(如果构建支持 ZLIB),以覆盖 ZLIB 压缩 WAL 段的创建、部分压缩 WAL 段的处理以及压缩操作本身。请注意,还有一个额外的阶段,通过直接使用 Makefile 传递给 pg_receivewal 的 gzip 命令来检查生成文件的有效性。如果找不到该命令,则会跳过此部分,在 Windows 上使用 MSVC 时很可能发生这种情况,除非在测试的环境变量中设置 GZIP_PROGRAM。这一系列测试将有助于即将进行的补丁,这些补丁将为 pg_receivewal 使用的压缩方法(如 LZ4)添加更多选项,以确保现有功能不会被破坏。作者:Georgios Kokolatos 审阅者:Gilles Darold, Michael Paquier 讨论:https://postgr.es/m/07BK3Mk5aEOsTwGaY77qBVyf9GjoEzn8TMgHLyPGfEFPIpTEmoQuP2P4c7teesjSg-LPeUafsp1flnPeQYINMSMB_UpggJDoduB5EDYBqaQ=@protonmail.com https://git.postgresql.org/pg/commitdiff/ffc9ddaea33f6dfd3dfa95828a0970fbb617bf8a

  • 修复 pg_receivewal 的 TAP 测试中 gzip 的可移植性问题。OpenBSD 的 gzip 实现只将后缀为“Z”、“gz”、“z”、“tgz”或“taz”的文件视为有效目标,忽略其他任何内容,当命令使用 --test 时,如果发现任何无效文件,将以错误代码 512 退出。ffc9dda 中引入的测试检查了一个后缀为 .gz.partial 的 WAL 段,这足以导致测试失败。仅测试完整段在覆盖范围内已经足够,因此通过在此检查中丢弃 .gz.partial 段来简化代码。这应该足以使测试在 OpenBSD 环境中通过。根据 curculio 的报告。讨论:https://postgr.es/m/YPAdf9r5aJbDoHoq@paquier.xyz https://git.postgresql.org/pg/commitdiff/0da3c1bc3f7261d5157f5b86ade88e8b379f8686

  • 在 Windows 上禁用 pg_receivewal 的 ZLIB 测试。正如 buildfarm 成员 bowerbird 报告的那样,这些测试在 Windows 上不稳定。那里出现的失败指向 gzflush() 的问题,它未能同步一个新打开的文件,即使 gzFile 已正确打开。在我使用 MSVC 测试时,我遇到了另一个错误,即文件根本无法打开,这让我对在 Windows 上测试此区域是否是一个好主意持怀疑态度,因为这可能会导致随机的并发失败。这需要进一步调查,而长期让这个 buildfarm 成员持续红色状态并不是一件好事,因此目前仅禁用在 Windows 上的这组测试。讨论:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz https://git.postgresql.org/pg/commitdiff/6cea447e6a10cd7ef511470e809a894a013e6a18

Heikki Linnakangas 提交

Peter Eisentraut 提交

Tom Lane 提交

Thomas Munro 推送

David Rowley 提交

Amit Kapila 提交

  • 为内置逻辑复制添加对预提交事务的支持。为了在 prepare 阶段支持流式传输事务到内置逻辑复制,我们需要做以下事情:* 修改输出插件 (pgoutput) 来实现新的两阶段 API 回调,利用扩展复制协议。* 修改复制应用工作进程,通过在 prepare 时重放来正确处理两阶段事务。* 添加一个新的 SUBSCRIPTION 选项“two_phase”以允许用户启用两阶段事务。我们在初始数据同步完成后启用 two_phase。然而,我们必须在复制槽创建期间显式禁用两阶段事务的复制,即使插件支持它。我们不需要复制此阶段累积的更改,而且,我们没有打开复制连接,因此也不知道数据要发送到哪里。流式传输选项不允许与这个新的 two_phase 选项一起使用。这可以作为单独的补丁来完成。我们不允许切换订阅的 two_phase 选项,因为这可能导致副本不一致。出于同样的原因,我们不允许在订阅启用 two_phase 后刷新发布,除非 copy_data 选项为 false。作者:Peter Smith、Ajin Cherian 和 Amit Kapila,基于 Nikhil Sontakke 和 Stas Kelvich 的先前工作 审阅者:Amit Kapila, Sawada Masahiko, Vignesh C, Dilip Kumar, Takamichi Osumi, Greg Nancarrow 测试者:Haiying Tang 讨论:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru 讨论:https://postgr.es/m/CAA4eK1+opiV4aFTmWWUF9h_32=HfPOW9vZASHarT0UA5oBrtGw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a8fd13cab0ba815e9925dc9676e6309f699b5f72

Magnus Hagander 已推送

John Naylor 提交了

Dean Rasheed 已推送

Alexander Korotkov 提交了

Daniel Gustafsson 提交

Álvaro Herrera 提交

待处理补丁

David Rowley 发送了补丁的另一版修订,用于在添加到 RelOptInfo 结构中的 Bitmapset 中跟踪未修剪的分区,并在更多情况下允许有序分区扫描。

Hayato Kuroda 发送了补丁的另一版修订,用于修复 ECPG 中的 DEALLOCATE 和 DESCRIBE。

David Rowley 提交了另一个补丁修订版,旨在提高事务中访问大量关系后事务完成的速度。

Hou Zhijie 提交了另一个补丁修订版,使在写入操作中使用并行操作成为可能。

Rahila Syed 提交了两个补丁修订版,使通过列过滤逻辑复制成为可能。

Álvaro Herrera 提交了一个补丁,旨在修复一个错误,该错误表现为在向分区插入数据时分区检查未更新。

Jeevan Ladhe 提交了两个补丁修订版,用于在错误消息中指定 `pg_upgrade` 中哪些数据库存在错误。

Magnus Hagander 提交了另一个补丁修订版,增加了对 PROXY 协议的支持。

Bharath Rupireddy 提交了一个补丁,将 `{pre, post}_auth_delay` 中的 `pg_usleep` 替换为 `WaitLatch`。

Vigneshwaran C 提交了三个补丁修订版,为 PUBLICATION 增加了模式级别的粒度。

John Naylor 提交了四个补丁修订版,用于加快 UTF-8 验证的速度。

David Rowley 提交了四个补丁修订版,为 `ORDER BY / DISTINCT` 聚合函数增加了适当的规划器支持。

Ronan Dunklau、David Rowley 和 Ranier Vilela 交换了补丁,在 ExecSort 中使用优化的单数据元组排序。

Masahiro Ikeda 提交了两个补丁修订版,用于修复 `heap_prune_chain()` 中一些错误的注释。

Alexander Lakhin 提交了另一个补丁修订版,旨在修复一个错误,该错误表现为在 Win32 上花费更多时间进行“删除挂起”操作。

Tom Lane 提交了另一个补丁修订版,用于减少挂起失效消息的内存消耗。

Peter Smith 提交了一个补丁,以避免不必要的 `PGserverVersion` 调用。

Craig Ringer 提交了一个补丁,用于让 `pgflex.pl` 和 `pgbision.pl` 从 `buildenv.pl` 读取工具名称,并支持 `config.pl` 中的额外预处理器定义。

Maxim Orlov 提交了另一个补丁修订版,用于修复并行工作进程断言失败和核心转储问题。

Tom Lane 提交了另一个补丁修订版,旨在修复一个错误,该错误表现为在具有不同数据库排序规则的表上使用 `postgres_fdw` 进行的合并连接失败。

Peter Smith 和 Euler Taveira de Oliveira 交换了补丁,为逻辑复制增加了行过滤。

Ian Barwick 提交了一个补丁,用于记录 `pg_encoding_to_char()` 和 `pg_char_to_encoding()`。

Fabien COELHO 提交了另一个 `psql` 补丁修订版,用于将回显代码分离出来。

Heikki Linnakangas 提交了另一个补丁修订版,用于重构 `LogicalTapeSet/LogicalTape` 接口,使其不再需要预先知道要创建的磁带数量,并用简单的平衡 k 路合并算法替换了多相合并算法。

Heikki Linnakangas 提交了另一个补丁修订版,用于为了安全性和清晰性将几个 `ResourceOwnerEnlarge()` 调用移位,使 `resowners` 更易于扩展,并优化了其中使用的哈希函数。

Daniil Zakhlystov 提交了另一个补丁修订版,用于普遍添加 zlib 和 zstd 流式压缩,然后使用此基础设施将其添加到 libpq。

Zhihong Yu 提交了两个补丁修订版,用于 `pfree()` 一个 `palloc()`ed 字符串。

Ajin Cherian 发送了另一个修订版的补丁,用于跳过逻辑复制的空事务。

Kyotaro HORIGUCHI 提交了另一个补丁修订版,用于在命令行和环境变量中严格检查数值参数,并记录这些更改对 PGCTLTIMEOUT 的影响。

Hou Zhijie 提交了一个补丁,用于避免在 `pg_dump` 中重复调用 `PQfnumber`。

Gilles Darold 提交了两个补丁修订版,允许通过注册的事务回调在任何命令开始时执行用户定义的代码。

Peter Smith 提交了另一个补丁修订版,为流式事务增加了准备 API 支持。

Huailing Liu 提交了一个补丁,用于移除一个令人困惑的 SI 无效(SI inval)。

Kyotaro HORIGUCHI 提交了另一个补丁修订版,用于从 `XLogReadRecord` 中移除 `read_page` 回调。

Heikki Linnakangas 提交了另一个补丁修订版,为 GIN 增加了 `amcheck`。

enis Hirn 提交了另一个补丁修订版,允许在公共表表达式中存在多个线性递归自引用。

Haiying Tang 提交了一个补丁,用于收紧 `psql` 标签补全功能的帮助输出。

Vigneshwaran C 发送了另一个版本的补丁,用于在 CREATE/ALTER SUBSCRIPTION 时识别发布者中缺少的发布。

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

Andrey V. Lepikhov 提交了另一个补丁修订版,用于教优化器考虑非分区表与分区表每个分区的分区连接,并禁止连接两个分区(或附加)关系的不对称机制,因为这可能导致在 `NestLoop` 路径的重新参数化期间大量消耗 CPU 和内存。

Bharath Rupireddy 提交了另一个补丁修订版,用于区分使用“非负”的错误消息。

Magnus Hagander 提交了一个补丁,用于用其 git 修订版标记 tarball。

Andrey V. Lepikhov 提交了另一个补丁修订版,用于移除关系与其自身的内部连接,如果可以证明该连接可以用扫描替换。

Ryohei Takahashi 提交了两个补丁修订版,用于加快 `COMMIT PREPARED` 的速度。

Mark Dilger 提交了一个补丁,用于停止忽略文件关闭时的失败。

Justin Pryzby 提交了两个补丁修订版,增加了新的元命令 `\dn+` 以显示每个模式的大小,以及 `\dA+` 用于显示 AM。

Aleksander Alekseev 提交了另一个补丁修订版,用于重构 `procarray`。

Yugo Nagata 提交了另一个补丁修订版,用于修复表现为 `pgbench` 错误和串行化/死锁重试的错误。

Justin Pryzby 提交了另一个补丁修订版,用于支持 `ALTER TABLE ... ACCESS METHOD` 并允许指定分区表的访问方法继承给分区。

Dilip Kumar 在 `src/backend/replication/basebackup_gzip.c` 中添加了一个缺失的 `bbsink_forward_end_archive(sink)`。

Kyotaro HORIGUCHI 提交了一个补丁,用于修复字符映射表中的许多重复拼写错误。

Bertrand Drouvot 提交了另一个补丁修订版,用于在备用服务器上实现最小逻辑解码。

Li Japin 和 Amit Kapila 交换了补丁,以禁止将复制槽名称设置为空字符串。

Ranier Vilela 提交了一个补丁,用于取消一些变量的阴影,并减少现代编译器的一些 `-Wsign-compare` 警告。

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

James Coleman 提交了另一个补丁修订版,允许对带有 `LIMIT/OFFSET` 的并行 `LATERAL` 子查询。

Dinesh Chemuduru 提交了一个补丁,为 PL/pgsql 增加了新的诊断信息 `PG_PARSE_SQL_STATEMENT` 和 `PG_PARSE_SQL_STATEMENT_POSITION`。

Andrew Dunstan 提交了三个补丁修订版,用于清理 `PostgresNode.pm`。

Álvaro Herrera 和 Ranier Vilela 交换了补丁,用于从 `slot.c` 中移除一个无用的 `strlen`。

Kyotaro HORIGUCHI 提交了两个补丁修订版,用于使 `FPI_FOR_HINT` 遵循标准的 `FPI` 发射策略。

Yugo Nagata 提交了一个补丁,旨在修复一个错误,该错误表现为在脚本开始时准备命令,而不是在命令首次执行时。

Soumyadeep Chakraborty 提交了另一个补丁修订版,用于通过引用 `pgprocno` 中的目标进程来提高 `ProcSendSignal()` 的效率,以避免扫描 `ProcArray` 并跟踪启动进程。

Yugo Nagata 和 Ranier Vilela 交换了补丁,旨在修复一个错误,该错误表现为 WAL 页头损坏从未报告。

Atsushi Torikoshi 提交了一个补丁,用于记录执行 `pg_import_system_collations()` 需要超级用户权限。

Peter Smith 提交了一个补丁,用于在将 `strcpy` 用于 `gid` 缓冲区时防止潜在的缓冲区溢出。

Atsushi Torikoshi 提交了另一个修订版的补丁,添加了一个函数,用于记录具有指定进程 ID 的后端当前运行的查询的完整查询字符串及其计划。