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

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

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

PostgreSQL 新闻

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

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

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

已应用的补丁

Michaël Paquier 推送了

David Rowley 推送了

Tom Lane 推送了

Dean Rasheed 推送了

  • 允许数值刻度为负数或大于精度。以前,当指定 NUMERIC(precision, scale) 时,刻度必须在 [0, precision] 范围内,这是按照 SQL 规范进行的。此提交将允许的刻度范围扩展到 [-1000, 1000],与精度无关(其有效范围仍为 [1, 1000])。负刻度意味着在小数点之前进行舍入。例如,可以使用 -3 的刻度声明一个列,以将值舍入到最接近的千位。请注意,显示刻度仍为非负数,因此在这种情况下,显示刻度将为零,并且将显示小数点之前的所有数字。大于精度的刻度支持小数点后紧跟零的小数值。借此机会整理打包、解包和验证 typmod 整数内容的代码,将其封装在一小组新的内联函数中。由于数值列的 atttypmod 允许的内容已更改,因此增加了 catversion。这不是需要重新 initdb 的更改,但 typmod 中的负刻度值会使旧的后端感到困惑。Dean Rasheed,Tom Lane 进行了额外的改进。由 Tom Lane 审查。讨论:https://postgr.es/m/CAEZATCWdNLgpKihmURF8nfofP0RFtAKJ7ktY6GcZOPnMfUoRqA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/085f931f52494e1f304e35571924efa6fcdc2b44

  • 修复 numeric_power() 中的边界情况错误和精度损失。这修复了将数字提升到非常大的幂时出现的一些相关问题。首先,当将负数提升到非常大的整数幂时,结果应该是明确定义的,但之前的代码仅在指数足够小以至于可以通过 power_var_int() 时才能处理。否则,它会抛出内部错误,试图获取负数的对数。通过在 power_var() 中的一般情况下添加合适的处理来处理负基数,从而修复此问题,并在那里检查整数幂。接下来,当将绝对值略小于 1 的(正或负)数提升到非常大的幂时,结果应随着幂的增加而接近零。但是,在某些情况下,对于足够大的幂,这将失去所有精度并返回 1 而不是 0。这是由于为最终全精度计算而计算 local_rscale 的方式所致:local_rscale = rscale + (int) val - ln_dweight + 8。右侧的前两项旨在给出结果中所需的有效位数(“val” 是估计的结果权重)。但是,这未能考虑到 rscale 被限制为 NUMERIC_MAX_DISPLAY_SCALE (1000) 的最大值,并且结果权重可能小于 -1000,导致它们的和为负数,从而导致精度损失。通过强制计算的有效位数非负来解决此问题。它可以为零(当结果权重小于 -1000 时),因为 local_rscale 值然后包含一些额外的数字以确保准确的结果。最后,向 exp_var() 和 power_var() 添加额外的下溢检查,以便它们在结果与零无法区分的情况下始终如一地返回零。此代码的一些路径在这些情况下已经返回零,但其他路径则抛出溢出错误。Dean Rasheed,由 Yugo Nagata 审查。讨论:http://postgr.es/m/CAEZATCW6Dvq7+3wN3tt5jLj-FyOcUgT5xNoOqce5=6Su0bCR0w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4dd5ce2fd9b9b2134886fee7fe4cb36d1988adb2

Tomáš Vondra 推送了

Álvaro Herrera 推送

Bruce Momjian 推送

Andrew Dunstan 推送

藤井正雄 推送

John Naylor 推送

Daniel Gustafsson 推送

Amit Kapila 推送

