PostgreSQL 周刊 - 2021 年 6 月 6 日

发布于 2021-06-07,作者:PWN
PWN

PostgreSQL 周刊 - 2021 年 6 月 6 日

PG Day Russia 将于 2021 年 7 月 8-9 日在线举行。CfP 征集已开放,请访问 在 2021 年 6 月 7 日前提交您的演讲!

本周人物

PostgreSQL 产品新闻

PL/R 8.4.2,R 语言在 PostgreSQL 中的嵌入,已发布

WAL-G 1.0,一个用 Go 编写的 PostgreSQL 和其他数据库的备份管理系统,已发布

pgtt 2.4,一个用于实现全局临时表的扩展,已发布

Database .NET v32.6,一个多数据库管理工具,现在支持 PostgreSQL,已发布

pg_partman 4.5.1,一个用于管理分区表的系统,已发布

hypopg 1.3.0,一个实现假设索引的扩展,已发布

六月份的 PostgreSQL 工作

工作

PostgreSQL 新闻

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

本周的 PostgreSQL 周刊由 David Fetter 为您带来

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

已应用补丁

Michaël Paquier 推送了

Noah Misch 推送了

Tom Lane 推送了

  • 修复重复应用投影的错误规划。create_projection_plan 包含一个隐藏的假设(这里由 Assert 明确指出),即具有投影能力的 Path 将产生具有投影能力的 Plan。不幸的是,create_projection_plan 本身在几行之外就违反了该假设。这意味着两个堆叠的 ProjectionPath 可能会产生一个结果,其中我们尝试将上层路径的 tlist 插入到一个没有投影能力的子节点中,从而导致无效的计划。没有任何理由要有堆叠的 ProjectionPath;实际上,整个概念都是错误的,因为上层路径所需的 Vars/Aggs/等的集合不一定在下层路径的输出中可用,而且如果下层路径的输入中没有这些值,下层路径也无法创建这些值。因此,我们可以通过调整 create_projection_path 来修复此问题,以从其给定的子路径中剥离任何顶级 ProjectionPath。(这相当于说“哦,我们改变了主意,我们现在需要在这里投影什么。”)此处添加的测试用例仅在 v13 和 HEAD 中失败;在此之前,由于我不太清楚的原因,我们不会尝试将 Sort 推入计划的并行部分。但是,所有直接相关的代码看起来与 v11 一样,v11 中引入了此风险 (d7c19e62a)。因此,我没有理由相信 v11 和 v12 中不存在相同类型的错误,前提是有合适的测试用例。因此,向后移植代码更改,但不将不相关的测试用例移植到这些分支中。根据 Bas Poot 的报告。讨论:https://postgr.es/m/534fca83789c4a378c7de379e9067d4f@politie.nl https://git.postgresql.org/pg/commitdiff/6ee41a301e70fc8e4ad383bad22d695f66ccb0ac

  • 拒绝 SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE。应该禁止这种情况,就像禁止带有普通 GROUP BY 的 FOR UPDATE 一样;只有当查询结果的每一行都可以用单个表行标识时,FOR UPDATE 才有意义。但是,我们错过了教 CheckSelectLocking() 检查 groupingSets 以及 groupClause,因此它会允许退化的分组集。这导致了错误的计划和执行程序中的空指针取消引用。在寻找相同 bug 的其他实例时,我发现的唯一一个是在 examine_simple_variable() 中。这只会导致愚蠢的估计,但也应该修复。根据 Yaoguang Chen 的私人报告。向后移植到所有受支持的分支。https://git.postgresql.org/pg/commitdiff/1103033aedc10295eb689a4b7158f21ef4c14a11

  • 教 tab-complete.c 关于最近添加的 CREATE TYPE 选项。提交 c7aba7c14 遗漏了在此处添加 SUBSCRIPT,而提交 6df7a9698 遗漏了添加 MULTIRANGE_TYPE_NAME。Haiying Tang 和 Tom Lane 讨论:https://postgr.es/m/OS0PR01MB6113F9EDA46FA53BAA5445BDFB3D9@OS0PR01MB6113.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/9e3b3ff2664dd0b349d2a6d6f047128cb3489cf2

  • 更新 plannodes.h 中关于 PlanRowMark 的注释。此处对继承的 UPDATE/DELETE 计划中不同物理列号的引用已过时,自 86dc90056 起;将其删除。此外,重新处理有关继承情况的文本以使其更清晰。https://git.postgresql.org/pg/commitdiff/79c50ca57828e9f8375766b36cce1e2960eebf87

  • 修复规划器为来自外部表的继承而产生的行标记代码。提交 428b260f8 中断了需要行标记(SELECT FOR UPDATE 等)且查询的表之一是具有常规表作为继承子项的外部表的规划。我们得到了相反的正确情况,但显然认为外部表不能是继承父项。事实并非如此;因此我们需要能够在添加新子项时添加一个 CTID 垃圾列,而不仅仅是 wholerow 垃圾列。向后移植到 v12,其中引入了错误的代码。Amit Langote 讨论:https://postgr.es/m/CA+HiwqEmo3FV1LAQ4TVyS2h1WM=kMkZUmbNuZSCnfHvMcUcPeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/889592344c48d3965567f331b4ea89dfe6447bce

  • 重新允许具有两个以上组件的自定义 GUC 名称。提交 3db826bd5 禁止了这种情况,但事实证明有些人依赖它。由于核心语法自 3dc37cd8d 起就允许这种情况,因此此代码似乎应该符合标准。根据 Robert Sosinski 提出的 bug #17045。讨论:https://postgr.es/m/17045-6a4a9f0d1513f72b@postgresql.org https://git.postgresql.org/pg/commitdiff/2955c2be79b35fa369c83fa3b5f44661cb88afa9

  • 修复 pg_subscription 上的不正确权限。文档中的意图是除 subconninfo 之外的所有列都可公开读取。但是,这已被忽略了两次。自引入以来,subsynccommit 从未可读取,oid 列(这对于连接很重要)也未可读取。鉴于之前没有投诉,尚不清楚在向后分支中对此做任何事情是否值得。但是,仍有时间在 v14 中以较低的成本修复它。根据 Israel Barth(通过 Euler Taveira)的报告。由 Euler Taveira 提供的补丁,由我提供可能没有意义的注释更新。讨论:https://postgr.es/m/b8f7c17c-0041-46b6-acfe-2d1f5a985ab4@www.fastmail.com https://git.postgresql.org/pg/commitdiff/3590680b85a8e51ef8df550e5a10dedd0d2dfd88

  • Doc: 修复错误的 intarray 索引示例。siglen 参数由 gist__intbig_ops 而不是 gist__int_ops 提供。Simon Norris 讨论:https://postgr.es/m/11BF2AA9-17AE-432A-AFE1-584FB9FB079D@hillcrestgeo.ca https://git.postgresql.org/pg/commitdiff/e4539386decae1c435767a69507cc7cbb11ac3ff

  • 修复了 postgres_fdw 在处理 RECORD 类型的整行变量时失败的问题。提交 86dc90056 期望 FDW 可以处理其表的整行变量,即使这些变量被标记为 vartype RECORDOID。此前,规划器生成的整行变量的 vartype 等于相关表的行类型 OID。(此更改的目的是为了能够跨继承子表共享 resjunk 列。)事实证明,postgres_fdw 无法处理这种情况,尽管由于运气不好,其测试用例中没有暴露这一点。 大部分情况下都能正常工作,但是当我们尝试读取此类变量的值时,record_in() 无法使用预期的行类型。 幸运的是,修改控制此过程的 tupdesc 以将外表的行类型替换为 RECORDOID 并不困难。因此,我们可以在运行时解决问题,同时仍然与其他表共享 resjunk 列。根据 Alexander Pyhalov 的报告。讨论:https://postgr.es/m/7817fb9ebd6661cdf9b67dec6e129a78@postgrespro.ru https://git.postgresql.org/pg/commitdiff/f61db909dfb94f3411f8719916601a11a905b95e

