PostgreSQL 每周新闻 - 2021 年 1 月 3 日

由 PWN 发布于 2021-01-03
PWN

PostgreSQL 每周新闻 - 2021 年 1 月 3 日

PostgreSQL 每周新闻祝您新年快乐!

PostgreSQL 产品新闻

Database Lab 2.1 发布,该工具用于快速克隆大型 PostgreSQL 数据库以构建非生产环境: https://postgres.ai/blog/dle-2.1-release/

一月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

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

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

已应用的补丁

Jeff Davis 推送

Bruce Momjian 推送

Fujii Masao 推送

  • postgres_fdw: 修复连接泄漏。在 postgres_fdw 中,如果删除了用户映射或这些连接所依赖的外部服务器,则缓存到外部服务器的连接将不会关闭,直到本地会话退出。这些连接可能会泄漏。为了修复连接泄漏问题,在更改 pg_foreign_server 或 pg_user_mapping 目录条目后,如果当前事务尚未 使用 这些连接,则此提交使 postgres_fdw 立即关闭依赖于该条目的连接。否则,将这些连接标记为无效,然后在当前事务结束时关闭它们,因为它们无法在事务中使用它们的过程中关闭。如果需要,关闭的连接将在下次机会重新建立。向后移植到所有受支持的分支。作者:Bharath Rupireddy 审查人:Zhihong Yu, Zhijie Hou, Fujii Masao 讨论:https://postgr.es/m/CALj2ACVNcGH_6qLY-4_tXz8JLvA+4yeBThRfxMz7Oxbk1aHcpQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e3ebcca843a4703938b9f40a4811f43c4b315753

Michaël Paquier 推送

