PostgreSQL 每周新闻 - 2021 年 7 月 25 日

由 PWN 于 2021-07-26 发布
PWN

PostgreSQL 每周新闻 - 2021 年 7 月 25 日

本周人物

奥地利 pgDay 将于 2021 年 9 月 17 日在维也纳美泉宫(Apothekertrakt)举行。https://pgday.at/en/

PostgreSQL 产品新闻

pgSCV 0.7.0,一个兼容 Prometheus 的 PostgreSQL 监控代理和指标导出器,已发布

pg_validate_extugprade 1.0.0beta,一个用于测试扩展升级过程各种组合的工具,已发布

pspg 5.1.0,一个为 PostgreSQL 设计的分页器,已发布。https://github.com/okbob/pspg/releases/tag/5.1.0

Database Lab 2.4,一个用于快速克隆大型 PostgreSQL 数据库以构建非生产环境的工具,已发布:https://gitlab.com/postgres-ai/database-lab/-/releases

七月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

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

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

已应用的补丁

Thomas Munro 推送了

Amit Kapila 推送了

Michaël Paquier 推送了

  • doc:提及 DROP STATISTICS 的 CASCADE/RESTRICT。此语法无效,因为统计信息没有依赖项,但解析器支持它。这与其他 DROP 命令更一致。作者:Vignesh C 讨论:https://postgr.es/m/CALDaNm1LA=yNmzcSfy+0oe6CEAgsxXRf_-UutE3ZncFi8QkFNQ@mail.gmail.com 回溯:10 https://git.postgresql.org/pg/commitdiff/d1216635610a9855a8ec139e55cd852f67d5ee81

  • 修复 pg_receivewal --compress 的 WAL 段打开的一些问题。当使用 --compress 时,如果存储这些文件的存储库中存在具有相同基本名称的部分、未压缩的段,则处理打开新 WAL 段的逻辑会变得模糊。在这种情况下,使用 --compress 将导致代码首先检查非压缩段的存在和大小,然后打开新的压缩、部分段。该代码在大多数平台上都意外地正确工作,构建场已经证明了这一点,除了 bowerbird,其中 gzflush() 可能在此代码路径中失败。无论如何,在创建新的部分、未压缩的段时采用预填充使用的代码路径是错误的,因此让我们修复它。请注意,当用户混合使用有压缩或无压缩的 pg_receivewal 的连续运行时,会存在此问题,正如 ffc9dda 引入的测试所发现的那样。在执行此操作时,这将重构代码,以便需要在 walmethods.c 中了解“.gz”后缀的代码路径从四个减少到一个,从而稍微简化了新压缩方法的引入。这解决了第二个问题,即为意外故障生成的日志消息不会显示所涉及的压缩段名称,这会让人感到困惑,而是打印非压缩等效项的名称。由 Georgios Kokolatos 报告 讨论:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz 回溯:10 https://git.postgresql.org/pg/commitdiff/7fbe0c8c4d4fe429ee1d6383706ea5ccb0f639d3

  • 重新启用 Windows 上 ZLIB 的 pg_receivewal 的 TAP 测试。这是对 6cea447 的还原,它暂时禁用了 Windows 上的这些测试,原因是 bowerbird 出现故障,在刚刚打开的压缩和部分段上执行 gzflush() 会失败。现在应该通过 7fbe0c8 来解决此问题,因此让我们看看构建场对于 Windows 上的这些测试有何评论。讨论:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz https://git.postgresql.org/pg/commitdiff/91d395f47aa92849b2556b1a4d6bc1ff34121a30

  • 禁用 Windows 上 ZLIB 的 pg_receivewal 的 TAP 测试。这将还原提交 91d395f,以避免在 Windows 上运行这些测试。这些测试在所有构建场成员中都是全局稳定的,除了 fairywren(pg_receivewal 崩溃)和 bowerdird(SIGBREAK 阻止构建场运行完成)。这些错误非常奇怪,因为其他具有非常相似特征的主机能够运行这些测试而不会出现任何问题。目前,禁用 Windows 上的这些测试以将构建场恢复为绿色。根据与 Andrew Dunstan 的讨论。讨论:https://postgr.es/m/9040d5ed-6462-66a4-07ac-2923785ae563@dunslane.net https://git.postgresql.org/pg/commitdiff/6a2c532c2230159b909382cfa58494ef9d6df703

  • 统一命令行整数选项的解析逻辑。现在,命令行二进制文件的大多数整数选项都使用一个能够完成工作的例程,修复了由于使用 atoi() 导致的检测草率值的问题,例如,atoi() 在以数字字符开头的字符串后跟垃圾字符时会失败。此提交使我计算的需要翻译的字符串数量减少了 26 个,并将代码切换为具有两种错误类型,分别用于无效值和超出范围的值。此处可以做更多的事情,使用浮点数甚至 int64 选项,但 int32 是最吸引人的情况,因为它有可能依靠 strtol() 来可靠地完成工作。请注意,目前有一些例外情况,例如 pg_ctl 或 pg_upgrade,它们使用自己的日志记录逻辑。一些负面 TAP 测试需要对生成的新错误进行一些调整。pg_dump 和 pg_restore 在选项解析中跟踪最大并行作业数。代码已稍微重构,以便在专门用于并行性的代码中跟踪它。作者:Kyotaro Horiguchi、Michael Paquier 经 David Rowley、Álvaro Herrera 审阅 讨论:https://postgr.es/m/CALj2ACXqdG9WhqVoJ9zYf-iZt7sgK7Szv5USs=he6NnWQ2ofTA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f164e6d17616a157ea5d9e34dbb1b211c080c41

  • 为 pg_basebackup 和 pg_{dump,restore} 添加缺失的标头声明。这修复了 6f164e6 导致的两个编译失败。有趣的是,缺失的 <limits.h> 在 Linux 甚至 Windows 中都不会失败。但是,在 MacOS 上,它会失败。根据各个构建场成员。https://git.postgresql.org/pg/commitdiff/bc0cc68f8a1648029424e9300b2e4457acd474a6

