祝贺新的 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 的此子命令支持的选项,这会导致在解析 DefElems 中设置的选项后不初始化与之相关的变量。然后刷新可能会引用它。作者: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 中的编译警告。这可以使用至少 -O0 的 gcc 重现。使用此未设置的变量无法访问验证块压缩的最后检查,但让我们保持代码的简洁。4035cd5 中的疏忽,来自构建场成员 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'd 或指向静态字符串,因此无法知道是否应该 pfree 消息的内存。前端中此例程的唯一用户是 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 死掉时,即使等待时间非常有限,因为这里只有 50 毫秒的超时,进程也会更具响应性。此更改的另一个优点是用于监视,因为我们为 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 页面相同,我们会这样做,否则,我们允许调用者自行清除它。现在,当我们无法将自己添加到任何组时,我们不会清除当前的 proc,如果它已经成为某个组的成员,这会导致在当前后端退出后将同一 proc 分配给另一个后端时出现断言失败。报告人:Alexander Lakhin Bug: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 命令时。此补丁还在 pg_recvlogical 中通过新的 --two-phase 选项添加了对两阶段的支持。此选项也将被未来的补丁使用,这些补丁允许在 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
向 DECLARE_INDEX 添加索引 OID 宏参数。不再显式定义诸如 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。开始 hacking ...https://git.postgresql.org/pg/commitdiff/596b5af1d3675b58d4018acd64217e2f627da3e4
修复 prove_installcheck,使其在使用 PGXS 时使用正确的路径。当与 PGXS 一起使用时,src/Makefile.global.in 中的 prove_installcheck 配方为几个元素发出了错误的路径。在这里,我们为 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
从 commit b8c4261e5e 添加缺失的标签。https://git.postgresql.org/pg/commitdiff/7355c241ed002496d70882eccea6027726e2fb5a
Peter Geoghegan 推送
将 pgindent commit 添加到 git-blame-ignore-revs 文件中。为最近的 commit 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 的问题。测试表明,这个位置是唯一一个这样做会产生可见回归测试失败的地方,但不幸的是,这证明不了什么。)向后移植到 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
修复报告哪个哈希分区冲突的虚假逻辑。Commit efbfb6424 添加了逻辑,用于在抱怨新的哈希分区的模数与现有分区不兼容时,准确报告哪个现有分区冲突。但是,它误解了分区数据结构,并且在某些情况下会选择错误的分区,或者在其他情况下由于获取虚假的表 OID 而完全崩溃。根据 Alexander Lakhin 的 bug #17076。由 Amit Langote 修复;我进一步修改了代码注释。讨论:https://postgr.es/m/17076-89a16ae835d329b9@postgresql.org https://git.postgresql.org/pg/commitdiff/dd2364ced98553e0217bfe8f621cd4b0970db74a
修复 commit 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 的建议,使用一个标记文件来控制检查的运行时间,避免在“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 将 “#define CLOBBER_CACHE_ALWAYS” 测试机制替换为一个 GUC,这对于以更有效的方式进行缓存清除测试有很大帮助;但该实现存在一个漏洞。在 initdb 运行期间进行缓存清除测试的唯一方法是使用旧的 #define 方法,因为无法从外部设置 GUC。通过为此目的向 initdb 添加一个开关来改进这一点。(也许有一天我们应该允许 initdb 传递任意的 “-c NAME=VALUE” 开关。但是,引用困难让我现在没有尝试这样做。)回溯到 v14,其中引入了 4656e3d66。讨论:https://postgr.es/m/1582507.1624227029@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b741f4c3ee67666aa333dbb25bd71906b3474def
不要尝试在 slot_store_error_callback() 中打印数据类型名称。现有代码试图在已经失败的事务中进行系统缓存查找,这至少可以说是有问题的。在考虑了一些替代方案后,最好的修复方法似乎是将错误消息中的类型名称完全删除。表名和列名似乎足以进行本地化。如果用户不确定涉及哪些类型,她可以检查本地和远程表定义。完成此操作后,我们还可以丢弃 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
进一步限制 libpq 中无 exit() 测试的范围。在 --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 和恢复结束时使用它。不要优化它们。讨论: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() 看到“added”计数高出 1。由于该后果如此微小,因此没有回溯修复。讨论:https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/85656bc3050f0846f53de95768b0f9f9df410560
转储公共模式的所有权和安全标签。副作用是,这修复了在 DBA 删除并重新创建该模式的数据库中公共模式 ACL 的转储。由 Asif Rehman 审核。讨论:https://postgr.es/m/20201229134924.GA1431748@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a7a7be1f2fa6b9f0f48e69f12256d8f588af729b
转储 COMMENT ON SCHEMA public。与公共模式的其他属性一样,当其负载与 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。在重启点完成 PreallocXlogFiles() 之前,启动进程 KeepFileRestoredFromArchive() 调用可以取消链接预先分配的段。如果 CHECKPOINT sql 命令引发了遇到竞争条件的重启点,则该 sql 命令将失败。此外,重启点省略了其 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 推送
将 PQsendFlushRequest 添加到 libpq。这个新的 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 推送
doc:为 postgres_fdw 参数添加类型信息。作者:Shinya Kato 审核人:Fujii Masao 讨论:https://postgr.es/m/TYAPR01MB2896DEB25C3B0D57F6139768C40F9@TYAPR01MB2896.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/61d599ede7424d88bbd4006b968bae366b6b9f5d
doc:改进 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)的计数器不包括在 sum 的计算中。作者: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" 语句就足够了。在这两个位置,都只添加了一个项目,因此循环最多只会迭代一次。将循环更改为 if 语句会使代码稍微更优化,因为条件只检查一次,而不是两次。还有相当多的地方以以下形式增加缓冲区的大小:while (reqsize >= buflen) { buflen
*=
2; buf = repalloc(buf, buflen); } 这些在此提交中未触及。对于大于 MaxAllocSize 的大小,repalloc 将会报错。将这些更改为使用 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 提交了另一个修订版的补丁,用于公开 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 提交了一个补丁,用于允许将 restore_command 作为命令行选项提供给 pg_rewind。
David Christensen 提交了一个补丁,用于扩展大小的可能单位,并重构 pg_size_pretty 和 pg_size_bytes 以允许支持的单位扩展。
Andrey V. Lepikhov 提交了一个补丁,用于向 pg_regress 添加“--ignore-errors”选项。
Jacob Champion 提交了另一个修订版的补丁,用于重新设计 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 提交了一个补丁,用于使数值 x^y 对负数 x 起作用。
Georgios Kokolatos 提交了一个补丁,用于教 pg_receivewal 使用 lz4 压缩。
Dean Rasheed 提交了两个修订版的补丁,用于放宽数值刻度的约束,例如允许 NUMERIC(3,-3),它将值四舍五入到最接近的千位,并保留高达 999000 的值,或者允许 NUMERIC(3,6),它可以保留高达 0.000999 的“微”量。
Thomas Munro 和 John Naylor 交换了补丁,以加速常见类型的元组排序。
Masahiko Sawada 提交了另一个修订版的补丁,用于使涉及多个 PostgreSQL 外部服务器的事务成为可能。
Andrey V. Lepikhov 提交了一个补丁,用于在初始执行阶段选择异步追加子计划。
Takashi Menjo 提交了另一个修订版的补丁,用于将 PMEM 上的 WAL 段文件映射为 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 提交了另一个修订版的补丁,用于从 SCRAM 代码中提取通用的 SASL 框架。
David Rowley 提交了一个补丁,用于记录未剪枝分区的一个 Bitmapset。
Fabien COELHO 提交了另外三个修订版的补丁,用于修复 pgbench 日志记录中的一个错误,该错误是由最近对时间逻辑的一些更改引起的。
David Christensen 和 Fabien COELHO 交换了补丁,用于向 pgbench 添加多连接选项。
Bharath Rupireddy 提交了另外两个修订版的补丁,用于针对 postgres_fdw 中的非数值值收紧 batch_size、fetch_size 选项。
Rahila Syed 提交了一个补丁,用于向逻辑复制添加列过滤。
Mark Dilger 提交了另外两个修订版的补丁,用于为管理逻辑复制、主机安全操作、网络安全操作和数据库操作添加默认角色,并允许非超级用户执行 SET 和 ALTER SYSTEM SET。
Yugo Nagata 提交了另一个修订版的补丁,旨在修复一个表现为 pgbench 序列化和死锁错误的错误。
Amit Langote 提交了一个补丁,用于显式跟踪关系的 RT 索引以检查权限。
Richard Guo 提交了另外两个修订版的补丁,用于将每个 rel 用作反连接的外部和内部。
Vigneshwaran C 提交了另一个修订版的补丁,用于为 PUBLICATION 添加模式级别支持。
Paul A Jungwirth 提交了另外三个修订版的补丁,用于实现 SQL 标准应用程序时间。
Gurjeet Singh 提交了一个补丁,用于添加顶级事务 ID 的自动通知。
David Rowley 提交了一个补丁,允许一些窗口函数提前完成执行。
Greg Smith 提交了一个补丁,用于改进 INSERT 工作负载、FK 索引和填充器领域中的一些 pgbench 工作负载。
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 提交了另外五个修订版的补丁,用于用更好的 PRNG 替换 rand48。
Haotian Wu 提交了另一个修订版的补丁,用于添加 --drop-cascade 选项 pg_dump/restore。
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 范围表限制。
Andy Fan 提交了一个补丁,用于为 RelOptInfo 添加非空属性。
Peter Eisentraut 提交了一个补丁,用于使用 EVP_EncryptFinal_ex() 和 EVP_DecryptFinal_ex() 以兼容 OpenSSL 3.0。
Gilles Darold 提交了另一个修订版的补丁,用于在 XactCommand 级别添加挂钩。
Zhihong Yu 提交了一个补丁,用于删除 check_safe_enum_use 中对正在进行事务的冗余检查。
石井達夫提交了另一个补丁修订版,以在 pgbench 中使用 COPY FREEZE。
David Rowley 提交了一个补丁,以更好地记录附加和删除分区时的锁定行为。