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

PostgreSQL 周报 - 2021 年 3 月 14 日

发布于 2021-03-15, 作者 PWN
PWN

PostgreSQL 周报 - 2021 年 3 月 14 日

本周人物:https://postgresql.life/post/corey_huinker/

三月 PostgreSQL 工作职位

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

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

已应用补丁

Amit Kapila 提交

Tom Lane 提交

  • 进一步调整 regex DFA 的内存管理。Coverity 在 commit 190c79884 之后仍然不满意,仔细查看后我认为它说得有道理。newdfa() 的调用者通常会在 v->err 被设置为非零时退出,newdfa() 会忠实地这样做。然而,如果我们进入 newdfa() 之前 v->err 已经非零了呢?那时 newdfa() 可能会成功,并且调用者会立即泄漏其结果。我不认为这种情况实际上会发生,但“调用 newdfa() 时 v->err 始终为零”这个谓词似乎很难完全确定;有大量的代码可能导致错误。调整调用者以直接检查空结果而不是依赖 ISERR() 测试似乎更好。这比之前的编码方式稍微便宜一些。由于缺乏实际错误的证据,不进行回溯。 https://git.postgresql.org/pg/commitdiff/6c20bdb2a279086777a3595ab00bcf14671fc5a1

  • 验证 pg_import_system_collations() 的 OID 参数。SELECT pg_import_system_collations(0) 导致断言失败。使用随机的非零参数——或者事实上是零,在非断言版本中——它会愉快地创建 collnamespace 值为垃圾数据的 pg_collation 条目。据我所知,这些是没有危害的(除非 OID 碰巧后来被用于一个模式?)。无论如何,这都不是一个安全问题,因为该函数仅限超级用户使用。但这似乎会让不谨慎的 DBA 遇到麻烦,所以让我们添加一个检查,确保给定的 OID 属于某个模式。回溯到此函数引入的 v10 版本。 https://git.postgresql.org/pg/commitdiff/5c06abb9b97b69513a3998cccf89556e73052e02

  • 正确标记 pg_stat_get_subscription() 为返回集合。此函数的初始目录数据未能设置 proretset 或提供 prorows 估算。在 FROM 子句中调用时,它意外地起作用了,因为执行器对此不太挑剔;但规划器不期望该函数返回多行,这可能导致错误的计划。此外,在 SELECT 列表中调用该函数会失败。我们无法轻松地回溯此修复,但幸运的是,在大多数情况下,该错误的后果并不严重。正确处理它主要是为了未来的兼容性。讨论:https://postgr.es/m/1636062.1615141782@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/fed10d4eec79242688382d03ddca82007160ee6f

  • 如果 FROM 中的函数不应返回集合,则发出警告。如果 FROM 中的函数尝试返回集合但未标记为 proretset,则抛出“function protocol violation”错误。尽管这种情况目前可以正常工作,但我们似乎不希望保证它会一直这样。此外,不设置 proretset 标志还有其他负面后果,例如可能导致错误的计划。不回溯,因为如果有任何第三方代码违反此预期,人们不会乐于在次要版本中破坏它。讨论:https://postgr.es/m/1636062.1615141782@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d4545dc19b8ea670bf62e06d22b0e4e6fcb45153

  • 文档:修复遗漏的程序 OUT 参数提及。commit 2453ea142 中的小疏忽。 https://git.postgresql.org/pg/commitdiff/3ebc6d295705fec37dc8f57a4ece54b370f55f72

  • 文档:改进关于过程的介绍信息。通过列表形式列出函数和过程之间的关键区别,以澄清“用户定义过程”中的讨论。特别是,这避免了关于过程可以进行事务控制的重点被掩盖。使 CREATE FUNCTION 参考页中的反向链接更加醒目,并在 CREATE PROCEDURE 中添加一个。根据 Guyren Howe 的抱怨。感谢 David Johnston 的讨论。讨论:https://postgr.es/m/BYAPR03MB4903C53A8BB7EFF5EA289674A6949@BYAPR03MB4903.namprd03.prod.outlook.com https://git.postgresql.org/pg/commitdiff/227338b00d498d9e1c5705a1ab118585e5d57c87

  • 文档:移除 <foreignphrase> 标签。我们对“per se”、“pro forma”和“ad hoc”的一些实例进行了斜体处理,但不是全部。这些短语在正式的英语语境中很常见,因此是否算作外语值得商榷。我们可以尝试更一致地使用 <foreignphrase>,但这很难强制执行,所以我们只删除这些词的标签。唯一似乎值得标记的例子是“voilà”。与其只保留一个标签实例,不如将其更改为更标准的短语。John Naylor 讨论:https://postgr.es/m/CAFBsxsHtWs_NsccAVgQ=tTUKkXHpHdkjZXtp_Cd9dGWyBDxfbQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b12436340adf27aa3d334c92579e6662dd3090ce

  • 避免为继承的 FK 约束创建重复的缓存计划。当外键约束应用于分区表时,每个叶分区都会继承一个类似的 FK 约束。我们之前独立处理了所有这些约束,这意味着在大型分区树中,我们会构建大量的缓存 FK 检查查询计划。然而,除了一个例外,生成查询对于继承树的所有成员来说实际上是相同的(因为在大多数情况下,查询只引用 FK 关系另一侧的最高级别表)。因此,我们可以共享一个缓存计划给所有分区,从而节省内存,更不用说构建和维护缓存计划的时间了。Keisuke Kuroda 和 Amit Langote 讨论:https://postgr.es/m/cab4b85d-9292-967d-adf2-be0d803c3e23@nttcom.co.jp_1 https://git.postgresql.org/pg/commitdiff/c3ffe34863688115dd7878f118f2a123bafd8a26

  • 重新简化 pqParseInput3 的子程序中 inStart 的管理。Commit 92785dac2 将 pqParseInput3 中与 inStart 前进相关的逻辑复制到了 getRowDescriptions 和 getAnotherTuple 中,因为它希望允许用户定义的行处理器回调可能从库中 longjmp 出去,并且必须在此之前更新 inStart 以避免无限循环。后来我们决定该 API 过于脆弱并回滚了它,但我们并没有撤销所有相关的代码更改,并且这种混乱仍然存在。现在撤销它,这样在 pqParseInput3 的处理中只有一个地方会前进 inStart;这将简化添加更好的跟踪支持。getParamDescriptions 也在某个时候出现了类似的(并非在 92785dac2 中;我没有追踪具体时间)处理,但它实际上存在 bug,因为其对损坏消息的处理似乎是从 v2 逻辑复制过来的,当时我们还没有已知的消息长度。“goto not_enough_data”的情况不应仅返回 EOF,因为那样我们不会消耗消息,可能会导致无限循环。这种情况现在代表一个明确损坏的消息,我们应该将其报告为这样。尽管尚未发现 getParamDescriptions 进入循环的现场报告,但回溯该修复似乎是合适的。我选择回溯所有这些,以使支持的分支中的逻辑看起来更相似。讨论:https://postgr.es/m/2217283.1615411989@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/51c54bb603098416dc6f9d9d46a3d14861f8fc38

  • 禁止将身份列标记为可为空。GENERATED ALWAYS AS IDENTITY 暗含 NOT NULL,但如果你用“GENERATED ALWAYS AS IDENTITY NULL”覆盖它,代码会失败。有人可能会认为旧的行为是一个特性,但它是矛盾的,因为结果取决于子句的顺序,所以它似乎只是一个疏忽。根据 Pavel Boev 的 bug #16913。回溯到身份列引入的 v10 版本。Vik Fearing(我进行了一些小调整)讨论:https://postgr.es/m/16913-3b5198410f67d8c6@postgresql.org https://git.postgresql.org/pg/commitdiff/f52c5d6749a61fc4e0908457c58f5069910d53a6

  • 修复 psql \e 检测文件修改的竞态条件。psql 的编辑命令通过检查修改时间戳的变化来决定用户是否编辑了文件。这对于预先存在的文件来说可能没问题,但对于在命令中创建的临时文件,一个快速的输入者可能在 stat(2) 时间戳的一秒精度内完成保存并退出。在 Windows FAT 文件系统上,精度甚至更差,为 2 秒,使得竞态更容易出现。为解决此问题,尝试将临时文件的修改时间设置为两秒前。这种情况不太可能失败,但竞态条件本身也不太可能发生,所以忽略任何错误。另外,我们不妨检查文件大小以及修改时间。虽然这是一个很难出现的 bug,但仍然值得回溯,以确保用户的编辑不会丢失。Laurenz Albe,根据 Jacob Champion 的抱怨;基于 Jacob 和我提供的修复建议 讨论:https://postgr.es/m/0ba3f2a658bac6546d9934ab6ba63a805d46a49b.camel@cybertec.at https://git.postgresql.org/pg/commitdiff/48d67fd897918c72e7cdf703d794056b88ed5725

  • pg_amcheck: 继续尝试修复测试。修复测试中非移植性选项顺序的另一个例子。疏忽在 24189277f。Mark Dilger 讨论:https://postgr.es/m/C37D28BA-3BA3-4776-B812-17F05F3472D8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/9e294d0f34d6e3e4fecf6f190b48862988934cde

  • 文档:添加关于如何运行 pg_amcheck 回归测试的说明。要使“make installcheck”在这里正常工作并不容易,所以我们在此处以与之前相同的方式进行文档记录。 https://git.postgresql.org/pg/commitdiff/58f57490facdec78119e5bab84229dbdc1d5ac6a

