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

发布于 2021-01-11,作者:PWN
PWN

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

PostgreSQL 产品新闻

pg_back 1.10,PostgreSQL 的备份脚本,已发布。 https://github.com/orgrim/pg_back

pgagroal 1.1.0,PostgreSQL 的高性能协议原生连接池,已发布。 https://agroal.github.io/pgagroal/release/announcement/2021/01/05/pgagroal-1.1.0.html

Veil2 0.9.2 beta,一个为 Postgres 提供数据库安全附加组件,提供一个使用行级安全性实现虚拟私有数据库的框架,已发布。 https://marcmunro.github.io/veil2/html/index.html

1 月份的 PostgreSQL 工作

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

PostgreSQL 新闻

PostgreSQL 星球:https://planet.postgresql.org/

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

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

已应用的补丁

Amit Kapila 推送了

Michaël Paquier 推送了

Tom Lane 推送了

  • 为核心语法添加支持多个解析目标的功能。此补丁本质上允许 gram.y 实现一系列相关的语法树,而不是必须始终解析 SQL 语句列表。raw_parser() 获取一个新参数 enum RawParseMode 来指定要执行的操作。作为概念验证,添加一个仅解析不带任何其他修饰的 TypeName 的模式,并使用它来大大简化 typeStringToTypeName()。此外,发明一个新的 SPI 入口点 SPI_prepare_extended(),以允许 SPI 用户(尤其是 plpgsql)访问此新功能。为了使它成为 SPI_prepare() 的最后一个变体,将它的附加参数设置为一个结构而不是直接参数,并承诺该结构将来的添加可以默认为零。SPI_prepare_cursor() 和 SPI_prepare_params() 可能在某个时候消失。讨论:https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/844fe9f159a948377907a63d0ef3fb16dc51ce50

  • 重新实现 pl/pgsql 的表达式和赋值解析。发明新的 RawParseModes,允许核心语法直接处理 pl/pgsql 表达式和赋值,从而消除 pl/pgsql 解析器中的大量黑客行为。这会将大量有关 pl/pgsql 的知识移动到核心代码中:值得注意的是,我们必须发明一个 CoercionContext,该上下文与 pl/pgsql 赋值强制转换的(相当可疑的)历史行为相匹配。这正在偏离 pl/pgsql 作为核心的远距离扩展的最初想法,但实际上我们很久以前就越过了这座桥梁。这样做的主要优点是,我们现在可以使用核心解析器生成 FieldStore 和/或 SubscriptingRef 节点来处理对作为记录或数组的 pl/pgsql 变量的赋值。这修复了许多从未在 pl/pgsql 赋值中实现的情况,例如嵌套记录和数组切片,并且它允许 pl/pgsql 赋值支持在提交 c7aba7c14 中引入的数据类型特定的下标行为。还有一些美观上的好处:当 pl/pgsql 表达式中出现语法错误时,错误报告不再包含曾经添加到表达式文本的前缀的令人困惑的“SELECT”关键字。此外,似乎有一些小的速度提升。讨论:https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c9d5298485b78a37923a23f9af9aa0ade06762db

  • 删除 pl/pgsql 中的 PLPGSQL_DTYPE_ARRAYELEM 数据类型。在前一个提交之后,我们不再真正需要它,因为数组赋值主要由核心代码处理。仍然可以访问该代码的唯一方法是,GET DIAGNOSTICS 目标变量可以是数组元素。但这似乎不是一个特别必要的功能。我曾在提交 55caaaeba 中添加过它,但只是因为它很容易而不是因为有人真正要求过它。因此,恢复该补丁,然后删除现在不可访问的东西。(如果我们真的需要,我们可能会使用新的赋值机制重新实现 GET DIAGNOSTICS;但是成本/收益比看起来非常差,而且它可能会慢一点。)请注意,PLPGSQL_DTYPE_RECFIELD 仍然存在。我们也有可能摆脱它,但是维护 RECORD 类型变量的现有行为似乎可能很困难。由于这些代码路径中没有任何功能限制,就像 ARRAYELEM 代码中一样,我没有继续这个想法。讨论:https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1788828d33516809fa2d842bf6e273d78e21d957

  • 重新思考 pl/pgsql 中的“读/写参数”机制。先前在 pl/pgsql 中重新实现数组元素赋值的补丁的性能问题使我意识到读/写参数机制设计错误。我们不要求赋值源表达式必须使其对目标变量的所有引用都可以作为 R/W 传递,而是真正希望将对目标变量的一个引用标识为作为 R/W 传递,允许任何其他引用像默认情况下那样作为只读传递。只要 R/W 引用是表达式中顶级(因此是最后一个要执行的)函数的直接参数,则将 R/O 引用传递给表达式的较低部分就不会有任何危害。也没有任何用例说明顶层函数的多个参数是 R/W。因此,重写该逻辑以标识引用目标变量的单个参数,并仅使该参数传递读/写引用,而不使引用目标变量的任何其他参数传递读/写引用。讨论:https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1c1cbe279b3c6e8038c8f8079402f069bb4cea4c

  • 修复 substring() 函数中的整数溢出边界情况。如果子字符串的起始索引和长度相加时发生溢出,substring() 函数的行为会不正确,要么在应该成功的情况下抛出虚假的“负子字符串长度”错误,要么不抱怨负长度为负数(而是返回整个字符串,在大多数情况下)。不出所料,该函数的 text、bytea 和 bit 变体都存在此问题。重新安排逻辑以确保始终拒绝负长度,并添加溢出检查以处理另一种情况。此外,在 detoast_attr_slice() (以前称为 heap_tuple_untoast_attr_slice())中安装类似的保护措施,因为它远不清楚通向该函数的其他代码路径是否会传递导致溢出的值。此补丁由我自己和 Pavel Stehule 提出,根据 Rafi Shamim 提出的错误 #16804。向 v11 进行回溯。虽然这些错误很旧,但在提交 4d6ad3125 之前,用于溢出检测算术的 common/int.h 基础设施不存在,并且这些错误行为似乎不足以证明为较旧的分支开发独立的修复程序是合理的。讨论:https://postgr.es/m/16804-f4eeeb6c11ba71d4@postgresql.org https://git.postgresql.org/pg/commitdiff/4bd3fad80e5c3bd107583dd9d32d4a47c045a3ec

  • 引入新的 GUC_REPORT 设置 "in_hot_standby"。除了可以通过 SHOW 查询之外,此值会在会话启动时立即发送给客户端,如果服务器在会话期间被提升为主服务器,则稍后再次发送。即将发布的补丁将使用立即报告来避免尝试连接到主服务器时的额外往返。Haribabu Kommi、Greg Nancarrow、Tom Lane;由 Laurenz Albe、Takayuki Tsunakawa、Peter Smith 在不同时间审核。讨论:https://postgr.es/m/CAF3+xM+8-ztOkaV9gHiJ3wfgENTq97QcjXQt+rbFQ6F7oNzt9A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bf8a662c9afad6fd07b42cdc5e71416c51f75d31

  • 允许 psql 的 \dt 和 \di 显示 TOAST 表及其索引。以前,TOAST 对象被无条件地抑制,但由于 \d 能够打印它们,因此不清楚为什么这些变体不应该显示。相反,使用与系统目录相同的规则:如果您编写 'S' 修饰符或表名模式,则可以查看它们。(实际上,由于几乎没有人会将 pg_toast 保留在他们的 search_path 中,因此它实际上取决于您是否使用可以匹配 pg_toast.*. 的模式。)似乎不需要更改文档,因为文档已经说明这种情况发生在“系统对象”中;我们只是将 TOAST 表归类为系统对象。Justin Pryzby,由 Laurenz Albe 审核。讨论:https://postgr.es/m/20201130165436.GX24052@telsasoft.com https://git.postgresql.org/pg/commitdiff/7d80441d2c8de5cd5d593e302bd14e8b19ee92d4

  • 还原提交 7d80441d2 中的不稳定测试用例。我一时忘记了“owner”列在构建场中不会稳定。好吧,这些测试无论如何都没有太大的价值。讨论:https://postgr.es/m/20201130165436.GX24052@telsasoft.com https://git.postgresql.org/pg/commitdiff/14d49f483d4c8a5a356e25d5e5ff5726ca43abff

  • 为正则表达式包添加一个测试模块。此模块提供一个函数 test_regex(),该函数在功能上非常类似于 regexp_matches(),但具有额外的面向调试的选项和额外的输出。调试选项有点晦涩;它们被选择为与 Henry Spencer 在很久以前为 Tcl 编写的测试工具的 API 相匹配。有了这个,我们可以导入 Spencer 最初编写的所有测试用例,即使对于我们目前在 Postgres 中不公开的正则表达式功能也是如此。这似乎是必要的,因为我们不能再依赖 Tcl 作为上游并验证我们所做的任何修复或改进。除了 Spencer 的测试之外,我还为后行约束(我们在 2015 年添加的,而 Tcl 仍然没有吸收)添加了一些测试,这些测试是以他对先行约束的测试为模型的。在查看代码覆盖率报告后,我还加入了一些测试来更全面地执行我们的“高色图”逻辑。根据我的测试,这使 src/backend/regex/ 的检查世界覆盖率从 71.1% 提高到 86.7% 的行。(coverage.postgresql.org 显示的数字略有不同,我认为这是因为它衡量的是非断言构建。)讨论:https://postgr.es/m/2873268.1609732164@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ca8217c10138fa3ffe1e7d1def2484fd0eb78226

  • 添加 idle_session_timeout。此 GUC 变量的工作方式与 idle_in_transaction_session_timeout 非常相似,因为它会杀死等待新客户端查询时间过长的会话。但是,它在我们在事务之外时应用,而不是在我们在事务之内时应用。Li Japin,由 David Johnston 和 Hayato Kuroda 审核,我进行了一些修复。讨论:https://postgr.es/m/763A0689-F189-459E-946F-F0EC4458980B@hotmail.com https://git.postgresql.org/pg/commitdiff/9877374bef76ef03923f6aa8b955f2dbcbe6c2c7

  • 改进 timeout.c 对重复超时设置/取消的处理。一个非常常见的用法模式是,我们设置一个我们不希望达到的超时,在稍微延迟后取消它,然后稍后重复。对于 timeout.c 的原始实现,这会导致每次超时设置或取消都调用一次 setitimer()。通过在更改超时中断请求方面偷懒,我们可以做得更好,即:(1) 即使我们没有活动的超时事件,也永远不要取消未完成的中断;(2) 如果我们需要设置中断,但已经有一个中断在或在所需时间之前挂起,则不要管它。当中断发生时,信号处理程序将在当时需要的任何时间重新安排它。例如,使用 statement_timeout 的一秒设置,此方法导致与内核的交互频率仅略高于每秒一次,无论我们在其间执行多少语句。主线代码在第一次之后可能永远不会调用 setitimer(),而每次信号处理程序触发时,它都会看到当时挂起的请求还有一秒钟的时间,而此时它会设置下一个中断请求。之后每个主线超时设置请求都会观察到它想要的时间已经超过了挂起的中断请求时间,并且什么也不做。对于使用几个不同超时长度的情况,这也很有效,只要它们都不是非常短。但这很好地描述了我们的用法。Thomas Munro 的想法和原始补丁;我修复了一个竞争条件并改进了注释。讨论:https://postgr.es/m/CA+hUKG+o6pbuHBJSGnud=TadsuXySWA7CCcPgCt2QE9F6_4iHQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/09cf1d52267644cdbdb734294012cf1228745aaa

  • 改进 timeout.c 中的注释。重新阅读后,我意识到我在新的超时代码中错过了一个竞争条件。它是安全的,但添加一个注释来解释它。讨论:https://postgr.es/m/CA+hUKG+o6pbuHBJSGnud=TadsuXySWA7CCcPgCt2QE9F6_4iHQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9486e7b666fd113f043d5f091fd42bc1ef72acd8

  • 修复测试注释中的虚假链接。我显然在提交 ca8217c10 中复制粘贴了错误的链接。将其指向它应该去的地方。https://git.postgresql.org/pg/commitdiff/f7a1a805cb178653ea2a6c8991ad73b035af953e

  • 进一步考虑 idle_session_timeout 补丁。经过反思,PostgresMain() 中的操作顺序是错误的。这些超时应该在我们在执行命令后读取 CHECK_FOR_INTERRUPTS 之前而不是之后关闭,以保证任何超时错误都会在那里检测到,而不是在一些定义不明确的稍后时间点(可能是在浪费了大量工作之后)。这实际上是原始 idle_in_transaction_timeout 补丁中的错误,因此回溯到引入该补丁的 9.6 版本。https://git.postgresql.org/pg/commitdiff/b8d0cda53377515ac61357ec4a60e85ca873f486

  • 调整 createdb TAP 测试以在最近的 OpenBSD 上工作。我们在去年 2 月发现,提交 008cf0409 添加的错误用例测试在 OpenBSD 上失败,因为该平台实际上并不检查区域设置名称。当时,这似乎只是 LC_CTYPE 的问题,但在较新版本的 OpenBSD 上进行的测试表明,它现在对 LC_COLLATE 也同样宽松。与其也删除 LC_COLLATE 测试,不如放回 LC_CTYPE(还原 c4b0edb07),并调整这些测试以接受如果 setlocale() 不拒绝虚假的区域设置名称,我们会得到的不同错误消息。这些测试的重点实际上不是后端如何处理区域设置名称,而是展示 createdb 安全地引用有趣的区域设置名称;因此我们不会以这种方式失去测试可靠性。根据需要进行回溯。讨论:https://postgr.es/m/231373.1610058324@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9ffe2278372d7549547176c23564a5b3404d072e

  • 修复解析 BRE 模式正则表达式中的一个古老错误。brenext() 在解析 '*' 量词时,忘记为标记返回任何“值”;根据 next() 中的等效情况,它应该返回值 1 以指示需要贪婪而不是非贪婪行为。结果是,如果我们在此时的 v->nextvalue 中碰巧有一个零,则编译后的正则表达式的行为可能类似于 'x*?' 而不是预期的 'x*'。如果我们有一个 '.*' 在 BRE 模式正则表达式的开头,这种情况似乎会以某种可靠性发生,但这取决于堆栈分配的结构的初始内容,因此不能保证会失败。由 Alexander Lakhin 使用 valgrind 测试发现。此错误似乎是 Spencer 代码中的原始错误,因此一路回溯。讨论:https://postgr.es/m/16814-6c5e3edd2bdf0d50@postgresql.org https://git.postgresql.org/pg/commitdiff/afcc8772edcec687d87b6f762ca6113229af7291

  • 修复 plpgsql 测试以用于 debug_invalidate_system_caches_always。提交 c9d529848 导致在有更多地方的失败的错误上下文堆栈取决于 debug_invalidate_system_caches_always (以前称为 CLOBBER_CACHE_ALWAYS)。这并不奇怪,因为如果计划缓存被破坏,我们必须重新解析缓存的计划。通过隐藏这些位置的上下文堆栈来稳定预期的测试输出,就像我们在该测试脚本中的其他地方所做的那样。(现在我们有了 debug_invalidate_system_caches_always,另一个值得考虑的想法是强制它在这些测试用例中为零。这似乎有降低缓存破坏测试覆盖范围的风险,这可能值得也可能不值得能够验证我们在正常情况下获得预期的错误输出。目前,我只是坚持使用现有技术。)顺便说一句,更新了引用 CLOBBER_CACHE_ALWAYS 的注释。根据构建场成员 hyrax。https://git.postgresql.org/pg/commitdiff/39d4a153105f0693d93f593a23e5144e2bd031ef

