PostgreSQL 每周新闻 - 2021 年 5 月 2 日

由 PWN 发布于 2021-05-03
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 为您带来

请在太平洋标准时间/太平洋夏令时周日下午 3:00 前将新闻和公告提交至 david@fetter.org。

已应用补丁

Tom Lane 推送了

  • 更新 rewriteTargetListIU() 的注释。该函数对于触发器可更新视图的 UPDATE 的行为,是类比 preptlist.c 过去对常规表的 UPDATE 所做的行为来解释的。由于 preptlist.c 自 86dc90056 以来就没有这样做过,因此该论点不再合理,更不用说具有说服力了。我认为我们仍然需要它以这种方式运行,因此更新注释以解释原因。https://git.postgresql.org/pg/commitdiff/08a986966524e522914b96e4398a4bebf942b298

  • 文档:记录 EXTRACT(JULIAN ...),改进儒略日期解释。出于某种原因,extract()/date_part() 的“julian”选项从未在手册中列出。此外,虽然附录 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 tlist 不需要虚拟条目,就像它不需要它们用于常规表或其他类型的视图一样。(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

  • 在服务器中添加启发式入站消息大小限制。我们收到了一份关于客户端错误导致令人困惑的服务器行为的报告:服务器认为垃圾数据是非常长的消息长度,并耐心等待永远不会出现的数据。我们可以通过减少对消息长度的信任来降低这种风险。长期以来,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 不保证自动生成的 rowtype OID 在不同版本之间保持不变,我们需要考虑与系统目录或视图关联的复合类型是不可升级的。似乎不太可能有人声明用户列是这样的,但如果他们这样做了,由于嵌入在复合 Datum 中的类型 OID,尝试在另一个 PG 版本中读取它可能会出现“没有这样的 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)。此外,自我们发明协议 3.0 以来,PQfn 不支持 NULL 参数或结果的说法一直是一个谎言。不确定为什么这段文字从未对此进行更新,但现在就更新它。讨论: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”选项传递给外部数据包装器。Commit 8ff1c94649 允许 TRUNCATE 命令截断外部表。以前,有关 TRUNCATE 命令中指定的“ONLY”选项的信息会传递给外部数据包装器。然后,postgres_fdw 根据传递的信息构造 TRUNCATE 命令以发出远程服务器,并在其中包含“ONLY”选项。另一方面,在访问或修改远程表时,SELECT、UPDATE 或 DELETE 中指定的“ONLY”选项不起作用,即不传递给外部数据包装器。因此,仅让 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,藤井正雄。审阅人:Bharath Rupireddy,Justin Pryzby,藤井正雄。讨论: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 输出。但是,我意识到,在构建场上以稳定的方式运行此类测试是不可能的,这有点太晚了。在了解这一点后,在 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 中使用查询结果对大写字符输入进行制表符补全。

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 ... 的制表符补全仅补全尚未有效的约束。

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

Vigneshwaran C,Masahiko Sawada 和 Amit Kapila 交换了补丁,以修复“total_bytes”的槽统计信息的计算,该计算可能会多次计算内容,方法是使用为事务解码的更改大小来计算它。

侯志杰发送了另一个修订版的补丁,以实现 { CREATE | ALTER } TABLE ... PARALLEL DML { UNSAFE | RESTRICTED | SAFE };

Kyotaro HORIGUCHI 发送了另一个修订版的补丁,以修复一些可疑的错误消息和注释。

David Christensen 发送了另一个修订版的补丁,以扩展 pg_size_bytes 中支持的单位以覆盖所有单位。

Tom Lane 发送了一个补丁,旨在修复一个错误,该错误表现为 pg_upgrade 未能通过检查复合类型的使用来检测不受支持的数组和范围。

侯志杰发送了另一个修订版的补丁,以修复一些并行安全检查。

Peter Geoghegan 发送了一个补丁,旨在修复一个错误,该错误表现为在运行逻辑复制时通过在 lazy_scan_heap 中将 all_visible_according_to_vm 设置为 false 而在 lazy_scan_heap() 中报告“FailedAssertion”。

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

Peter Smith 发送了另一个修订版的补丁,以添加对内置逻辑复制的预处理事务的支持,并添加对流事务的准备 API 支持。

Vaibhav Dalvi 发送了一个补丁,以删除 pg_upgrade 的函数 quote_identifier 中不需要的后增量。

Richard Yen 发送了三个修订版的补丁,以使 pg_filedump 可以读取 pg_filenode.map。

Vigneshwaran C 发送了一个补丁,以在从磁盘还原重新排序缓冲区更改时包含 xid。

Álvaro Herrera 发送了另一个修订版的补丁,以修复一个错误,该错误表现为 InvalidateObsoleteReplicationSlots() 中的竞争条件。

Peter Eisentraut 发送了另一个修订版的补丁,以防止 lwlock dtrace 探针进行不必要的工作。

Álvaro Herrera 发送了另一个修订版的补丁,以从 transformCreateStmt 中删除一个冗余变量。

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

Amit Kapila 发送了一个补丁,通过涵盖检测 ERRCODE_TRANSACTION_ROLLBACK 没有的情况,来加强解码期间的并发中止检查。

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

David Rowley 发送了另一个修订版的补丁,以在 SMgr 中使用 simplehash.h 哈希表。

Justin Pryzby 发送了另一个修订版的补丁,以添加允许从 v9.5-v13 测试升级到 v14dev 所需的更改,添加允许升级测试所需的更多更改,添加一个测试以进行二进制兼容性,并将 pg_upgrade kludge 移动到 SQL 脚本中。

Julien Rouhaud 发送了一个补丁,以添加可扩展解析的钩子。

Tom Lane 发送了两个修订版的补丁,以修复由新的匹配所有代码引起的正则表达式性能下降问题。

Vigneshwaran C 发送了另外两个修订版的补丁,以在 CREATE/ALTER SUBSCRIPTION 期间从发布者识别缺失的发布。

Alexander Korotkov 发送了四个修订版的补丁,以使 websearch_to_tsquery() 将引号中的文本解析为单个标记。

Noah Misch 发送了另一个修订版的补丁,以转储公共模式所有权和安全标签,并转储 COMMENT ON SCHEMA public。