PostgreSQL 每周新闻 - 2021 年 6 月 21 日

发布于 2021-06-21,作者 PWN
PWN

PostgreSQL 每周新闻 - 2021 年 6 月 21 日

pgMustard 4 发布,这是一个用于“explain analyze”的用户界面,提供性能提示,已发布

psycopg2 2.9.0 发布,这是一个用于 PostgreSQL 的 Python 连接器,已发布

pgAdmin4 5.4 发布,这是一个用于 PostgreSQL 的 Web 和原生 GUI 控制中心,已发布

本周人物

PostgreSQL 产品新闻

六月份的 PostgreSQL 工作

职位

PostgreSQL 新闻

PostgreSQL 星球:星球

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

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

已应用补丁

Tom Lane 推送了

  • 解决较新版本的 mktime() 的可移植性问题。最近的 glibc 版本在 tm_isdst 与当前时区不一致时会使 mktime() 失败;特别是当区域为 UTC 时,tm_isdst = 1 时会失败。(这似乎与 POSIX 规定的对 struct tm 的其他字段的“不正确”值的处理方式非常不一致,所以如果你问我,这是一个错误,但我敢打赌他们会说这是故意的。)据观察,这会导致在 pg_restore’ing 从不同时区创建的存档时出现表面问题。为了修复此问题,请使用存档中的字段值执行 mktime(),如果失败,请再次尝试 tm_isdst = -1。这将导致结果与原始区域的 UTC 偏移量差异,但这之前也是如此。这不是很关键,因为我们不对结果做任何处理,除了可能打印出来。(总有一天我们应该清除所有这些逻辑,并在存档中记录一个标准格式的时间戳。但这对于向后移植的错误修复来说是不可行的。)此外,通过让 initdb 的 build_time_t() 设置 tm_isdst = -1 而不是 0 来保护我们对 mktime() 的唯一其他使用。这种情况只可能在全年都使用 DST 的区域中出现问题;但我认为确实存在一些,或者将来可能会存在。根据 Wells Oliver 的报告。向后移植到所有支持的版本,因为任何版本都可能需要在较新的 glibc 中运行。讨论: https://postgr.es/m/CAOC+FBWDhDHO7G-i1_n_hjRzCnUeFO+H-Czi1y10mFhRWpBrew@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f807e3410fdfc29ced6590c7c2afa76637e001ad

  • 删除孤立的预期结果文件。这应该在 43e084197 中删除,它删除了相应的规范文件。在摆弄隔离测试器时注意到。https://git.postgresql.org/pg/commitdiff/ffbe9dec13599fa786ea6567df1c6a3f3ee3c673

  • 更新变体预期结果文件。这应该在 d2d8a229b 中更新,但被忽略了。根据添加它的 31a877f18,此文件旨在显示在 default_transaction_isolation = serializable 下获得的结果。我们已经在其他隔离测试中基本上失去了这一目标,但只要我们拥有这个测试,就应该正确。在摆弄隔离测试器时注意到。https://git.postgresql.org/pg/commitdiff/0a1e80c5c4f094087257fc4284a87e0bc7bca591

  • 删除另一个孤立的预期结果文件。aborted-keyrevoke_2.out 在添加时(在提交 0ac5ad513 中)显然需要处理可序列化事务模式的情况。但是,可序列化模式下的输出实际上与常规的 aborted-keyrevoke.out 文件匹配,并且据我所知,这种情况已经持续了很长时间。没有必要继续拖着这个变体。https://git.postgresql.org/pg/commitdiff/f6352a0d4e437ac8bc266f77df22d064592056c9

  • 更新另一个变体预期结果文件。这应该在 533e9c6b0 中更新,但被忽略了。鉴于没有投诉,我不会费心向后移植。https://git.postgresql.org/pg/commitdiff/d3c878499c9d639ff06e0664d06b8c731e30c2fc

  • 改进某些与复制相关的代码中的 SQLSTATE 报告。我最初的目标是在 walrcv_connect() 失败时报告 ERRCODE_CONNECTION_FAILURE,但在我环顾四周后,我意识到编写此代码的人认为错误代码是完全可选的。这不是我对我们项目政策的理解。因此,请确保在每个 ereport 中都提供错误代码,该代码 (a) 是 ERROR 或更高级别的,并且 (b) 并不是内部逻辑错误。同时修复一些非常可疑的现有错误代码分配。虽然这不符合政策,但它在很大程度上也是表面上的,因为这些情况很少会报告给应用程序。所以我认为没有必要向后移植。讨论:https://postgr.es/m/2189704.1623512522@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6b787d9e32005867ee3660d1ea20f447810a403d

  • 修复 ExecuteQuery 中出现错误后 plancache refcount 泄漏。当将 plancache 中的计划填充到 Portal 中时,不应在 GetCachedPlan 和 PortalDefineQuery 之间冒着抛出错误的风险;如果发生这种情况,GetCachedPlan 递增的计划 refcount 将泄漏。我在 9dbf2b7d7 中重构代码时设法打破了此规则。除了某些内存泄漏外,没有其他可见的后果,而且由于没有人很可能连续多次触发相关的错误条件,因此我们没有注意到这一点也不足为奇。尽管如此,这是一个错误,因此请重新排列操作顺序以消除风险。在寻找更好的错误修复 #17053 时注意到。这个错误相当古老,因此请向后移植到所有支持的分支。https://git.postgresql.org/pg/commitdiff/131ea3e908d3c97a2fe1ab25cce5046dd5cb905f

  • 集中用于保护性复制实用程序语句的逻辑。在“简单查询”代码路径中,对于实用程序语句的解析分析或执行来说,在语句的节点树上涂写是没问题的,因为之后会被丢弃。但是,如果节点树在计划缓存中,那就不好,因为它会损坏后续的执行。到目前为止,我们通过让各个实用程序语句函数在要修改树时应用 copyObject() 来处理这个问题。但这很容易遗漏。Charles Samborski 的错误 #17053 表明 CREATE/ALTER DOMAIN 没有收到此备忘录,并且如果从计划缓存重复执行可能会崩溃。在后向分支中,我们只会为此应用一个狭窄的创可贴,但在 HEAD 中,更谨慎的做法是采用更原则性的修复方法,以消除将来出现其他类似错误的可能性。因此,让我们将执行 copyObject 的责任从其子级提升到 ProcessUtility 中,从而确保它发生在所有实用程序语句类型中。同时,修改 ProcessUtility 的 API,以便其调用者可以告诉它是否需要复制步骤。事实证明,在所有情况下,直接调用者都知道节点树是否是临时的,因此这不会涉及大量的代码改动。这样,虽然由于有时会复制无论如何都不会变异的节点树而在从缓存执行的代码路径中损失了一点,但我们在简单查询代码路径中通过不复制临时的节点树而获得了一些好处。复杂到复制成本很高的语句几乎肯定是无论如何都必须复制的语句,因此缓存代码路径中的损失不应该很大。(请注意,整个问题仅适用于实用程序语句。可优化的语句没有这个问题,因为我们很久以前就使执行器将计划树视为只读。也许有一天我们会使实用程序语句执行也这样做,但我不会抱太大希望。)讨论:https://postgr.es/m/931771.1623893989@sss.pgh.pa.us 讨论:https://postgr.es/m/17053-3ca3f501bbc212b4@postgresql.org https://git.postgresql.org/pg/commitdiff/7c337b6b527b7052e6a751f966d5734c56f668b5

  • 改进 pgbench 中的版本报告。提交 547f04e73 导致 pgbench 开始打印其版本号,这似乎是个好主意,但还需要做更多工作:* 如果服务器版本不同,也打印服务器版本号。* 打印 PG_VERSION 字符串,而不是一些重建的近似值。此补丁复制了 psql 用于相同目的的经过良好测试的代码。讨论:https://postgr.es/m/1226654.1624036821@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/84bee9610965331d5110971d8de390a5bbe2effc

  • 修复具有重复 polroles 条目的 DROP OWNED BY 的错误行为。通常,pg_policy.polroles 数组不会多次列出相同的角色;但 CREATE POLICY 不会阻止这种情况。如果我们对一个多次列出的角色执行 DROP OWNED BY,RemoveRoleFromObjectPolicy 会遭受断言失败或遇到自更新元组错误。重写它以正确处理重复条目,并添加 CommandCounterIncrement 调用以防止另一个问题。根据讨论,这里应该进行其他清理,但这似乎是最低限度的基本修复。根据来自 Alexander Lakhin 的错误 #17062。它一直被破坏,因此请向后移植到所有支持的分支。讨论:https://postgr.es/m/17062-11f471ae3199ca23@postgresql.org https://git.postgresql.org/pg/commitdiff/d21fca084356946664bfce19d66d2df2bb873cbd

  • 为 v14 中添加的 libpq 功能提供功能测试宏。我们收到一个请求,要求提供一种在编译时测试新管道功能可用性的方法。更一般地说,通过 #ifdef 测试所有新的 libpq API 功能似乎是个好主意。人们一直在为此使用 pg_config.h 中的版本;但这更可能表示服务器版本,而不是 libpq 版本,在它们不同的越来越常见的情况下。如果 libpq-fe.h 本身是关于它提供哪些功能的真实来源,则更安全。因此,建立一项政策,即从 v14 开始,当我们在那里添加新的 API 时,我们将向 libpq-fe.h 添加一个适当的功能存在宏。(追溯应用此政策似乎没有多大意义,但对于 v14 来说还为时不晚。)Tom Lane 和 Alvaro Herrera,根据 Boris Kolpackov 的建议。讨论:https://postgr.es/m/boris.20210617102439@codesynthesis.com https://git.postgresql.org/pg/commitdiff/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5

  • 由提交 f61db909d 添加的稳定测试用例。Buildfarm 的成员 ayu 和 tern 有时会为此查询显示与预期不同的计划。我之前无法重现这种情况,但今天我终于意识到发生了什么。如果存在并发打开的事务(可能是 buildfarm 中的自动清理运行,但也可能是手动安排的),那么几行之前的 DELETE 删除的行的索引条目不会立即被清除,导致规划器对 ft2.c1 的极值估计发生变化,这足以使“c1 > 1100”的行数估计发生变化,从而将连接计划从嵌套循环更改为哈希。为了解决这个问题,将查询条件更改为“c1 > 1000”,使得无论是否存在并发打开的事务,哈希计划都是首选。由于此 UPDATE 被定制为无操作,因此其他任何内容都不会改变。报告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-09%2022%3A45%3A48 报告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-13%2022%3A38%3A18 报告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=tern&dt=2021-06-20%2004%3A55%3A36 https://git.postgresql.org/pg/commitdiff/5843659d091bfb6f2c60e010ea1fd00e55ee6ada