Michaël Paquier 提交

  • 移除 SSL 压缩支持。PostgreSQL 在 e3bdb2d 中禁用了压缩,并且文档建议自那时以来不要使用它。此外,SSL 压缩自 1.1.0 版本以来在 OpenSSL 中已被禁用,并且在许多发行版中早已被禁用。最新的 TLS 版本 TLSv1.3 在协议级别禁止压缩。此 commit 删除了该功能本身,移除了对 libpq 参数 sslcompression 的支持(为与现有连接字符串兼容性保留参数,但被忽略),并删除了 pg_stat_ssl 中相应的字段以及实际的 PgBackendSSLStatus。请注意,除了删除通过配置启用压缩的能力外,在前端和后端都主动禁用了压缩,以避免本地配置的覆盖。添加了一个针对已弃用 SSL 参数的 TAP 测试,用于向后兼容性检查。更新目录版本。作者:Daniel Gustafsson 审阅者:Peter Eisentraut, Magnus Hagander, Michael Paquier 讨论:https://postgr.es/m/7E384D48-11C5-441B-9EC3-F7DB1F8518F6@yesql.se https://git.postgresql.org/pg/commitdiff/f9264d1524baa19e4a0528f033681ef16f61b137

  • 为 COPY 添加更多进度报告支持。命令(TO 或 FROM)、其类型(文件、管道、程序或回调)以及 COPY FROM 中 WHERE 子句排除的元组数量被添加到已有的进度报告中。列“lines_processed”重命名为“tuples_processed”,以区分 CSV 和 BINARY COPY 情况下此列的含义,并与其他的目录进度视图保持一致。再次更新目录版本。作者:Matthias van de Meent 审阅者:Michael Paquier, Justin Pryzby, Bharath Rupireddy, Josef Šimánek, Tomas Vondra 讨论:https://postgr.es/m/CAEze2WiOcgdH4aQA8NtZq-4dgvnJzp8PohdeKchPkhMY-jWZXA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9d2d45700928d49212fb7ed140feeaebe3a6014f

  • 将 libpq 中的 sslcompression 切换回普通输入字段。根据 buildfarm 成员 crake 的报告,任何包含此选项的服务器,包括 postgres_fdw 服务器,在正确执行 pg_upgrade 时都会失败,因为该选项在 f9264d1 中被隐藏为 debug 选项,导致 FDW 服务器的恢复失败。此更改将 libpq 中的选项改回可见,但仍处于非活动状态,以修复此升级问题。讨论:https://postgr.es/m/YEbq15JKJwIX+S6m@paquier.xyz https://git.postgresql.org/pg/commitdiff/096bbf7c934a4288c9e48a6ac8e91d8753ac1ccd

  • 回滚 libpq 中 SSL 压缩的更改。这部分回滚了 096bbf7 和 9d2d457,撤销了 libpq 的更改,因为这可能会导致在多个 Postgres 主版本之间共享同一个 libpq 版本的发行版中的扩展和应用程序链接出现问题。请注意,后端在此处保持不变,它仍然禁用 SSL 压缩,同时简化了跟踪 SSL 连接是否启用了压缩的底层目录。根据与 Tom Lane 和 Daniel Gustafsson 的讨论。讨论:https://postgr.es/m/YEbq15JKJwIX+S6m@paquier.xyz https://git.postgresql.org/pg/commitdiff/0ba71107efeeccde9158f47118f95043afdca0bb

  • 将表空间路径重新创建从 makefiles 移动到 pg_regress。将此逻辑移入 pg_regress 修复了并行测试中可能出现的失败,当 pg_upgrade 和主回归测试套件都触发清理 src/test/regress/testtablespace/ 的 makefile 规则时。即使 pg_upgrade 触发了此规则,它也无需这样做,因为它使用不同的表空间路径。因此,如果 pg_upgrade 触发表空间设置的 makefile 规则,而主回归测试套件运行了表空间用例,则会失败。61be85a 是一个类似的尝试,但它破坏了回归测试需要在管理员帐户下运行的情况,例如与 Appveyor 一样。报告者:Andres Freund, Kyotaro Horiguchi 审阅者:Peter Eisentraut 讨论:https://postgr.es/m/20201209012911.uk4d6nxcnkp7ehrx@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/6c788d9f6aadb41d76a72d56149268371a7895ee

  • 为所有连接线程在 libpq 中设置 libcrypto 回调。基于与 Jacob 对 OpenSSL 代码的分析,转向 EVP 进行 cryptohash 计算使得设置之前仅为 SSL 连接设置但非 SSL 连接未设置的 libcrypto 回调成为必要。未设置回调会使线程的使用在连接调用身份验证期间的 cryptohashes(如 MD5 或 SCRAM)时可能不安全,如果 cryptohash 计算期间发生故障。然后,设置 libssl 和 libcrypto 状态的逻辑被分成两部分,都使用相同的锁定,libcrypto 为 SSL 和非 SSL 连接设置,而 SSL 连接则根据需要稍后设置任何 libssl 状态。在此 commit 之前,只有 SSL 连接会设置 libcrypto 回调,这些回调对于确保在使用 libpq 中的多个并发线程 (ENABLE_THREAD_SAFETY) 时正确进行线程锁定是必需的。请注意,这仅对 OpenSSL 1.0.2 和 1.0.1(HEAD 支持的最旧版本)是必需的,因为 1.1.0 有自己的内部锁定,并且已删除对 CRYPTO_set_locking_callback() 的支持。与最多 300 个线程在 OpenSSL 1.0.1 和 1.0.2 上进行测试,混合 SSL 和非 SSL 连接线程,在进行一些微基准测试后,性能没有受到影响。可以使用 pgbench(带 -C 选项和一个基本为空的脚本(例如,带有一个 \set 元命令))来强调身份验证请求,我们已经将其与一些自定义程序结合进行测试。报告者:Jacob Champion 作者:Michael Paquier 审阅者:Jacob Champion 讨论:https://postgr.es/m/fd3ba610085f1ff54623478cf2f7adf5af193cbb.camel@vmware.com https://git.postgresql.org/pg/commitdiff/2c0cefcd18161549e9e8b103f46c0f65fca84d99

