祝贺新晋 PostgreSQL 提交者 Daniel Gustafsson 和 John Naylor!
pg_dumpbinary 2.4 发布,这是一个用于以二进制格式转储 PostgreSQL 数据库的程序。 https://github.com/lzlabs/pg_dumpbinary/releases/
https://archives.postgresql.org/pgsql-jobs/2021-07/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Michaël Paquier 提交
为 CREATE INDEX CONCURRENTLY 添加了对带有“不太不可变”谓词的测试。83158f7 改进了 index_set_state_flags(),使其可以使用事务性更新来更新 pg_index 状态标志,但实际上并没有一个测试用例直接强调了它修复的可能性。此提交添加了一个此类测试,使用一个表面上有效但调用了稳定函数的谓词。作者:Andrey Lepikhov 讨论:https://postgr.es/m/9b905019-5297-7372-0ad2-e1a4bb66a719@postgrespro.ru 向后移植至:9.6 https://git.postgresql.org/pg/commitdiff/09a69f6e23369847cf11cd03c999a0342d47bbcc
修复 ALTER SUBSCRIPTION DROP PUBLICATION 时的变量初始化。copy_data 不是此 ALTER SUBSCRIPTION 子命令支持的选项,这会导致与该选项相关的变量在解析该选项集后未被初始化。之后可能会引用它。作者:Ranier Vilela 审阅者:Peter Smith 讨论:https://postgr.es/m/CAEudQAp5P8nr=ze2Gv=BMj=DJFZnrvendZCZcC-fos3QiDe2sg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/79718c1c6c007c27e9c1b8e92bd96d17067606fa
为 WAL 的全页写入压缩添加 LZ4 支持。该逻辑的实现方式是,在构建 WAL 记录时可以选择使用的压缩方式,并且使用额外的每个记录位来跟踪块是使用 PGLZ、LZ4 还是不压缩。现有的 wal_compression 参数已更改为枚举类型,支持以下向后兼容的值:- "off",默认值,不使用压缩。- "pglz" 或 "on",使用 PGLZ 压缩 FPW。- "lz4",新模式,使用 LZ4 压缩 FPW。基准测试表明 LZ4 轻松胜过 PGLZ。ZSTD 也会是一个有趣的选择,但目前仅支持 LZ4 使补丁保持最小化,因为 toast 压缩已经支持 LZ4,所以无需担心此实现所需的任何构建相关需求。作者:Andrey Borodin, Justin Pryzby 审阅者:Dilip Kumar, Michael Paquier 讨论:https://postgr.es/m/3037310D-ECB7-4BF1-AF20-01C10BB33A33@yandex-team.ru https://git.postgresql.org/pg/commitdiff/4035cd5d4eee4dae797bfc77ab07f8dcd8781b41
修复 xloginsert.c 中的编译警告。使用 gcc(至少使用 -O0)可以重现此警告。在变量未设置时,最后检查验证块压缩的逻辑将无法达到,但我们还是保持代码整洁。4035cd5 中的疏忽,由 buildfarm 成员 lapwing 报告。https://git.postgresql.org/pg/commitdiff/47f514dd9a0022a04d321b627b2e991cb85396e2
针对 FPW 压缩的格式更改,增加 XLOG_PAGE_MAGIC 的版本号。4035cd5 中的疏忽,由 Tom Lane 发现。讨论:https://postgr.es/m/365778.1624941613@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/445e36ad4e14480a3c97d0f973a3532912424e85
优化 pg_checksums --enable 在校验和已设置情况下的操作。此提交避免了 pg_checksums 在不需要时重写块的情况,即当计算出的校验和与块中已存储的校验和匹配时。这有助于加速该工具的连续运行,例如当先前的运行被中断时。完成后,该工具会跟踪并报告写入的块和文件的数量。请注意,即使没有写入块,最终也会刷新数据文件夹,因为先前中断的运行可能在刷新过程中停止。作者:Greg Sabino Mullane 审阅者:Paquier Michael, Julien Rouhaud 讨论:https://postgr.es/m/CAKAnmmL+k6goxmVzQJB+0bAR0PN1sgo6GDUXJhyhUmVMze1QAw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4c9f50d116461617848601e97dbc6f122b0a6f14
修复 ROLLBACK PREPARED 事务的错误 PITR 消息。在到达此类事务的 PITR 时,会生成一个 LOG 消息,指示事务已提交,而不是已中止。4f1b890 中的疏忽。作者:Simon Riggs 讨论:https://postgr.es/m/CANbhV-GJ6KijeCgdOrxqMCQ+C8QiK657EMhCy4csjrPcEUFv_Q@mail.gmail.com 向后移植至:9.6 https://git.postgresql.org/pg/commitdiff/17707c059cf4bf610e3b1833df5ca17cf223fe5f
简化 jsonapi.c 中面向前端的错误处理。此提交移除了 src/common/ 中的 JSON 解析例程对中央日志记录系统的依赖,该系统用于记录在遇到与 JsonParseErrorType 中任何现有值都不匹配的错误代码时发生的错误,这种情况实际上不应发生。提供基于错误代码的详细错误消息的例程已改为仅后端可用,现有代码不适合在前端使用,因为错误消息可能最终被 palloc() 或指向静态字符串,因此无法知道是否应释放消息的内存。前端对此例程的唯一用户是 pg_verifybackup,它已被修改为在解析失败时使用更通用的错误消息。请注意,使此代码对共享库中的 OOM 故障更具弹性需要更多工作,因为许多代码路径仍然依赖 palloc() 及相关函数,但我们还不确定是否需要进一步改进。尽管如此,删除对日志记录的依赖是朝着提高可移植性迈出的一步。同时,它还清理了 check_stack_depth() 的处理,因为它仅在后端存在。根据与 Jacob Champion 和 Tom Lane 的讨论。讨论:https://postgr.es/m/YNwL7kXwn3Cckbd6@paquier.xyz https://git.postgresql.org/pg/commitdiff/b44669b2ca6a510b2c81cbe74c704d59226d729c
在 vacuum 截断的末尾使用 WaitLatch() 而不是 pg_usleep()。这使得在 postmaster 死亡时进程更具响应性,即使等待时间相当有限,因为这里只有 50ms 的超时。此更改的另一个优点是便于监控,因为我们为 vacuum 截断的末尾获得了新的等待事件。作者:Bharath Rupireddy 审阅者:Aleksander Alekseev, Thomas Munro, Michael Paquier 讨论:https://postgr.es/m/CALj2ACU4AdPCq6NLfcA-ZGwX7pPCK5FgEj-CAU0xCKzkASSy_A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/70685385d70f8da73ab189a72f46311091ff09be
文档:在 TAP 测试部分提及需要 --enable-tap-tests。作者:Greg Sabino Mullane 讨论:https://postgr.es/m/CAKAnmmJYH2FBn_+Vwd2FD5SaKn8hjhAXOCHpZc6n4wXaUaW_SA@mail.gmail.com 向后移植至:9.6 https://git.postgresql.org/pg/commitdiff/0f06359fb3622b289485306727300dd31f96fd9d
Thomas Munro 推送
将 recovery_init_sync_method 更改为 PGC_SIGHUP。该设置仅在启动期间生效。仍然可以动态更改它,这对于管理员在崩溃恢复后重启集群不那么有吸引力时会非常有用。根据提交 2941138e6 和 61752afb2 后的讨论。作者:Justin Pryzby pryzby@telsasoft.com 审阅者:Fujii Masao masao.fujii@oss.nttdata.com 审阅者:Michael Paquier michael@paquier.xyz 审阅者:Thomas Munro thomas.munro@gmail.com 讨论:https://postgr.es/m/20210529192321.GM2082%40telsasoft.com https://git.postgresql.org/pg/commitdiff/34a8b64b4e5f0cd818e5cc7f98846de57938ea57
移除一些死存储。移除提交 2fc7af5e966 遗留的冗余局部变量赋值。作者:Quan Zongliang quanzongliang@yeah.net 审阅者:Jacob Champion pchampion@vmware.com 讨论:https://postgr.es/m/de141d14-4fd6-3148-99bf-856b71aa948a%40yeah.net https://git.postgresql.org/pg/commitdiff/a2595e039c4745d82f361ea15d692cac114575cc
Amit Kapila 提交
修复 TransactionGroupUpdateXidStatus() 中的竞态条件。当在提交时无法以独占模式立即获取 XactSLRULock 时,我们会将自己添加到需要更新 XID 状态的进程列表中。如果需要更新当前事务状态的 clog 页与组长的 clog 页相同,我们会这样做,否则,我们会允许调用者自行清除。现在,当无法将自己添加到任何组时,我们没有清除当前进程(如果它已成为某个组的成员),这会导致断言失败,因为当前后端退出后,相同的进程被分配给另一个后端。报告人:Alexander Lakhin 错误:17072 作者:Amit Kapila 测试者:Alexander Lakhin 向后移植至:11(在该版本中引入) 讨论:https://postgr.es/m/17072-2f8764857ef2c92a@postgresql.org https://git.postgresql.org/pg/commitdiff/b786304c2904a4e444fe740bbc2e0b69efacc19d
改进 RelationGetIdentityKeyBitmap()。我们之前使用 RelationGetIndexList() 来更新关系副本身份索引,但实际上可以直接使用 RelationGetReplicaIndex(),它使用了相同的功能。这是一个小的代码可读性改进。作者:Japin Li 审阅者:Takamichi Osumi, Amit Kapila 讨论:https://postgr.es/m/4C99A862-69C8-431F-960A-81B1151F1B89@enterprisedb.com https://git.postgresql.org/pg/commitdiff/ee3fdb8f3465b3a5937a7fe647b7b6584a600647
允许通过复制协议启用两阶段提交选项。扩展复制命令 CREATE_REPLICATION_SLOT 以支持 TWO_PHASE 选项。这将允许解码为此选项创建的槽的命令,如 PREPARE TRANSACTION、COMMIT PREPARED 和 ROLLBACK PREPARED。事务在 prepare 命令时进行解码。此补丁还通过新的 --two-phase 选项增加了 pg_recvlogical 对两阶段提交的支持。此选项也将被未来允许为内置逻辑复制流式传输事务在 prepare 时间的补丁使用。通过此,核心外的逻辑复制解决方案可以通过复制协议启用两阶段事务的复制。作者:Ajin Cherian 审阅者:Jeff Davis, Vignesh C, Amit Kapila 讨论:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru https://postgr.es/m/64b9f783c6e125f18f88fbc0c0234e34e71d8639.camel@j-davis.com https://git.postgresql.org/pg/commitdiff/cda03cfed6b8bd5f64567bccbc9578fba035691e
允许在投机性中止后流式传输更改。到目前为止,在收到投机性确认或投机性插入之后的下一个 DML 更改记录之前,我们不允许在逻辑复制中流式传输更改。原因是我们在提交 4daa140a2f 之前从不处理投机性中止,但现在可以处理它们,因此一旦收到投机性插入后的投机性中止,我们就可以允许流式传输。我们决定向 14 版本(在该版本中引入了流式传输进行中事务的功能)进行回溯,因为这是一个小的改动,并且可以改进该功能。作者:Amit Kapila 审阅者:Dilip Kumar 向后移植至:14 讨论:https://postgr.es/m/CAA4eK1KdqmTCtrBR6oFfGELrLLbDLDedL6zACcsUOQuTJBj1vw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/52d26d560e272613c501e35b24fbf8d710de4b8a
替换 pg_stat_get_replication_slot() 中使用的魔术常量。几个变量使用了 10 作为魔术常量,而 PG_STAT_GET_REPLICATION_SLOT_COLS 可以替代使用。作者:Masahiko Sawada 审阅者:Amit Kapila 向后移植至:14(在该版本中引入) 讨论:https://postgr.es/m/CAD21AoBvqODDfmD17DkEuPCvV2KbruukXQ2Vwrv5Xi-TsAsTJA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ab5e48f153cfea2c571dc177ae96faf4ab072b8e
Peter Eisentraut 提交
消息风格改进。 https://git.postgresql.org/pg/commitdiff/c31833779d5a4775d7220be4b9143bec66c9a9fd
将索引 OID 添加到 DECLARE_INDEX 的宏参数中。与其显式定义 AmOidIndexId 等符号,不如将其作为 DECLARE_INDEX() 的参数包含进来,并让 genbki.pl 以与 CATALOG() 声明中的表 OID 符号相同的方式生成。审阅者:John Naylor john.naylor@enterprisedb.com 讨论:https://postgresql.ac.cn/message-id/flat/ccef1e46-a404-25b1-9b4c-85f2c08e1f28%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/6a6389a08b228aa6bd21ced7a9c5151bf6f7f0a2
genbki 更严格的错误处理。与其仅为无效的跨目录查找写入警告,不如计算错误并在最后报错。审阅者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgresql.ac.cn/message-id/flat/ca8ee41d-241b-1bf3-71f0-aaf1add6d3c5%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/735dc1a09469002fd659a4b1f5d582377b318977
添加 UNBOUNDED 语法歧义的测试。SQL 标准中存在语法歧义。由于 UNBOUNDED 是一个非保留字,它可能是一个函数参数的名称,并用作表达式。存在一个语法技巧来解决这种情况,将其视为关键字。添加一些测试来记录此行为。审阅者:Heikki Linnakangas hlinnaka@iki.fi 讨论:https://postgresql.ac.cn/message-id/flat/b2a09a77-3c8f-7c68-c9b7-824054f87d98%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/71ba45a3602da0bdbb518e16e3990cfcf21e5f73
文档:清理标题大小写用法。 https://git.postgresql.org/pg/commitdiff/c0fdc963704983ebd5908dc5acfb4d52303091a4
文档:移除不适当的 <acronym> 标签。 https://git.postgresql.org/pg/commitdiff/1708f6b38aaf1b9375b5ca82792425410c98d441
在适当的地方使用 InvalidBucket 而不是 -1。报告人:Ranier Vilela ranier.vf@gmail.com 讨论:https://postgresql.ac.cn/message-id/flat/CAEudQAp%3DZwKjrP4L%2BCzqV7SmWiaQidPPRqj4tqdjDG4KBx5yrg%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/6bd3ec62d9d7921fad2125bbeb5f2eafbbb261e5
Andrew Dunstan 推送
预分支 pgindent / pgperltidy 运行。顺便对 src/include/utils/queryjumble.h 进行微调,以避免未使用的 typedef。 https://git.postgresql.org/pg/commitdiff/e1c1c30f635390b6a3ae4993e8cac213a33e6e3f
将 HEAD 标记为 15devel。开始编码吧… https://git.postgresql.org/pg/commitdiff/596b5af1d3675b58d4018acd64217e2f627da3e4
修复 prove_installcheck 在与 PGXS 一起使用时使用不正确路径的问题。src/Makefile.global.in 中的 prove_installcheck 配方在使用 PGXS 时会为几个元素发出错误的路径。这里我们为 PGXS 情况创建了一个单独的配方,该配方能正确执行。我们还趁此机会通过将 prove_installcheck 和 prove_check 配方分解成多行来使文件更易读,并移除 REGRESS_SHLIB 到 src/test/recovery/Makefile 的设置,因为它是唯一真正需要它的测试集。向所有活动分支回溯 讨论:https://postgr.es/m/f2401388-936b-f4ef-a07c-a0bcc49b3300@dunslane.net https://git.postgresql.org/pg/commitdiff/a0fc813266467d666b8f09ccccaccb700326a296
添加新的 make 目标 world-bin 和 install-world-bin。它们与 world 和 install-world 分别相同,但不构建或安装文档。有许多原因希望能够做到这一点,包括速度、缺乏文档构建工具以及希望构建其他格式的文档。用于简化 buildfarm 客户端代码的计划包括使用这些目标。向所有活动分支回溯。讨论:https://postgr.es/m/6a421136-d462-b043-a8eb-e75b2861f3df@dunslane.net https://git.postgresql.org/pg/commitdiff/b8c4261e5e8dc5c20d033970ec584991638ca041
添加提交 b8c4261e5e 缺失的标签。 https://git.postgresql.org/pg/commitdiff/7355c241ed002496d70882eccea6027726e2fb5a
Peter Geoghegan 提交
将 pgindent 提交添加到 git-blame-ignore-revs 文件。添加最近提交 e1c1c30f 的条目。 https://git.postgresql.org/pg/commitdiff/ba135fa537ab5c2fca0d589c826ebb3ecf98b2f1
改进 pgindent 发布工作流程。更新 RELEASE_CHANGES 指导读者完成 pgindent README 中概述的步骤,作为 beta 前任务和新开发周期开始时的任务。这降低了某人在运行 pgindent 作为例行发布更改任务时忘记更新 .git-blame-ignore-revs 文件的可能性。作者:Peter Geoghegan pg@bowt.ie 审阅者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgr.es/m/CAH2-Wz=2PjF4As8dWECArsXxLKganYmQ-s0UeGqHHbHhqDKqeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc49ab3c277b6b478bdad80c1ae36f926a33b4a6
Tom Lane 提交
在 pgbench 的 random() 函数中不依赖 -fwrapv 语义。而是使用 common/int.h 函数以更符合 C 标准的方式检查整数溢出。最近在 buildfarm 成员 moonjelly 上发生的故障促使了这一点,因为看起来开发分支的 gcc 在优化时没有考虑 -fwrapv 开关。可能是 gcc 的一个错误,很快就会修复,但我们最好在这里安装更干净的代码,而不是等待。(这并没有解决我们是否能摆脱使用 -fwrapv 的问题。测试表明,这是唯一会因使用 -fwrapv 而导致可见回归测试失败的地方,但这并不能证明什么。)向 v12 回溯。common/int.h 函数在 v11 中存在,但该分支在任何客户端代码中都不使用它们。我认为这种情况在现实世界中不够有趣,不值得承担因首次使用而可能带来的任何小风险。Tom Lane 和 Fabien Coelho 讨论:https://postgr.es/m/73927.1624815543@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/01697e92a460b10fde43707b29391c8deb69573e
在 libpq 的 fe-print.c 中不要使用 abort(3)。在内存不足时导致核心转储似乎非常不友好,而且肯定远超通用库的预期行为。只需打印一条错误消息(我们已经做了)然后返回。不幸的是,这些函数没有错误返回约定,但使用它们的代码可能只是寻找一种快速粗略的打印方法,而且无论如何都不会费心去检查。尽管这些函数半已弃用,但将此向后移植似乎仍然是合适的。顺便,也向后移植 b90e6cef1,以减少分支之间的 косметические 差异。讨论:https://postgr.es/m/3122443.1624735363@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6f5d9bce57a7bb29ba61f0bf4fd465a26de9fc28
文档:为 RELEASE_CHANGES 过程注释进行进一步更新。提及在创建或退休分支时,关于向相应列表发送电子邮件通知的预期。(我已经非正式地这样做了很多年,但最好还是写下来。) https://git.postgresql.org/pg/commitdiff/14b2ffaf7ffdd199937e8bcba8b459da5491bcb6
移除 libpq 处理互斥失败情况时使用 abort(3) 的情况。在开发版本中 abort() 似乎还可以,但在通用库的生产版本中不行。然而,执行此操作的函数缺乏向调用者报告失败的方法。在生产版本中忽略失败似乎是可以的,因为(a)在代码存在期间的十几年里没有报告过此类失败,而且(b)在大多数情况下,未能强制执行 fe-auth.c 操作期间的互斥可能不会导致任何问题。(使用此宏的 OpenSSL 回调已过时,因此不太可能引起有趣的问题。)也许更好的解决方案是破坏 pgthreadlock_t 回调 API 的兼容性,但在没有实际问题报告的情况下,似乎不值得麻烦。讨论:https://postgr.es/m/3131385.1624746109@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aaddf6ba09e25878e792f0d15f725370e19396df
添加一个构建时检查,确保 libpq 不会调用 exit() 或 abort()。直接退出或中止似乎不适合通用库。现在 libpq 大量使用了 src/common/ 中的代码,很容易意外地包含会执行一些不期望的操作的代码,例如在 OOM 后调用 exit(1) — 例如 8ec00dc5c。因此,添加一个简单的交叉检查,确保没有此类调用进入 libpq.so。交叉检查依赖于 nm(1) 可用并且能够作用于共享库,这可能并非到处都适用。但我们可以让测试在 nm 失败时静默地什么都不做。只要在常见平台上检查有效,这就足够了。(出于同样的逻辑,我没有担心在 MSVC 构建中提供等效的测试。)讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/dc227eb82ea8bf6919cd81a182a084589ddce7f3
修复报告哪个哈希分区冲突的错误逻辑。提交 efbfb6424 添加了报告哪个现有分区冲突的逻辑,用于抱怨新哈希分区的模数与现有分区不兼容。然而,它误解了分区数据结构,在某些情况下会选择错误的分区,或者由于获取了无效的表 OID 而崩溃。根据 Alexander Lakhin 的错误 #17076。由 Amit Langote 修复;我进一步修改了代码注释。讨论:https://postgr.es/m/17076-89a16ae835d329b9@postgresql.org https://git.postgresql.org/pg/commitdiff/dd2364ced98553e0217bfe8f621cd4b0970db74a
修复提交 dc227eb82 带来的可移植性问题。放弃尝试机械地禁止 libpq 中的 abort()。尽管源代码中没有此类调用,但我们已经看到了三种不同的情况,其中构建工具链会静默地插入此类调用:gcc 为剖析这样做,一些平台使用它来实现 assert(),而 icc 则出于某种不明显的原因这样做。与检查意外使用 exit() 相比,检查意外使用 abort() 似乎重要得多,所以我们暂时只做这件事。此外,过滤掉 __cxa_atexit() 以避免误报。似乎 OpenBSD 插入了对该函数的调用,尽管 libpq 中没有 C++ 代码。讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e45b0dfa1f1028948decad3abd3b0f6e913a44b0
改进 libpq 不会调用 exit() 的构建时检查。提交 dc227eb82 的进一步修复。根据 Peter Eisentraut 的建议,使用一个 stamp 文件来控制何时运行检查,避免在“make all”期间重复执行。此外,从 nm 中移除 "-g" 开关:它无用,并且某些版本的 nm 认为它与 "-u" 冲突。(感谢 Noah Misch 解决了这个可移植性问题。)讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2f7bae2f924d8213a76370f825dc15eb0aa79796
为 initdb 添加 --clobber-cache 选项,用于 CCA 测试。提交 4656e3d66 用 GUC 替换了 "#define CLOBBER_CACHE_ALWAYS" 测试机制,这在以更有效的方式进行缓存破坏测试方面提供了极大的帮助;但实现上存在一个不足。在 initdb 运行期间进行缓存破坏测试的唯一方法是使用旧的 #define 方法,因为无法从外部设置 GUC。通过向 initdb 添加一个用于此目的的开关来改进这一点。(也许有一天我们应该允许 initdb 传递任意的 "-c NAME=VALUE" 开关。引用方面的困难让我暂时放弃了尝试。)向 4656e3d66 引入的版本 14 回溯。讨论:https://postgr.es/m/1582507.1624227029@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b741f4c3ee67666aa333dbb25bd71906b3474def
在 slot_store_error_callback() 中不要尝试打印数据类型名称。现有代码尝试在已失败的事务中进行 syscache 查找,这至少是有问题的。经过对替代方案的仔细考虑,最好的修复似乎是完全从错误消息中删除类型名称。表名和列名似乎足以进行本地化。如果用户不确定涉及的类型,她可以查看本地和远程表定义。完成此操作后,我们还可以丢弃 LogicalRepTypMap 哈希表,该表没有其他用途。可以说,LOGICAL_REP_MSG_TYPE 复制消息现在也已过时;但我们应该保留它们,以防出现其他用途。(从复制协议中移除某项的复杂性可能会超过任何节省。)Masahiko Sawada 和 Bharath Rupireddy,根据 Andres Freund 的投诉。向该代码起源的 v10 回溯。讨论:https://postgr.es/m/20210106020229.ne5xnuu6wlondjpe@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/50371df266d4c8f4faaf448cbd789d9697443952
进一步限制 no-exit()-in-libpq 测试的范围。完全禁用 --enable-coverage 构建中的此检查,因为较新版本的 gcc 会为此类调用插入 exit() 和 abort()。在 AIX 和 Solaris 上也禁用它,因为这些平台倾向于提供 libldap 等作为静态库,然后将它们包含在 libpq 的 shlib 中。我们不能期望这些库遵守我们的编码规则。(该平台列表可能需要进一步调整,但我认为这足以让 buildfarm 满意。)根据 Jacob Champion 和 Noah Misch 的报告。讨论:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/792259591c0fc19c42247fc7668b1064d1e850d4
Noah Misch 推送
移除 XLogFileInit() 跳过 ControlFileLock 的能力。冷路径、initdb 和 end-of-recovery 使用了它。不要优化它们。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/c53c6b98d38a4d238b2fe2ddcea63c33b0a61376
在 XLogFileInit() 中,修复 `*use_existent` 后置条件以适应调用者。偶尔,这种不匹配会导致 log_checkpoints 消息和 TRACE_POSTGRESQL_CHECKPOINT_DONE() 看到一个计数器比实际多一。由于这种后果非常轻微,因此不进行回溯。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/85656bc3050f0846f53de95768b0f9f9df410560
转储 public schema 的所有权和安全标签。作为副作用,这可以修复 DBA 删除并重新创建 public schema 的数据库中的 public schema ACL 的转储。审阅者:Asif Rehman。讨论:https://postgr.es/m/20201229134924.GA1431748@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a7a7be1f2fa6b9f0f48e69f12256d8f588af729b
转储 COMMENT ON SCHEMA public。与 public schema 的其他属性一样,当其内容与 initdb 安装的内容匹配时,我们会省略 COMMENT 命令。对于包含此新 COMMENT 命令的转储,恢复它们的非超级用户很可能会收到错误。审阅者:Asif Rehman。讨论:https://postgr.es/m/ab48a34c-60f6-e388-502a-3e5fe46a2dae@postgresfriends.org https://git.postgresql.org/pg/commitdiff/7ac10f692054e2690aa6f80efdd98bd283c94b10
不要在 PreallocXlogFiles() 竞态条件时 ERROR。在 restartpoint 完成 PreallocXlogFiles() 之前,一个启动进程的 KeepFileRestoredFromArchive() 调用可以取消链接预分配的段。如果 CHECKPOINT SQL 命令引发了遇到竞态条件的 restartpoint,则该 SQL 命令将失败。此外,restartpoint 省略了其 log_checkpoints 消息和一些不必要的资源回收。通过跳过段的 open() 来防止 ERROR。由于这些后果非常轻微,因此不进行回溯。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/2b3e4672f7602a6bb46a0735a1b41b635508b290
在归档恢复期间跳过 WAL 回收和预分配。上一个提交解决了 InstallXLogFileSegment() 和 KeepFileRestoredFromArchive() 之间竞态条件的主要后果。修复了三个次要后果。仍然可能出现一个错误的 durable_rename_excl() LOG 消息。KeepFileRestoredFromArchive() 浪费了 WAL 回收和预分配的结果。最后,XLogFileInitInternal() 可以返回一个文件描述符,该文件已被 KeepFileRestoredFromArchive() 取消链接。这似乎是未来错误的根源。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/cc2c7d65fc27e877c9f407587b0b92d46cd6dd16
移除 XLogFileInit() 取消链接预存在文件的能力。只有 initdb 使用它。initdb 拒绝在非空目录上操作,并且通常不处理其他类型的预存在文件。因此,利用这个机会进行简化。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/421484f79c0b80209fa766eb00dbc2453a753273
从 Perl \Q ... \E 中移除字面反斜杠。行为在 Perl 5.8.9 之后发生变化,并且 "man perlre" 说它 "可能导致令人困惑的结果"。根据 buildfarm 成员 gaur 报告。这修复了提交 a7a7be1f2fa6b9f0f48e69f12256d8f588af729b。讨论:https://postgr.es/m/20210629053627.GA2061079@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/48cb244fb9aca1620e35a14617ca5869b3ea065a
Álvaro Herrera 提交
向 libpq 添加 PQsendFlushRequest。这个新的 libpq 函数允许应用程序发送一个 'H' 消息,该消息指示服务器刷新其传出缓冲区。到目前为止还没有需要它,因为 Sync 消息已经请求了缓冲区;并且我未能意识到在管道模式下需要它,因为 PQpipelineSync 也会导致缓冲区被刷新。然而,有时在不建立同步点的情况下请求刷新是有用的。向 14 版本回溯,管道模式是在 libpq 中引入的。报告人:Boris Kolpackov boris@codesynthesis.com 作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/202106252350.t76x73nt643j@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/a7192326c74da417d024a189da4d33c1bf1b40b6
修复管道模式下的 libpq 状态机。原始代码要求在第一次调用 PQgetResult 之前调用 PQpipelineSync,如果失败将导致返回意外的 NULL 结果。通过在发送查询时设置正确的状态来修复,而不是保持不变并让 PQpipelineSync 应用必要的状态更改。添加了一个新的测试用例来验证行为,该测试用例依赖于提交 a7192326c74d 添加的新 PQsendFlushRequest() 函数。向 14 版本(管道模式添加于此)回溯。报告人:Boris Kolpackov boris@codesynthesis.com 作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/boris.20210616110321@codesynthesis.com https://git.postgresql.org/pg/commitdiff/b71a9cb31e46b08aeac35a4355936165648b3c49
在 ANALYZE 分区表时,不要重置 relhasindex。提交 0e69f705cc1a 引入了分析分区表值的代码;然而,该代码未能正确保留 pg_class.relhasindex。通过观察是否存在索引而不是意外地假定不存在索引来修复。向 14 版本回溯。作者:Alexander Pyhalov a.pyhalov@postgrespro.ru 审阅者:Álvaro Herrera alvherre@alvh.no-ip.org 审阅者:Zhihong Yu zyu@yugabyte.com 讨论:https://postgr.es/m/CALNJ-vS1R3Qoe5t4tbzxrkpBtzRbPq1dDcW4RmA_a+oqweF30w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d700518d744e53994fdded14b23ebc15b031b0dd
Alexander Korotkov 提交了
Fujii Masao 提交
文档:为 postgres_fdw 参数添加类型信息。作者:Shinya Kato 审阅者:Fujii Masao 讨论:https://postgr.es/m/TYAPR01MB2896DEB25C3B0D57F6139768C40F9@TYAPR01MB2896.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/61d599ede7424d88bbd4006b968bae366b6b9f5d
文档:改进 pg_stat_database 中 tup_returned 和 tup_fetched 的描述。之前 pg_stat_database 视图中 tup_returned 和 tup_fetched 列的描述令人困惑。此提交改进了它们,使其更准确地表示以下公式:* pg_stat_database.tup_returned = sum(pg_stat_all_tables.seq_tup_read) + sum(pg_stat_all_indexes.idx_tup_read) * pg_stat_database.tup_fetched = sum(pg_stat_all_tables.idx_tup_fetch) 在这些公式中,请注意,跨集群所有数据库共享的一些系统目录的计数器(如 pg_database)已从总和计算中排除。作者:Masahiro Ikeda 审阅者:Fujii Masao 讨论:https://postgr.es/m/9eeeccdb-5dd7-90f9-2807-a4b5d2b76ca3@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/3465c8a8692fb628bc2710fbeedb9aeb534b0400
David Rowley 提交
改进多个双倍缓冲区大小的地方。几个地方通过一个紧密的循环来确定第一个大于或
= 所需内存的 2 的幂。与使用循环相比,我们可以使用 pg_nextpower2_32 或 pg_nextpower2_64。当我们需要的 2 的幂大于等于给定数量时,我们将该数量传递给 nextpower2 函数。当我们需要的 2 的幂大于给定数量时,我们将数量 + 1 传递给它。此外,在 tsearch 中,有几个地方在执行 while 循环时,简单的 "if" 语句就足够了。在这两个地方都只添加了 1 个项目,因此循环最多只能迭代一次。将循环更改为 if 语句使代码稍微更优化,因为条件只检查一次而不是两次。仍然有相当多的地方以以下形式增加缓冲区大小:while (reqsize >= buflen) { buflen
*=2; buf = repalloc(buf, buflen); } 这些在本次提交中未被触及。repalloc 会因大于 MaxAllocSize 的大小而报错。将这些更改为使用 pg_nextpower2_32 将消除引发该错误的风险。从代码中看不清楚这些大小是否可能变得如此之大,因此我们谨慎行事。讨论:https://postgr.es/m/CAApHDvp=tns7RL4PH0ZR0M+M-YFLquK7218x=0B_zO+DbOma+w@mail.gmail.com 审阅者:Zhihong Yu https://git.postgresql.org/pg/commitdiff/3788c66788e9f8c6904c6fe903724c1f44812c4d
清理执行器中的一些聚合代码。在这里,我们修改了调用 build_pertrans_for_aggref() 的代码,使其不再需要特殊处理是处理 aggtransfn 还是 aggcombinefn。这允许我们重用 build_aggregate_transfn_expr() 函数,并完全移除 build_aggregate_combinefn_expr()。build_pertrans_for_aggref() 中的所有特殊情况代码都已移至调用函数。这节省了 nodeAgg.c 中约十行代码,以及 parse_agg.c 中几十行代码。此外,重命名了 nodeAgg.c 中的一些变量,以使其更清楚我们正在处理 aggtransfn 或 aggcombinefn。一些旧名称会让你认为我们总是在处理 aggtransfn。讨论:https://postgr.es/m/CAApHDvptMQ9FmF0D67zC_w88yVnoNVR2+kkOQGUrCmdxWxLULQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/63b1af94375cc2be06a5d6a932db24cd8e9f45e9
文档:提及 VACUUM 无法利用超过 1GB 的 RAM。文档说明将 maintenance_work_mem 设置为超过 1GB 的值对 VACUUM 没有影响。报告人:Martín Marqués 作者:Laurenz Albe 讨论:https://postgr.es/m/CABeG9LsZ2ozUMcqtqWu_-GiFKB17ih3p8wBHXcpfnHqhCnsc7A%40mail.gmail.com 向后移植至:9.6,最旧的支持版本 https://git.postgresql.org/pg/commitdiff/ec34040af104a1d25233eccd5715863ace6cbb10
Heikki Linnakangas 提交
Bruce Momjian 已推送
文档:为新的积极 vacuum 模式(用于多事务)进行澄清。报告人:eric.mutta@gmail.com 讨论:https://postgr.es/m/162395467510.686.11947486273299446208@wrigleys.postgresql.org 向后移植至:14 https://git.postgresql.org/pg/commitdiff/c552e171d16e461c7af60cfe1a891c87be9cbbbf
文档:调整 "cities" 示例以与其他 SQL 一致。报告人:tom@crystae.net 讨论:https://postgr.es/m/162345756191.14472.9754568432103008703@wrigleys.postgresql.org 向后移植至:9.6 https://git.postgresql.org/pg/commitdiff/d390bb62a6332f8a913c2c2021d56d6dba5a1dce
Anna Akenteva 提交了 CLUSTER/VACUUM FULL 期间写入可见性图的补丁的又一次修订。
Julien Rouhaud 提交了 Expose get_query_def() 的补丁的又一次修订。
Arne Roland 提交了重命名分区表触发器的补丁的又一次修订。
Peter Eisentraut 提交了一个移除冗余初始化的补丁。
Andrew Dunstan 提交了一个清理 PostgresNode.pm 的补丁。
Masahiko Sawada 提交了一个添加 ALTER SUBSCRIPTION SET SKIP TRANSACTION,为逻辑复制更改的错误添加 errcontext,以及添加 pg_stat_logical_replication_error 统计视图的补丁。
Bharath Rupireddy、Amit Kapila 和 Álvaro Herrera 交换了补丁,以重构 parse_subscription_options 函数。不再使用 parse_subscription_options 函数签名中的多个参数,而是使用 SubOpts 结构体来封装所有订阅选项及其值。这将有助于未来的工作,因为我们需要在订阅中添加其他选项。此外,使用位图来传递支持的选项并检索指定的选项。
Jeff Davis 提交了一个添加 synchronous_replication_interrupt GUC 的补丁。
Daniel Gustafsson 提交了两个版本的补丁,用于修复 pg_basebackup 和 pg_dump 中的 sscanf 限制,并通过取消变量名遮蔽来修复 TOC 文件错误消息打印中的错误。
Dean Rasheed 提交了三个版本的补丁,旨在修复 NUMERIC 乘法中出现的溢出错误。
Michaël Paquier 提交了添加 wal_compression=zstd 的补丁的又一次修订。
Magnus Hagander 提交了添加 PROXY 协议支持的另外两个修订的补丁。
Peter Eisentraut 提交了 psql 的又一次修订补丁,使其能够显示多个结果集而不是默默地丢弃第一个结果集,并使过程能够返回动态结果集。
Ranier Vilela 提交了一个防止在 src/backend/executor/nodeAgg.c 中选择无效分区数的补丁。
Aleksey Kondratov 提交了一个允许向 pg_rewind 提供 restore_command 作为命令行选项的补丁。
David Christensen 提交了一个扩展大小可能单位的补丁,并重构了 pg_size_pretty 和 pg_size_bytes 以支持单位扩展。
Andrey V. Lepikhov 提交了一个向 pg_regress 添加 '--ignore-errors' 选项的补丁。
Jacob Champion 提交了 rework sslfiles Makefile 目标的又一次修订。
Josef Šimánek 提交了两个版本的补丁,以防止 BRIN 索引更新阻塞 HOT 更新。
Michaël Paquier 提交了加速 pg_checksums 在校验和已设置情况下的补丁的又一次修订。
Anastasia Lubennikova 和 Yura Sokolov 交换了补丁,通过新的钩子 smgr_hook、smgr_init_hook 和 smgr_shutdown_hook 使 smgr API 可扩展。
John Naylor 和 Heikki Linnakangas 交换了重写 pg_utf8_verifystr() 以提高速度的补丁。
Dean Rasheed 提交了一个使 numeric x^y 对负数 x 有效的补丁。
Georgios Kokolatos 提交了一个教 pg_receivewal 使用 lz4 压缩的补丁。
Dean Rasheed 提交了两个版本的补丁,放宽了对 numeric 标度的约束,例如允许 NUMERIC(3,-3),它会将值四舍五入到最近的千位并存储高达 999000 的值,或者 NUMERIC(3,6) 可以存储高达 0.000999 的“微量”值。
Thomas Munro 和 John Naylor 交换了加速常见类型元组排序的补丁。
Masahiko Sawada 提交了一个使其能够进行涉及多个 postgres 外部服务器的事务的补丁的又一次修订。
Andrey V. Lepikhov 提交了一个在初始执行阶段选择异步附加子计划的补丁。
Takashi Menjo 提交了一个将 WAL 段文件映射到 PMEM 作为 WAL 缓冲区的补丁的又一次修订。
Yugo Nagata 提交了另外两个版本的补丁,用于修复 pgbench 中的 conn_duration。
Simon Riggs 提交了一个增强 PITR 中的 getRecordTimestamp() 以包含所有包含时间的记录类型的补丁,添加了对检查点、恢复结束和准备好的 xact 记录类型的处理,并允许 recovery_target_use_origin_time 选项为 off (默认) | on。
Vigneshwaran C 提交了确保错误消息包含冗余选项错误提示信息的又一次修订。
Vigneshwaran C 发送了另一个版本的补丁,用于在 CREATE/ALTER SUBSCRIPTION 时识别发布者中缺少的发布。
Álvaro Herrera 提交了一个在 Perl 的 system() 失败时澄清错误消息的补丁。
Antonin Houska 提交了使用撤销日志清理孤立文件的又一次修订。
Jacob Champion 提交了将通用 SASL 框架从 SCRAM 代码中提取出来的又一次修订。
David Rowley 提交了一个记录非剪枝分区 Bitmapset 的补丁。
Fabien COELHO 提交了三项修订的补丁,用于修复 pgbench 日志记录中的一个错误,该错误是由最近对时间逻辑的更改引起的。
David Christensen 和 Fabien COELHO 交换了向 pgbench 添加 multiconnect 选项的补丁。
Bharath Rupireddy 提交了另外两个版本的补丁,用于收紧 postgres_fdw 中 batch_size、fetch_size 选项 against 非数字值。
Rahila Syed 提交了一个为逻辑复制添加列过滤的补丁。
Mark Dilger 提交了另外两个版本的补丁,为管理逻辑复制、主机安全操作、网络安全操作和数据库操作分别添加了默认角色,并允许非超级用户 SET 和 ALTER SYSTEM SET。
Yugo Nagata 提交了旨在修复 pgbench 序列化和死锁错误的补丁的又一次修订。
Amit Langote 提交了一个明确跟踪关系 RT 索引以检查权限的补丁。
Richard Guo 提交了另外两个版本的补丁,以便对反连接使用每个 rel 作为外连接和内连接。
Vigneshwaran C 提交了一个确保逻辑复制关系在模式更改时获得所需缓存失效的补丁,方法是添加一个模式更改的回调。
Paul A Jungwirth 提交了实现 SQL 标准应用程序时间的另外三个修订的补丁。
Gurjeet Singh 提交了一个添加顶级事务 ID 自动通知的补丁。
David Rowley 提交了一个允许某些窗口函数提前完成执行的补丁。
Greg Smith 提交了一个改进 pgbench 工作负载的补丁,涉及 INSERT 工作负载、FK 索引和填充程序。
Euler Taveira de Oliveira 提交了另一个修订的补丁,用于添加与 SSL/TLS 相关的缩略词 MITM 和 SNI,并更改 SSL 的用法为更现代和通用的 SSL/TLS。
Kyotaro HORIGUCHI 提交了两个版本的补丁,通过避免触碰解析树结构并使用 ExecuteStmt.type 通知返回的字符串是语句名称还是完整语句,来修复 ECPG 预编译 CREATE AS EXECUTE 为无法编译的 C 语句的错误。
Euler Taveira de Oliveira 和 Peter Smith 交换了实现逻辑复制行过滤的补丁。
Ranier Vilela 提交了一个修复 src/backend/utils/mmgr/freepage.c 中未初始化的变量访问的补丁。
Fabien COELHO 提交了五个修订的补丁,用于将 rand48 替换为更好的 PRNG。
Haotian Wu 提交了 pg_dump/restore 的 --drop-cascade 选项的又一次修订。
Pavel Stěhule 提交了另一个修订版的补丁,以实现模式变量。
Hayato Kuroda 提交了修复 ECPG 的 DECLARE STATEMENT、DEALLOCATE 和 DESCRIBE 中错误的又一次修订。
Justin Pryzby 提交了另一个修订的补丁,用于使 pg_ls_* 显示目录和共享文件集。
Fabien COELHO 提交了一个因子化 psql echo 代码的补丁的又一次修订。
Vigneshwaran C 提交了一个补丁,通过添加模式更改的回调,确保逻辑复制关系在模式更改时获得所需的缓存失效。
Tom Lane 提交了另外两个版本的补丁,用于避免在 conversion_error_calls 中进行目录访问。
Tom Lane 提交了另一个修订的补丁,用于移除 64k rangetable 限制。
Andy Fan 提交了一个为 RelOptInfo 添加 not null attrs 的补丁。
Peter Eisentraut 提交了一个使用 EVP_EncryptFinal_ex() 和 EVP_DecryptFinal_ex() 以兼容 OpenSSL 3.0 的补丁。
Gilles Darold 提交了在 XactCommand 级别添加钩子的又一次修订。
Zhihong Yu 提交了一个移除 check_safe_enum_use 中事务进行中的冗余检查的补丁。
Tatsuo Ishii 提交了一个在 pgbench 中使用 COPY FREEZE 的补丁的又一次修订。
David Rowley 提交了一个更好地记录附加和移除分区时锁定行为的补丁。