PostgreSQL 周刊 - 2021 年 6 月 27 日

发布于 2021-06-28,作者:PWN
PWN

PostgreSQL 周刊 - 2021 年 6 月 27 日

PostgreSQL 14 Beta 2 发布。 测试!

第 12 届古巴 PostgreSQL 会议 (PostgresqlCUBA, @PgCuba) 将于 2021 年 11 月 18-19 日在哈瓦那自由酒店举行。 此活动是 TECNOGET 会议的一部分,我们将举办一个专门讨论与 PostgreSQL 相关主题的会场。 如需了解更多详情,请联系 cu AT postgresql DOT org。

PostgreSQL 产品新闻

JDBC 42.2.22 已发布

Pgpool-II 的管理工具 pgpoolAdmin 4.2.0 已发布

用于观察和排查 PostgreSQL 故障的命令行管理工具 pgCenter 0.9.0 已发布

六月份的 PostgreSQL 工作机会

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

PostgreSQL 新闻

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

PostgreSQL 周刊由 David Fetter 本周为您带来

请在太平洋标准时间(PST8PDT)周日下午 3:00 前将新闻和公告提交至 david@fetter.org。

已应用的补丁

Tom Lane 推送了

  • 解决较新版本 mktime() 的可移植性问题。最近的 glibc 版本在 tm_isdst 与当前时区不一致时,导致 mktime() 失败;特别是当区域为 UTC 时,tm_isdst = 1 时会失败。(这似乎与 POSIX 强制处理 struct tm 的其他字段的“不正确”值的方式极不一致,所以如果你问我,这是一个 bug,但我敢打赌他们会说这是故意的。)当 pg_restore'ing 在不同时区创建的存档时,已观察到这会导致表面上的问题。为了解决这个问题,使用存档中的字段值执行 mktime(),如果失败,则使用 tm_isdst = -1 再次尝试。这将产生与原始区域的 UTC 偏移量差异的结果,但之前也是如此。这不是很关键,因为我们不会对结果做任何事情,除了可能打印它。(总有一天,我们应该刷新所有这些逻辑,并在存档中记录标准格式的时间戳。但这不适用于向后移植的错误修复。)此外,通过让 initdb 的 build_time_t() 设置 tm_isdst = -1 而不是 0,来保护我们对 mktime() 的唯一其他使用。这种情况只能在全年都是 DST 的区域中出现问题;但我认为确实存在一些,或者将来可能会存在。根据 Wells Oliver 的报告。向后移植到所有支持的版本,因为任何版本都可能需要使用较新的 glibc 运行。讨论:https://postgr.es/m/CAOC+FBWDhDHO7G-i1_n_hjRzCnUeFO+H-Czi1y10mFhRWpBrew@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f807e3410fdfc29ced6590c7c2afa76637e001ad

  • 删除孤立的预期结果文件。这应该在 43e084197 中删除,它删除了相应的规范文件。在摆弄隔离测试器时注意到。https://git.postgresql.org/pg/commitdiff/ffbe9dec13599fa786ea6567df1c6a3f3ee3c673

  • 更新变体预期结果文件。这应该在 d2d8a229b 中更新,但被忽略了。根据添加它的 31a877f18,此文件旨在显示在 default_transaction_isolation = serializable 下得到的结果。我们在其他隔离测试中已经很大程度上失去了这个目标,但是只要我们有这个文件,它就应该是正确的。在摆弄隔离测试器时注意到。https://git.postgresql.org/pg/commitdiff/0a1e80c5c4f094087257fc4284a87e0bc7bca591

  • 删除另一个孤立的预期结果文件。添加 aborted-keyrevoke_2.out 时(在提交 0ac5ad513 中)显然需要它来处理可序列化事务模式的情况。但是,可序列化模式下的输出实际上与常规 aborted-keyrevoke.out 文件匹配,并且 AFAICT 长期以来一直是这样。没有必要继续拖着这个变体。https://git.postgresql.org/pg/commitdiff/f6352a0d4e437ac8bc266f77df22d064592056c9

  • 更新另一个变体预期结果文件。这应该在 533e9c6b0 中更新,但被忽略了。考虑到没有投诉,我不会费心向后移植。https://git.postgresql.org/pg/commitdiff/d3c878499c9d639ff06e0664d06b8c731e30c2fc

  • 改进一些与复制相关的代码中的 SQLSTATE 报告。我最初的目标是当 walrcv_connect() 失败时报告 ERRCODE_CONNECTION_FAILURE,但是当我环顾四周时,我意识到编写此代码的人认为错误代码是纯粹可选的。这不是我对我们项目政策的理解。因此,请确保在每个 ereport 中提供一个错误代码,该错误代码(a)是 ERROR 或更高级别,并且(b)不是可以说是内部逻辑错误。此外,修复一些非常可疑的现有错误代码分配。虽然这不符合政策,但它在很大程度上也只是表面上的,因为很少有这些情况会报告给应用程序。因此,我觉得没有必要向后移植。讨论:https://postgr.es/m/2189704.1623512522@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6b787d9e32005867ee3660d1ea20f447810a403d

  • 修复 ExecuteQuery 中出错后 plancache 引用计数泄漏。当将 plancache 中的计划填充到 Portal 时,不应冒险在 GetCachedPlan 和 PortalDefineQuery 之间抛出错误;如果发生这种情况,GetCachedPlan 递增的计划引用计数将泄漏。我在 9dbf2b7d7 中重构代码时设法打破了这个规则。除了某些内存泄漏之外,没有明显的结果,并且由于没有人很可能连续多次触发相关错误条件,因此我们没有注意到这一点并不奇怪。尽管如此,这是一个 bug,因此请重新排列操作顺序以消除危险。在寻找更好的 bug #17053 修复程序的过程中注意到。这个错误很古老,因此向后移植到所有支持的分支。https://git.postgresql.org/pg/commitdiff/131ea3e908d3c97a2fe1ab25cce5046dd5cb905f

  • 集中实用工具语句的保护性复制逻辑。在“简单查询”代码路径中,对实用工具语句的节点树进行解析分析或执行是没问题的,因为之后会被丢弃。但是,如果节点树在计划缓存中,则不能这样做,因为它会被后续执行破坏。到目前为止,我们通过让单独的实用工具语句函数在要修改树时应用 copyObject() 来处理这个问题。但这很容易出现遗漏错误。Charles Samborski 的 Bug #17053 表明,CREATE/ALTER DOMAIN 没有收到此备忘,如果从计划缓存重复执行,则可能会崩溃。在后向分支中,我们将仅为此应用一个狭窄的临时修复,但在 HEAD 中,似乎谨慎地采用更原则性的修复,以消除将来出现其他类似 bug 的可能性。因此,让我们将执行 copyObject 的责任从其子项提升到 ProcessUtility 中,从而确保它对所有实用工具语句类型都发生。此外,修改 ProcessUtility 的 API,使其调用者可以告诉它是否需要复制步骤。事实证明,在所有情况下,直接调用者都知道节点树是否是临时的,因此这不会涉及大量的代码混乱。这样,虽然我们在执行缓存的代码路径中由于有时复制不会被修改的节点树而损失了一点,但我们在简单的查询代码路径中通过不复制抛弃的节点树而获得了一些收益。复杂到复制起来代价高昂的语句几乎肯定是无论如何都必须复制的语句,因此缓存代码路径中的损失应该不大。(请注意,整个问题仅适用于实用工具语句。可优化的语句没有问题,因为我们很久以前就让执行器将 Plan 树视为只读。也许有一天我们会让实用工具语句执行也这样做,但我不抱太大希望。)讨论:https://postgr.es/m/931771.1623893989@sss.pgh.pa.us 讨论:https://postgr.es/m/17053-3ca3f501bbc212b4@postgresql.org https://git.postgresql.org/pg/commitdiff/7c337b6b527b7052e6a751f966d5734c56f668b5

  • 改进 pgbench 中的版本报告。提交 547f04e73 导致 pgbench 开始打印其版本号,这似乎是个好主意,但它需要更多工作:* 在不同时打印服务器版本号。* 打印 PG_VERSION 字符串,而不是某些重建的近似值。此补丁复制了 psql 用于相同目的的经过良好测试的代码。讨论:https://postgr.es/m/1226654.1624036821@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/84bee9610965331d5110971d8de390a5bbe2effc

  • 修复带有重复 polroles 条目的 DROP OWNED BY 的错误行为。通常,pg_policy.polroles 数组不会多次列出同一个角色;但是 CREATE POLICY 并不能阻止这种情况。如果我们对多次列出的角色执行 DROP OWNED BY,RemoveRoleFromObjectPolicy 要么会遇到断言失败,要么会遇到自更新元组错误。重写它以正确处理重复条目,并添加 CommandCounterIncrement 调用以防止其他问题。根据讨论,此处应该进行其他清理,但这似乎是最低限度的基本修复。根据 Alexander Lakhin 的 bug #17062。它一直都是坏的,因此向后移植到所有支持的分支。讨论:https://postgr.es/m/17062-11f471ae3199ca23@postgresql.org https://git.postgresql.org/pg/commitdiff/d21fca084356946664bfce19d66d2df2bb873cbd

  • 为 v14 中添加的 libpq 功能提供功能测试宏。我们收到一个请求,要求提供一种在编译时测试新管道功能是否可用的方法。更笼统地说,似乎提供一种通过 #ifdef 测试所有新 libpq API 功能的方法是个好主意。人们一直在为此使用 pg_config.h 中的版本;但是,在服务器版本与 libpq 版本不同的日益普遍的情况下,它更有可能表示服务器版本而不是 libpq 版本。如果 libpq-fe.h 本身是关于它提供哪些功能的真实来源,那就更安全了。因此,制定一项政策,即从 v14 开始,当我们在那里添加新的 API 时,我们将向 libpq-fe.h 添加一个合适的功能存在宏。(对追溯应用此策略似乎没有太大意义,但对于 v14 来说还为时不晚。)Tom Lane 和 Alvaro Herrera,根据 Boris Kolpackov 的建议。讨论:https://postgr.es/m/boris.20210617102439@codesynthesis.com https://git.postgresql.org/pg/commitdiff/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5

  • 稳定由提交 f61db909d 添加的测试用例。构建场成员 ayu 和 tern 有时对此查询显示了与预期不同的计划。我之前一直无法重现这种情况,但今天我终于意识到发生了什么。如果存在并发的打开事务(可能是构建场中的自动清理运行,但这也可以手动安排),则由上面几行的 DELETE 删除的行的索引条目不会立即被清除,导致规划器对 ft2.c1 的极值估计发生变化,从而将“c1 > 1100”的行数估计移动到足以将连接计划从嵌套循环更改为哈希。为了修复这个问题,将查询条件更改为“c1 > 1000”,无论是否存在并发的打开事务,都会优先选择哈希计划。由于此 UPDATE 被定制为无操作,因此其他任何内容都不会更改。报告: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-09%2022%3A45%3A48 报告: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-13%2022%3A38%3A18 报告: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=tern&dt=2021-06-20%2004%3A55%3A36 https://git.postgresql.org/pg/commitdiff/5843659d091bfb6f2c60e010ea1fd00e55ee6ada

  • 也为简单表达式恢复门户级别的快照。提交 84f5c2908 等遗漏了涵盖 plpgsql 的“简单表达式”代码路径的需求。如果我们在 COMMIT/ROLLBACK 之后执行的第一个操作是这些操作之一,而不是完整的 SPI 命令,我们必须显式执行 EnsurePortalSnapshotExists() 以确保我们有一个外部快照。请注意,仅在表达式执行期间推送快照是不够的:返回的内容可能会被 toaste 化,因此我们最好有一个快照来保护它。演示这一事实的测试用例通过将 SQL 函数标记为不可变来作弊,即使它从表中获取数据。但这并不是用户没有做过的事情。根据 Jim Nasby 的报告。像之前的修复一样,向后移植到 v11。讨论:https://postgr.es/m/378885e4-f85f-fc28-6c91-c4d1c080bf26@amazon.com https://git.postgresql.org/pg/commitdiff/d102aafb6259a6a412803d4b1d8c4f00aa17f67e

  • 使用注释来减少隔离测试结果的不稳定性。我们长期以来一直与不完全稳定的隔离测试结果作斗争。一些测试脚本插入长时间延迟以尝试强制获得稳定的结果,这并不是很理想;但是其他不稳定的失败模式仍然存在,导致无法重复的构建场失败。我花了很多时间试图通过改进服务器端支持代码来解决这个问题,但没有取得多大成功:这种方式根本无法处理来自不同服务器进程的消息到达的偶然顺序所导致的差异。但是,我们可以通过注释测试脚本本身来改进客户端的问题,以显示可能以不同顺序发生的事件的所需报告顺序。此补丁添加了三种类型的注释来处理 (a) 在隔离测试程序看到它们正在等待之前,可能完成或可能未完成等待的测试步骤;(b) 可以合法地按任何顺序完成的不同会话中的测试步骤;以及 (c) 可能在另一个会话中的步骤完成之前或之后到达的 NOTIFY 消息。我们稍后可能需要更多注释类型,但这似乎足以处理我们在构建场中看到的不稳定性。它还使我们能够摆脱以前使用的所有长时间延迟,从而将隔离测试的运行时间缩短了一分钟以上。向后移植到所有支持的分支,因为构建场的不稳定性会影响所有分支,并且似乎希望在所有分支中保持隔离测试程序的功能相同,以简化将来可能的测试向后移植。讨论:https://postgr.es/m/327948.1623725828@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/741d7f1047fe52da7ced6fa9cea661ce9320c8d4

  • 改进隔离测试中查询结果的显示。以前,隔离测试程序使用一些显然没有花太多精力构建的临时代码来显示 SQL 查询结果。长度超过 14 个字符的字段值不会与下一个字段分隔,并且通常也会导致列未对齐。此外,查询结果与后续隔离测试程序输出之间没有视觉分隔。这使得测试结果文件混乱且难以阅读。为了改进这一点,让我们使用 libpq 的 PQprint() 函数。尽管 psql 早已不再使用它,但它仍然非常适合这里的用途。与 741d7f104 一样,向后移植到所有支持的分支,这样它就不会成为向后移植隔离测试更改的绊脚石。讨论:https://postgr.es/m/582362.1623798221@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/4a054069a36032a59afceb07f3b837f09ab1a2e9

  • 不要假设 GSSAPI 结果字符串以 null 结尾。我们对 gss_display_status() 和 gss_display_name() 的使用假设这些函数返回的 gss_buffer_desc 字符串以 null 结尾。考虑到到目前为止没有出现任何问题,它们似乎通常是这样的。但是,可用的文档并未对此进行承诺,并且 gss_display_status() 的一些手册页显示了依赖 gss_buffer_desc.length 字段而不是期望 null 结尾的示例。此外,我们现在有一份报告称,在某些实现中,clang 的地址消毒器认为指定长度之后的字节是未定义的。因此,更改代码以依赖长度字段。这很可能是表面上的更改,而不是修复任何真正的错误,但很难确定,因此向后移植到所有支持的分支。在此期间,还向后移植了 v12 更改,这些更改使 pg_GSS_error 可以诚实地处理来自 gss_display_status 的多个可用消息。根据 Sudheer H R 的报告。讨论:https://postgr.es/m/5372B6D4-8276-42C0-B8FB-BD0918826FC3@tekenlight.com https://git.postgresql.org/pg/commitdiff/126cdaf47af275f76b2f2ddb023bfdc6f018ae30

  • 文档:修复语法摘要中关于 LEAKPROOF 的混淆。CREATE FUNCTION 和相关命令的语法摘要使其看起来 LEAKPROOF 是 IMMUTABLE/STABLE/VOLATILE 的替代方案,而实际上它是一个正交选项。改进这一点。根据 aazamrafeeque0 的抱怨。感谢 David Johnston 的建议。讨论:https://postgr.es/m/162444349581.694.5818572718530259025@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/2031e1668e5577e64cfed29da69a34903d5a5227

  • 允许将非引号标识符用作隔离测试会话/步骤名称。隔离测试程序一直坚持会话和步骤名称必须用双引号括起来,这没有任何明显的原因。这是相当乏味的,并且对测试可读性几乎没有帮助,特别是因为人们实际选择的名称几乎总是看起来像正常的标识符。因此,让我们调整词法分析器,不仅允许双引号字符串,还允许类似于 SQL 的标识符。(它们类似于 SQL,但不完全是 SQL,因为我没有添加任何大小写折叠逻辑。也没有为 U&"..." 名称提供任何规定,但没有人会关心。)此更改引入了一个不兼容性:如果你写“foo”“bar”且没有空格,那么以前会被视为两个标识符,但现在它只是一个带有嵌入引号标记的标识符。我转换了所有 src/test/isolation/ specfile 以删除不必要的双引号,但到此为止,因为我的眼睛已经开始模糊了。与 741d7f104 一样,向后移植到所有支持的分支,这样它就不会成为向后移植隔离测试更改的绊脚石。讨论:https://postgr.es/m/759113.1623861959@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a443c1b2d6a646cf90a8afc193c07ed12a2bf045

  • 进一步稳定 postgres_fdw 测试。涉及 ft1_nopw 的查询不再稳定地返回相同的行。我推测,在 f61db909d/5843659d 引入更新后,自动清理命中“S 1”.“T 1”,释放了一些空间,从而改变了后续插入的存储位置。不过,这些结果之前是稳定的,这纯属运气好,因为没有 ORDER BY 的 LIMIT 没有明确定义,而且我们在这个测试脚本中也从未将该表视为仅追加表。由于我们真正关心的只是这些命令是否成功,因此只需将 "SELECT *" 替换为 "SELECT 1"。报告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=crake&dt=2021-06-23%2019%3A52%3A08 https://git.postgresql.org/pg/commitdiff/802177090992511c610804da54a4603d4f50c594

  • 文档:从 v14 发行说明中删除提交 f560209c6。既然这已被向后移植,那么它就不再是 v14 的新功能了。https://git.postgresql.org/pg/commitdiff/8a80562d732c0da1ddcc9fb88dfb976f4b846577

  • 删除 RemoveRoleFromObjectPolicy() 中不必要的失败情况。此函数不必打开或锁定与其正在修改的 pg_policy 条目关联的关系。它在 rel 上进行的错误检查如果有什么弊端的话,那就是适得其反(例如,如果我们不想允许在系统目录上安装策略,那么这里不是阻止它的地方)。特别是,坚持所有权检查似乎是完全错误的。这会产生迫使人们使用超级用户进行 DROP OWNED BY 的净效应,这肯定不是我们想要的效果。此外,重新构建策略表达式的依赖关系也没有任何意义,因为这些表达式没有被更改。最后,锁定表似乎也适得其反;它无助于防止竞争条件,因为我们在获得锁后未能重新读取 pg_policy 行。这意味着并发 DDL 可能会导致“元组并发更新/删除”错误;这与此代码产生的行为相同,但开销更少。根据对 bug #17062 的讨论。向后移植到所有支持的版本,因为此消除的失败情况在 9.6 中与在 HEAD 中一样不受欢迎。讨论:https://postgr.es/m/1573181.1624220108@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/5a0f1c8c0193f0dd7fba50c22d96781fa2414007

  • 移除 libpq 对 stringinfo.c 中不必要的依赖。提交 c0cb87fbb 不明智地在 fe-connect.c 中引入了对 StringInfo 机制的依赖。我们不应该在 libpq 中使用它,因为它在遇到 OOM(内存不足)时会执行 summary exit(1),这对于通用库来说是不合适的行为。允许服务文件中任意长度行的目标似乎不值得花费太多精力,因此恢复到之前使用堆栈分配缓冲区并在缓冲区溢出时失败的方法。但这并不是完全恢复。我保留了该补丁的重构,使其只有一个退出路径,因为这似乎比让每个错误路径都知道如何清理更清晰。此外,我将固定大小的缓冲区设置为 1024 字节而不是 256 字节,只是为了进一步推迟对可扩展缓冲区的需求。这里还有更多的工作要做;特别是现在缺乏对此类错误的任何机械检查似乎相当危险。但无论如何,这个修复使我们回到了 v13 中所具有的稳健性水平。讨论:https://postgr.es/m/daeb22ec6ca8ef61e94d766a9b35fb03cabed38e.camel@vmware.com https://git.postgresql.org/pg/commitdiff/8ec00dc5cd70e0e579e9fbf8661bc46f5ccd8078

  • 文档:更新 v14 发行说明,以说明回滚提交 c0cb87fbb。https://git.postgresql.org/pg/commitdiff/dcffc9ba8a1e0ab1b0a57e9b9d38e3dc9960f83f

  • 移除 isolationtester 中的内存泄漏。specscanner.l 每个 spec 文件的 token 会泄漏一千字节的内存。显然,有人认为介绍性代码块会执行一次;但它是每次 yylex() 调用执行一次。isolationtester.c 中的几个函数由于没有费心释放一次性分配的内存而泄漏了少量内存。不妨改进这些,以便 valgrind 对该程序进行健康检查。还要消除一个丑陋的静态变量。Coverity 抱怨其中一个一次性泄漏,这促使我尝试使用 valgrind 对 isolationtester 进行检查,从而发现了更大的泄漏。https://git.postgresql.org/pg/commitdiff/642c0697c96b9c6ba5d194653a329f7820565f01

