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

PostgreSQL 每周新闻 - 2021 年 8 月 15 日

发布于 2021-08-15,作者:PWN
PWN

PostgreSQL 每周新闻 - 2021 年 8 月 15 日

安全版本 13.4、12.8、11.13、10.18、9.6.23 和 14 Beta 3 已发布。请尽快升级。9.6 系列将于 2021 年 11 月 11 日停止修复。请立即规划主版本升级。

行为准则委员会 (Code of Conduct Committee) 正在寻找新成员,任期为 1-3 年。

PostgreSQL 产品新闻

pgbouncer 1.16.0 发布,这是一个 PostgreSQL 的连接池和其他功能 已发布

2021 年 8 月 PostgreSQL 工作岗位

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

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

已应用补丁

Bruce Momjian 已推送

David Rowley 提交

  • 为 MSVC x86_64 构建添加 POPCNT 支持。02a6a54ec 添加了代码,以便在许多常用平台上使用 POPCNT 指令。我们在这里也为 x86_64 机器上的 MSVC 做了同样的事情。MSVC 的 popcnt 内置函数似乎与 GCC 的不同,它们似乎总是会发出 popcnt 指令。在 GCC 中,行为取决于源文件是用 -mpopcnt 编译的还是没有。因此,MSVC 的内置函数被归入了 pg_popcount*_asm 函数,但这会使该函数名称失效,所以我们将其重命名为 pg_popcount*_fast()。作者:David Rowley 审阅者:John Naylor 讨论:https://postgr.es/m/CAApHDvqL3cbbK%3DGzNcwzsNR9Gi%2BaUvTudKkC4XgnQfXirJ_oRQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2e281249af6c702fd057f34150fd9ac6cb8c7a8b

  • 在 EXPLAIN 中使用 ExplainPropertyInteger 来处理 queryid。这可以节省几行代码。另外添加一个注释,说明为什么我们使用 ExplainPropertyInteger 而不是 ExplainPropertyUInteger,因为 queryid 是 uint64 类型。作者:David Rowley 审阅者:Julien Rouhaud 讨论:https://postgr.es/m/CAApHDvqhSLYpSU_EqUdN39w9Uvb8ogmHV7_3YhJ0S3aScGBjsg@mail.gmail.com 回向支持:14,该代码最初在此版本添加 https://git.postgresql.org/pg/commitdiff/4a3d806f38f99fecf8f2a2bf7990a7ebea9b6c63

  • 文档:修正 VACUUM 内存限制的误导性陈述。在 ec34040af 中,我曾提及将 vacuum 的 maintenance_work_limit 设置为高于 1GB 没有意义,但这是不正确的,因为 ginInsertCleanup() 在 VACUUM 时也会查看 maintenance_work_mem 的设置,而这并不限于 1GB。在此,我试图更清楚地说明限制仅在于 VACUUM 期间我们可以收集的死元组数量。我还添加了一个关于 autovacuum_work_mem 的注释来提及此限制。在 ec34040af 中我没有这样做,因为我曾错误地认为只需将该 GUC 的最大值限制为 1GB。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvpGwOAvunp-E-bN_rbAs3hmxMoasm5pzkYDbf36h73s7w@mail.gmail.com 回向支持:9.6,与 ec34040af 相同 https://git.postgresql.org/pg/commitdiff/deb6ffd4fdeb589de7a13ac1791380a7138cf59f

  • 从 MSVC 构建脚本中移除一些特殊情况。这里我们添加了对 Makefiles 的额外解析,以确定何时添加对 libpgport 和 libpgcommon 的引用。我们还通过添加一些非常基本的逻辑来实现 Makefile 规则,当 .o 文件在 Makefile 中存在对应的 .l 和 .y 文件时添加它们,从而消除了添加当前 contrib_extrasource 的需求。这只是对 Makefiles 进行了一些非常基本的额外解析,试图使使用 make 和 MSVC 构建之间的保持一致。这恰好适用于我们当前的 Makefile 布局,但如果有人在 Makefile 中做了我们没有解析支持的事情,未来很容易就会被破坏。到时候我们再处理。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvoPULi5JW3933NxgwxOmu9Ncvpcyt87UhEHAUX16QqmpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76ad24400d73fa10d527844d50bedf7dacb1e87b

  • 修复 simplehash.h 中不正确的哈希表重调大小代码。这修复了 simplehash.h 中的一个错误,该错误导致在哈希表增长到 SH_MAX_SIZE (2^32) 时使用了不正确的尺寸掩码。当哈希表达到最大可能的桶数时,该代码错误地将尺寸掩码设置为 0。这会导致总是尝试使用第 0 个桶,由于冲突过多而导致尝试增长哈希表的无限循环。Apparently,simplehash 表很少会增长到这么大,因为这个错误可以追溯到 v10 版本,而且似乎没有人注意到。然而,最有可能注意到这个问题的地方可能是在内存中进行大型 Hash Aggregate 操作,其中分组数量接近 2^31。在此修复之后,代码现在最多可以正确处理接近 2^32 个组,并在尝试向哈希表插入更多项时会以以下错误失败:ERROR: hash table size exceeded。但是,work_mem(或较新版本中的 hash_mem_multiplier)设置通常会在达到这么多组之前导致 Hash Aggregate 溢出到磁盘。我进行的最小测试案例需要超过 192GB 的 work_mem 设置才能触发此错误。simplehash 哈希表也用于其他一些地方,例如 Bitmap Index Scans,但同样,哈希表的大小也受 work_mem 的限制,并且需要一个大约 16TB (2^31) 页的表和一个非常大的 work_mem 设置才能触发此问题。使用较小的 work_mem 值,表将变得有损耗,永远不会大到足以触发问题。作者:Yura Sokolov 审阅者:David Rowley, Ranier Vilela 讨论:https://postgr.es/m/b1f7f32737c3438136f64b26f4852b96@postgrespro.ru 回向支持:10,simplehash.h 在此版本添加 https://git.postgresql.org/pg/commitdiff/37450f2ca9ad430d78673cc26816fc2085e65904