Thomas Munro 推送

Peter Geoghegan 推送了代码。

Peter Eisentraut 推送了代码。

Dean Rasheed 推送了代码。

Bruce Momjian 推送了代码。

Fujii Masao 推送了代码。

  • 文档:修复有关 recovery_target_timeline 的默认行为的描述。recovery_target_timeline 的默认值在 v12 中已更改,但有关其默认行为的描述未更新。回溯到 v12,其中 recovery_target_timeline 的默认行为已更改。作者:Benoit Lobréau 审核人:Fujii Masao 讨论:https://postgr.es/m/CAPE8EZ7c3aruEmM24GYkj8y8WmHKD1m9TtPtgCF0nQ3zw4LCkQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/25dde5835772a58356383bf1112c6c2a1a37df0e

  • 检测后端和启动进程之间的死锁。涉及锁的恢复冲突导致的死锁可能发生在热备用后端和启动进程之间。如果后端在表上获得排他访问锁,并最终触发死锁,则可以按预期检测到该死锁。另一方面,以前,如果启动进程获得排他访问锁,并最终触发死锁,则无法检测到该死锁,并且即使在 deadlock_timeout 经过后也可能仍然存在。这是一个错误。此错误的原因是处理锁恢复冲突的代码根本没有考虑死锁情况。它假设涉及启动进程和后端的死锁可以通过后端内调用的死锁检测器来检测。但这种假设是不正确的。如果需要,启动进程也应该调用死锁检测器。为了修复此错误,此提交使启动进程在处理锁恢复冲突时,如果达到 deadlock_timeout,则调用死锁检测器。具体来说,在这种情况下,启动进程会请求所有持有冲突锁的后端检查自身是否存在死锁。回溯到 v9.6。v9.5 也存在此错误,但根据讨论,我们决定不将此修复回溯到 v9.5。因为 v9.5 没有此错误修复补丁所依赖的一些基础设施代码(例如,37c54863cf)。我们可以将这些代码应用于回溯,但由于下一个小版本发布是 v9.5 的最后一个版本,因此这样做很冒险。如果我们意外地通过回溯将新错误引入 v9.5,则没有机会修复该错误。我们确定回溯到 v9.5 会带来比收益更大的风险。作者:Fujii Masao 审核人:Bertrand Drouvot、Masahiko Sawada、Kyotaro Horiguchi 讨论:https://postgr.es/m/4041d6b6-cf24-a120-36fa-1294220f8243@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8900b5a9d59a645b3485f5b046c4c7871b2c4026

  • 添加 GUC 以记录恢复冲突的长时间等待。此提交添加了 GUC log_recovery_conflict_waits,它控制当启动进程等待恢复冲突的时间超过 deadlock_timeout 时是否生成日志消息。这有助于确定恢复冲突是否阻止恢复应用 WAL。请注意,目前仅当即使在 deadlock_timeout 过去后,恢复冲突仍未解决时,才会生成日志消息,即仅当即使在 deadlock_timeout 之后,启动进程仍在等待恢复冲突时才会生成日志消息。作者:Bertrand Drouvot、Masahiko Sawada 审核人:Alvaro Herrera、Kyotaro Horiguchi、Fujii Masao 讨论:https://postgr.es/m/9a60178c-a853-1440-2cdc-c3af916cff59@amazon.com https://git.postgresql.org/pg/commitdiff/0650ff23038bc3eb8d8fd851744db837d921e285