Michaël Paquier 推送

Bruce Momjian 推送

Álvaro Herrera 推送

Noah Misch 推送了

Amit Kapila 推送了

Alexander Korotkov 推送了

Peter Geoghegan 推送了

Andrew Dunstan 推送了

Heikki Linnakangas 推送了

  • 修复了关于 WAL 文件查找位置的过时注释。自从提交 c24dcd0cfd 以来,我们一直在使用 pg_pread() 读取 WAL 文件,这不会更改查找位置(除非我们回退到 src/port/pread.c 中的实现)。相应地更新注释。反向移植到:12,我们开始使用 pg_pread() 的版本 https://git.postgresql.org/pg/commitdiff/d0303bc8d2670d11c9df9220aa08a2c33529e100

  • 整理 GetMultiXactIdMembers() 在出错时的行为。其中一个错误路径使 *members 未初始化。这不是一个实际的 bug,因为大多数调用者在函数返回 -1 时不会查看 *members,但我们还是把它整理一下。一个调用者 heap_lock_tuple() 会执行 "if (members != NULL) pfree(members)",但据我所见,它永远不会传递无效的 'multi' 值,因此不应到达该错误情况。调用者的期望也有些不一致。heap_lock_tuple() 在 'members' 不为 NULL 时释放它,其他调用者在 "nmembers >= 0" 时释放它,还有一些在 "nmembers > 0" 时释放它。这也不是一个实际的 bug,因为该函数永远不应该返回 0,但为此添加一个断言,使其更清晰。我将设置 *nmembers 的行移动了位置。之前它并没有错,但我喜欢在 'return' 语句旁边执行它,以明确它总是在返回时设置。此外,删除 ereport(ERROR) 之后一个无法访问的返回语句,为了简洁并与之后的类似 if 代码块保持一致。作者:Greg Nancarrow,并由我进行了其他更改。反向移植到:9.6,所有受支持的版本 https://git.postgresql.org/pg/commitdiff/d24c5658a80c8f5037e9e1948de311d3f3350f12

  • 防止读取 relmapper 文件时出现竞争条件。与此处的注释相反,POSIX 不保证 read() 的原子性,如果另一个进程同时调用 write()。或者至少 Linux 不保证。在 load_relmap_file() 中添加锁以避免竞争条件。修复了 bug #17064。感谢 Alexander Lakhin 的报告和测试用例。反向移植到:9.6,所有受支持的版本。讨论: https://postgresql.ac.cn/message-id/17064-bb0d7904ef72add3@postgresql.org https://git.postgresql.org/pg/commitdiff/b6d8d2073f228d9f7198f1f9826d8f6ab643c219

  • relmapper 竞争条件的另一个修复。在之前的提交中,我遗漏了 relmap_redo() 也未获取 RelationMappingLock。感谢 Thomas Munro 指出这一点。反向移植到:9.6,与之前的提交相同。讨论:https://postgresql.ac.cn/message-id/CA%2BhUKGLev%3DPpOSaL3WRZgOvgk217et%2BbxeJcRr4eR-NttP1F6Q%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/9b8ed0f52bffceaccf6fa650ffe482e7da20fbf2

