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

PostgreSQL 周报 - 2021 年 5 月 2 日

发布于 2021-05-03,作者:PWN
PWN

PostgreSQL 周报 - 2021 年 5 月 2 日

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

PostgreSQL 产品新闻

pgstats.dev 上的可观测性图已更新。https://pgstats.dev/

五月 PostgreSQL 工作岗位

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

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

已应用补丁

Tom Lane 提交

  • 更新 rewriteTargetListIU() 的注释。该函数在触发器可更新视图上执行 UPDATE 时的行为,之前是类比 preptlist.c 对普通表执行 UPDATE 时所做的操作来证明其合理性的。由于 preptlist.c 自 86dc90056 以来不再执行此操作,因此该论证已不再合理,更不用说令人信服了。我认为我们仍然需要它以这种方式工作,因此更新注释以解释原因。https://git.postgresql.org/pg/commitdiff/08a986966524e522914b96e4398a4bebf942b298

  • 文档:记录 EXTRACT(JULIAN ...),改进儒略日数解释。出于某种原因,“julian”选项 for extract()/date_part() 从未在手册中列出。另外,虽然附录 B 顺带提及我们不符合儒略日数从中午 UTC 开始的通常天文定义,但它对我们实际操作是什么却相当含糊。对此进行澄清,并添加一个示例,说明如果您想要天文定义,如何获得它。这种情况已经存在很久了,所以回溯到所有受支持的分支。讨论:https://postgr.es/m/1197050.1619123213@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/79a5928ebcb726b7061bf265b5c6990e835e8c4f

  • 删除 rewriteTargetListIU() 对 UPDATE 中视图目标列表的展开。添加视图触发器的提交 2ec993a7c 修改了重写器,为用户在 UPDATE 视图时实际未更新的任何列添加了虚拟条目,例如“SET x = x”。当时需要这样做,以便生成一个完整的“NEW”行传递给触发器。后来发现这对普通可更新视图造成了问题,因此提交 cab5dc5da 将其限制为仅在触发器可更新视图上发生。但在 86dc90056 之后,我们实际上根本不需要它了。nodeModifyTable.c 从为视图生成的整行变量中填充触发器的“OLD”行,然后使用该旧行和 UPDATE 目标列表计算“NEW”行。因此,UPDATE 目标列表不需要虚拟条目,就像普通表或其他类型视图不需要虚拟条目一样。(rewriteTargetListIU() 的注释表明我们必须这样做才能正确展开规则中的 NEW 引用,但我现在认为这只是 2ec993a7c 中懒惰的注释编辑。如果我们之前在没有触发器的情况下对视图的规则不需要这样做,那么之后也不需要。)这基本上将 86dc90056 关于我们不需要虚拟列更新的决定推广到了视图情况。除了使不同情况更加统一,从而可能避免未来的错误外,它应该可以节省一些重写器/规划器的工作。讨论:https://postgr.es/m/2181213.1619397634@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/04942bffd0aa9bd0d143d99b473342eb9ecee88b

  • 文档:修正关于如何获取真实儒略日期的讨论。不知何故,我曾认为旋转到 UTC-12 是获取真实儒略日期的正确方法,但在进一步审阅后,我确定是 UTC+12。讨论:https://postgr.es/m/1197050.1619123213@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c93f8f3b8d3bc780892e2bf11192fbdd136fddfe

  • 在服务器中添加启发式入站消息大小限制。我们收到过一个报告,称客户端的一个 bug 发送了垃圾数据到服务器,导致服务器行为混乱:服务器认为垃圾数据是很大的消息长度,然后耐心等待从未到达的数据。通过不那么信任消息长度,我们可以降低风险。很长一段时间以来,libpq 一直有一个启发式规则,它不会相信很大的消息大小字,除了少数预期(可能)很长的消息类型。这提供了一些防御措施,以应对消息边界同步丢失和其他损坏数据的情况。服务器也做类似的事情,只是到目前为止,它只限制了连接认证阶段接收的消息长度。让我们采取与 libpq 相同的做法,并对所有消息的允许长度进行限制,同时区分预期很长的消息类型和不长的消息类型。我为非长消息设置了 10000 字节的限制。(libpq 对应的限制是 30000 字节,但考虑到 FE/BE 协议的非对称性,数字相同没有好理由。)实验表明,这至少是实际需要的 10 倍,可能 100 倍;但充足的余量似乎是可取的,以避免误报。无论如何,我们可以根据 beta 测试结果调整限制。对于长消息,将限制设置为 MaxAllocSize - 1,这是我们能吸收进消息收集所在的 StringInfo 缓冲区中的最大值。这仅仅是为了确保错误的消息大小被报告为错误,而不是关于无法扩展字符串缓冲区的令人困惑的抱怨。在进行此操作时,请确保非主线代码路径(例如 COPY FROM STDIN)像 SocketBackend 一样多疑,并在相信消息长度之前验证消息类型代码。这提供了额外的保护,以防止因损坏的输入而卡住。讨论:https://postgr.es/m/2003757.1619373089@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9626325da5e8e23ff90091bc96535495d350f06e

  • 修复 pg_upgrade 测试中关于不可升级类型的更多遗漏。提交 29aeda6e4 等修复了一些疏忽,包括未检查容器类型(如数组和范围)内的不可升级类型。然而,我只查看了 version.c,未能注意到 check.c 中存在实质上等效的测试。(这些文件之间的职责划分不是很清晰…)此外,由于 genbki.pl 不能保证自动生成的行类型 OID 在版本之间保持稳定,因此我们需要考虑系统目录或视图关联的复合类型是不可升级的。用户列不太可能声明为这样,但如果他们这样做了,尝试在另一个 PG 版本中读取它可能会由于复合 Datums 中嵌入的类型 OID 而导致“no such pg_type OID”失败。为了支持复合类型和 reg* 类型的情况,扩展递归查询以允许任何返回 pg_type OID 列的基本查询,而不是将其限制为只有一个起始类型。与之前一样,回溯到所有支持的分支。讨论:https://postgr.es/m/2798740.1619622555@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/57c081de0afcd01bf47c46f015bf8886b01c2c21

  • 改进 pg_upgrade 失败报告的措辞。不要主张删除整个表,而删除列就足够了。在进行此操作时,尝试使这些消息的布局更清晰、更一致。根据 Daniel Gustafsson 的建议。不回溯,因为我们通常不喜欢在已发布的版本分支中更改可翻译的消息。讨论:https://postgr.es/m/2798740.1619622555@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c9c37ae03fea0c8ad467392ddf03940b61974935

  • 禁止通过 fastpath API 调用除普通函数外的任何函数。拒绝聚合函数、窗口函数和过程。聚合函数无论如何都会失败,尽管错误消息有些晦涩。窗口函数会触发一个断言或空指针解引用。过程似乎可以工作,只要你不尝试进行事务控制,但是(a)事务控制是过程的目的之一,并且(b)不完全清楚该路径上没有隐藏的错误。考虑到该区域的测试不足,最好保守地支持我们支持的范围。还拒绝 proretset 函数,因为 fastpath 协议不支持返回集合。还删除了一个容易触发的断言,即给定的 OID 不是 0;后续查找可以自行处理这种情况。根据 Theodor-Arsenij Larionov-Trichkin 的报告。回溯到所有支持的分支。(过程角度仅适用于 v11+。)讨论:https://postgr.es/m/2039442.1615317309@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2efcd502e56a528f75ec8e88c02a287ad3457d77

  • 文档:更新 libpq 的 PQfn() 文档。特别提到不能通过此方式调用聚合函数、窗口函数或过程(SRF 的不可调用性已提及)。此外,关于 PQfn 不支持 NULL 参数或结果的说法自从我们发明协议 3.0 以来就是谎言。不知道为什么这段文字从未更新,但现在进行更新。讨论:https://postgr.es/m/2039442.1615317309@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/386e64ea5abf346d887c21ea8869317838ba19b5

  • 文档:在 ddl.sgml 中添加一个自引用外键的示例。虽然我们一直允许这种情况,但文档中并未说明可以这样做。讨论:https://postgr.es/m/161969805833.690.13680986983883602407@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/e6f9539dc32473793c03cbe95bc099ee0a199c73