Fujii Masao 提交

  • 跟踪写入和同步 WAL 数据到磁盘的总时间。此 commit 添加了新的 GUC track_wal_io_timing。当此选项启用时,XLogWrite 写入和 issue_xlog_fsync 同步 WAL 数据到磁盘的总时间将被计入 pg_stat_wal。这些信息将有助于检查 WAL 写入和同步对性能的影响程度。启用 track_wal_io_timing 将使服务器在每次写入或同步 WAL 时都查询操作系统以获取当前时间,这可能会在某些平台上造成显著的开销。为了避免在启用 track_io_timing 的服务器中产生这种额外的开销,此 commit 将 track_wal_io_timing 作为与 track_io_timing 分开的参数。请注意,walreceiver 的 WAL 写入和同步活动尚未被跟踪。此 commit 还会在 pg_stat_wal 中跟踪 XLogWrite 写入和 issue_xlog_fsync 同步 WAL 数据到磁盘的次数,而不管 track_wal_io_timing 的设置。这些计数器可用于计算每次请求的 WAL 写入和同步时间。更新 PGSTAT_FILE_FORMAT_ID。更新目录版本。作者:Masahiro Ikeda 审阅者:Japin Li, Hayato Kuroda, Masahiko Sawada, David Johnston, Fujii Masao 讨论:https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/ff99918c625a84c91e7391db9032112ec8653623

  • 在 walwriter 退出时强制将剩余 WAL 统计信息发送到统计信息收集器。在 walwriter 的主循环中,WAL 统计信息消息仅在自上次发送到达到 PGSTAT_STAT_INTERVAL 毫秒后有足够的时间才发送。这是为了避免使统计信息收集器过载。但这可能导致最近的 WAL 统计信息在 walwriter 退出时未发送。为确保所有 WAL 统计信息都已发送,此 commit 使 walwriter 在因关机请求退出时强制将剩余 WAL 统计信息发送到收集器。请注意,当 walwriter 以非零退出码(例如,FATAL 错误)退出时,这些剩余 WAL 统计信息仍可能未发送。这种情况是 OK 的,因为 walwriter 退出会导致服务器崩溃,随后的恢复将丢弃所有统计信息。在这种情况下,无需发送剩余统计信息。作者:Masahiro Ikeda 审阅者:Fujii Masao 讨论:https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/33394ee6f2433d3cc7785428a77cc9a813254df7

  • 在关机检查点期间收集的统计信息发送到统计信息收集器。当请求关机时,checkpointer 会执行检查点或重启点,并在退出前更新统计信息。但以前 checkpointer 没有将这些统计信息发送到统计信息收集器。关机检查点和重启点被视为请求的,而不是计划的,因此它们的数量会计入 pg_stat_bgwriter.checkpoints_req 列。作者:Masahiro Ikeda 审阅者:Fujii Masao 讨论:https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/b82640df0062483431608b7e9e074255f03e6c02