Amit Kapila 提交

Tom Lane 提交

  • 在可能的情况下避免确定正则表达式子表达式匹配。由于我们的正则表达式引擎的工作方式,识别带括号的子表达式的精确匹配位置是一项相当昂贵的操作,无论是正则表达式编译时(我们必须为每个带括号的子表达式创建一个优化的 NFA)还是运行时(确定精确匹配位置需要繁琐的搜索)。到目前为止,我们几乎没有尝试优化这种情况。此补丁识别出我们可以在编译时知道不需要子表达式匹配位置的情况,并指示正则表达式编译器不要为未在正则表达式中其他位置被反向引用引用的括号对创建每个子表达式的正则表达式。(为了保留语义,我们显然仍然必须确定反向引用引用的匹配位置。)用户可以通过谨慎地使用“非捕获”括号在可能的情况下获得相同的结果,但很少有人这样做。讨论:https://postgr.es/m/2219936.1628115334@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0e6aa8747d439bb7f08f95e358f0509c50396785

  • 让 regexp_replace() 在可行时利用 REG_NOSUB。如果替换字符串不包含 \1...\9,则我们不需要子匹配位置,因此也可以在此使用 REG_NOSUB 优化。已经有一个用于查找反斜杠的替换字符串预扫描,因此将其扩展到检查数字,并重构以便在编译正则表达式之前完成。同时,尝试使用 memchr() 而不是手动循环来加速预扫描。这很可能在正则表达式本身的噪声中丢失,但也许不会。无论如何,这种编码更短。另外,添加一些测试用例以改进对 appendStringInfoRegexpSubstr() 的覆盖率不足的问题。讨论:https://postgr.es/m/3534632.1628536485@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/18bac60ede44359a1e577df80aef196e371c902e

  • 修复 btree_gin 索引扫描在与“char”类型和 <!--<= 运算符配合使用时出现的错误。由于对“char”类型是带符号还是无符号的困惑,索引搜索如“col < 'x'”或“col <= 'x'”的扫描会从索引的中间开始而不是左端,因此会遗漏许多或所有应该找到的条目。幸运的是,这不是索引损坏的迹象。只有搜索逻辑有问题,我们可以修复它而不会产生不良的副作用。根据 Jason Kim 的报告。这个错误自 btree_gin 问世以来就一直存在,所以回向给所有支持的分支。讨论:https://postgr.es/m/20210810001649.htnltbh7c63re42p@jasonk.me https://git.postgresql.org/pg/commitdiff/a6bd28beb0639d4cf424e961862a65c466ca65bf

  • 在 s_lock.h 中添加 RISC-V 自旋锁支持。与 ARM 的情况一样,只需使用 gcc 的 __sync_lock_test_and_set();,它将编译为 AMOSWAP.W.AQ,这正是我们需要的。可能有一天值得对 RISC-V 的原子操作做些工作,但对于一个可信的移植来说,这应该足够了。回向给所有支持的分支,以防有人想在 RISC-V 上尝试它们。作者:Marek Szuba 讨论:https://postgr.es/m/dea97b6d-f55f-1f6d-9109-504aa7dfa421@gentoo.org https://git.postgresql.org/pg/commitdiff/c32fcac56a212b4e6bb5ba63596f60a25a18109a

  • 修正 s_lock_test 的错误。提交 80abbeba2 显然没有检查这段代码。另外,将生成的可执行文件添加到 .gitignore 中(所以有人尝试这个已经是很久以前的事了)。在尝试 RISC-V 自旋锁补丁时注意到。鉴于此代码已损坏 5 年而无人注意到,可能不值得回向。 https://git.postgresql.org/pg/commitdiff/0a208ed63ffe50a8d9d7c0b33996ec01cc4fdef6

Andres Freund 提交

Michaël Paquier 提交

Daniel Gustafsson 提交

Heikki Linnakangas 提交

  • 修复 EvalPlanQual 中本地和外部分区混合时的段错误。在 EvalPlanQual 中重新评估直接修改的外部更新或删除是不合理的。然而,如果表混合了本地和外部分区,ExecInitForeignScan() 仍然可能被调用。EvalPlanQualStart() 在子 EPQ EState 中留下了未初始化的 es_result_relations 数组,但 ExecInitForeignScan() 仍然期望找到它。这导致了段错误。通过在 EvalPlanQual 处理期间跳过 es_result_relations 查找来修复。为了使事情更健壮,还跳过了 BeginDirectModify 调用,并添加了一个运行时检查,以确保在 EvalPlanQual 处理期间不调用 ExecForeignScan() 在直接修改的外部扫描上。这是 v14 的新功能,提交 1375422c782。在此之前,EvalPlanQualStart() 将整个 ResultRelInfo 数组复制到 EPQ EState。回向给 v14。由 Andrey Lepikhov 报告和诊断。讨论:https://postgresql.ac.cn/message-id/cb2b808d-cbaa-4772-76ee-c8809bafcf3d%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/c3928b467a4f0ed2b0ef21a33848e9fcdade37b4

John Naylor 提交了

Tomáš Vondra 提交了

Thomas Munro 推送

Michael Meskes 已推送

Peter Eisentraut 提交