Tomáš Vondra 推送

  • 修复了在使用 FDW 批处理时将数据复制到槽中的问题。提交 b676ac443b 优化了使用批量插入到外部表的元组槽的处理,以便只初始化槽一次,并为所有批次重用。但是,数据仅在初始化后才复制到槽中,当槽被重用时,会插入重复的值。通过将 ExecCopySlot 移到 init 分支之外来修复。由于将数据插入到没有唯一索引的外部表中,然后仅检查插入的行数,因此现有的 postgres_fdw 测试未能捕获此问题。这增加了一个新测试,既有唯一索引,也检查插入的值。报告人:Alexander Pyhalov 讨论: https://postgr.es/m/7a8cf8d56b3d18e5c0bccd6cd42d04ac%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/99cea49d6525e30bc3768e4ffb95377e7584dea1

Fujii Masao 推送

Peter Eisentraut 推送

David Rowley 推送

  • 修复 expand_grouping_sets 中的断言失败。如果给定的指针不是指定类型,则 linitial_node() 在启用断言的构建中会失败。此处的类型为 IntList。代码认为它应该期望 List,但这是错误的。在运行此代码的现有测试中,初始列表元素始终为 NIL。由于 linitial_node() 允许 NULL,因此我们没有在现有的回归测试中触发任何断言失败。关于我们是否需要在此领域进行更多测试仍有一些讨论,但现在,由于 beta2 即将发布,因此首先修复该 bug。Bug:#17067 讨论: https://postgr.es/m/17067-665d50fa321f79e0@postgresql.org 报告人:Yaoguang Chen https://git.postgresql.org/pg/commitdiff/8d29d45d9b3cab95a866efbcdd9138b3d76741b3