Peter Eisentraut 推送了此提交

Thomas Munro 推送了此提交

Amit Kapila 推送了此提交

Fujii Masao 推送了此提交

Tomáš Vondra 推送了此提交

David Rowley 推送了此提交

Andrew Dunstan 推送了此提交

  • 在 PostgresNode.pm 中,不要在命令行上传递 SQL 给 psql。Msys shell 会破坏其命令行中的某些模式,因此避免在命令行上传递任意 SQL 给 psql,而是使用 IPC::Run 的重定向工具来处理 stdin。此模式已经大部分使用了,但 query_poll_until() 没有做正确的事情。当 msys 上新的 TAP 测试失败时,在构建农场中发现了该问题。https://git.postgresql.org/pg/commitdiff/11e9caff82bc7326e2bc9782937cb03875050cc4

待处理的补丁

Emre Hasegeli 发送了一个补丁,用于处理 PostgreSQL FDW 中的布尔比较谓词,因为并非所有谓词都被识别。

Pavel Stěhule 发送了另一个版本的补丁,以使 PL/ppgsql 调试 API 返回变量内容的文本值。

Dilip Kumar 发送了另外四个版本的补丁,以修复使用 TOAST 解码推测性插入时的内存泄漏。

Hou Zhijie 发送了另外三个版本的补丁,以使 INSERT ... SELECT 可以并行执行。