Peter Eisentraut 推送了

Álvaro Herrera 推送了

Peter Geoghegan 推送了

Tom Lane 推送了

  • 修复 plpgsql 中一些角落情况的未初始化变量问题。如果在我们最初尝试检查成功编译的表达式是否“简单”时引发了错误,则后续对 exec_stmt_execsql 的调用会认为 stmt->mod_stmt 已经被计算过,而实际上并没有。这可能会导致调试版本中的断言失败;在生产版本中,效果通常会表现得好像指定了 INTO STRICT,即使没有指定。当然,只有在后续尝试执行表达式成功时,这才有意义,因此只能通过修复某些引用的、可内联 SQL 函数中的失败,然后在同一会话中重试调用 plpgsql 函数才能达到该问题。(可能还有更隐蔽的方法可以在不更改 plpgsql 函数的情况下更改表达式的行为,但那似乎是人们在实践中唯一可能遇到的方法。)修复此问题的最可靠方法是安排 exec_prepare_plan 在我们完成辅助简单表达式检查之前不设置 expr->plan。但是,如果不创建引用计数泄漏问题,似乎很难做到这一点。因此,我们决定在注释中记录此危险,并修复 exec_stmt_execsql 以单独测试是否计算过 stmt->mod_stmt。(这会在每次执行时增加一个测试和分支,但希望在上下文中可以忽略不计。)在 v11 及更高版本中,还修复了 exec_stmt_call,它也存在相同问题的变体。根据 Alexander Lakhin 报告的错误 #17113。反向移植到所有支持的分支。讨论:https://postgr.es/m/17113-077605ce00e0e7ec@postgresql.org https://git.postgresql.org/pg/commitdiff/d9809bf8694c17e05537c5dd96cde3e67c02d52a

  • 文档:改进关于求幂运算符的文档。现在我们不必将其楔入旧运算符表格式的束缚中,我们可以添加另一个示例来澄清关于从左到右结合性的观点。根据 mdione 在 grulic.org.ar 的建议。https://postgr.es/m/162661954599.693.13700316547731859171@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7fa1e1ef741964eeb50f33d7c72622658bb7e5f4

  • 修复一些头文件“独立”编译失败的问题。最近添加的对 ParseState 的引用未被 #include 引用覆盖,从而为这些头文件的用户创建了不必要的排序依赖关系。提交 2bfb50b3d 中的疏忽。根据 headerscheck/cpluspluscheck。https://git.postgresql.org/pg/commitdiff/678f5448c2d86976a98b402ef14482a8ba3b159b

  • 删除配置时的线程安全检查(thread_test.c)。此测试在编写时(大约二十年前)很有用,但在最近十几年或更长时间内构建的任何平台上都显得相当无意义。(另请参阅 8a2121185 的注释。)此外,我们现在有报告称该测试程序本身在 ThreadSanitizer 下会失败。与其投入精力修复它,不如直接删除它,并假设仍然关心的少数人已经知道他们需要使用 --disable-thread-safety。为了与 8a2121185 保持一致,将其反向移植到 v14。讨论:https://postgr.es/m/CADhDkKzPSiNvA3Hyq+wSR_icuPmazG0cFe=YnC3U-CFcYLc8Xw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76fa3db33654e543b5c796e28c6fc5b505a19c2a

  • 使 printf("%s", NULL) 输出 "(null)" 而不是崩溃。我们之前采取了强硬态度,认为调用者绝不应该打印空字符串指针,这样做会导致断言失败或崩溃。然而,我们早就清除了任何容易发现的此类错误。剩下的是大量可能在难以触及的角落情况下以这种方式失败的代码。例如,在像 ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("constraint \"%s\" for table \"%s\" does not exist", conname, get_rel_name(relid)))); 这样简单的代码中,人们必须怀疑是否完全保证 get_rel_name 在这种情况下不会返回 NULL。如果真的发生这种情况,现有的策略会将可能只是一个很小的错误转换为服务器崩溃的情况。这对健壮性不利。因此,让我们效仿 glibc 的做法,打印 "(null)" 而不是失败。当然,如果这种行为在正常使用中是可达的,我们仍然应该认为这是一个错误;但崩溃似乎不如不崩溃更可取。此修复程序在 v12 及更高版本中全面有效,我们在这些版本中始终使用 src/port/snprintf.c。在此之前,在大多数平台上,我们受制于本地 libc,但看起来 Solaris 10 是唯一仍然会导致崩溃的受支持平台。大多数其他平台,如 *BSD、macOS 和 Solaris 11,在某个时候都采用了 glibc 的行为。(AIX 和 HPUX 只是打印 "" 而不是 "(null)",但这已经很接近了。)我没有检查 Windows 的原生 printf 会做什么,但这并不重要,因为我们长期以来在该平台上使用 snprintf.c。在 v12 及更高版本中,还将相关代码 const 化,这样我们就不会在常量字符串上强制转换 const。这只是整洁主义,因为几乎没有编译器会对此发出警告。讨论:https://postgr.es/m/17098-b960f3616c861f83@postgresql.org https://git.postgresql.org/pg/commitdiff/3779ac62d709467fe6331c8f0285d42e7487a01c

  • 修复会话级锁与事务级锁冲突的检查。我们有一个实现限制,即 PREPARE TRANSACTION 无法处理在同一可锁定对象上同时持有会话生命周期锁和事务生命周期锁的情况。(这是因为否则我们需要在准备后清理期间获取一个新的 PROCLOCK 条目,这是一个可能会失败的操作。这种情况只会出现在咨询锁的奇特用法中,因此取消此限制可能不值得为此付出的努力。)AtPrepare_Locks 试图强制执行此操作,但其逻辑存在许多不足,因为它仅检测到会话锁和事务锁具有相同锁定模式的情况。同一对象上的不同模式的锁会导致相当无益的消息“PANIC: we seem to have dropped a bit somewhere”。为了解决这个问题,构建一个临时的哈希表,每个锁标签一个条目,而不是每个锁标签 + 模式一个条目,并使用它来检测冲突。根据 Alexander Pyhalov 的 bug #17122。这个 bug 很古老,因此回溯修补到所有受支持的分支。讨论:https://postgr.es/m/17122-04f3c32098a62233@postgresql.org https://git.postgresql.org/pg/commitdiff/6310809c4aa146b3996a35524955c6c6943d241a

  • 消除 Windows 上哈希表大小的人为限制。引入 hash_mem_multiplier GUC 的目的是让用户重现哈希聚合的旧行为,即它可以在需要时使用超过 work_mem 的内存。但是,该实现未能完成 Win64 上的工作,其中 work_mem 被钳制为 2GB,以保护使用“long int”计算内存大小的各个位置。按照原来的写法,相同的钳制应用于 hash_mem。这导致需要稍微超过 2GB 用于哈希聚合的查询出现严重的性能下降,因为它们现在会溢出到磁盘,而且没有办法阻止这种情况。消除 work_mem 限制似乎是一个好主意,但这是一项艰巨的工作,并且不可能进行回溯修补。但是,只有相当少的几个地方关心 hash_mem 值,并且事实证明可以在那里消除限制,而无需进行太多代码变动或任何 ABI 中断。因此,让我们现在这样做来修复回归,并将更大的任务留到以后。此补丁确实引入了更多基础设施,这应该有助于更大的任务,即 pg_bitutils.h 支持使用 size_t 值。根据 Laurent Hasson 的抱怨。回溯修补到引入行为更改的 v13。讨论:https://postgr.es/m/997817.1627074924@sss.pgh.pa.us 讨论:https://postgr.es/m/MN2PR15MB25601E80A9B6D1BA6F592B1985E39@MN2PR15MB2560.namprd15.prod.outlook.com https://git.postgresql.org/pg/commitdiff/28d936031a86d94806c6604480ff3f3f169b371c

