本周人物:https://postgresql.life/post/corey_huinker/
https://archives.postgresql.org/pgsql-jobs/2021-03/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Amit Kapila 提交
跟踪回滚的复制源进度。Commit 1eb6d6527a 允许跟踪 2PC 的副本源重放进度,但未完成。它未能正确跟踪回滚已准备状态的进度,特别是未能更新恢复代码。此外,我们需要允许在 wal_level 可能不是 logical 的订阅节点上跟踪它。需要跟踪 PG14 中提交的 2PC 的解码 (a271a1b50e),而且到目前为止没有人抱怨过这个问题,所以不进行回溯。作者:Amit Kapila 审阅者:Michael Paquier 和 Ajin Cherian 讨论:https://postgr.es/m/CAA4eK1L-kHmMnSdrRW6UhRbCjR7cgh04c+6psY15qzT6ktcd+g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8a812e5106c5db50039336288d376a188844e2cc
为“INSERT INTO ... SELECT ...”启用并行 SELECT。在以下情况下,并行 SELECT 无法用于 INSERT:- INSERT 语句使用 ON CONFLICT DO UPDATE 子句 - 目标表具有并行不安全的触发器、索引表达式或谓词、列默认表达式或检查约束 - 目标表在任何列上具有并行不安全的域约束 - 目标表是具有并行不安全分区键表达式或支持函数的表的分区表。查询规划器已更新,以对上述情况执行额外的并行安全检查,以确定是否可以在并行模式下运行带有底层并行 SELECT 的 INSERT。查询规划器将考虑对“INSERT INTO ... SELECT ...”使用并行 SELECT,前提是除了 SELECT 的现有并行安全检查外,未发现其他不安全之处。在检查并行安全性时,我们需要检查表的所有分区,这可能会很昂贵,尤其是在我们决定不使用并行计划时。因此,在单独的补丁中,我们将引入一个 GUC 或 reloption 来启用/禁用 INSERT 语句的并行性。在进入 INSERT 并行模式以执行并行 SELECT 之前,将获取一个 TransactionId 并分配给当前事务状态。这是必要的,以防止 INSERT 在并行模式下尝试分配 TransactionId,这是不允许的。这种方法的缺点是,如果底层 SELECT 没有返回任何行,那么 TransactionId 将不会被使用,但在许多情况下,这在实践中不应该发生。作者:Greg Nancarrow, Amit Langote, Amit Kapila 审阅者:Amit Langote, Hou Zhijie, Takayuki Tsunakawa, Antonin Houska, Bharath Rupireddy, Dilip Kumar, Vignesh C, Zhihong Yu, Amit Kapila 测试者:Tang, Haiying 讨论:https://postgr.es/m/CAJcOf-cXnB5cnMKqWEp2E2z7Mvcd04iLVmV=qpFJrR3AcrTS3g@mail.gmail.com 讨论:https://postgr.es/m/CAJcOf-fAdj=nDKMsRhQzndm-O13NY4dL6xGcEvdX5Xvbbi0V7g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/05c8482f7f69a954fd65fce85f896e848fc48197
修复 commit 05c8482f7f 中的 valgrind 问题。通过 is_parallel_safe() 初始化 max_parallel_hazard_context 中其他新添加的变量,因为我们不在此函数中检查目标关系的并行安全性。报告者:Tom Lane (根据 buildfarm 提供) 作者:Amit Kapila 讨论:https://postgr.es/m/2060179.1615347455@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e4e87a32cc5559303068b148bd4aa6a39b8f44a1
修复 commit 05c8482f7f 引入的 relcache TriggerDesc 字段的使用。该 commit 添加了使用 relcache TriggerDesc 字段的代码,但该字段位于另一个缓存访问之后,本不应如此,因为 relcache 不保证其不会被移动。诊断者:Tom Lane 作者:Greg Nancarrow 审阅者:Hou Zhijie, Amit Kapila 讨论:https://postgr.es/m/2309260.1615485644@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e2cda3c20a61c76e497fb2ebb6d2b2ae8c43c014
修复 commits d6ad34f3 和 bea449c6 引入的计算中的大小溢出。报告者:Thomas Munro 作者:Takayuki Tsunakawa 审阅者:Kyotaro Horiguchi 讨论:https://postgr.es/m/CA+hUKG+oPoFizjABt=GXZWTEHx3oev5rAe2scjW2r6F1rguo5w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/519e4c9ee21a656879123f4843f1d8d60cb71536
改进 commit 05c8482f7f 添加的 FK 触发器并行安全性检查。Commit 05c8482f7f 添加了与 FK 触发器并行安全性相关的特殊逻辑。这有点 hacky,本应通过在这些触发器函数本身上设置适当的 proparallel 值来完成。建议者:Tom Lane 作者:Greg Nancarrow 审阅者:Amit Kapila 讨论:https://postgr.es/m/2309260.1615485644@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c5be48f092016b1caf597b2e21d588b56c88a23e
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 提交
libpq:移除已弃用的连接参数 authtype 和 tty。authtype 参数在 commit d5bbe2aca55bc8 中已弃用并设置为非活动状态,但环境变量仍然定义,因此即使值没有用也会通过 getenv 调用进行测试。此外,如果它存在,它将被复制但永远不会被释放,因为清理代码已被删除。tty 在 commit cb7fb3ca958ec8bd5a14e7 中已弃用,但围绕它的绝大部分基础设施仍然保留。作者:Daniel Gustafsson daniel@yesql.se 讨论:https://postgr.es/m/DDDF36F3-582A-4C02-8598-9B464CC42B34@yesql.se https://git.postgresql.org/pg/commitdiff/14d9b37607ad30c3848ea0f2955a78436eff1268
小的调试消息调整。这使得删除情况的措辞与更新情况相匹配。 https://git.postgresql.org/pg/commitdiff/1657b37d7cce5c35e4c1d500f0a2f3736a087d82
在 bsearch() 前添加边界检查以提高性能。在当前的延迟 vacuum 实现中,一些索引 AM(如 btree 索引)在 ambulkdelete 期间为每个索引元组调用 lazy_tid_reaped(),以检查索引元组是否指向(已收集的)垃圾元组。在该函数中,我们只是调用 bsearch(),但如果我们能知道结果而不调用 bsearch(),如果索引元组指向堆元组,并且该元组超出已收集垃圾元组的范围。因此,在诉诸 bsearch() 之前添加一个简单的边界检查。测试表明,这可以带来显著的性能优势。作者:Masahiko Sawada masahiko.sawada@2ndquadrant.com 讨论:https://postgresql.ac.cn/message-id/flat/CA+fd4k76j8jKzJzcx8UqEugvayaMSnQz0iLUt_XgBp-_-bd22A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bbaf315309ed1194d451326cc8f4f59a45906408
Alexander Korotkov 提交了
Thomas Munro 推送
pgbench:重构线程移植性支持。与其维护 Windows 的不完整 POSIX 线程模拟,不如暂时使用一个极简的宏式抽象。后续的补丁将扩展此功能,而无需提供更复杂的 pthread 模拟代码。(将来可能需要更严肃的可移植线程抽象,但这并非如此。)修复了次要的偶发性问题:不能使用 (pthread_t) 0 作为特殊值,不能用 == 比较 thread_t 值,并且我们错误地假设 pthread 函数设置了 errno。讨论:https://postgr.es/m/20200227180100.zyvjwzcpiokfsqm2%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/b1d6a8f86813772b9198367a34c8ff8bff7fef9e
pgbench:改进时间逻辑。引入 pg_time_usec_t 并使用整数算术,而不是 instr_time (struct timespec) 和 INSTR_XXX 宏。除非使用 -C 模式,否则不将连接时间计入 TPS,但会单独报告。作者:Fabien COELHO coelho@cri.ensmp.fr 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Hayato Kuroda kuroda.hayato@fujitsu.com 讨论:https://postgr.es/m/20200227180100.zyvjwzcpiokfsqm2%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/547f04e7348b6ed992bd4a197d39661fe7c25097
添加缺失的 pthread_barrier_t。为 macOS 提供一个简单的缺失的 pthread_barrier_t 类型和函数的实现。讨论:https://postgr.es/m/20200227180100.zyvjwzcpiokfsqm2%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/44bf3d5083e151d772c5d6f656e3e162f573dced
pgbench:同步客户端线程。在基准测试开始前等待所有 pgbench 线程连接。这修复了一个问题,即由于早期连接的锁争用,某些连接可能需要很长时间才能建立,导致高连接数下的结果不稳定和错误。作者:Andres Freund andres@anarazel.de 作者:Fabien COELHO coelho@cri.ensmp.fr 审阅者:Marina Polyakova m.polyakova@postgrespro.ru 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Hayato Kuroda kuroda.hayato@fujitsu.com 审阅者:David Rowley dgrowleyml@gmail.com 讨论:https://postgr.es/m/20200227180100.zyvjwzcpiokfsqm2%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/aeb57af8e64000cc4288a7b8b8d7cf6040eae900
尝试修复最近 pgbench commit 中的移植性 bug。1. 根据 lapwing 的报告,32 位系统会抱怨 pg_time_usec_t 需要用 INT64_FORMAT 打印,而不是 %ld。2. 根据 whelk 的报告,某些 Windows 编译器不允许不带 __stdcall 标记的线程函数,我们看看这是否能解决问题。 https://git.postgresql.org/pg/commitdiff/68b34b2338f013cb025dea360b37a3b4fc930179
修复最近 pgbench commit 中的另一个移植性 bug。Commit 547f04e7 在构建 plpython 时在 AIX/xlc 上产生错误。新代码似乎与 commit a11cf433 安装的 hack 不兼容。没有 AIX 系统的访问权限进行检查,我猜测 _POSIX_C_SOURCE 可能需要 <time.h> 来声明标题需要看到的内容,但 plpython.h 取消了它。目前,为了不破坏 build farm 动物 hoverfly,只需将新的 pg_time_usec_t 支持移至 pgbench.c。也许以后我们可以弄清楚如何重新排列,将其放回头文件中以供更广泛使用。讨论:https://postgr.es/m/CA%2BhUKG%2BP%2BjcD%3Dx9%2BagyTdWtjpOT64MYiGic%2Bcbu_TD8CV%3D6A3w%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/c427de427ac411039d5efd5d0dcc8a4e0c6da68d
用条件变量替换 buffer I/O 锁。1. 等待 buffer I/O 的后端现在可中断。2. 如果一个正在执行 I/O 的后端出现问题,等待的后端不再会立即唤醒(因为 I/O 锁会自动释放),然后会忙等待直到 AbortBufferIO() 清除 BM_IO_IN_PROGRESS。3. LWLockMinimallyPadded 被移除,因为它现在将未使用。作者:Robert Haas robertmhaas@gmail.com 审阅者:Thomas Munro thomas.munro@gmail.com 审阅者:Julien Rouhaud rjuju123@gmail.com 审阅者:Tom Lane tgl@sss.pgh.pa.us (早期版本,2016)讨论:https://postgr.es/m/CA%2BhUKGJ8nBFrjLuCTuqKN0pd2PQOwj9b_jnsiGFFMDvUxahj_A%40mail.gmail.com 讨论:https://postgr.es/m/CA+Tgmoaj2aPti0yho7FeEf2qt-JgQPRWb0gci_o1Hfr=C56Xng@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d87251048a0f293ad20cc1fe26ce9f542de105e6
改进 struct BufferDesc 的注释。添加一个注释,说明每个 buffer 的 I/O 条件变量当前位于 BufferDesc 结构之外。commit d8725104 的后续工作。报告者:Julien Rouhaud rjuju123@gmail.com 讨论:https://postgr.es/m/20210311031118.hucytmrgwlktjxgq%40nol https://git.postgresql.org/pg/commitdiff/049d9b872db8a24b45709dbaed9a1051e92ed513
README.barrier 的轻微现代化。Itanium 非常罕见且即将停产。ARM 无处不在。优先使用 ARM 作为具有弱内存排序的体系结构的示例。 https://git.postgresql.org/pg/commitdiff/43c66624964aa1d2f519ad6be0c5ea8f170cf357
为恢复暂停添加条件变量。用 CV 替换 sleep 循环,以便在恢复暂停或 postmaster 通过标准基础设施退出时获得快速响应时间。不幸的是,我们仍然需要每秒唤醒一次,以便在恢复暂停循环期间执行额外的轮询。讨论:https://postgr.es/m/CA%2BhUKGK1607VmtrDUHQXrsooU%3Dap4g4R2yaoByWOOA3m8xevUQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/600f2f50b7a57c8481276450c9019fa7b3656411
为 walreceiver 关机添加条件变量。使用这个新的 CV 在没有 sleep/poll 循环的情况下等待 walreceiver 关机,同时也能从标准的 postmaster 死亡处理中受益。讨论:https://postgr.es/m/CA%2BhUKGK1607VmtrDUHQXrsooU%3Dap4g4R2yaoByWOOA3m8xevUQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/de829ddf23f69190efb4e0178704c4c4228e17cd
减少恢复时轮询 postmaster 的频率。自 commits 9f095299 和 f98b8476 以来,我们在 Linux 和 FreeBSD 上完全不轮询 postmaster 管道,但在其他操作系统上,我们仍然为每个 WAL 记录进行轮询。在需要系统调用的操作系统上降低轮询频率,代价是 postmaster 死亡后退出延迟。这避免了昂贵的系统调用,据报告,这会使 CPU 密集型的恢复速度减慢 10-30%。审阅者:Heikki Linnakangas hlinnaka@iki.fi 审阅者:Fujii Masao masao.fujii@oss.nttdata.com 审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/CA%2BhUKGK1607VmtrDUHQXrsooU%3Dap4g4R2yaoByWOOA3m8xevUQ%40mail.gmail.com 讨论:https://postgr.es/m/7261eb39-0369-f2f4-1bb5-62f3b6083b5e@iki.fi https://git.postgresql.org/pg/commitdiff/57dcc2ef3320de3e1aef6f668601e6ad2bdf88c4
特化 checkpointer 排序函数。在排序大量脏缓冲区时,checkpointer 可以从更快的排序例程中受益。在一个大型缓冲区池系统上,报告的改进是从 1.4 秒变为 0.6 秒。审阅者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/CA%2BhUKGJ2-eaDqAum5bxhpMNhvuJmRDZxB_Tow0n-gse%2BHG0Yig%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/1b88b8908e751271933c076234fa085cda251421
修复新的 pthread 代码以遵守 --disable-thread-safety。如果我们选择在配置时禁用线程,则不要尝试编译 src/port/pthread_barrier_wait.c。由 build farm 成员 gaur 发现,它因其 pthread 实现问题而无法编译此代码。它不应该尝试这样做,因为它正在使用 --disable-thread-safety。commit 44bf3d50 中的缺陷。报告者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgr.es/m/2568537.1615603606%40sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/de91c3b976cfacddacd45a9b52046264c0e44b11
Bruce Momjian 已推送
C 注释:改进 GiST NSN 和 GistBuildLSN 的描述。GiST 索引很复杂,因此在代码中添加更多细节可能有助于他人理解。讨论:https://postgr.es/m/20210302164021.GA364@momjian.us https://git.postgresql.org/pg/commitdiff/845ac7f847a25505e91f30dca4e0330b25785ee0
教程:陆地高度是“elevation”,不是“altitude”。这是对 92c12e46d5 的后续补丁。在该补丁中,我们根据以下细节将文档中的“altitude”重命名为“elevation”:https://mapscaping.com/blogs/geo-candy/what-is-the-difference-between-elevation-relief-and-altitude 此补丁将教程 SQL 文件重命名以匹配文档。报告者:max1@inbox.ru 讨论:https://postgr.es/m/161512392887.1046.3137472627109459518@wrigleys.postgresql.org 回溯到:9.6 https://git.postgresql.org/pg/commitdiff/2950ff32f31d073ea4be4f5f9b73249131f42bd7
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 提交
重构和泛化 ParallelSlot 机制。创建一个包装器对象 ParallelSlotArray,用于封装槽的数量和槽数组本身,以及其他一些相关信息。这减少了我们需要在各处传递的参数数量。允许一个 ParallelSlotArray 在单个集群中包含连接到不同数据库的槽。当前的客户不需要这个,但预计未来的补丁会使用它。推迟连接到数据库,直到我们实际需要连接为止。这对于 vacuumdb 和 reindexdb 是一个细微的行为改变。如果你指定的工作数大于对象数,多余的连接现在将不会被使用。但是,另一方面,如果你指定的工作数如此之大以至于它将失败,失败以前会在任何操作实际开始之前发生,现在则不会。Mark Dilger,我审阅。讨论:http://postgr.es/m/12ED3DA8-25F0-4B68-937D-D907CFBF08E7@enterprisedb.com 讨论:http://postgr.es/m/BA592F2D-F928-46FF-9516-2B827F067F57@enterprisedb.com https://git.postgresql.org/pg/commitdiff/f71519e545a34ece0a27c8bb1a2b6e197d323163
明确恢复暂停是否生效。以前,代码和文档似乎基本上假设调用 pg_wal_replay_pause() 会立即生效,但事实并非如此,因为我们只在某些地方检查暂停。这意味着,一个使用此函数然后想做其他依赖于暂停生效的事情的工具,不知道它需要等待多久才能确定不会再有 WAL 被重放。为避免这种情况,添加了一个新函数 pg_get_wal_replay_pause_state(),它返回“not paused”、“paused requested”或“paused”。调用 pg_wal_replay_pause() 后,状态将立即从“not paused”变为“paused requested”;当启动过程注意到这一点时,状态将变为“paused”。为向后兼容性,pg_is_wal_paused() 仍然存在,并且返回与以前相同的内容:如果已请求暂停,则为 true,无论是否已生效;否则为 false。文档已更新以澄清。为了提高暂停请求能快速生效的更改,调整了 WaitForWALToBecomeAvailable 以便在发出暂停请求时 Swiftly 到达 recoveryPausesHere() 的调用。Dilip Kumar,审阅者 Simon Riggs, Kyotaro Horiguchi, Yugo Nagata, Masahiko Sawada, 和 Bharath Rupireddy。讨论:http://postgr.es/m/CAFiTN-vcLLWEm8Zr%3DYK83rgYrT9pbC8VJCfa1kY9vL3AUPfu6g%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/32fd2b57d7f64948e649fc205c43f007762ecaac
添加 pg_amcheck,一个 contrib/amcheck 的 CLI。这使得针对大量关系运行 contrib/amcheck 实现的损坏检查并以易于理解的格式获取结果变得容易得多。它有多种选项,用于选择要检查的关系和要执行的检查,并且如果您愿意,它还可以并行运行检查。Mark Dilger,审阅者 Peter Geoghegan 和我。讨论:http://postgr.es/m/12ED3DA8-25F0-4B68-937D-D907CFBF08E7@enterprisedb.com 讨论:http://postgr.es/m/BA592F2D-F928-46FF-9516-2B827F067F57@enterprisedb.com https://git.postgresql.org/pg/commitdiff/9706092839db2c8c93860674e426a917635438c3
尝试修复编译器警告。根据 Peter Geoghegan 的报告。讨论:http://postgr.es/m/CAH2-WznpwULZ3uJ1_6WXvNMXYbOy8k8tYs3r=qSdGmZeRd6tDw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d60e61de4fb4a8e7ca88204c2c409e7380887d76
调整 Perl 风格。根据 buildfarm 成员 crake。 https://git.postgresql.org/pg/commitdiff/7a1527c02c147a4107490662cb1872524c54a8ae
在初始化程序之前移动 PG_USED_FOR_ASSERTS_ONLY。Erik Rijkers 报告了一个编译失败,我认为这可能是原因。 https://git.postgresql.org/pg/commitdiff/ac445955852fe6bc0e02e87a409f25ab6e0a82d6
修复 pg_amcheck 的 004_verify_heapam.pl 中的移植性问题。测试 #12 覆盖了一个 1 字节的 varlena 头,使其看起来像一个 4 字节 varlena 头的初始字节,但结果依赖于字节序。此外,“abc”字节跟在覆盖的字节后面,将根据字节序被解释为不同。覆盖 4 个字节,以字节序感知的方式。测试 #13 意外地依赖于 TOAST_MAX_CHUNK_SIZE,它根据 MAXIMUM_ALIGNOF 略有不同。无论如何,这也不是重点,所以使正则表达式对预期的块数不敏感。Mark Dilger 讨论:http://postgr.es/m/A80D68F6-E38F-482D-9522-E2FB6AAFE8A1@enterprisedb.com https://git.postgresql.org/pg/commitdiff/661125612706b1d0d5ed9f12d18908b08512a7eb
尝试避免 IPC::Run 中明显的平台依赖性。难以置信,但新的 pg_amcheck 的 buildfarm 结果表明 command_checks_all() 在某些机器上执行 shell 扩展,而在另一些机器上不执行,这显然是由于 IPC::Run 底层行为的差异。让我们尝试通过将 '-S*' 作为单个参数而不是将 '-S' 和 '*' 作为两个单独的参数来解决这个问题,并确认这是否是真正的问题。在 jacana 和 hoverfly 上观察到失败。Mark Dilger 讨论:http://postgr.es/m/9E76E46A-48B2-4869-BD0C-422204C1F767@enterprisedb.com https://git.postgresql.org/pg/commitdiff/f371a4cdba6dc805acd608cc63a7089b57cb4e9e
pg_amcheck:继续尝试修复测试。避免在 command_checks_all() 中使用非移植性的选项顺序。裸命令行参数在开关之前在某些地方不起作用。根据 buildfarm 成员 drongo 和 hoverfly。避免测试“role '%s' does not exist”消息,因为一些 buildfarm 机器报告了不同的错误。fairywren 抱怨“SSPI authentication failed for user '%s'”,例如。Mark Dilger 讨论:http://postgr.es/m/9E76E46A-48B2-4869-BD0C-422204C1F767@enterprisedb.com 讨论:http://postgr.es/m/F0A1FD70-A2F4-4528-8A03-8650CAEC0554%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/24189277f6ff3169b15c7bc82926a372ca7f2dbf
pg_amcheck:继续尝试修复测试。Commit 24189277f6ff3169b15c7bc82926a372ca7f2dbf 设法移除了两个检查“no such user”错误的地方之一,而将另一个地方留在了它旁边。所以也把它移除了。事实上,删除整个测试,因为这个测试的重点是查看我们在失败时收到什么消息。 https://git.postgresql.org/pg/commitdiff/b9164eab208342d685638fc90048ffaa2688cb47
在 pg_amcheck 测试中,不依赖 Perl 的 Q/q pack 代码。它在所有平台上的一些 Perl 版本上不起作用。为避免字节序问题,为列 a 选择一个新值,该值具有与低 4 字节相同的上 4 字节。尝试使其成为页面附近不太可能出现的值。讨论:http://postgr.es/m/29DA079B-0658-4E66-BDAA-0EFD7B64D9C6@enterprisedb.com https://git.postgresql.org/pg/commitdiff/945d2cb7d0255e296a55f3e9febb5dce6eaccc3e
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() 的补丁的两次修订。