Peter Smith 和 Ajin Cherian 交换了补丁,以支持内置逻辑复制中的预备事务。

Dilip Kumar 发送了三个版本的补丁,以在外部存储时提取未更改的副本身份密钥。如果将副本身份设置为密钥并且该密钥未被修改,则我们不会单独记录密钥,因为它应该与更新的元组一起记录。但是,如果密钥在外部存储,我们必须对其进行解 TOAST 并单独记录。

Justin Pryzby 发送了另一个版本的补丁,以实现 CREATE TABLE (LIKE .. INCLUDING ACCESS METHOD)。

Zhihong Yu 发送了一个补丁,以从 pgtls_init() 返回正确的错误代码。

Peter Smith 和 Takamichi Osumi 交换了补丁,以记录在同步模式下逻辑解码中目录上的 AEL 可能导致的死锁风险。

Etsuro Fujita 发送了另一个版本的补丁,以修复异步追加的重新扫描。

Bharath Rupireddy 发送了另外两个版本的补丁,以重构 parse_subscription_options,使其更容易扩展,并通过位图更容易检测到互斥选项。

Hou Zhijie 和 Amit Langote 交换了补丁,以跳过具有常量分区键的分区元组路由。

Kyotaro HORIGUCHI 发送了两个版本的补丁,以修复可能获得重复历史文件的错误。

Aleksander Alekseev 发送了另一个版本的补丁,以添加一种将列投影列表指定到表访问方法 API 的方法。

Joe Wildish 发送了另一个版本的补丁,以允许在 FOR EACH STATEMENT 触发器的 WHEN 表达式中使用查询。

Greg Sabino Mullane 发送了另外两个版本的补丁,以在校验和已设置的情况下加快 pg_checksums 的速度。

Andrew Dunstan 发送了三个修订版的补丁,以澄清和更新简短版本的安装文档。

Matthias van de Meent 发送了一个补丁,用于报告并行 B 树构建中排序阶段的进度。

Jim Mlodgenski 发送了一个补丁,用于实现 CREATE MODULE。

John Naylor 发送了两个修订版的补丁,以加速 UTF-8 的验证。

Thomas Munro 发送了一个补丁,用于删除更多关于信号量的过时注释。

Thomas Munro 发送了另一个修订版的补丁,通过将目标进程的引用从 pid 更改为 pgprocno,使 ProcSendSignal() 更有效率,这使得可以避免扫描 ProcArray 并跟踪启动进程。

Greg Nancarrow 发送了另一个修订版的补丁,用于实现客户端连接的事件触发器。