Tomáš Vondra 推送了代码。

待处理的补丁

Atsushi Torikoshi 发送了另一个补丁修订版,以实现 pg_get_target_backend_memory_contexts() 并使其能够收集指定进程的内存上下文。

Atsushi Torikoshi 发送了另一个补丁修订版,以将 wait_start 列添加到 pg_locks 视图中。

Mark Zhao 发送了一个补丁,旨在通过在 pgoutput.c 中的 RelationIdGetRelation 之后添加缺少的 RelationClose 来修复一个错误,该错误表现为分区表上的逻辑复制非常慢并消耗大量 CPU。

Önder Kalacı 发送了另一个补丁修订版,以实现逻辑复制的行过滤。

Justin Pryzby 发送了一个补丁,以允许在 BIND 阶段报告参数值中的错误。

Pavel Stěhule 发送了另一个补丁修订版,使其可以在 PL 中编写窗口函数,并在 PL/pgsql 中实现相同的功能。

Bharath Rupireddy 发送了三个补丁的修订版,使其可以在 CTAS 中使用并行插入。

Kyotaro HORIGUCHI 发送了四个补丁修订版,旨在通过确保 Walsender 在发送历史时间线时跟踪时间线切换来修复一个错误,该错误表现为备用服务器无法跟随时间线切换。