Andres Freund 推送

Joe Conway 推送

Thomas Munro 推送

待处理的补丁

Nitin Jadhav 发送了另一个修订版本的补丁,该补丁提供了一种方法来跟踪启动过程中执行的操作的进度。

Yuzuko Hosoya 发送了一个补丁,以通过新的 GUC autovacuum_analyze_attach_partition、autovacuum_analyze_detach_partition 和 autovacuum_analyze_drop_partition 来控制是否为分区操作运行自动分析。

Peter Eisentraut 发送了一个补丁,将索引 OID 宏参数添加到 DECLARE_INDEX。不要显式定义诸如 AmOidIndexId 之类的符号,而是将它们作为 DECLARE_INDEX() 的参数,并让 genbki.pl 生成 CATALOG() 声明中表 OID 符号的方式。

Filip Gospodinov 发送了一个补丁,旨在修复一个 bug,该 bug 表现为静态链接 libpq 时,随附的 pkg-config 文件已损坏,因为缺少 libpgcommon 和 libpgport。该修复程序添加了这两个缺失的私有依赖项。

Heikki Linnakangas 发送了另一个修订版本的补丁,将 xlog.c 拆分为 xlog.c 和 xlogrecovery.c。这会将与执行 WAL 恢复相关的函数移动到新的 xlogrecovery.c 源文件中,而 xlog.c 负责维护 WAL 缓冲区,协调启动和从恢复到正常操作的切换,以及其他一直存在于 xlog.c 中的杂项内容。