藤井正雄推送

John Naylor 推送

David Rowley 推送

Andres Freund 推送

待处理的补丁

Dilip Kumar 发送了另一个修订版的补丁,用于添加 TOAST 压缩方法选项。

堀口京太郎发送了另外两个修订版的补丁,以防止恢复期间出现 xlog 页眉错误。

Greg Nancarrow 发送了另一个修订版的补丁,用于添加新的“client_connection”事件和客户端连接触发器支持。

Jacob Champion 发送了另一个修订版的补丁,以支持将 NSS 作为 libpq TLS 后端。

Thomas Munro 发送了一个补丁,以支持 Solaris 上的直接 I/O。

Andres Freund 发送了两个修订版的 WIP 补丁,以通过将热路径与冷路径分离来优化分配,并通过避免在分配新块时需要迭代所有块来提高 slab 性能。

Daniel Gustafsson 发送了一个补丁,以禁用 pgcrypto 中的 OpenSSL EVP 摘要填充,并为没有加载旧版的 OpenSSL 3 添加替代输出。

Ranier Vilela 发送了两个修订版的补丁,以避免一些 strlen 调用。

Masahiko Sawada 发送了另外两个修订版的补丁,用于将 errcontext 添加到应用逻辑复制更改时发生的错误,添加 pg_stat_logical_replication_error 统计视图,并为 ALTER SUBSCRIPTION 添加 skip_xid 选项。