Peter Eisentraut 提交

Alexander Korotkov 提交了

Thomas Munro 推送

Bruce Momjian 已推送

Peter Geoghegan 提交

  • 在 nbtree VACUUM 中不考虑新插入的元组。移除 nbtree VACUUM 中“陈旧统计信息”的整个概念(停止关心涉及已插入元组数量的统计信息)。还在 master 分支上移除 vacuum_cleanup_index_scale_factor GUC/参数(但在 postgres 13 上仅禁用它们)。vacuum_cleanup_index_scale_factor/stats 接口使得 nbtree AM 部分负责决定何时需要更新 pg_class.reltuples 统计信息。这似乎与索引 AM API 的精神相悖——对于索引 AM 的批量删除和清理回调来说,提供准确的统计信息(当它不方便时)并非真正必要。核心代码拥有这些。 (索引 AM 有权根据其自身考虑(例如页面删除和回收)执行或不执行某些类型的延迟清理,但这与 pg_class.reltuples/num_index_tuples 关系不大。)直到 commit b07642db 引入 autovacuum_vacuum_insert_threshold 功能之前,这个问题相当无害,该功能与 vacuum_cleanup_index_scale_factor 机制产生了不良的交互:它导致插入驱动的 autovacuums 执行完整的索引扫描,尽管这样做没有实际好处。这与针对 append-only 插入基准测试的回归相关联 [1]。在仅清理的 nbtree VACUUM 中执行对索引的完全扫描的剩余情况表明,最终的元组计数只是一个估算。这阻止了 vacuumlazy.c 在那些情况下设置索引的 pg_class.reltuples(现在它仅在 vacuumlazy.c 有用于 nbtree 进行批量删除的 TID 时更新 pg_class)。这可以说修复了重复数据删除相关的 bug 修复 commit 48e12913 中的一个疏忽。 [1] https://smalldatum.blogspot.com/2021/01/insert-benchmark-postgres-is-still.html 作者:Peter Geoghegan pg@bowt.ie 审阅者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAD21AoA4WHthN5uU6+WScZ7+J_RcEjmcuH94qcoUPuB42ShXzg@mail.gmail.com 回溯:13-,其中添加了 autovacuum_vacuum_insert_threshold。 https://git.postgresql.org/pg/commitdiff/9f3665fbfc34b963933e51778c7feaa8134ac885

  • VACUUM ANALYZE:始终更新 pg_class.reltuples。vacuumlazy.c 有时未能更新每个索引的 pg_class 条目(以确保 pg_class.reltuples 是最新的),即使 analyze.c 假定它在 VACUUM ANALYZE 期间已发生。至少有几个原因可以解释这一点。例如,当索引 AM 指示其统计信息只是一个估算时,vacuumlazy.c 可能会失败更新 pg_class,根据 2006 年 commit e57345975cf 建立的 amvacuumcleanup() 例程的约定。停止假设 pg_class 必须在 VACUUM ANALYZE 中已用准确的统计信息更新——在所有情况下,都在更新表关系的同时为索引更新 pg_class。这样,VACUUM ANALYZE 就不会在保持 pg_class.reltuples 相对准确方面失败。与旧方法相比,这种方法的唯一缺点是它可能会为堆/表关系具有相同不准确值的索引错误地设置 pg_class.reltuples。这似乎不算太坏。在任何 VACUUM ANALYZE 期间,我们已经为堆/表关系一致地调用了 vac_update_relstats()(用于更新 pg_class)两次——一次在 vacuumlazy.c 中,一次在 analyze.c 中。现在,我们确保为每个索引至少调用一次(尽管通常是两次)vac_update_relstats()。这是 commit 9f3665fb 的后续工作,该 commit 处理了 btvacuumcleanup() 中的问题。严格来说,这修复了一个无关的问题,尽管如此。在 commit 9f3665fb 之后,btvacuumcleanup() 不再提供准确的 num_index_tuples 值(当在该 VACUUM 操作中没有调用 btbulkdelete() 时),但 hashvacuumcleanup() 多年来一直以相同的方式工作。作者:Peter Geoghegan pg@bowt.ie 审阅者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAH2-WzknxdComjhqo4SUxVFk_Q1171GJO2ZgHZ1Y6pion6u8rA@mail.gmail.com 回溯:13-,与 commit 9f3665fb 相同。 https://git.postgresql.org/pg/commitdiff/5f8727f5a679452f7bbdd6966a1586934dcaa84f

  • 文档:B-Tree 只有一个附加参数。commit 9f3665fb 中的疏忽。回溯:13-,与 commit 9f3665fb 相同。 https://git.postgresql.org/pg/commitdiff/3f0daeb02f8dd605f89de9aa2349137c09cc7fb4

  • 添加 vacuum_cleanup_index_scale_factor 参数。Commit 9f3665fb 删除了 vacuum_cleanup_index_scale_factor 存储参数。然而,这在跨主版本移动时会产生转储/重载的危险。添加回 vacuum_cleanup_index_scale_factor 参数(但不是同名 GUC),纯粹是为了避免在使用 pg_upgrade 等工具时出现问题。该参数仍然禁用且未记录。不回溯到 Postgres 13,因为 vacuum_cleanup_index_scale_factor 在 REL_13_STABLE 的 master 分支 commit 9f3665fb 版本中才被禁用——该参数在 REL_13_STABLE 上看起来已经如此。讨论:https://postgr.es/m/YEm/a3Ko3nKnBuVq@paquier.xyz https://git.postgresql.org/pg/commitdiff/effdd3f3b633e88feaa675377075f02ecc99aee4

  • 在 nbtree VACUUM 中节省几个周期。在清理唯一的 nbtree VACUUM 操作中,当没有已删除但尚未回收的页面需要回收时,避免不必要地调用 RelationGetNumberOfBlocks()。这是 commit e5d8a999 的后续工作,该 commit(除其他外)教会了“跳过完全扫描”的 nbtree VACUUM 机制,仅在索引中已删除页面的绝对数量被认为过多时才触发完全索引扫描。 https://git.postgresql.org/pg/commitdiff/7bb97211a5589265f3f88183ae9353639ab184c6

  • 合并 nbtree VACUUM 元页例程。简化 _bt_vacuum_needs_cleanup() 函数的签名(现在只需要一个 'rel' 参数),并将其移动到 nbtpage.c 中的兄弟函数旁边。我相信 _bt_vacuum_needs_cleanup() 最初位于 nbtree.c 是因为一个包含依赖问题。现在那不再是问题了。commit 9f3665fb 的后续工作。 https://git.postgresql.org/pg/commitdiff/02b5940dbea17d07a1dbcba3cbe113cc8b70f228