Michaël Paquier 推送

Bruce Momjian 推送

Álvaro Herrera 推送

Noah Misch 推送

Amit Kapila 推送

Alexander Korotkov 推送

Peter Geoghegan 推送

  • 从 VACUUM 状态中删除不需要的字段。错误修复提交 5fc89376 有效地使 vacuumlazy.c 全局状态结构中的 lock_waiter_detected 字段成为 lazy_truncate_heap() 拥有的私有状态。通过使用局部变量替换结构字段来完成此操作。https://git.postgresql.org/pg/commitdiff/958cfbcf2dd338e3179c2d8a35f48bde020eba60

  • 支持禁用 VACUUM 的索引绕过功能。通用化 INDEX_CLEANUP VACUUM 参数(以及相应的 reloption):使其成为一个三值布尔参数。现在它公开了第三个选项 “auto”。 “auto” 选项(现在是默认选项)启用了提交 1e55e7d1 添加的“绕过索引清理”优化。“VACUUM (INDEX_CLEANUP TRUE)” 被重新定义为再次使 VACUUM 简单地执行任何需要的索引清理,而不管在目标堆关系的第一遍扫描中遇到了多少死元组(除非死元组数量恰好为零)。这为用户提供了一种选择退出“绕过索引清理”优化的方法,如果出于任何原因证明有必要的话。它也被 PostgreSQL 开发人员预期会不时地用作测试选项。“VACUUM (INDEX_CLEANUP FALSE)” 的作用与以前相同:它强制禁用索引清理和索引清除。预计在 PostgreSQL 中不会经常使用。

  • 提交 1e55e7d1 添加的故障保护机制以更简单的方式解决了相同的问题。现在可以将 INDEX_CLEANUP 视为测试和兼容性选项。作者:Peter Geoghegan pg@bowt.ie 审核人:Masahiko Sawada sawada.mshk@gmail.com 审核人:Justin Pryzby pryzby@telsasoft.com 讨论:https://postgr.es/m/CAH2-WznrBoCST4_Gxh_G9hA8NzGUbeBGnOUC8FcXcrhqsv6OHQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3499df0dee8c4ea51d264a674df5b5e31991319a