Amit Kapila 提交

Peter Eisentraut 提交

Michaël Paquier 提交

Álvaro Herrera 提交

Fujii Masao 提交

  • 不要将 TRUNCATE 中指定的“ONLY”选项传递给外部数据包装器。提交 8ff1c94649 允许 TRUNCATE 命令截断外部表。以前,TRUNCATE 命令中指定的“ONLY”选项的信息会被传递给外部数据包装器。然后 postgres_fdw 会构造一个 TRUNCATE 命令来在远程服务器上执行,并根据传递的信息包含“ONLY”选项。另一方面,“ONLY”选项在 SELECT、UPDATE 或 DELETE 中访问或修改远程表时无效,即不传递给外部数据包装器。因此,仅让 TRUNCATE 命令将“ONLY”选项传递给外部数据包装器是不一致的。因此,此提交更改 TRUNCATE 命令,使其不将“ONLY”选项传递给外部数据包装器,以与其他语句保持一致。此提交还更改了 postgres_fdw,使其在构造 TRUNCATE 命令时始终不包含“ONLY”选项。作者:Fujii Masao 审阅者:Bharath Rupireddy, Kyotaro Horiguchi, Justin Pryzby, Zhihong Yu 讨论:https://postgr.es/m/551ed8c1-f531-818b-664a-2cecdab99cd8@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8e9ea08bae93a754d5075b7bc9c0b2bc71958bfd

  • 文档:审查“允许 TRUNCATE 命令截断外部表”。文档中的拼写错误、修正和语言改进。作者:Justin Pryzby, Fujii Masao 审阅者:Bharath Rupireddy, Justin Pryzby, Fujii Masao 讨论:https://postgr.es/m/20210411041658.GB14564@telsasoft.com https://git.postgresql.org/pg/commitdiff/0c8f40863acb94963df9fd6a4369eb71efe9a93b