Tom Lane 推送

  • 修复 plpgsql 内存泄漏修复中的 thinko。提交 a6b1f5365 旨在将 CALL 语句的瞬态“目标”列表放置在函数的语句生命周期上下文中,但是我犯了一个错误,使用了 get_eval_mcontext() 而不是 get_stmt_mcontext()。eval_mcontext 属于“简单表达式”基础结构,该结构在事务结束时被销毁。最终效果是,如果被调用的过程执行了 COMMIT,则在具有 OUT 或 INOUT 参数的过程中对另一个过程的 CALL 将失败。根据 Peter Eisentraut 的报告。像之前的补丁一样向后移植到 v11。讨论:https://postgr.es/m/f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com https://git.postgresql.org/pg/commitdiff/ea80d8d9437e80de6506dbfe3765d834653312bf

  • 进一步修复 plpgsql 内存泄漏修复中的 thinko。还有第二个 get_eval_mcontext() 调用也应该为 get_stmt_mcontext()。这实际上是无用代码,因为在切换回原始上下文之前不会发生任何有趣的分配,但是我们应该使其与另一个调用保持同步,以防止将来可能出现的错误。讨论:https://postgr.es/m/f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com https://git.postgresql.org/pg/commitdiff/5f2e09bcccd771629fb7a2885f8c468ae0f7fb33

  • 在 PQconndefaults() 中公开 channel_binding 的默认值。如果连接选项存在静态默认值,则应在 PQconninfoOptions 数组中显示。Daniele Varrazzo 讨论:https://postgr.es/m/CA+mi_8Zo8Rgn7p+6ZRY7QdDu+23ukT9AvoHNyPbgKACxwgGhZA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/cf61b0734c61d93c62827fe4e44fa2162a533b8e

  • 修复 libpq 的 GSSAPI 加密支持中的错误。此处修复的关键问题是,如果成功建立了 GSSAPI 加密连接,则 pqsecure_open_gss() 会清除 conn->allow_ssl_try,这是一种阻止我们尝试在已加密的连接上隧道传输 SSL 加密的(公认的)临时方法。问题在于,如果我们因身份验证期间的失败而放弃 GSSAPI 连接,我们将不会在下一次使用同一服务器的尝试中尝试 SSL 加密。这可能会导致意外的连接失败,或者在需要加密连接的地方静默获取非加密连接。幸运的是,只有当客户端和服务器在同一 Kerberos 基础结构中持有有效票证时,我们才能成功建立 GSSAPI 加密连接,这是一种相对不常见的环境。尽管如此,这仍然是一个具有潜在安全隐患的非常糟糕的错误。要修复,请不要重置该标志,而是在决定是否尝试启动 SSL 时添加对 conn->gssenc 是否已为 true 的检查。同时,修复 libpq 的 GSSAPI 代码中的一些较小问题: * 在删除尝试的 GSSAPI 连接时,使用 need_new_connection 节,而不是部分重复该代码。这造成的后果很小:AFAICS 它可能只会导致 auth_req_received 或 password_needed 在不应该设置时仍然设置,这不是太有害。 * 修复 pg_GSS_error() 以不重复多次给定的 “mprefix”,并注意 gss_display_status() 的任何失败返回。 * 避免在 pg_GSS_load_servicename() 中不必要的依赖 NI_MAXHOST。根据 Mikael Gustavsson 的报告。向后移植到引入此代码的 v12。讨论:https://postgr.es/m/e5b0b6ed05764324a2f3fe7acfc766d5@smhi.se https://git.postgresql.org/pg/commitdiff/ff6ce9a3a691a96e8e47ed449bc51c5a178e6931

  • 修复后端 GSSAPI 加密支持中的各种问题。GSSAPI 加密检测到的不可恢复的错误不能仅仅用 elog(ERROR) 或 elog(FATAL) 来报告,因为尝试将错误报告发送到客户端可能会导致无限递归或协议同步丢失。相反,使此代码执行 SSL 加密代码长期以来一直在执行的操作,即将此类故障报告给服务器日志(使用 elevel COMMERROR),然后通过返回 errno = ECONNRESET 来假装我们失去了连接。同时,修复关于消息翻译是由 pg_GSS_error() 还是其调用方完成的混乱(后者应该这样做),并使该函数的后端版本的工作方式更像前端版本。在需要之前避免分配 port->gss 结构;我们肯定不需要在 postmaster 中分配它。改进启用 GSS 后 “连接已授权” 消息的日志记录。(作为此操作的一部分,我向后移植了 dc11f31a1 中的代码更改。)使 BackendStatusShmemSize() 考虑由 CreateSharedBackendStatus() 分配的 GSS 相关空间。此遗漏可能会导致 max_connections 设置非常高时出现共享内存不足的问题。删除仅可以在 GSS 加密连接上使用 GSS 身份验证的任意、无意义的限制。改进文档;值得注意的是,记录 libpq 现在优先于 SSL 加密使用 GSS 加密(如果两者都可能)。根据 Mikael Gustavsson 的报告。向后移植到引入此代码的 v12。讨论:https://postgr.es/m/e5b0b6ed05764324a2f3fe7acfc766d5@smhi.se https://git.postgresql.org/pg/commitdiff/622ae4621ece72a9f64b5602c74d7aaf373c1631

  • 改进与 pg_hba.conf 不匹配的连接相关的日志消息。包括有关是否已激活 GSS 加密的详细信息;自从我们添加了 “hostgssenc” 类型 HBA 条目以来,这是相关信息。Kyotaro Horiguchi 和 Tom Lane。向后移植到引入 GSS 加密的 v12。讨论:https://postgr.es/m/e5b0b6ed05764324a2f3fe7acfc766d5@smhi.se https://git.postgresql.org/pg/commitdiff/3995c424984e991b1069a2869af972dc07574c0b

  • 抑制来自 SIGQUIT 关闭的多个报告的日志垃圾信息。当 postmaster 向其子进程发送 SIGQUIT 时,所有子进程都没有真正必要记录该事实;postmaster 已经为此做了一个日志条目,因此添加可能数十或数百个子进程日志条目没有任何价值。因此,让我们引入一个新的 ereport 级别来指定 “WARNING,但永远不要发送到日志”,并将该级别用于这些消息。在提交 7e784d1dc 之前,这样的更改是不可取的,因为如果有人手动对后端进行 SIGQUIT 操作,我们 确实 希望记录它。但是现在,我们可以合理地确定 postmaster 发出的信号和不是 postmaster 发出的信号之间的区别。同时,在 ereport() 之前还清除 error_context_stack,以防止在信号处理程序上下文中调用错误回调。这应该减少在尝试通知客户端时被挂起的可能性。根据 Andres Freund 的建议。讨论:https://postgr.es/m/20201225230331.hru3u6obyy6j53tk@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1f9158ba48122fa232db955a2ee324eec1848ba9

  • 文档:修复因表格列过宽导致的 PDF 构建警告。向表格 8.27 和 65.1 添加多范围信息导致它们在 PDF 文档构建中开始抛出“超出可用区域”的警告。对于 8.27,调整现有的列宽提示足以解决此问题。对于 65.1,我稍微调整了宽度,但要真正修复它,我必须在表格中的每个逗号后插入一个空格,以便允许在那里发生换行符。(这似乎比插入 &zws;; 实体更容易阅读和维护。)根据 buildfarm 的反馈。https://git.postgresql.org/pg/commitdiff/f20dc2c8dd50a5c738d535205d5d44bff82d3f75

  • 修复 krb_server_keyfile GUC 参数的使用。secure_open_gssapi() 无条件地将 krb_server_keyfile 设置安装为 KRB5_KTNAME,只要它不为空。但是,pg_GSS_recvauth() 仅在 KRB5_KTNAME 尚未设置时才安装它,导致了一个令人不安的不一致:理论上,客户端可能会看到不同的服务器主体名称集,具体取决于他们是否使用 GSSAPI 加密。始终使用 krb_server_keyfile 似乎是正确的做法,因此让这两个地方都这样做。此外,修复 secure_open_gssapi() 缺少对 setenv() 失败的检查 --- 这当然不太可能,但安全关键的操作不应该马虎。此外,改进了相关的文档。此补丁没有处理 secure_open_gssapi() 对 setenv() 的使用,实际上还导致 pg_GSS_recvauth() 也使用它。这名义上违反了项目的可移植性规则,但由于此代码仅在使用 --with-gssapi 构建时才构建,因此我认为没有必要在后向分支中对此采取任何措施。不过,HEAD 将会有一个修复程序。向引入 GSSAPI 加密的 v12 进行反向移植。pg_GSS_recvauth() 中的可疑行为可以追溯到更早的版本,但它没有任何不一致之处,因此就这样吧。讨论:https://postgr.es/m/2187460.1609263156@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/860fe27ee1e2a4a1c36c2f874c37656533cccce9

  • 优先使用 setenv() 而不是 putenv()。自 2001 年以来,我们一直使用 putenv() 并避免使用 setenv(),理由是后者不可移植且不在 POSIX 中。但是,POSIX 在同一年添加了它,而现在情况已经逆转:setenv() 可能比 putenv() 更具可移植性,因为 POSIX 现在将后者视为非核心函数。而且 setenv() 的语义也更清晰。因此,让我们反转旧策略。此提交为任何掉队者添加了一个简单的 src/port/ setenv() 实现(我们在 buildfarm 中有一个,但如果该代码在实际使用中从未使用过,我不会感到惊讶)。更重要的是,扩展 win32env.c 以便也支持 setenv()。然后,将 putenv() 的用法替换为 setenv(),并删除一些 setenv() 模仿者的临时实现。此外,调整我们的 src/port/ unsetenv() 实现以遵循 POSIX 规范,即它返回一个错误指示符,而不是像古老的 BSD 惯例那样返回 void。我认为没有必要让所有调用点都检查错误,但是可移植性存根应该与实际实践相符。讨论:https://postgr.es/m/2065122.1609212051@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7ca37fb0406bc2cbbd864a2ffdbdb4479e338c0c

  • 对 pg_upgrade 跨版本测试进行更多修复。提交 7ca37fb04 从 regress.so 库中删除了 regress_putenv,因此重新加载依赖于该函数的 SQL 函数将不起作用。与 52202bb39 类似地修复。根据 buildfarm 的反馈。https://git.postgresql.org/pg/commitdiff/091866724cb3ee7251fa56e2517248c4b7796ca8

  • 文档:详细说明日期/时间类型的比较行为。日期/时间数据类型之间的跨类型比较的行为实际上没有在任何地方解释。如果您认识到其他地方有关数据类型转换的注释的适用性,您可能会推断出它,但是似乎值得明确的文档说明。根据 Dana Burd 的错误 #16797。讨论:https://postgr.es/m/16797-f264b0b980b53b8b@postgresql.org https://git.postgresql.org/pg/commitdiff/319f4d54e82d15d4a0c3f4cc1328c40dba024b5c

  • 文档:改进对不带时区的 timestamp 的 EXTRACT(EPOCH) 的解释。尝试更清楚地说明这里实际发生的是什么计算。根据 Dana Burd 的错误 #16797。讨论:https://postgr.es/m/16797-f264b0b980b53b8b@postgresql.org https://git.postgresql.org/pg/commitdiff/4d3f03f42227bb351c2021a9ccea2fff9c023cfc

