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

PostgreSQL 周刊 - 2021 年 4 月 25 日

发布于 2021-04-26,作者:PWN
PWN

PostgreSQL 周刊 - 2021 年 4 月 25 日

本周人物:https://postgresql.life/post/pavlo_golub/

PostgreSQL 产品新闻

JDBC 42.2.20 发布 https://jdbc.postgresql.ac.cn/documentation/changelog.html#version_42.2.20

kubgres 1.1 发布,这是一个 Kubernetes 操作符,可以部署一个具有复制和故障转移配置的 PostgreSQL pod 集群。https://github.com/reactive-tech/kubegres/releases/tag/v1.1

pspg 4.6.1 发布,一个专为 PostgreSQL 设计的分页器。https://github.com/okbob/pspg/releases/tag/4.6.1

pgAdmin4 5.2 发布,一个用于 PostgreSQL 的 Web 和原生 GUI 控制中心。https://www.pgadmin.org/docs/pgadmin4/5.2/release_notes_5_2.html

pg_log_statements 0.2 发布,一个可以记录特定服务器进程语句的扩展。https://github.com/pierreforstmann/pg_log_statements/releases

四月 PostgreSQL 工作机会

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

Thomas Munro 推送

Michaël Paquier 提交

Amit Kapila 提交

Peter Eisentraut 提交

Peter Geoghegan 提交

  • 记录 VACUUM 中 LP_DEAD 的会计问题。记录 VACUUM 的软假设,即在修剪期间遇到的任何 LP_DEAD 项将在 VACUUM 完成之前成为 LP_UNUSED 项。这对于 VACUUM 生成的关于表给统计信息收集器的最终报告的会计核算是至关重要的。它还影响 VACUUM 如何确定哪些堆页可以被截断。在这两种情况下,VACUUM 都关心页面在不久的将来的可能内容,而不是页面的当前内容。这种情况导致了 VACUUM 的死元组会计核算与 ANALYZE 在类似会计核算方面存在重大差异的误解。至少在软假设完全起作用的情况下,它们之间没有实质性差异。现在这更加清楚了。还记录了 VACUUM 的死元组会计核算不能完全正常工作的情况。VACUUM 可能会留下大量 LP_DEAD 项,并且这些项不会在 VACUUM 的统计信息收集器报告中被记录为剩余的死元组。这种行为可以追溯到提交 a96c41fe,该提交允许 VACUUM 在用户请求时不进行索引和堆真空。最近提交 1e55e7d1 为 VACUUM 添加的故障安全机制在死元组会计核算方面采用了相同的方法。报告者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAH2-Wz=Jmtu18PrsYq3EvvZJGOmZqSO2u3bvKpx9xJa5uhNp=Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/7136bf34f28892362144ae2e350714836a5c0c0c

  • amcheck:MAXALIGN() nbtree 特殊区域偏移。这并非绝对必要,但理论上,如果将来 nbtree 特殊区域的宽度发生变化,它可能会很重要——即使有填充,其总大小也可能不是 MAXALIGN() 量子的偶数倍。PageInit() 对所有特殊区域偏移执行 MAXALIGN(),但 amcheck 使用偏移来执行行指针的初始基本验证,因此我们不依赖于页面头部的偏移。这样做的真正原因是为了给添加其他索引 AM 的 amcheck 覆盖的新代码树立一个好榜样。报告者:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 讨论:https://postgr.es/m/CALj2ACUMqTR9nErh99FbOBmzCXE9=gXNqhBiwYOhejJJS1LXqQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bb3ecc8c961896ecb2ad3d5ba705c2877b933945

Magnus Hagander 已推送

Andrew Dunstan 推送

Tom Lane 提交

Bruce Momjian 已推送

