安全版本 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/
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
https://archives.postgresql.org/pgsql-jobs/2021-02/
Planet PostgreSQL:https://planet.postgresql.org/
PostgreSQL 每周新闻本周由 David Fetter 为您带来
请在太平洋标准时间下午 3:00 前的周日将新闻和公告提交至 david@fetter.org。
Heikki Linnakangas 推送了
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 推送了
更正 pgstattuple B 树页面注释。https://git.postgresql.org/pg/commitdiff/5fd590021d268190e4c8f377370c7e7f1e7d9229
修复 nbtree README 中的过时 FSM 说明。空闲空间映射已使用专用关系分支而不是共享内存段十多年了。https://git.postgresql.org/pg/commitdiff/31c7fb41e26bf03dae231c7165a1a16388b2e366
删除过时的 IndexBulkDeleteResult 统计信息字段。pages_removed 字段不再用于任何目的。自提交 0a469c87 删除旧式 VACUUM FULL 以来,索引不可能在物理上缩小。https://git.postgresql.org/pg/commitdiff/3063eb17593c3ad498ce4e89db3358862ea2dbb6
Michaël Paquier 推送了
向 VACUUM 添加选项 PROCESS_TOAST。此选项控制在运行手动 VACUUM 时是否清理与关系关联的 TOAST 表。已经可以在不处理其主关系的情况下触发对 TOAST 关系的手动 VACUUM,但是对主关系的手动清理始终强制清理其 TOAST 表。这在主关系和 TOAST 关系的膨胀程度或事务年龄差异很大的情况下非常有用。此选项是现有 VACOPT_SKIPTOAST 的扩展,autovacuum 使用该选项来控制是否应跳过 TOAST 关系。此内部标志被重命名为 VACOPT_PROCESS_TOAST,以与新选项保持一致。向 vacuumdb 添加了一个新的选项开关,称为 --no-process-toast。作者:Nathan Bossart 审核人:Kirk Jamison、Michael Paquier、Justin Pryzby 讨论: https://postgr.es/m/BA8951E9-1524-48C5-94AF-73B1F0D7857F@amazon.com https://git.postgresql.org/pg/commitdiff/7cb3048f38e26b39dd5fd412ed8a4981b6809b35
在 REINDEX CONCURRENTLY 操作中保留 pg_attribute.attstattarget。对于索引,可以使用 ALTER INDEX SET STATISTICS 更新 attstattarget。在执行 REINDEX CONCURRENTLY 后,新索引上的此数据会丢失。此字段的更新在旧索引和新索引交换时完成,以便修复可以向后移植。另一种我们可以在长期考虑的方法是更改 index_create(),以便在创建新关系时传递所需的 attstattarget 值,但是,由于这会导致 ABI 中断,因此只能在 HEAD 分支上进行。报告人:Ronan Dunklau 作者:Michael Paquier 审核人:Ronan Dunklau, Tomas Vondra 讨论:https://postgr.es/m/16628084.uLZWGnKmhe@laptop-ronand 向后移植到:12 https://git.postgresql.org/pg/commitdiff/bd12080980297dbc8ae926a3bd5b2ef9cc47932b
简化与 SSL 和 OpenSSL 编译相关的代码。此提交使一些与使用 OpenSSL 和 SSL 进行编译相关的注释和代码更加通用,以便将来更容易添加更多的 SSL 实现。在 libpq 中,一些仅限 OpenSSL 的代码被移动到 USE_OPENSSL 而不是 USE_SSL 下。同时,使 libpq-fe.h 中的注释更加一致。作者:Daniel Gustafsson 讨论:https://postgr.es/m/5382CB4A-9CF3-4145-BA46-C802615935E0@yesql.se https://git.postgresql.org/pg/commitdiff/092b785fad3de3f81355a4b2420aa39a1bc0ccd5
修复 REINDEX CONCURRENTLY 新回归测试中的 ORDER BY 子句。bd12080 中的疏忽。报告人:Justin Pryzby 讨论:https://postgr.es/m/20210210065805.GG20012@telsasoft.com 向后移植到:12 https://git.postgresql.org/pg/commitdiff/4f4726005082c07c004506a1ddfca29896375206
修复 checksum_helper.c 中 SHA256 摘要长度的复制粘贴错误。问题由 87ae969 引入,在处理该区域时注意到。同时,修复周围静态断言中的一些语法错误。https://git.postgresql.org/pg/commitdiff/42d74e0c443760af91875af99d2655c9eb4c40df
文档:在支持的 ALTER 命令中提及 NO DEPENDS ON EXTENSION。此语法由 5fc7039 添加。作者:Ian Lawrence Barwick 讨论:https://postgr.es/m/CAB8KJ=ii6JScodxkA6-DO8bjatsMYU3OcewnL0mdN9geR+tTaw@mail.gmail.com 向后移植到:13 https://git.postgresql.org/pg/commitdiff/8063d0f6f56e53edd991f53aadc8cb7f8d3fdd8f
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 推送了
修复消息缺少复数形式。 https://git.postgresql.org/pg/commitdiff/4ad5611055c8381d6a9b54fc11838418a1f14bc9
pg_dump:添加 const 修饰。向 dump 函数的 info 参数添加 const 修饰,以澄清它们不会修改该参数。附近的其他许多函数会修改它们的参数,因此这有助于稍微澄清这些不同的 API。讨论:https://postgresql.ac.cn/message-id/flat/012d3030-9a2c-99a1-ed2d-988978b5632f%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/64990081504661ff5c04dbf20cc4252be66ab149
为 abbrev(cidr) 添加测试用例。这将特别为 inet_cidr_ntop.c 添加一些良好的测试覆盖率,该文件以前完全没有覆盖。审核人:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgresql.ac.cn/message-id/flat/cb0c4662-4596-dab4-7f64-839c5e8582c8%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/69273c8f88d7e6295ed7b38114969fa3ea03eff2
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。