Alexander Korotkov 推送

Noah Misch 推送

Amit Kapila 推送

  • 扩展输出插件 API 以允许解码准备好的事务。这向输出插件 API 添加了六个方法,添加了对在准备时流式传输两阶段事务更改的支持。* begin_prepare * filter_prepare * prepare * commit_prepared * rollback_prepared * stream_prepare 其中大部分是对现有方法的简单扩展,语义上的区别在于事务尚未提交,并且可能会在稍后中止。到目前为止,两阶段事务在订阅者上被转换为常规事务,并且 GID 没有转发给它。没有任何两阶段命令被传达给订阅者。此补丁为逻辑解码插件提供了通知两阶段命令的基础设施,例如带有相应 GID 的 PREPARE TRANSACTION、COMMIT PREPARED 和 ROLLBACK PREPARED 命令。这也扩展了“test_decoding”插件,实现了这些新方法。此提交只是添加了这些新的 API,即将到来的“允许在 ReorderBuffer 中在准备时进行解码”的补丁将使用这些 API。作者:Ajin Cherian 和 Amit Kapila,基于 Nikhil Sontakke 和 Stas Kelvich 先前的工作。审核者:Amit Kapila、Peter Smith、Sawada Masahiko 和 Dilip Kumar 讨论:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru https://postgr.es/m/CAMGcDxeqEpWj3fTXwqhSwBdXd2RS9jzwWscO-XbeCfso6ts3+Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0aa8a01d04c8fe200b7a106878eebc3d0af9105c

