PG Build 2021 将于 2021 年 11 月 30 日和 12 月 1 日 GMT 时间 09:00-17:00 在线举行。 详情。
PostgresDAC 3.11 发布,这是一个用于 PostgreSQL 的直接访问组件套件。 http://microolap.com/products/connectivity/postgresdac/download/
JDBC 42.3.1 已发布。
ODB C++ ORM 版本 2.5.0-b.21 已发布。
DynamoDB FDW 1.0.0 已发布。
Babelfish,一个用于 PostgreSQL 的 MS SQL Server 兼容层,已发布。
https://archives.postgresql.org/pgsql-jobs/2021-11/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tom Lane 提交
plpgsql:报告变量初始化错误的正确行号。以前,我们会指向周围块的 BEGIN 关键字。如果在 DECLARE 部分初始化了多个变量,这就不够好了:它可能非常令人困惑且无益。我们确实知道变量声明从何开始,所以只需要一点点额外的错误报告基础设施即可使用它。讨论:https://postgr.es/m/713975.1635530414@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/acb2d7d5d2301f07d5857ee252995e62ce9e7055
当备用进程释放许多锁时,避免 O(N^2) 的行为。在重放事务时,该事务在主服务器上持有许多排他锁,备用服务器的启动进程会在处理锁列表时花费 O(N^2) 的精力。代码写出来时没问题,但提交 1cff1b95a 使重复的 list_delete_first() 调用变得效率低下,正如其提交消息中所解释的。通过正常迭代列表并仅在完成后释放存储来修复。 (如果我们想从过程中发生的错误中恢复,这可能不够;但我们不需要。)回溯到 v13,因为 1cff1b95a 就是在那里引入的。Nathan Bossart 讨论:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/6301c3adabd947394682e37c933b0f3f83353b28
文档:改进与 TAP 测试相关的 README 文件。重新排列 src/test/perl/README,使其第一部分更清晰地说明“如何运行这些测试”,其余部分说明“如何编写新测试”。在那里添加一些关于调试测试失败的基本信息。然后,从描述如何运行 TAP 测试的其他 README 文件中添加交叉引用。根据 Kevin Burke 的建议,尽管这不是他的原始补丁。讨论:https://postgr.es/m/CAKcy5eiSbwiQnmCfnOnDCVC7B8fYyev3E=6pvvECP9pLE-Fcuw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b21415595cace7f3a45cfeb3023359b4b4d56b85
不要试图一次读取多 GB 的 pg_stat_statements 文件。Windows 在读取超过 INT_MAX 字节的请求时会失败,并且其他平台可能也会有类似问题。让我们调整此代码,使其每次最多读取 1GB。(没想到文件会变得那么大,但现在有了一个问题报告,所以它会变得那么大。我们可能应该添加一些机制来限制查询文本文件的大小,使其独立于哈希表的大小。但这并非此补丁的目标。)根据 Yusuke Egashira 的 bug #17254。它已经这样一段时间了,所以回溯到所有支持的分支。讨论:https://postgr.es/m/17254-a926c89dc03375c2@postgresql.org https://git.postgresql.org/pg/commitdiff/a667b066837849c5e55e0d626f1f7c93e267b8b7
在列表操作中避免其他 O(N^2) 的危险。与 6301c3ada 类似,修复了更多地方,我们在循环中使用 list_delete_first() 并因此存在 O(N^2) 的行为风险。目前还不清楚这些位置操作的列表是否会变得足够长以至于成为真正的问题……但也不能排除它们会变得足够长,而且修复也很简单。与之前一样,回溯到 v13。讨论:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/e9d9ba2a4ddc39e331dd8461b511aa59ec0dc8af
避免 SyncPostCheckpoint() 中的 O(N^2) 行为。与提交 6301c3ada 和 e9d9ba2a4 一样,避免执行重复的 list_delete_first() 操作,因为当有许多文件等待取消链接时,这会很昂贵。这比这些情况下的更改要大一些。我们必须保持列表状态对 AbsorbSyncRequests() 的调用有效,因此有必要发明一个“已取消”字段,而不是立即删除 PendingUnlinkEntry 条目。此外,因为我们可能无法处理所有条目,所以我们需要一个新的列表原语 list_delete_first_n()。list_delete_first_n() 几乎等同于 list_copy_tail(),但它修改输入列表而不是创建新副本。我发现其中几个使用后者的地方可以有效地使用新函数。(可能还有更多,但其他调用者看起来可能不应该覆盖输入列表。)与之前一样,回溯到 v13。讨论:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/65c6cab1365ac33b11a49a2a193f6b3f9c53e487
文档:更精确地说明关系名称冲突。在所有这些对象类型的参考页面中使用“表名必须与其他模式中的任何其他关系(表、序列、索引、视图、物化视图或外部表)的名称不同”等措辞。主要变化是明确提及物化视图;尽管其中一些页面根本没有提及名称冲突。根据 Daniel Westermann 的建议。讨论:https://postgr.es/m/ZR0P278MB0920D0946509233459AF0DEFD2889@ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/af8c580e5cf32bb85dde70083a260c93a1f783eb
文档:清理一些提到了 template1 但未提及 template0 的地方。改进旧文本,这些文本在我们添加 template0 到标准数据库集时并未更新。根据 P. Luzanov 的建议。讨论:https://postgr.es/m/163583775122.675.3700595100340939507@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7d9ec0754afeabb9f336c5220ef415c3ea27a0b6
修复 ExecInitCoerceToDomain() 中的变量生命周期。这撤销了 1ec7679f1 中的一个错误:domainval 和 domainnull 本应跨越循环迭代,但它们被错误地移到了循环内部。其效果只是发出无用的额外 EEOP_MAKE_READONLY 步骤,因此这并不是什么大事;尽管如此,回溯到引入错误的 v13。Ranier Vilela 讨论:https://postgr.es/m/CAEudQAqXuhbkaAp-sGH6dR6Nsq7v28_0TPexHOm6FiDYqwQD-w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/01fc6527034a6f70ed44a078af8f636b1ab64947
确保日期时间 (datetime) 和 float8 值的逻辑复制一致性。在 walreceiver 中,将发布者的相关 GUC(datestyle、intervalstyle、extra_float_digits)设置为与 pg_dump 使用的相同值,原因相同:我们需要输出的读取方式与接收者的设置无关。没有这个,订阅者就有可能误解传输的值。尽管这显然是一个 bug 修复,但它并非没有缺点:将值存储到其他数据类型(如 text)的订阅者可能会得到与之前不同的结果,并且可能对此不满意。鉴于之前没有抱怨,最好仅在 HEAD 中更改此设置,并将其称为 v15 中的不兼容更改。Japin Li,根据 Sadhuprasad Patro 的报告讨论:https://postgr.es/m/CAFF0-CF=D7pc6st-3A9f1JnOt0qmc+BcBPVzD6fLYisKyAjkGA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3d4019da5d026f2c3fe5bd258becf6fbb6b4673
尝试抑制 hamerkop 上的 SSL 编译失败。Buildfarm 成员 hamerkop 最近几天一直因错误而失败,这些错误看起来像是 OpenSSL 的 X509 相关符号尚未导入 be-secure-openssl.c。原因不明,但让我们尝试显式包含 `
修复 pg_basebackup 的 MSVC 构建。提交 23a1c6578 试图通过新的变量 BBOBJS 来重构 pg_basebackup/Makefile,但我们的 MSVC 构建系统对此一无所知。根据 buildfarm 的报告。 https://git.postgresql.org/pg/commitdiff/d8bf0a1c1d3429cafb3019f2773e2f3aa68f3b65
第二次尝试抑制 hamerkop 上的 SSL 编译失败。经过进一步调查,问题的原因似乎是我们最近决定开始定义 WIN32_LEAN_AND_MEAN。这导致 `
不允许通过 array_to_tsvector() 创建空词元 (lexeme)。tsvector 数据类型一直禁止词元为空。然而,array_to_tsvector() 没有收到这个消息,并且允许空字符串的数组元素成为空词元。这可能导致后续的 dump/restore 失败,更不用说原始禁止后面可能存在的语义问题了。然而,其他直接将纯文本输入作为词元值的函数不需要类似的限制,因为它们只将字符串与现有的 tsvector 条目进行匹配。特别是,让 ts_delete() 拒绝空字符串将是一个坏主意,因为这是清理可能通过此 bug 进入 tsvector 列的任何错误数据的最方便的方法。考虑到这一点,让我们也移除 tsvector_delete_arr 和 tsvector_setweight_by_filter 中对 NULL 数组元素的禁止。忽略它们似乎更一致,就像会忽略空字符串元素一样。这是一个 bug 修复,有一个回溯的理由。但总的来说,这似乎不是在次要版本中需要更改的内容。Jean-Christophe Arnu 讨论:https://postgr.es/m/CAHZmTm1YVndPgUVRoag2WL0w900XcoiivDDj-gTTYBsG25c65A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/cbe25dcff73a297adbada9dc1d6cad3df18014e9
尝试修复 MSVC pgcrypto 构建。提交 db7d1a7b0 移除了 Mkvcbuild.pm 对构建 contrib/pgcrypto 的自定义支持,但忽略了通知它该模块现在可以正常构建。至少我猜现在可以正常构建了。但这肯定会导致 bowerbird 失败,因为它试图测试一个尚未构建的模块。 https://git.postgresql.org/pg/commitdiff/3c2c391dc9f82fae181508ebcc2f7621ffefd024
文档:添加一些关于 List 函数性能的说明。根据 Andres Freund 的建议。讨论:https://postgr.es/m/20211104221248.pgo4h6wvnjl6uvkb@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/27ef132a805c8633ed8bb94ed70be995c681ab1f
contrib/sslinfo 也需要一个修复才能让 hamerkop 满意。重新排序 #include 会在这里带来一些问题,因为 libpq/libpq-be.h 需要包含 <openssl/ssl.h>。相反,让我们在所有 #include 之后 #undef 掉不需要的宏。这肯定比其他方法更丑陋,但尽管可能将来会重新排列头文件,它也应该能正常工作。(查看 openssl 头文件表明 X509_NAME 是我们使用的唯一冲突符号。)顺便,删除 pg_backup_archiver.h 中一个相关的但长期不正确的注释。讨论:https://postgr.es/m/1051867.1635720347@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/568620dfd6912351b4127435eca5309f823abde8
抑制未初始化变量警告。许多 buildfarm 机器都对此发出警告,lapwing 实际上失败了(因为 -Werror)。据我所知,这是一个误报,所以只需要将变量初始化为零即可。讨论:https://postgr.es/m/YYXJnUxgw9dZKxlX@paquier.xyz https://git.postgresql.org/pg/commitdiff/c3ec4f8fe867807613c08fe16789434ab1a74a15
Michaël Paquier 提交
在 REINDEX CONCURRENTLY 期间保留操作符类参数。旧索引的操作符类参数 Datums 的获取方式与谓词和表达式相同,直接从系统目录中获取。然后将它们复制到将用于创建新副本的新的 IndexInfo 中。这导致新索引以默认参数重建,而不是用户预定义的参数。获得具有正确操作符类参数的新索引的唯一方法是重新从头开始创建新索引。此问题由 911e702 引入。作者:Michael Paquier 审阅者:Zhihong Yu 讨论:https://postgr.es/m/YX0CG/QpLXcPr8HJ@paquier.xyz 回溯到:13 https://git.postgresql.org/pg/commitdiff/add5cf28d48149459466b9aff374d78aebf17482
为 pg_receivewal 添加时间线切换的 TAP 测试。pg_receivewal 能够跟踪时间线切换,但这并未经过测试。此测试使用空的归档位置,并从槽进行重启,使其实现比重用现有归档目录稍简单一些。作者:Ronan Dunklau 审阅者:Kyotaro Horiguchi, Michael Paquier 讨论:https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/0f9b9938a0367313fcf6a32fcb7fb5be9e281198
重构 pg_receivewal 的压缩选项。自 cada1af 起,pg_receivewal 包含了 --compress 选项,允许使用 gzip 压缩 WAL 段,值为 0(默认)表示不压缩。此提交引入了一个新选项 --compression-method,其值可以为“none”(默认)和“gzip”,以使事情更具扩展性。--compress=0 的情况与此选项层变得模糊,因此我们选择使 pg_receivewal 在使用“none”且压缩级别非零时返回错误,这意味着 --compress 的授权值现在是 [1,9] 而不是 [0,9]。未指定 --compress 和“gzip”作为压缩方法,pg_receivewal 会使用 zlib 的默认值(Z_DEFAULT_COMPRESSION)。负责在扫描现有归档时查找流式启动 LSN 的代码被重构并使其更具扩展性。同时,在 walmethods.c 中将“compression”重命名为“compression_level”,以减少与引入压缩方法混淆,即使 pg_basebackup 使用的 tar 方法不依赖于压缩方法(至少目前还不是),而仅仅依赖于压缩级别(实际上,这个区域可以进一步改进)。这是为即将发布的添加 LZ4 支持到 pg_receivewal 的补丁做准备。作者:Georgios Kokolatos 审阅者:Michael Paquier, Jian Guo, Magnus Hagander, Dilip Kumar 讨论:https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/d62bcc8b07f921bad105c7a826702c117ea7be58
修复 pg_receivewal --compression-method 的一些错误。选项名称在一个错误消息中不正确,并且代码中使用了短选项 'I',但我们不打算这样。同时,修复文档以引用“方法”,而不是“级别”。提交 d62bcc8 中的疏忽,我在进一步审查 pg_receivewal 的 LZ4 补丁后检测到。 https://git.postgresql.org/pg/commitdiff/9588622945754305836555273a6a3be814db315c
为 pg_receivewal 添加 LZ4 压缩支持。pg_receivewal 获得了一个新选项 --compression-method=lz4,当代码使用 --with-lz4 编译时可用。与 gzip 类似,这提供了使用 LZ4 压缩归档 WAL 段的可能性。此选项与 --compress 不兼容。实现使用 LZ4 帧,并兼容简单的 lz4 命令。与 gzip 类似,使用 --synchronous 可以确保任何数据在当前 .partial 段内刷新到磁盘,从而尽可能多地检索 WAL 数据,即使是从未完成的段(这需要将部分文件填充零直到后端解压后支持的 WAL 段大小,但这与 gzip 相同)。计算流式启动 LSN 的代码能够透明地查找和检查 LZ4 压缩的段。与 gzip 不同,gzip 直接将未压缩的大小存储在读取的对象中,LZ4 块协议默认不存储未压缩的数据。there is contentSize,它可以通过 LZ4 帧使用,但这无助于使用包含默认压缩的“lz4”命令压缩的段的归档,其中此信息未存储。因此,此提交采取了最可扩展的方法,通过以 64kB 的块(没有注意到 8kB、16kB 或 32kB 的实际性能差异,并且操作本身实际上很快)为空输出缓冲区来解压缩已归档的段以检查其未压缩大小。已添加测试以验证生成的 LZ4 文件的创建和正确性。后者通过使用环境变量中的“lz4”命令来实现。walmethods.c 中的 tar-based WAL 方法(目前仅由 pg_basebackup 使用)尚不了解 LZ4。其代码可以扩展用于此目的。作者:Georgios Kokolatos 审阅者:Michael Paquier, Jian Guo, Magnus Hagander, Dilip Kumar 讨论:https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/babbbb595d2322da095a1e6703171b3f1f2815cb
改进 psql 的 tab 补全功能 for COMMENT。为更多对象类型添加了补全,例如 domain constraints、text search 相关对象或 policies。此外,该区域进行了重组,将 COMMENT 支持的对象列表的顺序更改为与文档一致,以便于将来的添加。作者:Ken Kato 审阅者:Fujii Masao, Shinya Kato, Suraj Khamkar, Michael Paquier 讨论:https://postgr.es/m/6e0c2f3f657b229bea32d098d118f307@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/a5b336b8b9e04a93e7c8526302504d2e5201eb80
Álvaro Herrera 提交
在 DecodeXLogOp 中处理 XLOG_OVERWRITE_CONTRECORD。未能这样做将导致逻辑解码无法处理 WAL 流。通过无操作来处理它。全部回溯。报告人:Petr Jelínek petr.jelinek@enterprisedb.com https://git.postgresql.org/pg/commitdiff/40c516bba864395c77bcfb1bae65ba9562ba8f71
改写 vacuumdb --analyze-in-stages 的文档说明。让用户意识到在具有现有统计信息的数据库中使用它可能会导致暂时性问题。作者:Nikolai Berkoff nikolai.berkoff@pm.me 讨论:https://postgr.es/m/s-kSljtWXMWgMfGTztPTPcS80R8FHdOrBxDTnrQI6GMZbT7au1A4b0fzaSFtKwCI8nwN0MhgPLfVOTvJ7DwTjkip4P3d0o4VgrMJs4OLN-o=@pm.me https://git.postgresql.org/pg/commitdiff/00a354a13560dc529ac34a303c85c265aaf033b7
记录 log_startup_progress_interval 的默认值和可变性。审查 9ce346eabf35。作者:Álvaro Herrera alvherre@alvh.no-ip.org 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/202110292123.bnf6axcp27vx@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/e543906e217509ad95c1e341de4e874f027f871b
Pipeline 模式不允许多命令字符串。……所以在 libpq 文档的适当位置提及这一点。回溯到 14。报告人:RekGRpth rekgrpth@gmail.com 讨论:https://postgr.es/m/17235-53bb38fc5be593dc@postgresql.org https://git.postgresql.org/pg/commitdiff/105c1de0197473dac8ada55dc8cf773d782224cb
文档说明 ALTER TABLE .. TYPE 会移除统计信息。联合作者:Nikolai Berkoff nikolai.berkoff@pm.me 讨论:https://postgr.es/m/vCc8XnwDmlP4ZnHBQLIVxzD405BiYHVC9qZlhIF7IsfxK0gC9mZ4PUUOH0-3y6kv5p-87-3_ljqT1KvQVAnb8OoWhPU3kcqWn2ZpmxRBCQg=@pm.me https://git.postgresql.org/pg/commitdiff/df80f9da5c6541e744eeb20eaca919c7fc189999
避免在并发 DROP 的罕见情况下崩溃。当要删除的角色被目录对象引用,而这些对象又同时被删除时,在尝试构造描述对象的字符串时可能会导致崩溃。通过忽略其描述返回 NULL 的对象来抑制这种情况。大多数相关的代码点已经对此很谨慎了;我们只是遗漏了几个。这是一个旧 bug,所以要全部回溯。报告人:Alexander Lakhin exclusion@gmail.com 讨论:https://postgr.es/m/17126-21887f04508cb5c8@postgresql.org https://git.postgresql.org/pg/commitdiff/d74b54b3ddf710926a44bf3f9c87c00e6f82d825
Daniel Gustafsson 提交
Amit Kapila 提交
用更本地化的标志替换 XLOG_INCLUDE_XID 标志。提交 0bead9af484c 引入了 XLOG_INCLUDE_XID 标志,以指示 WAL 记录包含 subXID 到 topXID 的关联。它稍后使用该标志标记 CurrentTransactionState,表示 top-xid 已记录,因此我们不应在当前子事务的下一个 WAL 记录中再次记录它。但是,我们可以使用局部变量来传递该信息。顺便,更改相关的函数和变量名称,使其与代码的实际操作保持一致。作者:Dilip Kumar 审阅者:Alvaro Herrera, Amit Kapila 讨论:https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b
将 MarkCurrentTransactionIdLoggedIfAny() 移出临界区。我们在此函数中不修改任何共享状态,这可能导致任何并发会话出现问题。这将使其看起来与同一结构(TransactionState)的其他更新相似,从而避免将来代码阅读者的混淆。作者:Dilip Kumar 审阅者:Amit Kapila 讨论:https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/335397456b7e3f9f619038cb322fbfc9dd649d4f
Fujii Masao 提交
pgbench:改进 pgbench 中的错误处理。以前,初始连接和日志文件打开的失败会导致 pgbench 继续进行基准测试,报告不完整的测试结果并以状态 2 退出。当 pgbench 无法按规定启动时,继续进行基准测试是没有意义的。此提交改进了 pgbench,以便在启动基准测试时发生的早期错误(如这些失败)应使 pgbench 立即以状态 1 退出。作者:Yugo Nagata 审阅者:Fabien COELHO, Kyotaro Horiguchi, Fujii Masao 讨论:https://postgr.es/m/TYCPR01MB5870057375ACA8A73099C649F5349@TYCPR01MB5870.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/cd29be5459f0e138c0f19d49ee588feeda78e3c9
pgbench:修复注释中的拼写错误。讨论:https://postgr.es/m/f9041ec2-46b6-1b41-0e84-9c8a1e2d6bda@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/d8dba4d03068eeee1ea3ffc8e7c7b4fa3e35a7f4
Peter Geoghegan 提交
在并行 VACUUM 中不要忽略索引。提交 b4af70cb 简化了 VACUUM 管理的状态,顺便对并行 VACUUM 进行了重构。对领导者进程负责的任务的细节感到困惑,导致出现了可能导致并行 VACUUM 完全错过表索引的子集的代码。具体来说,低于 min_parallel_index_scan_size 截止值的索引被忽略了。这些索引应该由领导者(以及任何并行不安全索引)进行 vacuum,但实际上根本没有被 vacuum。一旦堆元组的堆 TID 被回收用于新的堆元组,受影响的索引很容易出现重复的堆 TID。这具有通用症状,几乎可以用于任何涉及索引与其表之间结构不一致的索引损坏。为解决此问题,请确保并行 VACUUM 领导者进程执行所有必需的索引 vacuum 操作,以处理那些恰好低于大小截止值的索引。此外,请记录并行 VACUUM 的设计,包括这些低于大小截止值的索引。目前尚不清楚有多少用户可能受到此 bug 的影响。表中至少必须有三个索引才能触发 bug:一个较小的索引,以及至少另外两个索引,它们本身超过了大小截止值。仅有一个额外索引的案例不会出现问题,因为并行 VACUUM 成本模型需要表中至少有两个大于截止值的索引才能应用任何并行处理。另请注意,自动 vacuum 未受影响,因为它从不使用并行处理。基于 Masahiko Sawada 的一个较大补丁的测试用例。非常感谢 Kamigishi Rei 在追踪此问题上的宝贵帮助。作者:Peter Geoghegan pg@bowt.ie 作者:Masahiko Sawada sawada.mshk@gmail.com 报告人:Kamigishi Rei iijima.yun@koumakan.jp 报告人:Andrew Gierth andrew@tao11.riddles.org.uk 诊断人:Andres Freund andres@anarazel.de Bug:#17245 讨论:https://postgr.es/m/17245-ddf06aaf85735f36@postgresql.org 讨论:https://postgr.es/m/20211030023740.qbnsl2xaoh2grq3d@alap3.anarazel.de 回溯:14-,其中出现了重构提交。 https://git.postgresql.org/pg/commitdiff/9bacec15b67d1a643915858f054790f36b2b7871
修复并行 amvacuumcleanup 安全 bug。提交 b4af70cb 反转了 parallel_processing_is_safe() 函数的返回值,但忽略了 amvacuumcleanup 测试。不支持并行清理的索引 AM 受到影响。此 bug 的实际后果并不严重。哈希索引受到影响,但由于 hashvacuumcleanup 仅返回块数,因此影响不大。作者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAD21AoA-Em+aeVPmBbL_s1V-ghsJQSxYL-i3JP8nTfPiD1wjKw@mail.gmail.com 回溯:14-,其中出现了提交 b4af70cb。 https://git.postgresql.org/pg/commitdiff/c59278a1aa5ef2ee8a6d5d83bd987a7ce5c89e84
将另一个旧提交添加到 git-blame-ignore-revs。添加另一个历史性的 pgindent 提交,该提交在初始工作(提交 8e638845)中被遗漏了。 https://git.postgresql.org/pg/commitdiff/581055c32fbb5018431265877754cbd8019bc012
向堆剪除代码添加各种断言。这些断言记录(并验证)我们关于剪除如何影响目标堆页面现有项的高层假设。例如,其中一个新断言验证剪除不会将仅堆元组设置为 LP_DEAD。作者:Peter Geoghegan pg@bowt.ie 审阅者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/CAH2-Wz=vhvBx1GjF+oueHh8YQcHoQYrMi0F0zFMHEr8yc4sCoA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5cd7eb1f1c32e1b95894f28b277b4e4b89add772
添加硬化以捕获索引中的无效 TID。向堆索引元组删除路径添加硬化,以捕获索引页面中的 TID,这些 TID 指向索引元组绝不应指向的堆项。这里试图捕获的损坏特别难以检测,因为它通常涉及“额外的”(损坏的)索引元组,而不是索引中缺少必需的索引元组。例如,来自索引页面的堆 TID(该页面指向堆页面中的 LP_UNUSED 项)很可能被新的检查之一捕获。最近修复的并行 VACUUM bug(参见提交 9bacec15)如果该特定检查在 PostgreSQL 14 中可用,可能会被捕获。目前不回溯此额外硬化。作者:Peter Geoghegan pg@bowt.ie 审阅者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/CAH2-Wzk-4_raTzawWGaiqNvkpwDXxv3y1AQhQyUeHfkU=tFCeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e7428a99a13f973549aab30c57ec8380ddda1869
更新 vacuumlazy.c 中过时的堆剪除注释。添加新的注释,阐明 VACUUM 对堆剪除的期望:剪除绝不能留下仍具有元组存储的 DEAD 元组。至少自提交 8523492d 以来一直如此,该提交确立了 vacuumlazy.c 不需要直接处理仍具有元组存储的 DEAD 元组的原则,除了可能通过简单地重试剪除(以处理并发事务中止引起的罕见角落情况)。顺便,更新一些对旧符号名称的引用,这些引用在快照可伸缩性工作(特别是提交 dc7420c2c9)中被遗漏了。 https://git.postgresql.org/pg/commitdiff/f214960adde6028a39ba3014b1ab2b224faeefed
更新 vacuumlazy.c 中过时的引用。提交 7ab96cf6 中的疏忽。 https://git.postgresql.org/pg/commitdiff/02f9fd129432cab565b2a3cb9f3b3a5000dfe540
Peter Eisentraut 提交
修复不正确的格式占位符。 https://git.postgresql.org/pg/commitdiff/ef6f047d2c87b91318364341c058dd6b715951b2
pgcrypto:删除非 OpenSSL 支持。pgcrypto 拥有一些加密算法的内部实现,作为调用 OpenSSL 的替代方案。这些很少使用,因为大多数生产安装都是用 OpenSSL 构建的。此外,维护并行代码路径会使代码更复杂且难以维护。此补丁删除了这些内部实现。现在,仅当配置了 OpenSSL 支持时,pgcrypto 才会构建。审阅者:Daniel Gustafsson daniel@yesql.se 讨论:https://postgresql.ac.cn/message-id/flat/0b42f1df-8cba-6a30-77d7-acc241cc88c1%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/db7d1a7b0530e8cbd045744e1c75b0e63fb6916f
Heikki Linnakangas 提交
如果在 lo_export 失败时修复快照引用泄漏。如果在 lo_export() 无法打开目标文件或写入文件,它会在顶层事务上下文和资源所有者中泄漏创建的 LargeObjectDesc 及其快照。这基本上是无害的,毕竟这是一个小泄漏,但它会给用户带来“Snapshot reference leak”警告。通过使用短暂的内存上下文和非资源所有者来修复,对于在单个函数调用中打开和关闭的临时 LargeObjectDesc。最容易通过在不存在的目录上使用 lo_export() 来重现泄漏,但原则上其他 lo_* 函数也可能失败。回溯到所有支持的版本。报告人:Andrew B 审阅者:Alvaro Herrera 讨论:https://postgresql.ac.cn/message-id/32bf767a-2d65-71c4-f170-122f416bab7e@iki.fi https://git.postgresql.org/pg/commitdiff/6b1b405ebfdce9da47f59d8d4144b1168709fbce
更新预期的替代输出文件。先前的提交在 'largeobject' 中添加了一个测试,但忽略了替代的预期输出文件 'largeobject_1.source'。根据 buildfarm 动物 'hamerkop' 上的失败。讨论:https://postgresql.ac.cn/message-id/DBA08346-9962-4706-92D1-230EE5201C10@yesql.se https://git.postgresql.org/pg/commitdiff/d5ab0681bf1bbf6c0c2cba9a2d55fe8e080597b6
Robert Haas 提交
amcheck:添加额外的 TOAST 指针检查。扩展对 TOAST 属性的检查,以在原始大小过大时发出警告。对于压缩属性,如果压缩似乎扩大了属性或压缩方法无效,也应发出警告。Mark Dilger,审阅者 Justin Pryzby, Alexander Alekseev, Heikki Linnakangas, Greg Stark 和我。讨论:http://postgr.es/m/8E42250D-586A-4A27-B317-8B062C3816A8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/bd807be6935929bdefe74d1258ca08048f0aafa3
引入 'bbsink' 抽象以模块化基础备份代码。基础备份代码多年来积累了大量新功能,但由于没有真正分离关注点,维护和进一步增强这些代码变得越来越困难。例如,了解如何使用 libpq 协议将数据发送到客户端的代码分散在 basebackup.c 的各个部分,而不是集中在一个地方。为了试图改善这种情况,引入了一个新的 'bbsink' 对象,它充当基础备份过程中生成的归档的接收者,也充当备份清单的接收者。此提交引入了三种类型的 bbsink:'copytblspc' bbsink 通过每个表空间一次 COPY OUT 操作将备份转发到客户端,以及一个用于清单的;'progress' bbsink 执行命令进度报告;'throttle' bbsink 执行速率限制。'progress' 和 'throttle' bbsink 类型还将数据转发到后继的 bbsink;目前,链中的最后一个 bbsink 始终是 'copytblspc' 类型。计划在未来的提交中添加更多类型的 'bbsink'。此抽象在进度报告的情况下有点泄漏,但仍然比我们以前的更好。补丁由我编写,由 Andres Freund, Sumanta Mukherjee, Dilip Kumar, Suraj Kharage, Dipesh Pandit, Tushar Ahuja, Mark Dilger 和 Jeevan Ladhe 审阅和测试。讨论:https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论:https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bef47ff85df18bf4a3a9b13bd2a54820e27f3614
引入 'bbstreamer' 抽象以模块化 pg_basebackup。pg_basebackup 知道如何处理从服务器获取的备份的许多事情,例如直接写出文件,或先压缩它们,甚至解析 tar 格式并将修改后的 postgresql.auto.conf 文件注入服务器生成的归档中。不幸的是,这使得 pg_basebackup.c 成为一个非常大的源文件,并且也难以进行增强,因为例如,关于服务器正在向我们发送“tar”文件而不是其他类型归档的知识分布在各个地方,而不是集中在一个地方。为了改善这种情况,此提交发明了一个新的“bbstreamer”抽象。从服务器接收的每个归档都馈送给一个 bbstreamer,该 bbstreamer 可以选择处理它或将其传递给另一个 bbstreamer。数据块也可以根据它们是归档文件中文件的数据负载部分还是归档元数据部分被“标记”。因此,例如,如果我们想获取一个 tar 文件,修改其中包含的 postgresql.auto.conf 文件,然后将其 gzip 并写出,我们可以使用 bbstreamer_tar_parser 来解析从服务器接收到的 tar 文件,bbstreamer_recovery_injector 来修改 postgresql.auto.conf 的内容,bbstreamer_tar_archiver 来用新构建的、对于已修改文件正确的 tar 头替换前一步修改文件的 tar 头,以及 bbstreamer_gzip_writer 来 gzip 并写出结果数据。只有名称中包含“tar”的对象才知道 tar 归档格式,并且理论上如果我们想使用除“tar”以外的其他格式进行重新归档,我们可以这样做。这些更改确实增加了大量代码,但我认为结果更易于维护和扩展。pg_basebackup.c 本身缩小了大约三分之一,其中许多以前包含的复杂性都转移到了新添加的文件中。补丁由我编写。作为此部分的大型补丁系列,已由 Andres Freund, Sumanta Mukherjee, Dilip Kumar, Suraj Kharage, Dipesh Pandit, Tushar Ahuja, Mark Dilger, Sergei Kornilov 和 Jeevan Ladhe 在不同时间进行过审阅和测试。讨论:https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论:https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/23a1c6578c87fca0e361c4f5f9a07df5ae1f9858
在不需要时不要设置 ThisTimeLineID。在 slotfuncs.c 中,pg_replication_slot_advance() 需要确定槽应推进到的 LSN,但这不需要更新 ThisTimeLineID,因为从这里调用的任何代码都不依赖于它。如果复制槽是逻辑的,pg_logical_replication_slot_advance 将调用 read_local_xlog_page,它确实会使用 ThisTimeLineID,但也会确保其是最新的。如果是物理复制槽,时间线根本不会被使用。在 logicalfuncs.c 中,pg_logical_slot_get_changes_guts() 存在同样的问题:我们唯一要运行的代码是 read_local_xlog_page 或其下游代码,后者已经确保设置了正确的值。因此,不要在这里执行。补丁由我编写,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 审阅和测试。讨论:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caf1f675b88d1aa67ea3fb642e8f38b470cc911e
移除 xlog.c 之外对 ThisTimeLineID 全局变量的所有使用。所有此类代码都以三种方式之一处理此全局变量。有时,同一函数在同一时间以多种方式使用它。首先,有时它是 xlog.c 或其他地方调用的一个或多个函数的隐式参数,并且必须在调用这些函数之前设置为适当的值,以免它们出错。在那些情况下,现在将它显式传递作为参数。其次,有时在恢复结束后用于获取当前时间线,即正在写入和刷新 WAL 的时间线。此类代码现在调用 GetWALInsertionTimeLine() 或依赖于添加到 GetFlushRecPtr() 的新的输出参数。第三,有时在恢复期间用于存储当前重放时间线。这可能会发生变化,因此此类代码通常必须在每次使用之前更新该值。它们仍然可以这样做,但现在必须使用局部变量。这些更改的净效应是直接访问此全局变量的代码量大幅减少。这是好事,因为历史表明,我们并不总是清楚在任何给定时间点它应该包含哪个时间线 ID,甚至在代码的任何给定点是否已经或需要初始化它。补丁由我编写,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 审阅和测试。讨论:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e997a0c642860a96df0151cbeccfecbdf0450d08
将 ThisTimeLineID 从全局变量更改为局部变量。StartupXLOG() 仍然将 ThisTimeLineID 作为局部变量,但 xlog.c 中剩余的代码现在需要通过其他方式获取相关 TimeLineID。大多数情况下,这意味着现在将它作为函数参数传递给许多以前没有的函数。然而,少数情况需要特殊处理:- 在可能被外部调用者调用而不知道要指定哪个时间线的函数中,我们从共享内存中获取时间线 ID。在大多数情况下可以使用 XLogCtl->ThisTimeLineID,因为可以假定在调用这些函数之前恢复已经完成。在 xlog_redo() 中,我们可以使用 XLogCtl->replayEndTLI。- XLogFileClose() 需要知道打开的日志文件的 TLI。通过一个新的全局变量 openLogTLI 来实现。虽然有人可能认为这只是用另一个全局变量替换了一个全局变量,但新的变量的用途要窄得多,并且只在少数几个地方被引用。- read_backup_label() 现在返回通过解析 backup_label 文件获得的 TLI。以前,可以调用 ReadRecord() 来解析检查点记录,而 ThisTimeLineID 尚未初始化。现在,时间线会传递下去,而我不想传递未初始化的变量;这个更改可以避免这种情况。旧代码似乎没有任何实际后果需要我们担心,但这样更清晰。- 在 BootstrapXLOG() 中,它只是一个常量。补丁由我编写,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 审阅和测试。讨论:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4a92a1c3d1c361ffb031ed05bf65b801241d7cdd
删除由 bd807be6935929bdefe74d1258ca08048f0aafa3 添加的测试。Buildfarm 对此不满意。不清楚它为什么不喜欢这些测试,但让我们在弄清楚之前删除它们。讨论:http://postgr.es/m/462618.1636171009@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ccf289745d3e50360653181dce6a277a1fc79730
Tomáš Vondra 提交了
修复 BRIN minmax multi 中 NaN 值的处理。在计算 float4/float8 值之间的距离时,我们需要更小心地处理 NaN 值,以避免触发 assert。我们将 NaN 值视为相等(距离为 0.0),并且与所有其他值有无限距离。在没有 assert 的构建中,这个问题基本无害——范围可能会以效率较低的顺序合并,但索引仍然是正确的。根据 Andreas Seltenreich 的报告。回溯到 14,这是引入这个新的 BRIN opclass 的地方。报告人:Andreas Seltenreich 讨论:https://postgr.es/m/87r1bw9ukm.fsf@credativ.de https://git.postgresql.org/pg/commitdiff/d91353f4b21f10417d142e6ac17a0490adae867c
将 mystreamer 变量标记为 PG_USED_FOR_ASSERTS_ONLY。在没有 assert 的构建中,抑制未使用变量的警告。 https://git.postgresql.org/pg/commitdiff/dafcf887daa472b0a49bee7e07042372bc37cee4
向 btree_gist 添加 bool GiST opclass。将 bool opclass 添加到 btree_gist 扩展中,以允许在 bool 列上创建 GiST 索引。GiST 索引仅在单个 bool 列上似乎不太有用,但这允许定义涉及 bool 列的排除约束,例如。作者:Emre Hasegeli 审阅者:Andrey Borodin 讨论:https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/57e3c5160b24e61758f817feb7aac152cd695c6f
修复 gist_bool_ops 使用 gbtreekey2。提交 57e3c5160b 添加了一个新的 GiST bool opclass,但它使用了 gbtreekey4 来存储数据,这留下了两个未定义的字节,正如我们的 valgrind 机器 skink 所报告的。还有一些混淆,因为 opclass 在定义中也使用了 gbtreekey8。通过定义一个新的 gbtreekey2 结构,并在所有地方使用它来修复。讨论:https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e2fbb883720aa222f61eb9f3affad1c63bac7cbb
Alexander Korotkov 提交了
Andres Freund 提交