Álvaro Herrera 提交

  • 分离分区时不要添加冗余约束。在 ALTER TABLE .. DETACH CONCURRENTLY 上,我们添加了一个新的表约束,它复制了分区约束。但是,如果分区已经有另一个暗示该约束的约束,那么这是不必要的。我们已经避免添加重复约束,如果存在完全“相等”的匹配——这只是提高了检查的质量。作者:Justin Pryzby pryzby@telsasoft.com 审阅者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20210410184226.GY6592@telsasoft.com https://git.postgresql.org/pg/commitdiff/7b357cc6ae553c0ecacdc11b2e5278b7bf477dba

  • 添加关于 extract_autovac_opts 不持有锁的注释。根据 Tom Lane 的观察。讨论:https://postgr.es/m/1901125.1617904665@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7c298c6573a0f181963ddcb40c850fa9c7da0ada

  • 修复分区分离中的 relcache 不一致危险。在来自 ri_triggers.c 的查询期间,我们需要省略标记为待分离的分区——否则,RI 查询会被欺骗,允许一条行进入引用表,而其对应的行位于已分离的分区中。这是错误的:一旦分离操作完成,行就成为孤立行。然而,在可重复读事务中,代码没有这样做,因为 relcache 保留了分区描述符的副本,其中包含该分区,并在 RI 查询中使用它。此提交更改了 partdesc 缓存代码,使其仅保留不依赖于快照的描述符(即:不存在已分离分区,或者已包含已分离分区)。当请求 partdesc-without- detached-partitions 时,我们每次都重新创建一个;此外,这些 partdesc 存储在 PortalContext 中而不是 CacheMemoryContext 中。find_inheritance_children 获得了一个新的输出 `*detached_exist` 布尔值,指示是否找到任何标记为待分离的分区。其“include_detached”输入标志被更改为“omit_detached”,因为该名称更自然地捕捉了所需的语义。CreatePartitionDirectory() 和 RelationGetPartitionDesc() 的参数被重命名为相同。这是因为一个运行 relcache 清理的 buildfarm 成员(它不会保留不正确缓存的 partdesc)破坏了一个测试,这让我们意识到该测试的预期输出是错误的。此提交还纠正了该预期输出。作者:Amit Langote amitlangote09@gmail.com 作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/3269784.1617215412@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/8aba9322511f718f12b618470d8c07f0ee5f0700

  • 修复未初始化内存 bug。让 find_inheritance_children 的相关调用者在调用它之前将其 detached_exist 值设置为 false,以便该例程仅在罕见情况下设置为 true。否则不触摸它。根据 buildfarm 成员 thorntail(报告了此处发生 UBSan 故障)。https://git.postgresql.org/pg/commitdiff/43b55ec4bc3bc06596d966391f16defe016310ec

Etsuro Fujita 推送

Fujii Masao 提交

  • 文档:修复关于 pg_basebackup 的过时描述。以前的文档指出,如果使用“-X none”选项,当从 standby 备份时,不能保证所有必需的 WAL 文件在 pg_basebackup 结束时都被存档。但此限制已由提交 52f8a59dd9 移除。现在,即使从 standby 备份,pg_basebackup 也可以等待所有必需的 WAL 文件被存档。因此,此提交从文档中删除了这种过时的描述。此提交还向文档添加了关于从 standby 备份时限制的新描述。限制是 pg_basebackup 不能强制 standby 在备份结束时切换到新的 WAL 文件,这可能导致 pg_basebackup 等待很长时间来切换和存档最后一个必需的 WAL 文件,特别是在主服务器写入活动较低的情况下。回填到引入问题的 v10。报告者:Kyotaro Horiguchi 作者:Kyotaro Horiguchi, Fujii Masao 审阅者:Kyotaro Horiguchi, Fujii Masao 讨论:https://postgr.es/m/20210420.133235.1342729068750553399.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/eaec48b3c54eec222d64468b57af80ee4ddf76a9

  • 将 gram.y 和 parsenodes.h 中的 COMPRESSION 选项重新按字母顺序排列。提交 bbe0a81db6 在 CREATE TABLE 命令中引入了“INCLUDING COMPRESSION”选项,但之前 TableLikeOption 在 gram.y 和 parsenodes.h 中没有将其与其余选项按字母顺序分类。作者:Fujii Masao 审阅者:Michael Paquier 讨论:https://postgr.es/m/YHerAixOhfR1ryXa@paquier.xyz https://git.postgresql.org/pg/commitdiff/3f20d5f37086e548c32ddb9d6ae09c2e1ce300ce

Alexander Korotkov 提交了

Noah Misch 推送

待处理补丁

Peter Smith 发送了一个补丁,重新排列了 CREATE SUBSCRIPTION 的选项列表。

Bharath Rupireddy 发送了另一个修订版的补丁,用于为多插入和单插入添加新的表 AM,并将其用于 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。

Amul Sul 发送了另外两个修订版的补丁,用于从 transformCreateStmt 中删除一个冗余变量。

Pavel Stěhule 发送了另一个修订版的补丁,使 auto_explain 能够记录 seqscans。

David Rowley 发送了另一个修订版的补丁,以减少 Windows 上 contrib 构建的特殊情况。

Amul Sul 发送了另外两个修订版的补丁,为 RelationGetSmgr 添加了一个内联函数。

Masahiko Sawada 发送了另外两个修订版的补丁,用于在插入冻结元组时跳过 vmbuffer。

Dagfinn Ilmari Mannsåker 发送了一个补丁,用于创建一个函数来从表达式中剥离 RelabelType 节点,将许多重复的模式合并为一个。