Peter Smith 发送了四个补丁修订版,使其可以使用多个 tablesync 工作程序。

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

Dmitry Dolgov 发送了补丁的另外三个修订版本,用于为 JSONB 操作使用通用下标基础设施。

Justin Pryzby 发送了补丁的另一个修订版本,用于支持 pg_dump 中多种压缩方法和相关选项。

Masahiko Sawada 发送了一个补丁,引入了一个 IndexAM API 用于选择索引清理策略,使用相同的策略来选择索引清理策略,并在索引没有增长时跳过 btree bulkdelete。

Thomas Munro 发送了补丁的另一个修订版本,用于减少 WaitEventSet 系统调用的频繁调用。

Pavel Stěhule 发送了一个补丁,用于添加一个选项,在 PL/pgsql 中使用简写来引用参数和局部变量。

Dmitry Dolgov 发送了补丁的另一个修订版本,用于防止 ArrayExpr 中的每个元素混杂,以防止 pg_stat_statements 为本质上相似的查询生成不同的条目。

Tom Lane 发送了一个 PoC 补丁,用于处理 MacOS 的 SIP 基础设施如何处理动态库。

Amit Kapila 发送了一个补丁,用于跟踪逻辑复制中 2PC 遗漏的某些情况的回滚的复制源进度。