Peter Geoghegan 推送

  • 修复索引删除最新移除XID的错误。用于在REDO例程中生成恢复冲突的逻辑在确定最新移除的XID时存在微妙的错误。它未能跟踪HOT链中的链接,因此在某些情况下未能考虑所有相关的堆元组头。为了修复这个问题,扩展处理LP_REDIRECT行指针的循环,使其也能处理HOT链。这个新版本的循环松散地基于heap_prune_chain()中类似的循环。这个错误的潜在影响可能相当有限,因为水平线代码必然会处理由LP_DEAD设置的索引元组指向的堆元组。设置LP_DEAD索引元组(例如在kill_prior_tuple机制中)的过程与机会性地修剪指向的堆元组高度相关。另外,生成恢复冲突的问题通常是在索引元组的LP_DEAD位最初设置后的一段时间才出现,这与堆修剪不同,堆修剪是在修剪操作时生成latestRemovedXid(堆修剪没有延迟的“潜在页面分割”风格的处理,它会懒惰地产生冲突)。仅回溯到Postgres 12,这是此逻辑在原始执行期间运行的第一个版本(在commit 558a9165e08之后)。索引的latestRemovedXid机制自10多年前首次出现以来(在commit a760893d中)就存在相同的错误,但是现在回溯到所有支持的版本似乎从整体上来说不是一个好主意。在恢复期间运行新的改进代码似乎有风险,特别是考虑到没有收到来自实际应用的任何投诉。作者:Peter Geoghegan pg@bowt.ie 讨论:https://postgr.es/m/CAH2-Wz=Eib393+HHcERK_9MtgNS7Ew1HY=RDC_g6GL46zM5C6Q@mail.gmail.com 回溯:12- https://git.postgresql.org/pg/commitdiff/422881744997417944634a7f84af7a66a608de9a

  • 在持有缓冲区锁的情况下获取堆页的最大偏移量。进一步考虑后,似乎最好在获取页面的缓冲区锁之后调用PageGetMaxOffsetNumber()。这实际上不应该有任何影响,但是这样做更清晰。是对commit 42288174的后续改进。回溯:12-,与commit 42288174一样 https://git.postgresql.org/pg/commitdiff/32d6287d2eef6b6a4dde07e0513f3e4f321792ad

待处理的补丁

Noah Misch 发送了一个补丁,将类似的算法合并到 roles_is_member_of() 中。

Vigneshwaran C 发送了一个基于现有补丁的补丁,用于并行化 COPY 的部分,将查找行边界的任务委派给工作进程。

Bharath Rupireddy 发送了一个补丁,实现了 REFRESH MATERIALIZED VIEW 的 EXPLAIN [ANALYZE]。

Masahiko Sawada 发送了另一个修订版的补丁,添加新的 FDW API 以支持 2PC,引入全局事务管理器,并在 PostgreSQL FDW 中实现这些 FDW API。

Peter Geoghegan 发送了另一个修订版的补丁,用于修改 btvacuumstrategy() 的自底向上索引删除。

Bharath Rupireddy 发送了另外两个修订版的补丁,使得 CTAS 可以使用并行插入。

Luc Vlaming 发送了两个修订版的补丁,用于懒加载地生成 JIT IR 代码。这个问题出现在以下情况:对于分区表,不必要地生成了大量 JIT IR 代码,其中许多分区的 IR 从未执行,因为这些分区被修剪了。

Thomas Munro 发送了另一个修订版的补丁,使得可以使用并行哈希来执行 Full 和 Right JOIN。

Andrey Borodin 发送了另一个修订版的补丁,将 LZ4 添加为 WALL FPI 的一种可能的压缩方案。