Andrew Dunstan 推送

  • 改进 PostgresVersion.pm 中的逻辑。处理 Perl 交换比较运算符操作数顺序的情况。有关详情,请参阅 perldoc overload:第三个参数设置为 TRUE,当且仅当两个操作数被交换时。Perl 这样做是为了确保第一个参数($self)是一个实现重载操作的对象,符合一般的对象调用约定。https://git.postgresql.org/pg/commitdiff/fa26eba221a9e837493df47d0255ce615129e9a8

David Rowley 提交

  • 调整并行结果缓存计划的 EXPLAIN 输出。在此,我们调整结果缓存的 EXPLAIN ANALYZE 输出,以便不显示对结果缓存计划节点没有任何贡献的并行工作程序的任何结果缓存统计信息。最初,我曾想过不帮忙的工作程序仍然可以显示其结果缓存统计信息。这样做的想法是为了能够编写一些并行结果缓存回归测试来显示 EXPLAIN ANALYZE 的输出。然而,我太晚意识到在 buildfarm 上稳定地运行此类测试是不可能的。有了这个知识,在 9eacee2e6 提交之前,我删除了所有显示并行结果缓存计划 EXPLAIN ANALYZE 输出的测试,但是,我忘记将代码放回,该代码会调整 EXPLAIN 输出以隐藏那些不够快以至于在查询执行结束前提供帮助的并行工作程序的统计信息。所有其他节点都这样工作,结果缓存也应该如此。此外,通过此更改,现在移除我在回归测试中添加的 SET force_parallel_mode = off 似乎足够安全了。还对 partition_prune 测试进行了一些清理。我调整了 explain_parallel_append() 函数来清理结果缓存 EXPLAIN ANALYZE 的输出。但是,由于我实际上没有包含任何显示其 EXPLAIN ANALYZE 输出的并行结果缓存测试,因此该代码无效,可以删除。顺便,将 memPeakKb 的设置移到使用它的范围内。报告者:Amit Khandekar 作者:David Rowley, Amit Khandekar 讨论:https://postgr.es/m/CAJ3gD9d8SkfY95GpM1zmsOtX2-Ogx5q-WLsf8f0ykEb0hCRK3w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3c80e96dffd4df7f66fffa5f265cbd87becb7ef5

Bruce Momjian 已推送

待处理补丁

Bharath Rupireddy 提交了一个补丁,将 BLCKSZ 而不是 pageSize 传递给 gistinitpage,使其与对等项 BloomInitPage、brin_page_init 和 SpGistInitPage 对齐。

Yugo Nagata 提交了该补丁的另外两个修订版,用于实现增量视图维护。

Peter Eisentraut 提交了该补丁的又一个修订版,用于修复 ALTER TABLE / INHERIT 与生成列的问题。

Tang 提交了该补丁的又一个修订版,用于在 psql 中支持大写字符输入的查询结果 tab 补全。

Tom Lane 提交了一个补丁,用于删除重写器中一些无用的工作。

Andrey V. Lepikhov 提交了一个补丁,用于在不扫描外部分区时避免不必要的工作。

Masahiro Ikeda 提交了该补丁的又一个修订版,用于在不引入新变量的情况下加快 WAL 统计信息的报告速度,并将 XXXUsage 的数据类型从 long 改为 int64。

Michaël Paquier 提交了一个补丁,用于在 pg_stat_activity 中跟踪已认证的身份,现在已具备日志记录功能。

Mark Dilger 和 Robert Haas 交换了补丁,用于修改 toast 并测试 pg_amcheck,以及修改 toast 损坏测试的预期输出。

Vigneshwaran C 和 Bharath Rupireddy 交换了补丁,用于增强错误消息,为冗余选项错误添加提示信息。

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

Bharath Rupireddy 提交了一个补丁,用于检查 CREATE COLLATION 命令中的重复选项并报错。

