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

由 PWN 于 2021-08-15 发布
PWN

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

安全版本 13.4、12.8、11.13、10.18、9.6.23 和 14 Beta 3 已发布,请尽快升级。9.6 系列将于 2021 年 11 月 11 日停止接收修复。请现在计划主要版本升级。

行为准则委员会正在寻找新成员,任期为 1-3 年。

PostgreSQL 产品新闻

pgbouncer 1.16.0,PostgreSQL 的连接池和更多功能已发布

8 月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

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

请在太平洋标准时间下午 3:00 之前(PST8PDT)将新闻和公告提交至 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 中对 queryid 使用 ExplainPropertyInteger。这样可以节省几行代码。此外,添加注释以提及为什么我们使用 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 规则来删除添加当前 contrib_extrasource 的需求,这些规则会在 Makefile 中为给定的 .o 文件存在时添加 .l 和 .y 文件。这只是对 Makefiles 的一些非常基本的额外解析,目的是尝试使使用 make 和 MSVC 构建之间的构建更加一致。这恰好适用于我们当前的 Makefiles 的布局方式,但如果将来有人选择在 Makefile 中执行我们没有解析支持的操作,则很容易被破坏。我们到时候再解决这个问题。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvoPULi5JW3933NxgwxOmu9Ncvpcyt87UhEHAUX16QqmpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76ad24400d73fa10d527844d50bedf7dacb1e87b

  • 修复 simplehash.h 中不正确的哈希表大小调整代码。这修复了 simplehash.h 中的一个 bug,该 bug 导致当哈希表增长到 SH_MAX_SIZE (2^32) 时使用了不正确的大小掩码。当哈希表达到最大可能的桶数时,代码错误地将大小掩码设置为 0。这将导致始终尝试使用第 0 个桶,从而导致因冲突过多而尝试增长哈希表的无限循环。似乎 simplehash 表增长到这么大并不常见,因为此 bug 可以追溯到 v10,并且以前似乎没有人注意到它。但是,人们最有可能注意到它的地方可能是使用接近至少 2^31 组的内容执行大型内存哈希聚合。修复此 bug 后,代码现在可以正确地处理最多 98% 的 2^32 个组,并且在尝试向哈希表中插入更多项时,将失败并显示以下错误:错误:哈希表大小超出。但是,work_mem(或较新版本中的 hash_mem_multiplier)设置通常会导致哈希聚合在达到那么多组之前溢出到磁盘。我做的最小测试用例使用了超过 192GB 的 work_mem 设置来触发此 bug。simplehash 哈希表在其他一些地方使用,例如位图索引扫描,但是,哈希表的大小也限制为 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

  • 修复使用“char”类型和 <!--<= 运算符的 btree_gin 索引扫描失败的问题。由于对“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 中列出生成的 executable(因此,自从有人尝试使用此代码以来已经过了很长一段时间)。在尝试 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 推送了