Robert Haas 提交

待处理补丁

Etsuro Fujita 提交了另一个补丁修订版,用于在 postgres_fdw 节点上实现异步追加。

Kyotaro HORIGUCHI 提交了一个补丁,用于使用 wal_level=minimal 运行 011_crash_recovery.pl,并确保已发布的 XID 是持久的。

Ibrar Ahmed 提交了 pg_rewind 的另一个版本补丁,该补丁修复了服务器刚刚被提升时 TLI 的确定方式,通过查看控制文件中的 minRecoveryPointTLI 以及检查点上的 ThisTimeLineID。

Ibrar Ahmed 提交了将 popcount 暴露给 SQL 的另一个版本补丁。

Kota Miyake 提交了 pgbench 的 \sleep 命令工作方式的另一个版本补丁,要求它接受一个整数参数。

Michael Banck 提交了一个添加新的 PGC_ADMINSET guc 上下文和 pg_change_role_settings 默认角色的补丁。

Andrey Borodin 提交了一个为 gist_btree 类型添加 GiST 构建排序支持的补丁。

Pavel Stěhule 提交了一个为 record 类型添加运算符 ? 和 ->>,以及函数 record_keys 和 record_each_text 的补丁。

Ajin Cherian 提交了一个使 stream_prepare_cb 可选的补丁,这允许插件不启用流式传输和两阶段提交同时进行逻辑复制。