Andrew Dunstan 推送

Heikki Linnakangas 推送

  • 修复了关于 WAL 文件查找位置的过时注释。自从提交 c24dcd0cfd 以来,我们一直在使用 pg_pread() 来读取 WAL 文件,这不会改变查找位置(除非我们回退到 src/port/pread.c 中的实现)。相应地更新注释。回溯到:12,我们开始使用 pg_pread() 的版本 https://git.postgresql.org/pg/commitdiff/d0303bc8d2670d11c9df9220aa08a2c33529e100

  • 整理 GetMultiXactIdMembers() 的错误行为。其中一个错误路径使 *members 未初始化。这不是一个实际的错误,因为大多数调用者在函数返回 -1 时不会查看 *members,但是让我们保持整洁。一个调用者 heap_lock_tuple() 会执行“if (members != NULL) pfree(members)”,但 AFAICS 它永远不会传递无效的“multi”值,因此它不应该到达该错误情况。调用者在他们的期望中也有些不一致。如果“members”不是 NULL,heap_lock_tuple() 会 pfree 'members' 数组,如果“nmembers >= 0”,其他调用者会 pfree() 它,如果“nmembers > 0”,其他调用者会 pfree() 它。这也不是一个实际的错误,因为该函数永远不应返回 0,但是为此添加一个断言以使其更清晰。我保留了调用者。我还移动了设置 *nmembers 的行。它之前并没有错,但我喜欢在 'return' 语句旁边执行此操作,以明确表示它始终在返回时设置。此外,删除 ereport(ERROR) 之后的 1 个无法到达的 return 语句,以简洁起见,并与紧随其后的类似 if 代码块保持一致。作者:Greg Nancarrow,并由我进行了其他更改。回溯到:9.6,所有受支持的版本 https://git.postgresql.org/pg/commitdiff/d24c5658a80c8f5037e9e1948de311d3f3350f12