Paul Martinez 发送了一个补丁,用于在引用完整性触发器中添加部分外键更新。

Bruce Momjian 发送了补丁的另外两个修订版本,用于合并 /common 中更多的十六进制函数。

Shinya Kato、Masahiko Sawada 和 Fujii Masao 交换了补丁,以完善 psql 中 CLOSE、FETCH 和 MOVE 的制表符补全的实现。

Daniel Gustafsson 发送了补丁的另外两个修订版本,用于支持在运行的集群上启用和禁用校验和。

Tsutomu Yamada 和 Tomáš Vondra 交换了补丁,以向 psql 添加一个以 \dX 开头的一系列函数,用于处理扩展统计信息。

Bharath Rupireddy 发送了补丁的另外两个修订版本,用于添加一个 postgres_fdw 函数来丢弃缓存的连接,添加一个 postgres_fdw.keep_connections GUC 来控制连接是否被缓存,并添加一个类似的服务器级 keep_connection GUC。

Ryo Matsumura 在 libpq 跟踪补丁的基础上发送了一个补丁,修复了其中的一些疏忽。

Kyotaro HORIGUCHI 发送了补丁的另一个修订版本,旨在修复在 WAL 重放期间由于在截断成功后延迟检查点完成而表现为损坏的错误。

Greg Sabino Mullane 发送了补丁的另一个修订版本,以使 psql 的 \df 可以按输入类型选择函数。