Amit Langote 发送了另一个修订版的补丁,以添加一个断言,确保子行标记不会过早出现。

Nitin Jadhav 发送了另一个修订版的补丁,用于实现多列列表分区。

David Christensen 发送了另一个修订版的补丁,将 pg_size_pretty(numeric) 知道的单位扩展到 YB,并将 pg_size_bytes 中支持的单位扩展到覆盖所有单位。

Zhihong Yu 发送了两个修订版的补丁,用于记录在 write_relcache_init_file 中无需检查 unlink 返回值的原因。

Robert Haas 和 Dilip Kumar 交换了补丁,以修复新备用服务器无法跟随新主服务器的极端情况失败。

Bharath Rupireddy 发送了一个补丁,当 fsm_set_and_search 的返回值被忽略时,使用 (void)。

David Christensen 发送了一个补丁,用于实现 DELETE...CASCADE。

Kyotaro HORIGUCHI 发送了一个补丁,使 pg_waldump 中的错误消息更清晰、更明确地说明哪里出了问题以及原因。

Andrey V. Lepikhov 发送了另一个修订版的补丁,用于对具有外部分区的表进行批量写入时使用 COPY。

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

Tomáš Vondra 发送了一个补丁,用于添加 PQ_QUERY_PARAM_MAX_LIMIT,为批处理创建一个描述符的副本,并且仅为批处理初始化槽一次。

Nitin Jadhav 发送了一个补丁,用于为启动过程创建进度指示器。

Aleksander Alekseev 发送了一个补丁,将 ZSON 扩展添加到 contrib。

Andrew Dunstan 发送了一个补丁,以确保 pg_upgrade 回显 Windows 命令。

Maxim Orlov 发送了一个补丁,旨在修复并行扫描中带有 SubTransGetTopmostTransaction 断言的内核转储形式的错误。

Ajin Cherian 发送了一个补丁,用于从 CreateReplicationSlotCmd 结构中删除两阶段选项,并在 CREATE_REPLICATION_SLOT 中添加设置两阶段的选项。

Tom Lane 发送了另一个修订版的补丁,以修复 CALL 和仅输出参数的过程之间的不一致之处。

Melanie Plageman 发送了另一个修订版的补丁,以添加跟踪共享缓冲区操作的系统视图。

Jehan-Guillaume de Rorthais 发送了另一个修订版的补丁,以添加 pg_stat_waitaccum 视图,并将等待事件时间的测量方法从 INSTR_TIME 更改为 rdtsc。

Michaël Paquier 发送了一个补丁,以防止 VACUUM 重新压缩。

Álvaro Herrera 发送了一个补丁,使 toast_get_compression_id 内联。

Álvaro Herrera 发送了另一个修订版的补丁,以减少表重写时 TOAST 重新压缩的开销。

David Rowley 发送了一个补丁,用于修复 brin_minmax_multi.c 中的几个拼写错误。

Vigneshwaran C 发送了另一个修订版的补丁,用于添加模式级别的发布支持,并为之添加测试。

Ranier Vilela 发送了另一个修订版的补丁,以减少表重写时 TOAST 重新压缩的开销。

Vigneshwaran C 发送了另一个修订版的补丁,用于在 CREATE/ALTER SUBSCRIPTION 期间识别发布者中缺少的发布。

Julien Rouhaud 发送了另一个修订版的补丁,用于添加 parser_hook 钩子,添加基于此的 sqlol 解析器,为核心解析器添加一个新的 MODE_SINGLE_QUERY 并将其用于 pg_parse_query,并教会 sqlol 使用新的 MODE_SINGLE_QUERY 解析器模式。

Julien Rouhaud 发送了一个补丁,用于修复 SQL 标准主体空语句处理。

Michaël Paquier 发送了一个补丁,旨在修复 pg_log_backend_memory_contexts() 中错误的超级用户检查。

Tomáš Vondra 发送了另一个修订版的补丁,以修复 psql 的 \dX(扩展统计信息)中的错误,该错误无法检查对象可见性。