Tomáš Vondra 推送

  • 修复了使用 FDW 批处理将数据复制到槽中的问题。提交 b676ac443b 优化了使用批量插入到外表中的元组槽的处理,以便只初始化槽一次,并将其重用于所有批处理。但是,数据仅在初始化后才被复制到槽中,从而在重用槽时插入重复的值。通过将 ExecCopySlot 移到 init 分支之外来修复此问题。现有的 postgres_fdw 测试未能捕获此问题,原因是将数据插入到没有唯一索引的外表中,然后仅检查插入的行数。这增加了一个新的测试,其中包含唯一索引和对插入值的检查。报告者:Alexander Pyhalov 讨论:https://postgr.es/m/7a8cf8d56b3d18e5c0bccd6cd42d04ac%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/99cea49d6525e30bc3768e4ffb95377e7584dea1

藤井正雄 推送

待处理的补丁

Amit Khandekar 发送了一个正在开发的补丁,以允许在工作进程中使用子事务。

Bertrand Drouvot 发送了另一个允许在备用服务器上进行逻辑解码的补丁修订版。

Thomas Munro 发送了另一个补丁修订版,以对仅索引扫描使用元组级 SIREAD 锁,并在可能的情况下跳过 btree 页面上的 SIREAD 锁。

Andrew Dunstan 发送了另一个补丁修订版,旨在修复在更改带有默认值的外表列的类型时表现为分段错误的错误。

Tomáš Vondra 发送了另一个补丁修订版,以使用扩展统计信息来改进连接估计。

Bharath Rupireddy 发送了另一个补丁修订版,以删除 pg_wait_for_backend_termination()。

Fabien COELHO 发送了另一个补丁修订版,以将 psql 中的 echo 系统整合到它自己的函数中。

Yugo Nagata 和 Fabien COELHO 交换了 pgbench 的补丁,以确保仅在请求时才计算和存储 conn_duration。

Jehan-Guillaume de Rorthais 发送了一个 PoC 补丁,当 log_statement_stats=on 时,将等待事件跟踪到日志文件。

Yugo Nagata 和 Fabien COELHO 交换了补丁,以避免由于跳过的事务而导致 pbgench 中出现卡住的情况。

Jacob Champion 和 Daniel Gustafsson 交换了补丁,以支持 NSS 作为 libpq TLS 后端。

Dilip Kumar 和 Amit Langote 交换了补丁,旨在修复表现为使用 toast 泄漏内存的推测性插入解码的错误。

Yugo Nagata 和 Fabien COELHO 交换了补丁,旨在修复 pgbench 中表现为负“初始连接时间”的错误。

大隅隆道和 Amit Kapila 交换了补丁,以修复锁定 [用户] 目录表、2PC 和逻辑复制之间的不协调。

Justin Pryzby 和 Michaël Paquier 交换了补丁,以添加更多用于 WAL 压缩的选项。