Movead Li 发送了补丁的另一个修订版本,用于修复 WAL 切换的 waldump 大小。

Kirk Jamison 发送了补丁的另一个修订版本,以使用 dlist 使删除关系缓冲区更有效。

Michaël Paquier 发送了补丁的另一个修订版本,以将 SHA1 添加到 cryptohash 基础设施中。

Julien Rouhaud 发送了补丁的另一个修订版本,用于将 pg_stat_statements 查询混杂移动到核心,在 pg_stat_activity 和 log_line_prefix 中公开 queryid,并在详细的解释中公开查询标识符。

Laurenz Albe 发送了补丁的另外两个修订版本,以向 pg_stat_database 添加会话统计信息。

Zeng Wenjing 发送了一个 PoC 补丁,以实现全局索引。

Bharath Rupireddy 发送了补丁的另外三个修订版本,以实现 REFRESH MATERIALIZED VIEW 的 EXPLAIN [ANALYZE]。

Masahiko Sawada 发送了一个补丁,旨在修复由于逻辑复制工作进程在错误上下文回调中访问目录而表现出来的错误,方法是将本地和远程类型名称都存储在 SlotErrCallbackArg 中,以便只需在错误回调中设置名称,而无需系统缓存查找。

Vigneshwaran C 发送了一个补丁,为 PUBLICATION 添加模式级支持。