Etsuro Fujita 推送

  • postgres_fdw: 修复处理待处理的异步请求的问题。待处理的异步请求由 process_pending_request() 处理,该函数之前不仅处理正在进行的远程查询,还执行 ExecForeignScan() 以异步地从远程查询的结果中生成一个元组返回给本地服务器。但是,当执行查询时,这会导致服务器崩溃;或者当对其进行 EXPLAIN ANALYZE 时,会导致 “InstrStartNode called twice in a row” 或 “InstrEndLoop called on running node” 的失败。在计划树包含多个能够异步访问同一 initplan/子计划的节点的情况下,该 initplan/子计划包含多个能够异步扫描与父异步节点相同的外表的节点时,Andrey Lepikhov 报告了这个问题。原因是,当为父异步节点之一执行 initplan/子计划时,调用 process_pending_request() 的第二步导致了另一个父异步节点的 initplan/子计划的递归执行。为了修复这个问题,将 process_pending_request() 分为两个步骤,并将第二步推迟到为每个待处理的异步请求调用 ForeignAsyncConfigureWait() 时。此外,在 ExecAppendAsyncEventWait() 中,我们假设 FDW 会在 WaitEventSet 中注册至少一个等待事件,当从 ForeignAsyncConfigureWait() 调用它们时,会在那里创建 WaitEventSet,但允许 FDW 在 WaitEventSet 中注册零个等待事件;修改 ExecAppendAsyncEventWait() 以在这种情况下直接返回。这是 commit 27e1f1456 中的疏忽。回溯到 v14,该提交已进入其中。Andrey Lepikhov 和 Etsuro Fujita 讨论:https://postgr.es/m/fe5eaa19-1704-e4a4-76ee-3b9d37ade399@postgrespro.ru https://git.postgresql.org/pg/commitdiff/1ec7fca8592178281cd5cdada0f27a340fb813fc

Heikki Linnakangas 推送了

Robert Haas 推送了

  • 删除对 ReadCheckpointRecord() 的不必要调用。最后一个检查点记录应该始终是可读的,因为否则,崩溃会使我们陷入无法恢复的情况。因此,此补丁删除的测试应该总是成功。要使其失败,要么是代码中的某个地方存在严重错误,要么是用户在崩溃恢复运行时手动修改 pg_wal。如果是第一种情况,我们应该修复错误。如果是第二种情况,他们应该停止,或者无论如何他们都在自担风险。在这两种情况下,用完整检查点代替恢复结束记录似乎都不是明显的赢家。此外,很少采用的代码路径特别容易出现错误,因此让我们通过摆脱它来简化。讨论:http://postgr.es/m/CA+TgmoYmw==TOJ6EzYb_vcjyS09NkzrVKSyBKUUyo1zBEaJASA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1d919de5eb3fffa7cc9479ed6d2915fb89794459

Jeff Davis 推送了

待处理补丁

Bharath Rupireddy 发送了另一个补丁修订版,通过区分未记录表的错误消息和临时表的错误消息来改进发布错误消息。

Daniel Gustafsson 发送了另一个补丁修订版,以支持 NSS 作为 libpq TLS 后端。

David Fetter 和 Greg Nancarrow 交换了补丁,以使用更少的指令来查找用于格式化的整数的十进制长度。

John Naylor 发送了另外两个补丁修订版,以添加用于验证 UTF-8 文本的快速路径。

Justin Pryzby 和 Bharath Rupireddy 交换了补丁,以使在启动过程中可以记录事件。

Haiying Tang 和 Vigneshwaran C 交换了补丁,以向 PUBLICATION 添加模式级别的粒度。

Nathan Bossart 发送了另外两个补丁修订版,以澄清 initdb --sync-only 帮助消息和文档。

Amit Langote 发送了另一个补丁修订版,以允许在跨分区更新期间批量插入。

Andrey V. Lepikhov 发送了另一个补丁修订版,以删除不必要的自连接。

David Rowley 发送了另一个补丁修订版,用于 postgres_fdw,以向某些远程 SQL 查询添加 ORDER BY。

Peter Smith 发送了另一个补丁修订版,以添加逻辑复制的行过滤。

Daniel Westermann 发送了一个补丁,以修复一个拼写错误。

Amit Langote 发送了一个补丁,用于在 src/backend/executor/nodeModifyTable.c:ExecInsert 中为计划使用单独的 tupledesc 结构。

Dagfinn Ilmari Mannsåker 发送了一个补丁,通过禁止在 void 上下文中映射和 grep 来符合 perlcritic。

Dipesh Pandit 发送了另一个补丁修订版,以缓解 WAL 存档器的性能杀手目录扫描。

Bertrand Drouvot 发送了另一个补丁修订版,以使可以在备用机上进行逻辑解码。

Bharath Rupireddy 发送了另一个补丁修订版,用于为 {pre, post}_auth_delay 使用 WaitLatch。

Daniel Gustafsson 和 Jacob Champion 交换了补丁,以重做 sslfiles Makefile 目标。

Bruce Momjian 发送了另外四个补丁修订版,以修复间隔算术处理方式的一些问题。