Greg Nancarrow 发送了两个修订版本的补丁,以删除 BIGINT 序列 MINVALUE/MAXVALUE 值上无用的 int64 范围检查。

Peter Geoghegan 发送了三个修订版本的补丁,以添加用于“git blame”的可忽略的 pgindent 提交的列表。

David Rowley 发送了另一个修订版本的补丁,以添加一种具有稳定指针的新哈希表类型,并使用相同的方法来加速 SMgr。

Peter Smith 和 Ajin Cherian 交换了补丁,以添加一个选项来支持内置逻辑复制的预备事务。

Daniel Gustafsson 和 Michaël Paquier 交换了补丁,以记录一些与 SSL/TLS 相关的首字母缩略词,并将 SSL 的使用替换为 SSL/TLS,后者更准确和最新。

Simon Riggs 发送了三个修订版本的补丁,以添加关于哈希索引的文档章节。

Atsushi Torikoshi 发送了另一个修订版本的补丁,以添加一个函数来记录完整查询字符串及其针对具有指定进程 ID 的后端上当前正在运行的查询的计划。

Li Japin 发送了一个补丁,以对 RelationGetIdentityKeyBitmap 进行小的代码美化。

Bertrand Drouvot 发送了另一个补丁修订版,以在备用服务器上启用最小逻辑解码。