Ibrar Ahmed 提交了另一个版本补丁,用于在规划阶段为另外两个情况评估表达式。

Joel Jacobson 提交了四份更多版本的补丁,以添加 pg_permissions 和 pg_ownerships 视图,这大大简化了建立这些内容的查询。

Ibrar Ahmed 提交了实现系统版本化临时表的另一个版本补丁。

Tomáš Vondra 提交了实现 BRIN 多范围索引的两个更多版本补丁。

Tomáš Vondra 和 Stephen Frost 交换了补丁,以改进自动 vacuum 和自动 analyze 的日志记录,如果启用了 track_io_timing,则包含 I/O 时间。此外,对于自动 analyze,添加了读取速率和脏速率,类似于自动 vacuum 历来记录这些信息的方式。

Masahiro Ikeda 和 Fujii Masao 交换了补丁,以便在关机时发送 walwriter 和 checkpointer 的统计信息。

Dilip Kumar 和 Justin Pryzby 交换了实现表自定义压缩方法的补丁。

Bharath Rupireddy 提交了实现 EXPLAIN [ANALYZE] REFRESH MATERIALIZED VIEW 的另一个版本补丁。

Greg Nancarrow 和 Hou Zhijie 交换了实现并行 INSERT (INTO ... SELECT ...) 的补丁。