Masahiko Sawada 和 Amit Kapila 交换了补丁,为复制槽统计信息使用 HTAB。

Vigneshwaran C 和 Amit Kapila 交换了补丁,以在释放复制槽时更新解码统计信息。

Bharath Rupireddy 发送了一个补丁,在 lazy_truncate_heap、do_pg_stop_backup 中使用 WaitLatches 进行锁等待,而不是 pg_usleep(),以及用于预认证和后认证延迟。

Bharath Rupireddy 发送了一个补丁,将 parallel_leader_participation GUC 移至资源消耗类别。

Peter Smith 发送了另外两个修订版的补丁,为内置逻辑复制添加了对预备事务的支持,并为流式事务添加了 prepare API 支持。

Dan Carter 发送了一个补丁,为 libpq 添加了一个 GSSAPI ccache_name 选项。

Takamichi Osumi 和 Amit Kapila 交换了补丁,以修复 TRUNCATE 和同步逻辑复制之间的不一致。

Amit Langote 发送了一个补丁,以修复 pgoutput 插件中的 tupdesc 泄漏。

Bharath Rupireddy 发送了一个补丁,用于跳过重复关系的 VACUUM/ANALYZE。

Pavel Stěhule 发送了另一个修订版的补丁,为 psql 添加了一个 PSQL_WATCH_PAGER 设置。

Masahiro Ikeda 发送了另一个修订版的补丁,在不引入新变量的情况下对报告 WAL 统计信息进行了一些性能改进。

Fujii Masao 发送了四个修订版的补丁,以记录 TRUNCATE 在外表上的工作方式,并确保原始查询中的任何 ONLY 子句不被传递给它。

Hou Zhijie 发送了一个补丁,用于修复一个具有错误并行安全标志的测试用例。

Zeng Wenjing 发送了另一个版本的补丁,用于实现全局临时表。

Simon Riggs 发送了一个补丁,以记录验证约束需要 SHARE UPDATE EXCLUSIVE 锁这一事实。

Simon Riggs 发送了一个补丁,以降低 CHECK 约束在允许其为 NOT VALID 时的锁级别。

Daniil Zakhlystov 发送了另一个修订版的补丁,添加了 zlib 和 zstd 流式压缩,并实现了 libpq 压缩。

Tom Lane 发送了一个补丁,以更好地记录儒略历。

Álvaro Herrera 发送了一个补丁,为 psql 的 ALTER TABLE .. DETACH PARTITION CONCURRENTLY 添加了标签补全。

Tom Stellard 发送了一个补丁,使 jit 能够处理 s390x 上潜在的数据布局不匹配。

Justin Pryzby 发送了一个补丁,在执行 CREATE TABLE ... LIKE 时添加了 COMPRESSION 作为一种可能性。

Kyotaro HORIGUCHI 发送了一个补丁,用于修复一些可疑的消息。

Tang 发送了一个补丁,用 pg_strncasecmp 替换 strncmp 来比较 psql 中的“pg_”字符串。

Tang 发送了另一个修订版的补丁,以支持 psql 中大写字符输入的标签补全。

Hou Zhijie 发送了另一个修订版的补丁,使并行执行 INSERT SELECT 成为可能。

Mark Dilger 和 Robert Haas 交换了补丁,为 pg_amcheck 添加了 toast 指针损坏检查。

Bharath Rupireddy 发送了一个补丁,用于在 PageGetItemIdCareful 中 MAXALIGN sizeof(BTPageOpaqueData)。

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

Alexander Pyhalov 发送了另一个修订版的补丁,将 restrictinfos 推送到 CTE,并尝试在此过程中修剪分区。

Thomas Munro 发送了一个补丁,在 src/test/recovery 下添加了一个新的 TAP 测试,该测试使用 wal_consistency_checking=all 运行回归测试。

Joel Jacobson 发送了一个补丁,用于修复 pg_identify_object_as_address 的事件触发器。

Takamichi Osumi 发送了一个补丁,用断言替换 ReorderBufferProcessTXN 中对 RelationIsLogicallyLogged 的检查,以达到相同效果。

David Rowley 发送了另一个修订版的补丁,通过允许使用哈希表来加速具有一组常量的 NOT IN()。

David Rowley 和 Yura Sokolov 交换了补丁,在 SMgr 中使用 simplehash.h 而不是 dynahash。

Julien Rouhaud 发送了一个补丁,用于修复查询 ID 计算中的一些疏忽。

Tom Lane 发送了一个补丁,要求 pq_getmessage 的调用者提供一个上限长度,并在服务器中安装与 libpq 相同的短消息/长消息启发式方法。