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

发布于 2021-02-15 作者:PWN
PWN

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

安全版本 13.2、12.6、11.11、10.16、9.6.21 和 9.5.25 已发布。请尽快升级。9.2.25 是 PostgreSQL 9.5 的最后一个版本。https://postgresql.ac.cn/about/news/postgresql-132-126-1111-1016-9621-and-9525-released-2165/

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

PostgreSQL 产品新闻

check_pgbackrest 2.0,一个与 Nagios 兼容的 pgBackRest 监控器已发布。https://github.com/dalibo/check_pgbackrest/releases

AGE 0.3.0,一个提供图数据库功能的 PostgreSQL 扩展已发布。https://github.com/apache/incubator-age/releases/tag/v0.3.0.rc0-incubating

二月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

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

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

已应用的补丁

Heikki Linnakangas 推送了

  • 修复分区上约束违反错误的权限检查。如果跨分区 UPDATE 违反了目标分区上的约束,并且新分区中的列与父分区中的物理顺序不同,则错误消息可能会显示用户没有 SELECT 权限的列。类似的错误已在提交 804b6b6db4 中修复。该错误的原因是 ExecBuildSlotValueDescription() 函数的调用者在构造修改的列列表时感到困惑。如果元组是从父级路由的,我们将元组转换为父级的格式,但修改的列列表直接从子级的 RTE 条目中获取。ExecUpdateLockMode() 也有类似的问题。这导致对哪些列是键列的混淆,导致在使用 INSERT ON CONFLICT UPDATE 更新行时,对外键引用的表采取错误的元组锁定。为该极端情况添加了一个新的隔离测试。使用此补丁,对于范围表中没有条目的分区,不再设置 ri_RangeTableIndex 字段。以前,它被设置为父关系的 RTE 条目,但这令人困惑。注意:这修改了 ResultRelInfo 结构,将 ri_PartitionRoot 字段替换为 ri_RootResultRelInfo。这有点冒险,因为这会破坏任何访问该字段的扩展。ri_RangeTableIndex 不为分区设置的更改也可能破坏扩展。至少 FDW 可以看到 ResultRelInfos,并且此补丁需要对 postgres_fdw 进行小的更改。不过,这似乎是最不坏的选择。我不认为这些字段在扩展中被广泛使用;我不认为有 FDW 使用 FDW“直接更新”API,除了 postgres_fdw。如果有,您将收到编译错误,因此希望能够快速捕获。回溯到 11,其中添加了对跨分区 UPDATE 和分区表上的唯一索引的支持。审核人:Amit Langote 安全:CVE-2021-3393 https://git.postgresql.org/pg/commitdiff/6214e2b2280462cbc3aa1986e350e167651b3905