Alexander Pyhalov 发送了另一个补丁修订版,以允许将 CASE 表达式推送到外部服务器。

Peter Eisentraut 发送了一个补丁,用于使 Unicode makefile 更具并行安全性,使 UCS_to_most.pl 按排序顺序处理编码,删除生成的 C 输出中的一些空格,使其与项目其余部分的编码风格一致,简化代码生成代码,并修复生成输出中的缩进。

Maxim Orlov 发送了另一个补丁修订版,以修复并行工作进程失败的断言和核心转储。

Vigneshwaran C 发送了另外两个补丁修订版,以添加对 PUBLICATION 的模式级支持。

Mike Fiedler 发送了一个补丁,以在后复制输出中发出命名空间。

Emre Hasegeli 发送了一个补丁,以将操作符类与索引访问方法解耦。

Jacob Champion 发送了两个补丁修订版,以将 SASL 框架与 SCRAM 代码解耦,因为它可能单独有用。

Yugo Nagata 发送了另一个补丁修订版,通过使用客户端变量的 Variables 结构来解决一些 Pgbench 错误。这在用于在序列化/死锁失败后重复事务期间重置客户端变量时最为重要。不要逐个分配 Variable 结构体。相反,每次溢出时都添加一个常量边距。还包括了针对 pgbench 错误和序列化/死锁重试的修复。