Ranier Vilela 发送了另一个补丁修订版,以使对 ProcArray 的访问更加高效。

David Fetter 发送了一个补丁,以便在回归测试中在适当的地方使用单数形式。

Alexander Pyhalov 发送了另一个补丁修订版,以实现 case 表达式下推。

Ranier Vilela 发送了一个补丁,以修复 ecpg 中未以 null 结尾的缓冲区。

Fabien COELHO 和 Yugo Nagata 交换了补丁,旨在修复表现为 pgbench 日志记录中出现错误的错误。

Dmitry Dolgov 发送了两个 ArrayExpr 中防止每个元素被打乱的补丁修订版。

Dilip Kumar 发送了一个补丁,以使 CREATE DATABASE 完全 WAL 日志记录,因此不再强制执行该命令进行检查点操作。

Ajin Cherian 发送了另一个补丁修订版,以添加一个选项,用于在 CREATE_REPLICATION_SLOT 命令中设置两阶段,并支持 pg_recvlogical 中的两阶段解码。

Peter Smith 和 Ajin Cherian 交换了补丁,以支持两阶段事务的逻辑解码。

Daniel Gustafsson 发送了一个补丁,以便在文档中使用更正确和当前的 TLS/SSL 而不是 SSL。

Thomas Munro 发送了另一个补丁修订版,以跟踪共享内存中的关系大小,为 smgrnblocks() 提供无锁快速路径,并将 fifo 更新为 lru 以清除有效的缓存。

Kyotaro HORIGUCHI 发送了另一个补丁修订版,以在 pg_waldump 中的错误中显示更多详细信息。

Tom Lane 发送了一个补丁,以允许在隔离测试器脚本中使用常规标识符。

Matthias van de Meent 发送了另一个补丁修订版,以修复 GetOldestNonRemovableTransactionId 中的一个错误,该错误返回的值与 GlobalVisTestFor(rel) 不一致。此外,lazy_scan_prune 有一个错误的假设,即 GlobalVis*Rels 的 OldestXmin 永远不会 < vacrel->OldestXmin,这是不正确的。现在已经修复了此假设,并且已经记录了这些更改。

Heikki Linnakangas 发送了一个补丁来拆分 xlog.c,因为它变得难以控制。

Thomas Munro 发送了另一个补丁修订版,以制作和使用 qsort 模板。

Amit Langote 发送了另外三个补丁修订版,以使用常量分区键跳过分区元组路由。

Jeff Davis 发送了两个补丁修订版,以阐明复制协议的文档。

Tomáš Vondra 发送了一个 PoC 补丁,以使用 count-min 草图进行连接基数估计。

Jeff Davis 发送了另一个补丁修订版,以记录 START REPLICATION 中发生的情况。

Alexander Korotkov 发送了另外三个补丁修订版,以实现多范围的 UNNEST。

Vigneshwaran C 发送了另一个补丁修订版,以添加对 PUBLICATION 的架构级别支持。

Amul Sul 发送了另一个补丁修订版,以实现 ALTER SYSTEM SET READ {WRITE | ONLY}。

Nitin Jadhav 发送了另一个补丁修订版,以实现启动进程进度指示器。

Matthias van de Meent 发送了另一个补丁修订版,以实现和使用索引元组属性迭代,并为 _bt_binsrch* 实现页面级动态前缀截断。

Mark Dilger 提交了两个补丁修订版,用于选择性地在错误时禁用订阅。

Jeff Davis 提交了一个补丁,用于修复启动复制识别系统的问题。

Thomas Munro 提交了另一个补丁修订版,使用定时器实现 snapshot_too_old。

Takashi Menjo 提交了另一个补丁修订版,将 PMEM 上的 WAL 段文件映射为 WAL 缓冲区。

Amit Kapila 提交了另一个补丁修订版,用于实现逻辑复制的行过滤。

Egor Rogov 提交了一个补丁,将范围类型的统计信息包含在 pg_stats 视图中。

Álvaro Herrera 提交了另外两个补丁修订版,为使用活动 walsender 使插槽过时添加了一个测试用例。

Greg Sabino Mullane 提交了另一个补丁修订版,以避免不必要地计算页面校验和。

Noah Misch 提交了一个补丁,以移除 XLogFileInit() 跳过 ControlFileLock 的能力。

David Rowley 提交了另一个补丁修订版,添加了一种具有稳定指针的新哈希表类型。

Thomas Munro 提交了一个补丁,用于调整 LLVM 13 API 的更改。