Peter Smith 发送了另外两个补丁修订版,以添加对流事务的准备 API 支持。

Pavel Stěhule 发送了另一个补丁修订版,以向 pg_dump 添加 --options-file 选项和支持机制。

Pavel Stěhule 发送了另一个补丁修订版,以向 pg_dump 添加过滤。

Pavel Stěhule 发送了另一个补丁修订版,以在 plpgsql 调试 API 中返回变量内容的文本值。

Michaël Paquier 发送了一个补丁,用于在 CREATE SEQUENCE 中记录 RESTART,同时根据 START 描述其行为。

Daniel Gustafsson 发送了另一个补丁修订版,以在 post-copy errmsg 中发出命名空间。

Melanie Plageman 发送了一个补丁,用于为 AIO bitmapheapscan 使用 pgsr。

Yugo Nagata 发送了另一个补丁修订版,用于 pgbench,以防止它不必要地中止。

Amit Langote 发送了另一个补丁修订版,以重做查询关系权限检查,方法是将权限检查信息从范围表条目移动到一个名为 RelPermissionInfo 的新节点类型,从而避免了对范围表的多次搜索。

Ronan Dunklau 发送了一个补丁,以添加 READ_REPLICATION_SLOT 命令,该命令将在物理复制连接的上下文中使用,并在 pg_receivewal 中使用相同命令以获得所需的 start_lsn 的更好估计。

Daniil Zakhlystov 发送了一个补丁,以添加 zlib 和 zstd 流压缩,并在实现 libpq 压缩时使用相同的方法。

Hayato Kuroda 发送了一个补丁,以将本地 pid 添加到 fallback_application_name。

Masahiko Sawada 发送了另外两个补丁修订版,以向应用逻辑复制更改中的错误添加 errcontext,添加 pg_stat_logical_replication_error 统计信息视图,并向 ALTER SUBSCRIPTION 添加 skip_xid 选项。

Yura Sokolov 发送了一个补丁,向 bdbench 添加一个 integerset2 实现,旨在改进惰性 vacuum 的死元组存储。

RGU 发送了一个补丁,以收集子问题最上面的扫描/连接关系的局部路径。

Dean Rasheed 发送了一个补丁,以避免 to_char 中不正确的除以零错误。

Prabhat Sahu 发送了一个补丁,以添加禁止 wal 的 TAP 测试。

John Naylor 发送了另一个补丁修订版,以加速常见类型的元组排序。

Daniel Gustafsson 发送了另一个补丁修订版,以修复 pg_basebackup 和 pg_dump 中的 sscanf 限制,并修复 TOC 文件错误消息打印中的错误,该错误有时未能包含发生错误的文件的名称。

Tomáš Vondra 发送了另一个补丁修订版,以向逻辑复制添加对序列的操作。

Melanie Plageman 发送了另一个补丁修订版,以修复并行哈希连接批处理清理中的竞争条件,澄清并行哈希连接阶段的命名,并使可以在完整和右外连接上使用并行哈希。

Hou Zhijie 发送了一个补丁,以删除 maybe_send_schema 中未使用的参数。

David Rowley 和 Tomáš Vondra 交换了补丁,以使用生成上下文来加速元组排序。

Álvaro Herrera 发送了另一个补丁修订版,以避免过早创建存档状态 ".ready" 文件。

Heikki Linnakangas 发送了另外三个补丁修订版,以在 StartupXLOG() 中移动代码,将 xlog.c 分割为 xlog.c 和 xlogrecovery.c,并将应用一个 WAL 记录的代码移动到子例程中。

Ajin Cherian 发送了一个补丁,以修复 021_twophase tap 测试中可能发生的失败,方法是更改测试,以便它等待两个订阅都赶上,然后再检查准备好的事务计数。

Gilles Darold 发送了另一个补丁修订版,以添加函数 regexp_count、regexp_instr 和 regexp_like,并向 regexp_replace 和 regexp_substr 添加新参数,以使其可以指定位置和出现次数。

Tomáš Vondra 发送了另一个补丁修订版,以提高 slab 分配器的性能。

David Rowley 发送了另一个补丁修订版,以跟踪 RelOptInfo 中未修剪的分区,并允许在更多情况下进行有序分区扫描。

Vigneshwaran C 发送了另一个补丁修订版,以包括逻辑复制消息格式文档中使用的实际数据类型。