Jacob Champion、Michaël Paquier 和 Tom Lane 交换了补丁,以使 jsonapi 可以与 libpq 一起使用。

Gurjeet Singh 发送了一个补丁,为顶级事务 ID 添加自动通知。

Haiying Tang 发送了另一个补丁修订版,以支持 psql 中大写输入的查询结果的制表符补全。

Peter Eisentraut 发送了一个补丁,通过计算错误并在最后报错而不是仅对无效的跨目录查找写入警告,使 genbki 错误处理更有用。

Daniel Gustafsson 发送了另一个补丁修订版,以支持 NSS 作为 libpq 的 TLS 后端。

Andrey V. Lepikhov 发送了一个补丁,告知 genericcostestimate() 的索引选择性值,在唯一的单行 btree 索引的情况下,只能返回扫描一行。

Tomáš Vondra 发送了另一个补丁修订版,以使逻辑解码中可以复制序列。

Ranier Vilela 发送了一个补丁,以修复 src/backend/commands/subscriptioncmds.c 中未初始化的 copy_data 变量。

Peter Eisentraut 发送了另一个补丁修订版,通过缩短主要错误消息并更直接地说尝试的操作是不可能的,从而改进有关 relkind 不匹配的错误消息。

Peter Eisentraut 发送了一个补丁,为 UNBOUNDED 语法歧义添加测试。