Andrey V. Lepikhov 提交了该补丁的又一个修订版,用于修复执行器和异步追加节点之间的一个不协调之处。

Andres Freund 提交了一个补丁,用于修复 REFRESH MATERIALIZED VIEW 的性能下降问题。

David Fetter 和 Aleksander Alekseev 交换了补丁,以确保 ALTER TABLE ... VALIDATE CONSTRAINT ... 的 tab 补全仅能补全尚未验证的约束。

Joel Jacobson 和 Michaël Paquier 交换了补丁,以确保 pg_identify_object_as_address() 支持 pg_event_trigger oids。

Vigneshwaran C、Masahiko Sawada 和 Amit Kapila 交换了补丁,用于修复 'total_bytes' 槽统计信息的计算,该计算可能因使用事务解码更改的大小来计算而导致重复计数。通过使用事务解码的更改大小来计算。

Hou Zhijie 提交了该补丁的又一个修订版,用于实现 { CREATE | ALTER } TABLE ... PARALLEL DML { UNSAFE | RESTRICTED | SAFE };

Kyotaro HORIGUCHI 提交了该补丁的又一个修订版,用于修复一些可疑的错误消息和注释。

David Christensen 提交了该补丁的又一个修订版,用于扩展 pg_size_bytes 支持的单位,以覆盖所有单位。

Tom Lane 提交了一个补丁,旨在修复一个 bug,该 bug 表现为 pg_upgrade 无法检测到不支持的数组和范围,通过检查复合类型的用法。

Hou Zhijie 提交了该补丁的又一个修订版,用于修复一些并行安全检查。

Peter Geoghegan 提交了一个补丁,旨在修复一个 bug,该 bug 在使用 lazy_scan_heap() 时报告了“FailedAssertion”,这是在运行逻辑复制时发生的,方法是在 lazy_scan_heap 中将 all_visible_according_to_vm 设置为 false。

Amul Sul 提交了一个补丁,用于隐藏 EXPLAIN 中的内部临时模式名称,并更改相同的表描述。

Peter Smith 提交了该补丁的又一个修订版,用于为内置逻辑复制添加对准备好的事务的支持,并为流式传输事务添加 prepare API 支持。

Vaibhav Dalvi 提交了一个补丁,用于删除 pg_upgrade 中 quote_identifier 函数中一个不必要的后置增量。

Richard Yen 提交了该补丁的三个修订版,用于使 pg_filedump 能够读取 pg_filenode.map。

Vigneshwaran C 提交了一个补丁,用于在从磁盘恢复 reorder buffer 更改时包含 xid。

Álvaro Herrera 提交了该补丁的又一个修订版,用于修复一个 bug,该 bug 表现为 InvalidateObsoleteReplicationSlots() 中的竞态条件。

Peter Eisentraut 提交了该补丁的又一个修订版,用于防止 lwlock dtrace 探针进行不必要的工作。

Álvaro Herrera 提交了该补丁的又一个修订版,用于从 transformCreateStmt 中删除一个冗余变量。

Thomas Munro 提交了一个补丁,用于为套接字关闭事件添加 WL_SOCKET_CLOSED,并为 client_connection_check_interval 使用 WL_SOCKET_CLOSED。

Amit Kapila 提交了一个补丁,用于在解码过程中收紧并发中止检查,涵盖了检测 ERRCODE_TRANSACTION_ROLLBACK 未能覆盖的情况。

Andres Freund 提交了一个补丁,以帮助即将到来的 WAL 预取补丁正常工作。

David Rowley 提交了该补丁的又一个修订版,用于在 SMgr 中使用 simplehash.h 哈希表。

Justin Pryzby 提交了该补丁的又一个修订版,用于添加允许测试从 v9.5-v13 升级到 v14dev 所需的更改,添加更多允许升级测试所需的更改,添加一个测试来运行二进制兼容性,并将 pg_upgrade 的临时解决方案移到一个 SQL 脚本中。

Julien Rouhaud 提交了一个补丁,用于为可扩展解析添加钩子。

Tom Lane 提交了该补丁的两个修订版,用于修复由新的全匹配代码引起的正则表达式性能回归。

Vigneshwaran C 提交了该补丁的另外两个修订版,用于在 CREATE/ALTER SUBSCRIPTION 时识别发布者中丢失的出版物。

Alexander Korotkov 提交了该补丁的四个修订版,用于使 websearch_to_tsquery() 将引号中的文本解析为单个标记。

Noah Misch 提交了该补丁的又一个修订版,用于转储 public 模式的所有权和安全标签,并转储 COMMENT ON SCHEMA public。