Ibrar Ahmed 和 Kazutaka Onishi 交换了实现外表 TRUNCATE 的补丁。

Peter Smith 和 Ajin Cherian 交换了实现两阶段事务的逻辑解码的补丁。

Tatsuo Ishii 提交了两个版本的补丁,使 pgbench 能够使用 COPY FREEZE。

Peter Smith 提交了一个补丁,让 tablesync worker 有机会查看它是否可以立即退出(因为它已经赶上),而无需先处理消息就可以发现这一点。

Yugo Nagata 提交了实现增量物化视图的另一个版本补丁。

Arseny Sher 提交了一个补丁,以增加索引扫描使用的 vm 缓存。

Peter Eisentraut 提交了另一个版本补丁,以支持为 SQL 语言编写符合 SQL 标准且可移植到其他实现的 CREATE FUNCTION 和 CREATE PROCEDURE 语句。

Heikki Linnakangas 提交了另一个版本补丁,为了安全性和清晰性,移动了几个 ResourceOwnerEnlarge() 调用,使 resowners 更容易扩展,并使用 64 位 murmur hash(如果可用)来提高速度。

Tomáš Vondra 提交了另一个版本补丁,通过新的 GUC remove_temp_files_after_crash 来控制崩溃后临时文件的删除。

Jacob Champion 提交了两个更多版本补丁,将客户端的 DN 存储在 port->peer_dn 中,并使用它来记录所有认证后端已认证的身份。

Joel Jacobson 提交了另一个版本补丁,以实现 regexp_positions。

Justin Pryzby 提交了一个补丁,使 pg_dump 在 getBlobs 中使用游标,以缓解在存在数百万个大对象时内存使用过大的情况。

Tomáš Vondra 提交了另一个版本补丁,以提高 GROUP BY 的效率。

Erica Zhang 提交了两个版本的补丁,为 contrib 下的 pg_stat_statements 兼容性验证添加了一些测试。

Matthias van de Meent 提交了三个版本的补丁,用于截断页面上的行指针数组,当它有尾部未使用的 ItemIds 时。这将允许重用实际上是空闲空间的数据以及新的行指针,而不是将其仅保留给行指针。另一个好处是,HasFreeLinePointers 提示位优化现在不再提示数组末尾的空行指针,稍微提高了空行所在位置的特异性;并且避免了在所有其他条目都已满的情况下搜索到数组末尾的需要。

Magnus Hagander 提交了另一个版本补丁,以添加 PROXY 协议支持。

Floris Van Nee 提交了另一个版本补丁,允许将元组插入几乎为空的页面。

Marcus Wanner 提交了一个补丁,向输出插件的 filter_prepare 回调添加了一个 xid 参数。

Kyotaro HORIGUCHI 和 Fujii Masao 交换了补丁,将统计信息收集器使用的临时存储从文件更改为共享内存。

Amul Sul 和 Ibrar Ahmed 交换了补丁,放入了一些机制,使得实现 ALTER SYSTEM READ {ONLY|WRITE} 成为可能。

Masahiko Sawada 提交了另一个版本补丁,使 autovacuum 的日志稍微更具信息量。

Bharath Rupireddy 提交了另一个版本补丁,为多插入和单插入添加了新的表 AM,并将其用于 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。

Yuzuko Hosoya 提交了另一个版本补丁,用于在 DISCARD ALL 时释放 referential integrity 的 SPI 计划。

John Naylor 提交了一个补丁,用于移除文档中的 <foreignphrase> 标签。

John Naylor 提交了一个补丁,用于使 popcount xor 在缓冲区级别进行间接寻址。

Masahiko Sawada 提交了一个补丁,用于移除 vacuumlazy.c 中不必要的 bsearch。

Craig Ringer 提交了另一个版本补丁,用于将目标 LWLock* 和 tranche ID 传递给 LWLock tracepoint,添加到 LWLock 例程的 tracepoint 中,并在启动时添加后端类型和 postmaster pid 的 SDT tracepoint。