David Rowley 发送了另外两个修订版的补丁,用于减少在 Windows 上构建 contrib 模块的特殊情况的数量。

Noah Misch 发送了一个补丁,用于转储公共模式的所有权和安全标签。

Paul Martinez 发送了一个补丁,用于简化 user.c 中的权限检查逻辑。

Bharath Rupireddy 发送了另一个修订版的补丁,允许在 REFRESH MATERIALIZED VIEW 的规划中使用并行模式。

Thomas Munro 发送了另一个修订版的补丁,用于在共享内存中跟踪关系大小,此功能由新的 GUC smgr_shared_relation 控制,它限制了新引入的 SMgrSharedRelation 对象池的数量,并为 smgrnblocks() 提供了无锁的快速路径。

Peter Smith 发送了另一个修订版的补丁,允许 table-sync worker 使用多个事务。

Andrey V. Lepikhov 发送了另一个修订版的补丁,通过向 FDW API 添加三个新例程来加速对具有外部分区的表的 COPY 操作:BeginForeignCopy、EndForeignCopy 和 ExecForeignCopy,并在 PostgreSQL FDW 中添加相同例程。

Andrey Borodin 发送了另一个修订版的补丁,重新组织 pglz 压缩代码,使其更高效:将宏函数转换为常规函数以提高可读性,使用具有 uint16 索引而不是指针的更紧凑的哈希表,避免哈希表中的 prev 指针,并在搜索中使用 4 字节比较而不是 1 字节比较。

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

Luc Vlaming 发送了另一个修订版的补丁,允许部分 UNION ALL,从而改进了并行子查询的成本计算。

Rui Zhao 发送了另一个修订版的补丁,重构了在 RelationIdGetRelation 之后调用 RelationClose 的方式。

Peter Eisentraut 发送了另一个修订版的补丁,实现了来自过程的动态结果集。

David Fetter 发送了两个修订版的补丁,将 popcount 公开给 SQL。

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

David Fetter 发送了另一个修订版的补丁,使得可以从 initdb 设置 pg_hba.conf 参数。

Greg Sabino Mullane 发送了另一个修订版的补丁,让 psql 的 \df 通过输入类型帮助选择函数。

David Fetter 和 Krasiyan Andreev 交换了补丁,以实现窗口函数的 NULL 处理。

Dmitry Dolgov 发送了另外三个修订版的补丁,将通用类型下标基础设施用于 JSONB。

David Fetter 发送了一个 WIP 补丁,用于记录钩子系统。

Michael Banck 发送了一个补丁,添加了一个新的 PGC_ADMINSET guc 上下文和 pg_change_role_settings 默认角色,为 GUC 上下文在 “超级用户” 和 “用户” 之间创建了一个空间。

Álvaro Herrera 发送了另一个修订版的补丁,实现了 MERGE。

Peter Geoghegan 发送了另一个修订版的补丁,向下传递一个 “逻辑上未更改的索引” 提示,并使用它来实现自底向上的索引删除。

Soumyadeep Chakraborty 发送了另一个修订版的补丁,向 table AM API 添加一个接受列投影列表的例程。

Bruce Momjian 和 Michaël Paquier 交换了补丁,将其他十六进制函数移动到源代码树中的公共位置。

Etsuro Fujita 发送了另外两个修订版的补丁,实现了 postgres_fdw 节点上的异步追加。

David Fetter 发送了另一个修订版的补丁,实现了 TID 的范围扫描。

Pavel Stěhule 发送了另一个修订版的补丁,用于减少 PL/pgSQL 中非原子模式下 CALL 语句的执行开销。

Pavel Stěhule 发送了另一个修订版的补丁,实现了模式变量。

Josef Šimánek 发送了另一个修订版的补丁,添加了一个带有 COPY 进度报告的 pg_stat_progress_copy 视图。

Pavel Stěhule 发送了一个补丁,使得可以在 PL 中编写窗口函数,因为它们目前仅限于 C。

Luc Vlaming 发送了一个补丁,通过为每个后端分配一组独立的、本地于该后端的块,从而提高堆表批量加载的效率,并通过移动逻辑来减少锁定分区缓冲区所花费的时间,使每组 128 个块使用相同的缓冲区分区,然后添加一个自定义函数来专门为扩展获取缓冲区块,同时保持之前的分区锁,从而减少我们在互斥锁上花费的时间。

Michael Banck 发送了一个补丁,将 --data-checksums 移动到 initdb 的 --help 输出中的公共选项。

Thomas Munro 发送了一个补丁,为缺少 pthread barrier 的平台向 pgbench 添加 pthread barrier 模拟。