2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 周报 - 2021 年 1 月 10 日

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

PostgreSQL 周报 - 2021 年 1 月 10 日

PostgreSQL 产品新闻

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

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

发布了 Veil2 0.9.2 beta,这是一个为 Postgres 提供虚拟专用数据库(Virtual Private Databases)框架和行级安全(row level security)的数据库安全插件。 https://marcmunro.github.io/veil2/html/index.html

一月份的 PostgreSQL 工作岗位

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

Amit Kapila 提交

Michaël Paquier 提交

Tom Lane 提交

  • 允许核心语法(core grammar)拥有多个解析目标。此补丁基本上允许 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 解析器中的大量 hackery。这使得 pl/pgsql 的大量知识转移到核心代码中:特别是,我们必须发明一个与 pl/pgsql(相当可疑的)历史行为相匹配的 CoercionContext 来处理赋值转换。这偏离了 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 datum 类型。继上一提交之后,我们不再需要这个了,因为数组赋值主要由核心代码处理。仍然可以通过该代码的唯一方式是 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 是没有用的。因此,重写该逻辑以识别单个 Param 引用目标变量,并只让该 Param 传递读/写引用,而不是任何其他引用目标变量的 Param。讨论:https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1c1cbe279b3c6e8038c8f8079402f069bb4cea4c

  • 修复 substring() 函数中的整数溢出边界情况。如果 substring 的起始索引和长度相加时发生溢出,substring() 的行为就会出错,要么在本应成功的情况下抛出错误的“负子字符串长度”错误,要么(在大多数情况下)未能抱怨负长度是负的(而是返回整个字符串)。毫不奇怪,该函数中的 text、bytea 和 bit 变体都存在此问题。重新排列逻辑以确保始终拒绝负长度,并添加溢出检查以处理其他情况。同时,将类似的保护措施安装到 detoast_attr_slice()(原名 heap_tuple_untoast_attr_slice()),因为不清楚导致该函数的其他代码路径是否可能传递导致溢出的值。此补丁由我和 Pavel Stehule 完成,根据 Rafi Shamim 的 bug #16804。向 v11 回溯。尽管这些 bug 存在已久,但用于溢出检测算术的通用/int.h 基础设施在提交 4d6ad3125 之前并不存在,而且这些错误行为似乎不足以证明为旧分支开发独立修复是合理的。讨论: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

  • 撤销 commit 7d80441d2 中不稳定的测试用例。我短暂地忘记了“owner”列在 buildfarm 中是不稳定的。算了,这些测试 anyway 也没什么价值。讨论: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 的测试,我还根据他对前瞻约束(lookahead constraints)的测试添加了几个关于后视约束(lookbehind constraints)的测试(我们在 2015 年添加了这些,Tcl 仍未吸收)。在查看代码覆盖率报告后,我还添加了几个测试来更全面地测试我们的“高颜色映射”(high colormap)逻辑。根据我的测试,这使 src/backend/regex/ 的 check-world 覆盖率从 71.1% 提高到 86.7%。(coverage.postgresql.org 显示一个略有不同的数字,我认为那是因为它测量的是一个非 assert 的构建。)讨论: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 set/cancel)的处理。一个非常常见的用法模式是,我们设置一个我们不期望达到的超时,稍后取消它,然后在稍后重复。使用 timeout.c 的原始实现,这会导致每次设置或取消超时时调用一次 setitimer()。我们可以通过惰性更改超时中断请求来做得更好,即:(1) 即使我们没有活动的超时事件,也永远不要取消挂起的(outstanding)中断;(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

  • 修复测试注释中的错误链接。我显然在 commit ca8217c10 中复制粘贴了错误的链接。将其指向应有的位置。 https://git.postgresql.org/pg/commitdiff/f7a1a805cb178653ea2a6c8991ad73b035af953e

  • 对 idle_session_timeout 补丁的进一步二次思考。回想起来,PostgresMain() 中的操作顺序是错误的。这些超时应该在执行 post-command-read CHECK_FOR_INTERRUPTS 之前,而不是之后关闭,以确保任何超时错误都会在那里被检测到,而不是在某个定义不清的稍后时间(可能在浪费了大量工作之后)。这实际上是原始 idle_in_transaction_timeout 补丁中的一个错误,因此回溯到 9.6 版本(该补丁于此版本引入)。 https://git.postgresql.org/pg/commitdiff/b8d0cda53377515ac61357ec4a60e85ca873f486

  • 调整 createdb TAP 测试以在最近的 OpenBSD 上运行。我们去年二月发现,commit 008cf0409 添加的错误用例测试在 OpenBSD 上失败了,因为该平台实际上不检查 locale 名称。当时看起来这只影响 LC_CTYPE,但测试了较新版本的 OpenBSD 后发现,它现在对 LC_COLLATE 同样宽松。为了不丢弃 LC_COLLATE 测试,将 LC_CTYPE 重新加回去(撤销 c4b0edb07),并调整这些测试以接受 setlocale() 不拒绝错误 locale 名称时产生的不同错误消息。这些测试的重点并非后端如何处理 locale 名称,而是显示 createdb 安全地引用了有趣的 locale 名称;因此,我们并没有因此失去测试的可靠性。酌情回溯。讨论:https://postgr.es/m/231373.1610058324@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9ffe2278372d7549547176c23564a5b3404d072e

  • 修复 BRE 模式正则表达式解析中的一个古老 bug。brenext() 在解析 `*` 量词时,忘记为 token 返回任何“值”;根据 next() 中的相应情况,它应该返回值 1,表示想要贪婪(greedy)而不是非贪婪(non-greedy)的行为。结果是,如果碰巧 v->nextvalue 在此时为零,那么编译后的 regexp 的行为可能像 `x*?` 而不是预期的 `x*`。这是 Alexander Lakhin 使用 valgrind 测试发现的。这个 bug 似乎是 Spencer 代码中的一个原始 bug,所以全部回溯。讨论:https://postgr.es/m/16814-6c5e3edd2bdf0d50@postgresql.org https://git.postgresql.org/pg/commitdiff/afcc8772edcec687d87b6f762ca6113229af7291

  • 修复 plpgsql 测试中的 debug_invalidate_system_caches_always。Commit c9d529848 导致错误上下文堆栈在某些地方因 debug_invalidate_system_caches_always(原名 CLOBBER_CACHE_ALWAYS)而有所不同。这并不令人意外,因为如果缓存的计划被破坏,我们必须重新解析它。通过隐藏测试脚本中其他地方的上下文堆栈来稳定预期的测试输出。 (现在有了 debug_invalidate_system_caches_always,另一个值得考虑的想法是将其设置为零,以便在这些测试用例中。这似乎会冒险减少缓存破坏测试的覆盖率,这可能是否值得验证我们在正常情况下获得预期的错误输出。目前我只坚持现有的技术。)顺便更新了指向 CLOBBER_CACHE_ALWAYS 的注释。根据 buildfarm 成员 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

  • 检测后端进程与 startup 进程之间的死锁。恢复冲突锁(recovery conflict on lock)可能发生在热备(hot-standby)后端进程与 startup 进程之间。如果一个后端进程获得了表的访问排他锁(access exclusive lock),最终触发了死锁,那么死锁可以按预期被检测到。另一方面,以前,如果 startup 进程获得了访问排他锁并最终触发了死锁,那么该死锁就无法被检测到,并且可能在 deadlock_timeout 过去后仍然存在。这是一个 bug。这个 bug 的原因是,处理恢复冲突锁的代码根本没有处理死锁情况。它假设涉及 startup 进程和后端进程的死锁能够被后端进程内的死锁检测器检测到。但这个假设是不正确的。startup 进程在必要时也应该调用死锁检测器。为了修复这个 bug,此提交使得 startup 进程在处理恢复冲突锁时,如果达到 deadlock_timeout,就会调用死锁检测器。具体来说,在这种情况下,startup 进程会请求所有持有冲突锁的后端进程检查死锁。回溯至 v9.6。v9.5 也有这个 bug,但根据讨论,我们决定不回溯修复到 v9.5。因为 v9.5 没有这个 bug 修复补丁依赖的一些基础设施代码(例如 37c54863cf)。我们可以为回溯应用这些代码,但由于 v9.5 的下一个次要版本发布是最后一个版本,这样做有风险。如果我们意外地通过回溯给 v9.5 引入新 bug,将没有机会修复。我们确定回溯到 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,它控制当 startup 进程等待恢复冲突的时间超过 deadlock_timeout 时是否生成日志消息。这有助于确定恢复冲突是否阻止了 WAL 的应用。请注意,目前只有当恢复冲突尚未解决(即使已过 deadlock_timeout),即 startup 进程在 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 发送了对补丁的又一次修订,该补丁在 pg_locks 视图中添加了一个 wait_start 列。

Mark Zhao 发送了一个补丁,旨在修复一个 bug,该 bug 表现为分区表上的逻辑复制非常缓慢并消耗大量 CPU,方法是在 pgoutput.c 的 pgoutput.c 中添加一个缺失的 RelationClose(在 RelationIdGetRelation 之后)。

Önder Kalacı 发送了对补丁的又一次修订,该补丁旨在实现逻辑复制的行过滤。

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

Pavel Stěhule 发送了对补丁的又一次修订,该补丁使得在 PL 中编写窗口函数成为可能,并提供了 PL/pgsql 中的实现。

Bharath Rupireddy 发送了对补丁的三个修订,该补丁使得 CTAS 中的并行插入成为可能。

Kyotaro HORIGUCHI 发送了对补丁的四个修订,该补丁旨在修复一个 bug,该 bug 表现为 standby 无法跟随时间线切换,方法是确保 Walsender 在发送历史时间线时跟踪时间线切换。

Peter Smith 发送了对补丁的四个修订,该补丁使得可以使用多个 tablesync 工作进程。

Dilip Kumar 发送了对补丁的又一次修订,该补丁添加了自定义表压缩方法的选项。

Dmitry Dolgov 发送了对补丁的三个修订,该补丁为 JSONB 操作使用了通用的下标基础设施。

Justin Pryzby 发送了对补丁的又一次修订,该补丁支持 pg_dump 中的多种压缩方法和相关选项。

Masahiko Sawada 发送了一个补丁,该补丁引入了一个 IndexAM API 来选择索引 vacuum 策略,使用它来选择索引 vacuum 策略,并在索引不增长时跳过 btree bulkdelete。

Thomas Munro 发送了对补丁的又一次修订,以减少 WaitEventSet 的 syscall 搅动。

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 发送了对补丁的又一次修订,旨在修复一个 bug,该 bug 表现为 WAL 重放期间的损坏,方法是延迟 checkpoint 完成,直到截断成功。

Greg Sabino Mullane 发送了对补丁的又一次修订,以使 psql 的 \df 能够按输入类型选择函数。

Movead Li 发送了对补丁的又一次修订,用于修复 wal switch 的 waldump 大小。

Kirk Jamison 发送了对补丁的又一次修订,以使用 dlist 使删除关系缓冲区更有效。

Michaël Paquier 发送了对补丁的又一次修订,以在 cryptohash 基础设施中添加 SHA1。

Julien Rouhaud 发送了对补丁的又一次修订,将 pg_stat_statements 的查询混淆移至核心,在 pg_stat_activity 和 log_line_prefix 中公开 queryid,并在 verbose explain 中公开查询标识符。

Laurenz Albe 发送了对补丁的两个修订,以将会话统计信息添加到 pg_stat_database。

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

Bharath Rupireddy 发送了对补丁的三个修订,用于实现 REFRESH MATERIALIZED VIEW 的 EXPLAIN [ANALYZE]。

Masahiko Sawada 发送了一个补丁,旨在修复一个 bug,该 bug 表现为逻辑复制工作进程在错误上下文中访问目录,方法是将本地和远程类型名称都存储在 SlotErrCallbackArg 中,这样就可以在不进行系统缓存查找的情况下设置错误回调中的名称。

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

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

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

Kyotaro HORIGUCHI 发送了对补丁的又一次修订,通过用共享内存替换用于临时存储的文件,使 stats 收集器更高效。

Michaël Paquier 发送了对补丁的又一次修订,以重构 HMAC 实现以减少重复。

Pavel Stěhule 发送了对补丁的又一次修订,以降低 PL/pgSQL 在非原子模式下执行 CALL 语句的开销。

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

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

Pavel Stěhule 发送了一个补丁,使 psql 的 \watch 命令能够使用特殊的分页器。

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

Simon Riggs 发送了对补丁的四个修订,以实现系统版本表(system-versioned tables)。

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 发送了对补丁的又一次修订,旨在修复一个 bug,该 bug 表现为 SimpleLruTruncate() 四舍五入导致的虚假“明显回绕”(apparent wraparound)。

Shenhao Wang 发送了一个补丁,旨在修复一个 bug,该 bug 表现为 Windows 上文件 backup_label 问题中的无效数据,方法是在读取 backup_label 和 tablespace_map 时设置文本模式。

Tatsuo Ishii 发送了一个补丁,用于修复文档中缺失的缩略语标签。

Tomáš Vondra 发送了对补丁的又一次修订,用于在 COPY FREEZE 中设置 PD_ALL_VISIBLE 和 visibility map 位,弥补了页面级别标志更新的不足。

Tom Lane 发送了一个补丁,旨在修复一个 bug,该 bug 表现为连接字符串中的多个主机在非热备模式下未能故障转移。