Simon Riggs 发送了一个补丁,使 pgbench 使用 COPY FREEZE。

Justin Pryzby 发送了一个补丁,以避免双括号,并修复 tablefunc.c 中的注释以引用正确的注释。

Craig Ringer 发送了一个补丁,添加了一些 PGDLLIMPORT,以公开 Windows 上之前不可用的一些内容。

Amit Kapila 发送了一个补丁,允许在推测性中止后流式传输更改。

Hayato Kuroda 发送了一个补丁,使 ECPG 的新 DECLARE STATEMENT 可以用于 DEALLOCATE 和 DESCRIBE。

Bruce Momjian 发送了另一个补丁修订版,以实现集群文件加密。

Jie Zhang 发送了一个补丁,使生成的示例 postgresql.conf 与 shared_buffers 的实际默认值保持一致。

Richard Guo 发送了一个补丁,将每个 rel 都用作反连接的外部和内部。

Tom Lane 发送了一个补丁,以防止从 libpq 内部调用 abort() 或 exit()。

Alexander Korotkov 发送了一个补丁,以修复多范围运算符目录定义中的一些小的不一致之处。

Julien Rouhaud 发送了另一个补丁修订版,以在生成 const 节点时保留参数位置。

Andrey Borodin 发送了另一个补丁修订版,以重组 pglz 压缩代码。

Julien Rouhaud 和 Ranier Vilela 交换了补丁,以添加一个 pg_get_query_def() 来反解析和打印重写的 SQL 语句。

Tomáš Vondra 发送了一个 PoC 补丁,使用运行时采样进行基数估计。