Mark Dilger 发送了补丁的另外两个修订版本,添加了一个新的 pg_amcheck contrib 模块,这是一个命令行界面,用于针对表和索引运行 amcheck 的验证。

Thomas Munro 发送了一个补丁,将 FreeBSD 添加到具有 fdatasync 的平台列表中。

Kyotaro HORIGUCHI 发送了补丁的另一个修订版本,通过将统计收集器用于临时存储的文件替换为共享内存,使其更有效率。

Michaël Paquier 发送了补丁的另一个修订版本,以重构 HMAC 实现以减少重复代码。

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

Kyotaro HORIGUCHI 发送了补丁的另一个修订版本,使 ALTER TABLE SET [UN]LOGGED 避免堆重写,当 wal_level > minimal 时更改 SET LOGGED,以便它使用 XLOG_FPI 而不是大量 HEAP_INSERT 发出 WAL,并允许清理在创建它的事务崩溃时遗留的文件。

Pavel Stěhule 发送了一个补丁,添加了一种将变量内容的文本值返回到 PL/pgsql 调试 API 的方法。

Pavel Stěhule 发送了一个补丁,使 psql 的 \watch 命令可以使用特殊的寻呼机。

Tomáš Vondra 发送了补丁的另一个修订版本,使在表达式上创建扩展统计信息成为可能。

Simon Riggs 发送了补丁的另外四个修订版本,以实现系统版本化表。

Peter Eisentraut 发送了 pageinspect 的另一个修订版本,该版本将块号参数的类型更改为 bigint,以避免溢出。

Bruce Momjian 发送了补丁的另外四个修订版本,用于为密钥管理添加测试。

Álvaro Herrera 和 Tomáš Vondra 交换了补丁,以实现 MERGE。

Pavel Stěhule 和 Erik Rijkers 交换了补丁,以实现模式变量。

Álvaro Herrera 和 Justin Pryzby 交换了补丁,以实现 ALTER TABLE ... DETACH PARTITION CONCURRENTLY。

Noah Misch 发送了一个补丁,用于修复 pg_dump 中初始权限中的 GRANT OPTION。

Krasiyan Andreev 发送了补丁的另一个修订版本,以实现窗口函数的 NULL 处理。

Michael Banck 发送了一个补丁,用于修复当相关查询不返回行时 psql 的 \watch 无法正常工作的问题。

Thomas Munro 发送了一个补丁,在 pg_test_fsync 中使用 pg_pwrite(),以保持与 PostgreSQL 现在所做操作的一致性。

Justin Pryzby 发送了补丁的另一个修订版本,以修复在 libpq 中实现可插拔压缩的补丁中的一些文档和注释。

Noah Misch 发送了补丁的另一个修订版本,旨在修复由于 SimpleLruTruncate() 舍入而表现为虚假“明显环绕”的错误。

Shenhao Wang 发送了一个补丁,旨在修复由于读取 backup_label 和 tablesapce_map 时设置文本模式而导致 Windows 上文件 backup_label 问题中出现无效数据的错误。

Tatsuo Ishii 发送了一个补丁,以修复文档中缺少首字母缩略词标签。

Tomáš Vondra 发送了补丁的另一个修订版本,以在 COPY FREEZE 中设置 PD_ALL_VISIBLE 和可见性映射位,从而弥补缺少页面级标志更新的不足。

Tom Lane 发送了一个补丁,旨在修复由于非热备模式下连接字符串中的多个主机未能进行故障转移而表现出来的错误。