Peter Smith 发送了另外两个修订版的补丁,用于为流式事务添加 prepare API 支持。

Dipesh Pandit 发送了另外两个修订版的补丁,通过维护当前正在存档的日志段编号,并将其递增 1 以获取下一个 WAL 文件,而不是默认情况下重新扫描目录,从而缓解 WAL 存档器的目录扫描。

Andres Freund 和 Yura Sokolov 交换了补丁,以改进 Andres 的惰性 vacuum 的死元组存储,通过添加基数树实现,以及 Yura 通过添加专门的 vacuum tid 映射。

Denis Hirn 发送了另一个补丁修订版,允许在 CTE 中进行多个线性递归自引用。

Peter Eisentraut 发送了一个补丁,使 Unicode makefile 并行安全。

Ronan Dunklau 发送了另一个补丁修订版,用于标记和删除为 SortGroupClause 添加的 resjunk,并教导排序和结果节点执行简化版本的投影。

Filip Gospodinov 发送了另一个补丁修订版,通过在 Libs.private 中硬编码 -lpgcommon 和 -lpgport 来修复静态链接的 pkg-config 文件。

Tomáš Vondra 发送了另一个补丁修订版,以实现序列的逻辑解码/复制。

Tomáš Vondra 发送了另一个补丁修订版,以处理扩展统计信息中的 Expr op Expr 子句。

Tomáš Vondra 发送了两个补丁修订版,以提高 GROUP BY 的效率。

David Rowley 发送了另一个补丁修订版,使 nodeSort.c 为单列排序执行 Datum 排序。

Peifeng Qiu 发送了两个补丁修订版,为 libpq 添加 Kerberos 委托支持。

John Naylor 发送了另一个补丁修订版,以重写 pg_verify_str 以提高速度。

Hou Zhijie 和 Greg Nancarrow 交换了补丁,以允许用户声明表的并行数据修改安全性,为插入启用并行选择,并添加一个返回 (objid, classid, parallel_safety) 记录的 pg_get_table_parallel_dml_safety(regclass) 函数。

Ranier Vilela 和 Aleksander Alekseev 交换了补丁,以取消隐藏几个变量。

Simon Riggs 发送了两个补丁修订版,使哈希索引能够支持 UNIQUE 约束,并允许使用多列哈希索引。

Bruce Momjian 发送了四个补丁修订版,以修复分数间隔算术中的错误。

Yugo Nagata 发送了一个补丁,纠正了 libpq 文档中的错误,其中指出命令在刷新之前本地存储在输出缓冲区中。

Yugo Nagata 发送了另一个补丁修订版,旨在修复一个错误,该错误表现为在 pgbench 的管道中使用预准备的 BEGIN 语句可能会导致错误。

Richard Guo 发送了另一个补丁修订版,以修复分区式 JOIN 中的一些缺陷。

