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

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

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

本周人物

七月份的 PostgreSQL 职位

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

PostgreSQL 新闻

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

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

请在太平洋标准时间/太平洋夏令时间周日下午 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 引入的用于增强 Windows 上大于 4GB 文件大小的 stat() 实现的代码无法正确检测到待删除的文件,其基于 NtQueryInformationFile() 或 GetFileInformationByHandleEx() 的方法证明了这一点,Alexander Lakhin 在他自己的自定义 TAP 测试中证明了这一点。open() 的实现中使用的在 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,向后移植:14 https://git.postgresql.org/pg/commitdiff/54fb8c7ddf152629021cab3ac3596354217b7d81

  • 还原“修复 Windows 上待删除文件的 stat() 问题”。此操作会还原提交 54fb8c7,因为 fairywren 在 MinGW 上报告的问题,原因是那里缺少 microsoft_native_stat()。仅使用 stat() 进行 MSVC 操作不足以解决待删除文件的并发问题。可能可以在代码中绘制一些 MINGW64 以在此构建上下文中切换到 stat() 的不同实现,但我也不确定是否依赖 MinGW 中 stat() 的实现来解决我们试图修复的问题是否足够。因此,这需要更多研究。讨论:https://postgr.es/m/YOvOlfRrIO0yGtgw@paquier.xyz,向后移植: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 中不必要的断言。一个代码路径断言归档器已死,但检查使得这种情况不可能发生。作者:Bharath Rupireddy,讨论:https://postgr.es/m/CALj2ACW=CYE1ars+2XyPTEPq0wQvru4c0dPZ=Nrn3EqNBkksvQ@mail.gmail.com,向后移植:14 https://git.postgresql.org/pg/commitdiff/dc2db1eac365b97c9129393acfe11102859f9e23

  • 为 pg_receivewal 的 ZLIB 压缩添加 TAP 测试。在 pg_receivewal 中有大量的代码处理 ZLIB 压缩,从格式名称等基本内容,到起始流位置的计算以及当然是压缩本身,但没有自动覆盖。此提交引入了一组条件测试(如果构建支持 ZLIB)以涵盖 ZLIB 压缩的 WAL 段的创建、部分压缩的 WAL 段的处理以及压缩操作本身。请注意,还有一个额外的阶段检查生成文件的有效性,方法是直接使用 gzip 命令,该命令由 pg_receivewal 的 Makefile 传递。如果找不到该命令,则会跳过此部分,这很可能会在 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 的测试。正如构建场成员 bowerbird 报告的那样,这些测试在 Windows 上不稳定。那里产生的失败指向 gzflush() 的问题,该问题无法同步新打开的文件,并且无法正确打开 gzFile。当我自己使用 MSVC 测试时,我遇到了一个不同的错误,其中一个文件根本无法打开,因此这让我非常怀疑在 Windows 上测试此区域是否是一个好主意,如果它以随机并发失败结束。这需要更多调查,并且长期保持此构建场成员为红色不是一件好事,因此目前仅在 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 推送

  • 为内置逻辑复制添加对预备事务的支持。为了在准备时为流式传输事务添加到内置逻辑复制中,我们需要执行以下操作:* 修改输出插件 (pgoutput) 以通过利用扩展的复制协议来实现新的两阶段 API 回调。* 修改复制应用工作器,以通过在准备时重放它们来正确处理两阶段事务。* 添加新的 SUBSCRIPTION 选项 “two_phase”,以允许用户启用两阶段事务。一旦初始数据同步结束,我们就启用 two_phase。但是,即使插件支持,我们也必须在复制槽创建期间显式禁用两阶段事务的复制。我们不需要复制在此阶段累积的更改,而且,我们没有打开复制连接,所以我们也不知道将数据发送到哪里。此新的 two_phase 选项不允许使用流式传输选项。这可以作为单独的补丁完成。我们不允许切换订阅的 two_phase 选项,因为它会导致不一致的副本。出于同样的原因,除非 copy_data 选项为 false,否则我们不允许在为订阅启用 two_phase 后刷新发布。作者: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 发送了另一个补丁修订版,以加快在事务中访问多个关系后事务的完成速度。

侯志杰发送了另一个补丁修订版,使在写入事物中使用并行操作成为可能。

Rahila Syed 发送了另外两个补丁修订版,以使按列过滤逻辑复制成为可能。

Álvaro Herrera 发送了一个旨在修复一个错误的补丁,该错误表现为插入分区时未更新分区检查。

Jeevan Ladhe 发送了两个补丁修订版,以在错误消息中指定 pg_upgrade 中哪个数据库出现错误。

Magnus Hagander 发送了另一个补丁修订版,以添加对 PROXY 协议的支持。

Bharath Rupireddy 发送了一个补丁,用于对 {pre, post}_auth_delay 使用 WaitLatch 而不是 pg_usleep。

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 后面对具有不同 DB 校对的表进行合并联接失败。

Peter Smith 和 Euler Taveira de Oliveira 交易补丁,以添加用于逻辑复制的行过滤。

Ian Barwick 发送了一个补丁,用于记录 pg_encoding_to_char() 和 pg_char_to_encoding()。

Fabien COELHO 发送了另一个补丁修订版,将 psql 的 echo 代码分解出来。

Heikki Linnakangas 发送了另一个补丁修订版,以重构 LogicalTapeSet/LogicalTape 接口,使其不再需要预先知道将创建多少个磁带,并将多相合并算法替换为简单的平衡 k 路合并。

Heikki Linnakangas 发送了另一个补丁修订版,以移动一些 ResourceOwnerEnlarge() 调用以提高安全性和清晰度,使资源所有者更容易扩展,并优化在其中使用的哈希函数。

Daniil Zakhlystov 发送了另一个补丁修订版,以常规方式添加 zlib 和 zstd 流式压缩,然后使用此基础结构将它们添加到 libpq。

Zhihong Yu 发送了两个补丁修订版,以 pfree() 一个 palloc() 的字符串。

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

Kyotaro HORIGUCHI 发送了另一个补丁修订版,以严格检查命令行、环境变量中的数字参数,并记录这些更改对 PGCTLTIMEOUT 的影响。

侯志杰发送了一个补丁,以避免在 pg_dump 中重复调用 PQfnumber。

Gilles Darold 发送了另外两个补丁修订版,以允许通过 xact 注册的回调在任何命令开始时执行用户定义的代码。

Peter Smith 发送了另一个补丁修订版,以添加对流事务的准备 API 支持。

Huailing Liu 发送了一个补丁,以删除一个令人困惑的 SI 无效。

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 引用目标进程,避免扫描 ProcArray 并跟踪启动进程,从而使 ProcSendSignal() 更加高效。

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

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

Peter Smith 提交了一个补丁,以防止使用 strcpy 到 gid 缓冲区时可能发生的缓冲区溢出。

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