Tom Lane 推送了

  • 修复了连接别名的列级 SELECT 权限的处理错误。scanNSItemForColumn、expandNSItemAttrs 和 ExpandSingleTable 在处理连接 ParseNamespaceItem 时会将错误的 RTE 传递给 markVarForSelectPriv:它们会传递连接 RTE,而我们需要标记的是连接列来自的基本表。最终结果是未正确填充基本表的 selectedCols 位图,从而导致低估查询读取的列集。执行器仍然会坚持至少有一个可选列;但是,通过一个精心设计的查询,拥有表中仅一个列的 SELECT 权限的用户仍然可以读取其所有列。为了修复此问题,使 markRTEForSelectPriv 为自己获取正确的 RTE,忽略调用者传递的可能不匹配的 RTE。稍后,我们将删除一些现在未使用的 RTE 参数,但这会带来 API 中断的风险,因此我们不会在已发布的版本中执行此操作。此问题由提交 9ce77d75c 引入,因此回溯到引入该问题的 v13。感谢 Sven Klemm 报告此问题。安全:CVE-2021-20229 https://git.postgresql.org/pg/commitdiff/c028faf2a62ce476c8d689a33b12471dc98b80f2

  • 删除 markVarForSelectPriv() 中不再使用的 RTE 参数。在 c028faf2a 之后,不再需要此参数。我将其排除在该补丁之外,因为 API 更改在已发布的版本中是不希望的;但是没有理由不在 HEAD 中执行此操作。https://git.postgresql.org/pg/commitdiff/d4c746516b8b4eb0bf993e3729ccc04d1febdb1e

  • 通过使用 strtoint() 而不是 strtol() 来简化 jsonfuncs.c 代码。显式测试 INT_MIN 和 INT_MAX 不是特别好的风格;它很繁琐,并且在 int 和 long 宽度相同的机器上可能会引发无用的编译器警告。我们发明 strtoint() 正是为了这种用法,所以请改用它。在此时,删除对 strtoint-succeed 的测试方式的无意义变化。此外,避免尝试否定 INT_MIN;考虑到结果被隐式转换为 uint32,这可能会起作用,但我认为它在名义上是未定义的行为。根据 Ranier Vilela 的抱怨,尽管这不是他提出的补丁。讨论: https://postgr.es/m/CAEudQAqge3QfzoBRhe59QrB_5g+NmQUj2QpzqZ9Nc7QepXGAEw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/69036aafb9a8f425fb489125b5075ba7719d20d0

  • 删除 ECPGconnect() 中已失效的代码,并改进文档。ECPGconnect() 中旨在允许指定 Unix 套接字目录路径而不是端口的段自其提交以来从未执行过,大约在二十年前;前面的 strrchr() 已经找到了最后一个冒号,因此不可能有另一个冒号。对此缺乏抱怨无疑与没有用户文档建议这是可能的事实有关。与其尝试修复它,不如删除不可访问的代码,而是记录以何种方式工作来编写套接字目录路径,即将其指定为“host”选项。为了支持这一点,再次尝试阐明 ECPG 连接目标的语法文档,特别是记录哪些内容被解析为标识符以及在何处使用双引号。重新排列一些看起来顺序不佳的内容,并修复一些小的文档错误。Kyotaro Horiguchi,根据 Shenhao Wang 的抱怨(文档更改主要由我完成)讨论: https://postgr.es/m/ae52a416bbbf459c96bab30b3038e06c@G08CNEXMBPEKD06.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/62535cae9723afc48173ba1be65f1c7491813fc2

  • 避免在具有长固定前缀的 regex_selectivity() 中除以零。给定一个具有非常长的固定前缀(接近 500 个字符)的正则表达式模式,pow(FIXED_CHAR_SEL, fixed_prefix_len) 的结果可能会下溢为零。通常,前面的选择性计算也会下溢,因此我们会计算 0/0 并得到 NaN。在已发布的版本中,这会导致稍后的断言失败。这不会在 HEAD 中发生,原因我尚未探索,但这肯定仍然是一个错误。为了修复此问题,只需在 pow() 结果为零时跳过除法,这样我们(很可能)会返回零选择性估计。在“sel”尚未下溢的极端情况下,也许这不是可取的,但我不太确定这种情况值得花费大量精力。regex_selectivity_sub() 的结果无论如何都不值得在其上写入电子 :-( 根据 Alexander Lakhin 的报告。回溯到所有受支持的版本。讨论: https://postgr.es/m/6de0a0c3-ada9-cd0c-3e4e-2fa9964b41e3@gmail.com https://git.postgresql.org/pg/commitdiff/ae4867ec749671dadb5eb49a1158ded9b8ca0b29

  • 调整对 no_sanitize("alignment") 支持的编译器版本截止值。Buildfarm 结果表明,gcc 直到 7.x 都会为此构造产生恼人的警告(并且,大概也不会做正确的事情)。clang 似乎对我们拥有的截止值没有问题。讨论:https://postgr.es/m/CAPpHfdsne3%3DT%3DfMNU45PtxdhSL_J2PjLTeS8rwKnJzUR4YNd4w%40mail.gmail.com 讨论:https://postgr.es/m/475514.1612745257%40sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ad2ad698ac16f36a9784bc98f312cf5b5266c6aa

Peter Geoghegan 推送了

Michaël Paquier 推送了

Fujii Masao 推送了

  • 在 pg_locks 中显示进程开始等待锁的时间。此提交在 pg_locks 视图中添加了新的列 "waitstart"。如果锁未被持有,此列报告服务器进程开始等待锁的时间。此信息很有用,例如,在检查等待锁的时间量时,可以通过从当前时间中减去 pg_locks 中的 "waitstart" 来计算,并识别进程正在等待很长时间的锁。此功能使用死锁超时计时器获得的当前时间作为 "waitstart"(即此进程开始等待锁的时间)。由于新获取当前时间可能会导致开销,我们重用已获取的时间以避免该开销。请注意,更新 "waitstart" 时不持有锁表的 partition lock,以避免额外的锁获取带来的开销。这可能会导致在等待开始后很短的时间内,即使 "granted" 为 false,pg_locks 中的 "waitstart" 也变为 NULL。这在实践中是可以接受的,因为我们可以假设用户可能会在长时间等待锁时查看 "waitstart"。增加目录版本。作者:Atsushi Torikoshi 审核人:Ian Lawrence Barwick, Robert Haas, Justin Pryzby, Fujii Masao 讨论:https://postgr.es/m/a96013dc51cdc56b2a2b84fa8a16a993@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/3b733fcd04195399db56f73f0616b4f5c6828e18

  • 还原 “在 pg_locks 中显示进程开始等待锁的时间。”。这还原了提交 3b733fcd04195399db56f73f0616b4f5c6828e18。根据构建农场成员 prion 和 rorqual。https://git.postgresql.org/pg/commitdiff/890d2182a2c425aaa80f9bf9f7116d31e0c6538e

Amit Kapila 推送了

  • 使 pg_replication_origin_drop 对并发删除安全。目前,我们从名称中获取源 ID,然后通过在 ReplicationOriginRelationId 上获取 ExclusiveLock 来删除源。因此,两个并发会话可以同时从名称中获取 ID,然后当它们尝试删除源时,其中一个会话将获得 “tuple concurrently deleted” 或 “cache lookup failed for replication origin ..”。为了防止这种竞争条件,我们在锁下执行整个操作。这避免了对 replorigin_drop() API 的需求,我们已经将其删除,因此如果任何扩展作者正在使用它,他们需要改为使用 replorigin_drop_by_name。请参阅它在 pg_replication_origin_drop() 中的用法。作者:Peter Smith 审核人:Amit Kapila, Euler Taveira, Petr Jelinek 和 Alvaro Herrera 讨论:https://postgresql.ac.cn/message-id/CAHut%2BPuW8DWV5fskkMWWMqzt-x7RPcNQOtJQBp6SdwyRghCk7A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/cd142e032ebd50ec7974b3633269477c2c72f1cc

  • 允许在逻辑复制中进行表同步期间的多个事务。对于逻辑复制中的初始表数据同步,我们使用单个事务复制整个表,然后将流中的位置与主应用工作进程同步。这种方法有多个缺点:(a) 如果在 tablesync 工作进程和应用工作进程之间同步 WAL 位置时出现任何错误(网络中断、数据库操作中的错误等),我们必须再次执行整个复制操作;对于大型复制,这将是繁重的,(b) 在同步阶段(我们可以在其中接收来自多个事务的 WAL)中使用单个事务将存在超出 CID 限制的风险,(c) 在整个同步完成之前,该槽将一直持有 WAL,因为我们直到最后都不会提交。此补丁通过允许在 tablesync 阶段进行多个事务来解决上述所有缺点。初始复制在单个事务中完成,之后,我们在接收时提交每个事务。为了允许在任何错误或崩溃后进行恢复,我们使用永久槽和来源来跟踪进度。一旦我们完成表的同步,槽和来源将被删除。如果用户执行 DROP SUBSCRIPTION .. 或 ALTER SUBSCRIPTION .. REFRESH 并且某些表同步仍未完成,我们也会删除 tablesync 工作进程的槽和来源。ALTER SUBSCRIPTION ... REFRESH PUBLICATION 和 ALTER SUBSCRIPTION ... SET PUBLICATION ... 带有 refresh 选项为 true 的命令不能在事务块内执行,因为它们现在可以删除我们没有回滚功能的槽。这也将为订阅者端 2PC 事务的逻辑复制开辟道路。以前,我们无法做到这一点,因为需要在 tablesync 工作进程中维护单个事务。由于目录(pg_subscription_rel)中的状态更改,增加了目录版本。作者:Peter Smith, Amit Kapila 和 Takamichi Osumi 审核人:Ajin Cherian, Petr Jelinek, Hou Zhijie 和 Amit Kapila 讨论:https://postgr.es/m/CAA4eK1KHJxaZS-fod-0fey=0tq3=Gkn4ho=8N4-5HWiCfu0H1A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ce0fdbfe9722867b7fad4d3ede9b6a6bfc51fb4e

  • 修复提交 ce0fdbfe97 添加的订阅测试。我们要测试事务块中不允许的 Alter Subscription 的变体,但是为此,我们不需要创建一个尝试连接到发布者的订阅。因此,此测试没有问题,但最好允许此类测试在 wal_level = minimal 和 max_wal_senders = 0 的情况下运行,以使其与其他测试保持一致。由构建农场报告。作者:Amit Kapila 审核人:Ajin Cherian 讨论:https://postgr.es/m/CAA4eK1Lw0V+e1JPGHDq=+hVACv=14H8sR+2eJ1k3PEgwKmU-jQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/c8b21b0378141948a2dc0ddde6f57407321787ea

Peter Eisentraut 推送了

Magnus Hagander 推送了

Alexander Korotkov 推送了

Bruce Momjian 推送了

待处理的补丁

唐海英提交了另一个补丁修订版,以支持在使用 set/reset/show 时,psql 中大写输入的制表符补全。

Pavel Borisov 提交了三个补丁修订版,以使 amcheck 检查 btree 索引的 UNIQUE 约束。

Vigneshwaran C 提交了另外三个补丁修订版,以使 libpq 连接参数“target_session_attrs”支持新值:read-only、primary、standby 和 prefer-standby。

Iwata Aya 提交了另外两个补丁修订版,以将跟踪添加到 libpq。

Amit Langote、Greg Nancarrow 和 Hou Zhijie 交换了补丁,以实现 INSERT ... SELECT 的并行执行。

Scott Mead 发送了另一个补丁修订版,以使自动清理 (autovacuum) 动态降低 cost_limit 和 cost_delay。

Matthias van de Meent 和 Josef Šimánek 交换了补丁,以增强 COPY 的进度报告。

Heikki Linnakangas 和 John Naylor 交换了补丁,以使用 SIMD 指令加速 utf-8 校验。

Mark Rofail 和 Joel Jacobson 交换了补丁,以实现外键数组。

Amit Langote 发送了另一个补丁修订版,用于设置 ForeignScanState.resultRelInfo 并延迟初始化结果关系信息。

Peter Eisentraut 发送了一个补丁,用于添加例程使用信息模式表。

Heikki Linnakangas 发送了另一个补丁修订版,用于为编码转换函数添加 'noError' 参数,并使用该参数以较大的块执行 COPY FROM 的编码转换/验证。

Alexey Bashtanov 发送了一个补丁,用于添加 bit_xor 聚合函数。

Daniel Gustafsson 发送了另一个补丁修订版,以使 libpq 的 TLS 实现可以使用 NSS。

Jacob Champion 发送了另外两个补丁修订版,用于记录来自所有身份验证后端的已验证身份。

Kyotaro HORIGUCHI 和 Dilip Kumar 交换了补丁,以提供一个获取恢复暂停状态的新接口。

Tom Lane 发送了一个补丁,禁止将一些容易出错的字符用作自定义 GUC 的名称。

Nathan Bossart 发送了一个补丁,以扩大堆内元组 (HOT) 优化的范围,使其在更新索引时更加谨慎,只更新实际更改了索引值的索引。在此之前,HOT 只能在完全没有索引的列上工作,因为另一种选择是更新所有索引,而不管其中的任何内容是否实际更改。

Peter Geoghegan 发送了三个补丁修订版,用于在已删除的 nbtree 页面中使用 64 位 XID,并将 pages_newly_deleted 添加到 VACUUM VERBOSE。

Takayuki Tsunakawa 发送了另一个补丁修订版,用于在目标表具有远程分区时加速 COPY FROM。

Justin Pryzby 发送了另一个补丁修订版,以使 CLUSTER 可以在分区表上工作。

Stephen Frost 发送了另一个补丁修订版,以便在启用 track_io_timing 时,将 I/O 计时包含在 autovacuum 和 autoanalyze 的日志中,以及 autoanalyze 的读取速率和脏数据速率。

Peter Smith 发送了另外两个补丁修订版,用于实现两阶段事务的逻辑解码。

Andy Fan 发送了一个补丁,在 RelOptInfo 中引入 notnullattrs 字段,以指示当前查询中哪些属性是非空的。

Etsuro Fujita 发送了另外两个补丁修订版,用于在 PostgreSQL FDW 节点上实现同步追加。

Ranier Vilela 和 Michaël Paquier 交换了补丁,通过为 pg_cryptohash_final 添加长度参数来修复 pg_cryptohash_final 中可能存在的越界访问。

Dilip Kumar、Robert Haas 和 Justin Pryzby 交换了补丁,为表添加自定义压缩方法。

Michail Nikolaev 发送了另一个补丁修订版,以在备用服务器上添加对索引 LP_DEAD 提示位的完全支持。

Justin Pryzby 发送了一个补丁,以润色 14 的文档。

Peter Eisentraut 发送了另一个补丁修订版,用于为 SQL 函数实现 SQL 标准函数体。

Peter Eisentraut 发送了一个补丁,为 bytea LIKE 运算符添加测试。

Fujii Masao 发送了一个补丁,旨在通过将 written_lsn 的赋值移动到可以更好地使用 pg_atomic_read_u64(&WalRcv->writtenUpto) 的位置来修复一个表现为 ERROR: invalid spinlock number: 0 的错误。

Tomáš Vondra 发送了另一个补丁修订版,以实现 BRIN 多范围索引。

Anastasia Lubennikova 发送了另一个补丁修订版,旨在修复一个表现为 pg_upgrade 在使用非标准 ACL 时失败的错误。

Melanie Plageman 发送了另一个补丁修订版,用于更新并行哈希连接的注释和阶段命名。

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

Zhihong Yu 和 Ranier Vilela 交换了补丁,以修复 src/backend/replication/logical/reorderbuffer.c 中可能存在的空指针解引用。

Tom Lane 发送了两个补丁修订版,用于为正则表达式发明彩虹弧,并在匹配类似于 "."".*" 或其变体的子 NFA 时短路逐字符扫描,即它将匹配任意数量字符的任何序列。

Thomas Munro 发送了一个补丁,尝试在 WAL 记录之间保留缓冲区,如果成功,则可以将查找、固定、锁定、解锁和取消固定这些缓冲区的成本分摊到多个执行中。

Erik Rijkers 和 Amit Kapila 交换了补丁,以修复最近的逻辑复制中断问题。

Bharath Rupireddy 发送了一个补丁,用于删除 MakeSingleTupleTableSlot 中不必要的 MakeTupleTableSlot 包装。

Li Japin 发送了另一个补丁修订版,以实现 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION。

Noah Misch 发送了一个补丁,用于添加公共模式默认 ACL。