David Rowley 发送了另一个补丁修订版,为 ORDER BY 聚合添加计划器支持。

Ronan Dunklau 和 Ranier Vilela 交换了补丁,通过关注用于排序的操作符族来修复 postgres_fdw PathKey 的处理。

Thomas Munro 发送了两个补丁修订版,使 SIMD 代码更具平台中立性,为 UTF-8 验证添加 ARM/NEON 支持,并为 UTF-8 验证添加 POWER AltiVec 支持。

Dean Rasheed 发送了另一个补丁修订版,使负指数的幂运算与 NUMERIC 一起工作。

Peter Eisentraut 发送了一个补丁,用于在 psql 中测试查询取消。

Pavel Stěhule 和 Aleksander Alekseev 交换了补丁,以增强 PL/pgsql 调试 API,以添加返回变量内容的文本值。

Vigneshwaran C 发送了两个补丁修订版,为 PUBLICATION 添加模式级粒度。

Jacob Champion 发送了一个补丁,用于添加自 Unicode 5.0 以来添加的宽 Unicode 代码点的指示符。

Thomas Munro 和 Soumyadeep Chakraborty 交换了补丁,通过将目标后端从按 pid 跟踪更改为使用 pgprocno 来优化 ProcSendSignal(),这不需要扫描 ProcArray。 这样做还消除了启动期间需要检查的一些特殊情况。

Andres Freund 发送了一个针对 pgbench 的补丁,限制仅在必要时使用管道执行 PQconsumeInput()。

Nitin Jadhav 发送了两个补丁修订版,以显示启动过程中执行的操作的进度。

Ajin Cherian 发送了四个补丁修订版,以从逻辑复制中删除空事务。

Thomas Munro 发送了一个补丁,以教导 pgindent 关于特殊的文件本地类型名称。

Erik Rijkers 发送了另一个补丁修订版,以实现 SQL/JSON 规范的 JSON_TABLE 部分。

Alexander Pyhalov 发送了另一个补丁修订版,使 CASE 表达式可以推送到外部服务器。

Zeng Wenjing 发送了另一个补丁修订版,以实现全局临时表。

Justin Pryzby 发送了另一个补丁修订版,以实现 ALTER TABLE ... ACCESS METHOD,并使可以指定分区表的表访问方法。

Hou Zhijie 发送了一个补丁,以添加快速选择功能,该功能可用于快速计算中位数等。

Artur Zakirov 发送了一个补丁,旨在修复一个错误,该错误表现为逻辑复制触发的存储过程无法通过将 SignalBackends() 调用移动到 AtCommit_Notify() 内部来使用通知事件。

Peter Eisentraut 发送了一个针对 pg_amcheck 的补丁,以修复命令行上的块号解析,使其正确处理 sizeof(long)==4 的系统。

Haiying Tang 发送了一个补丁,以支持对包含等号的单引号输入进行 Tab 补全。

Fabien COELHO 发送了另一个补丁修订版,以向 psql 添加 SHOW_ALL_RESULTS 选项。

Dean Rasheed 和 Tom Lane 交换了补丁,以允许 NUMERIC 具有负刻度。

Michael Banck 发送了另一个补丁修订版,以添加新的 PGC_ADMINSET GUC 上下文和新的 pg_change_role_settings 预定义角色。 这些创建一个在其功能上介于超级用户和用户之间的管理员。

Greg Nancarrow 发送了另一个补丁修订版,以修复并行工作进程失败的断言和核心转储。

Andrey Borodin 发送了一个补丁,以避免 relcache 和 syscache 回调中的重复。

Vigneshwaran C 发送了另一个补丁修订版,以在逻辑复制消息描述中包含实际使用的数据类型。

Robert Haas 发送了一个补丁,将一些恢复结束代码从 StartupXLOG() 中重构出来,推迟一些与允许 WAL 相关的恢复结束操作,并使用 StartupXLOG() 中的代码创建 XLogAcceptWrites() 函数。

Andrey Borodin 发送了一个补丁,通过确保不再出现无用的错误“未找到记录”来改进 ReadPageInternal() 的错误报告。

Tom Lane 发送了一个补丁,以删除哈希表大小的“long int”相关限制。

Haiying Tang 发送了另一个补丁修订版,为回归示例进行了一个小的修复。

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

Bharath Rupireddy 发送了另一个补丁修订版,禁止为 CREATE SEQUENCE 使用 RESTART 选项。

Julien Rouhaud 发送了一个补丁,使 pg_stat_statements 测试不受预准备语句失效的影响。