Bharath Rupireddy 提交了两个版本的补丁,使 check_publication_add_relation 中的错误消息更加信息丰富且一致。

Iwata Aya、Álvaro Herrera 和 Tom Lane 交换了为 libpq 添加跟踪功能的补丁。

David Rowley 提交了两个更多版本补丁,用于缓存 PathTarget 和 RestrictInfo 的易变性,允许 estimate_num_groups() 返回有关估算的更多详细信息,允许 simplehash.h 的用户执行直接删除,添加 Result Cache 执行节点,并移除 nodeResultCache.c 中的代码重复。

Nathan Bossart 和 Laurenz Albe 交换了文档 ALTER ROLE ... SET ROLE 的补丁。

Mark Dilger 和 Robert Haas 交换了添加前端实用程序 pg_amcheck 的补丁。

Peter Geoghegan 提交了另一个版本补丁,用于回收同一 VACUUM 期间删除的页面。

Thomas Munro 提交了另一个版本补丁,用于在共享内存中跟踪关系大小,为 smgrnblocks() 提供无锁快速路径,并将 fifo 更新为 lru 以清除有效缓存。

Thomas Munro 提交了一个补丁,通过使用 pg_procno 而不是扫描 ProcArray 并跟踪启动进程,提高 ProcSendSignal() 的效率。

Hou Zhijie 提交了另一个版本补丁,用于在执行 INSERT INTO 引用表时避免 RI 触发器中的 CommandCounterIncrement。

Álvaro Herrera 提交了另一个版本补丁,用于实现 ALTER TABLE ... DETACH PARTITION CONCURRENTLY。

Álvaro Herrera 提交了两个更多版本补丁,用于实现 libpq 的批量/管道支持。

Fabien COELHO 和 Dean Rasheed 交换了补丁,向 pgbench 添加了一个伪随机置换函数。

Bruce Momjian 提交了另一个版本补丁,用于添加密钥管理。

Takayuki Tsunakawa 提交了对一个加快具有外部分区表 COPY FROM 操作速度的补丁的又一次修订。

Hao Wu 提交了一个补丁,旨在修复 HotStandbyActive() 在节点提升为主后仍返回 true 的错误。

Takayuki Tsunakawa 提交了对一个修复缓存无效数量计数溢出问题的补丁的两次修订。

Andrey Borodin 提交了对一个使所有 SLRU 缓存大小可配置的补丁的又一次修订。

Tom Lane 提交了对一个清理 PL/pgsql 中变量使用文档的补丁的两次修订。

Thomas Munro 提交了对一个在崩溃恢复中运行检查点进程和后台工作进程、在崩溃恢复后记录缓存统计信息、以及使崩溃恢复不必等待结束的补丁的又一次修订。

Justin Pryzby 提交了对一个允许 wal_compression 使用备选压缩方法的补丁的两次修订。

Mark Rofail 和 Justin Pryzby 交换了实现外键数组的补丁。

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

Michaël Paquier 和 Soumyadeep Chakraborty 交换了修复 PITR 和 2PC 之间不一致问题的补丁。

Pavel Stěhule 提交了对一个向 PL/pgsql 添加 #routine_label pragma 的补丁的两次修订。

Thomas Munro 提交了一个补丁,用于向 sort_template.h 添加 bsearch 和 unique 模板,为一些常见的标量类型提供排序/搜索特化,在显眼的位置使用 qsort_oid() 及其同类函数,为 ItemPtrData 提供特化的排序/搜索例程,在多个地方使用 qsort_itemptr() 及其同类函数,通过使用“编码”格式(基于可以通过减法进行比较的 48 位整数,避免分支)来特化 ANALYZE 使用的 HeapTuple 排序例程,特化 tidbitmap.c 中的 pagetable 排序例程,特化 nbtree 代码中的一些排序/搜索例程,以及特化 multixact.c 使用的排序例程。

Julien Rouhaud 提交了对一个将 pg_stat_statements 查询打乱移至核心、在 pg_stat_activity 和 log_line_prefix 中公开 queryid、以及在 verbose explain 中公开查询标识符的补丁的又一次修订。

Dmitry Dolgov 提交了对一个引入跳跃扫描的补丁的又一次修订。

Julien Rouhaud 提交了对一个为 REINDEX 命令添加新的 OUTDATED 过滤功能、并向 reindexdb 添加相应 --outdated 选项的补丁的又一次修订。

Alexander Lakhin 提交了一个在 pgwin32_open 中使用 microsoft_native_stat 的补丁。

Thomas Munro 提交了对一个在 Linux 上可选地为 SyncDataDirectory() 使用 syncfs() 的补丁的两次修订。