2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 每周新闻 - 2021 年 4 月 4 日

发布于 2021-04-05,作者 PWN
PWN

PostgreSQL 每周新闻 - 2021 年 4 月 4 日

本周人物:https://postgresql.life/post/jan_karremans/

PostgreSQL 产品新闻

Ora2Pg 21.1 发布,这是一个将 Oracle 数据库迁移到 PostgreSQL 的工具。https://github.com/darold/ora2pg/blob/master/changelog

pgtt 2.3 发布,一个实现全局临时表的扩展。https://github.com/darold/pgtt/releases/tag/v2.3

SB Data Generator 发布,一个用于生成和填充测试数据的 GUI 工具。SB Data Generator

四月 PostgreSQL 工作机会

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

David Rowley 提交

  • 如果 PathTarget 和 RestrictInfos 包含易变函数,则进行缓存。我们旨在通过缓存 PathTargets 和 RestrictInfos 是否包含任何易变函数,以减少 contain_volatile_functions() 所做的重复工作。对这些节点未来的任何调用都将使用缓存值,而不是再次递归检查子节点。感谢 Tom Lane 的想法。代码中任何会改变 PathTarget 或 RestrictInfo 并可能改变易变性检查结果的修改,都必须将缓存值重置回 VOLATILITY_UNKNOWN。contain_volatile_functions() 是唯一负责将缓存值设置为 VOLATILITY_VOLATILE 或 VOLATILITY_NOVOLATILE 的代码。一些现有代码确实受益于这种额外的缓存,但此更改主要针对即将到来的一个补丁,该补丁在连接搜索期间需要检查易变性。在这种情况下,重复的易变性检查会变得非常昂贵,特别是当连接搜索包含多个关系时。作者:David Rowley 讨论:https://postgr.es/m/3795226.1614059027@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/f58b230ed0dba2a3d396794a2ec84541e321d92d

  • 调整每个工作进程的并行顺序扫描数据结构设计。允许在并行顺序扫描期间存储每个工作进程内存的数据结构的设计并不理想。56788d215 中的工作需要额外的数据结构,以便工作进程能够记住在并行顺序扫描期间分配给它们处理的页面范围。该提交向 TableScanDescData 添加了一个 void 指针字段,以允许 heapam 存储每个工作进程的分配信息。然而,将该字段放在那里,考虑到我们有针对该特定类型的结构,例如 HeapScanDescData,这显得不太合理。这里我们从 TableScanDescData 中移除了 void 指针字段,并为此目的添加了一个专用字段到 HeapScanDescData。以前,我们为所有扫描分配并行每个工作进程的数据内存,无论是否为并行扫描。这只是非并行扫描的浪费性分配,因此在这里,我们根据扫描是否为并行来有条件地分配内存。此外,在 heap_endscan() 中添加了以前缺失的 pfree() 来释放每个工作进程的数据。报告者:Andres Freund 审阅者:Andres Freund 讨论:https://postgr.es/m/20210317023101.anvejcfotwka6gaa@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/af527705edc3fd0b335264d17e0521c05edc5cca

  • 允许 simplehash.h 的用户执行直接删除。以前 simplehash.h 只公开了一个使用哈希表键执行哈希表删除的方法。这意味着删除函数必须执行一次哈希查找才能找到要删除的条目。这里我们添加了一个新函数,以便 simplehash.h 的用户可以直接使用条目指针执行哈希删除,从而节省哈希查找。一个即将发布的、使用 simplehash.h 的补丁已经执行了哈希查找,因此已经拥有了条目指针。此更改将允许该补丁中的代码在 simplehash.h 中的代码不必执行额外的哈希查找即可执行哈希删除。作者:David Rowley 审阅者:Andres Freund 讨论:https://postgr.es/m/CAApHDvqFLXXge153WmPsjke5VGOSt7Ez0yD0c7eBXLfmWxs3Kw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ff53d7b159b93ce9fc884897f9d96b97744781e2

  • 修复 unistr 函数中的编译器警告。一些编译器不清楚 elog/ereport ERROR 不返回。 https://git.postgresql.org/pg/commitdiff/efd9d92bb39c74c2aded64fc08e2d601ce20c39d

  • 允许 estimate_num_groups() 返回关于估计的更多详细信息。我们在此添加了一个新的输出参数 estimate_num_groups(),以便它能够告知调用者有关估计的更多可能有用信息。新的输出参数是一个结构体,目前只有一个包含标志集的字段。这样做是为了避免将标志作为输出参数,以便将来可以在不更改函数签名的情况下添加新字段,以便在需要传递更多信息时(这些信息可能不适合存储在标志字段中)。可以合理地预见到,在未来的某个时候,规划器会希望了解有关估计的更多信息。例如,估计是从多少组单独的统计信息生成的?如果我们希望在生成计划时考虑风险以及成本,规划器可能会考虑这一点。目前,我们只设置了一个标志。这是为了指示估计是否在估计的任何部分回退到使用硬编码的常量。调用者可能会根据此标志更改其行为,并且此功能允许他们这样做。如果调用者不关心获得有关估计的任何附加信息,则可以传递 NULL 指针。我们在此不添加任何实际使用这些标志的代码。一些后续的提交将使用此功能。此外,我们也没有对 clauselist_selectivity() 和 clauselist_selectivity_ext() 添加支持。但是,如果将来需要,这里添加的同一结构体也可以作为这些函数的新的输出参数。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvqQqpk=1W-G_ds7A9CsXX3BggWj_7okinzkLVhDubQzjA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ed934d4fa30f0f94e6f7125ad2154e6a58d1c7f7

  • 添加 Result Cache 执行节点。我们在此添加了一个名为“Result Cache”的新执行节点类型。规划器可以在计划中包含此节点类型,以便执行程序缓存参数化嵌套循环连接的内侧结果。这允许缓存参数集对应的元组,以便在节点再次看到相同的参数值时,它可以直接返回缓存的元组,而无需再次扫描连接的内侧。在内部,结果缓存使用哈希表来快速查找先前缓存的元组。对于某些数据集,这可以显著提高连接的性能。使用这种新节点类型的最佳场景是连接问题,其中连接的内侧的元组大部分没有与外侧的连接伙伴匹配。在这种情况下,哈希连接必须哈希从未被查找过的值,从而导致哈希表膨胀并可能导致其多次批处理。合并连接必须跳过所有不匹配的行。如果我们使用带有结果缓存的嵌套循环连接,那么我们只缓存至少有一个连接伙伴在外侧的元组。当查找的唯一值较少且每个值的查找次数很多时,使用带有结果缓存的参数化嵌套循环的优势会增加。此外,查找缓存的哈希探查可能比哈希连接中的哈希探查快得多,因为结果缓存的哈希表通常比哈希连接的哈希表小得多,这是因为结果缓存只缓存有用的元组而不是内侧连接的所有元组。当哈希连接的哈希表不再适合 CPU 的 L3 缓存,而结果缓存的哈希表可以时,这种哈希探查性能的差异更为显著。每次哈希探查的哈希桶的显式“随机”访问可能导致大哈希表的 L3 缓存命中率较低。较小的哈希表通常性能更好。用于缓存的哈希表将大小限制为不超过 work_mem * hash_mem_multiplier。我们维护一个用于此缓存的键的 dlist,当添加新元组并意识到我们已经超出内存预算时,我们会逐出最近最少使用的缓存条目,直到有足够的内存将新元组添加到缓存中。对于参数化嵌套循环连接,我们现在考虑在嵌套循环节点和其内侧节点之间使用这些结果缓存节点之一。我们根据成本来确定何时可能有用,成本主要取决于预期的缓存命中率。估计缓存命中率依赖于对嵌套循环的参数有良好的唯一值估计。目前,规划器只会考虑为参数化嵌套循环连接使用结果缓存。这适用于常规连接和 LATERAL 类型到子查询的连接。将来,此新节点也可用于其他用途,例如缓存来自相关子查询的结果。然而,由于在计算估计缓存命中率时,从外侧计划获取唯一值估计存在一些困难,因此此处未实现。我们目前在查询规划之前规划内侧计划,因此无法很好地知道结果缓存是否有用,因为在生成外侧计划之前,我们无法估计子计划将被调用的次数。这里添加的功能是新引入了对 join search 期间 estimate_num_groups() 返回值的依赖。以前,在 join search 期间,我们只需要执行选择性估计。通过此提交,我们需要使用 estimate_num_groups() 来估计结果缓存的命中率。简单来说,如果我们预期有 10 个唯一值和 1000 行外侧数据,那么我们估计命中率为 99%。由于缓存命中与扫描嵌套循环连接内侧的底层节点相比非常便宜,因此这将显著降低规划器连接的成本。然而,在这里很容易看出,当 estimate_num_groups() 错误地返回一个远低于实际唯一值数量的值时,情况会变得糟糕。如果发生这种情况,那么我们可能会使用带有结果缓存的嵌套循环连接,而不是其他连接类型,例如合并连接或哈希连接。我们已知的唯一值估计存在问题,因此在这里额外的依赖可能会导致规划器选择比之前的功能更慢的计划。当已连接多个表或 WHERE 子句过滤掉与我们正在估计的唯一值数量相关的表达式集时,唯一值估计也相当难以准确估算。目前,我们在查询规划期间为结果缓存进行的成本计算相当依赖于唯一值估计的准确性。当这些估计准确时,我们通常会看到包含结果缓存的计划执行速度更快。然而,在实际情况中,我们可能会发现我们需要更改成本计算,以减少对唯一值估计准确性的信任,甚至可能默认禁用此功能。当我们教查询规划器执行新技巧时,它可能会错误地使用该技巧并导致回归,这总是有风险的。用户可以通过使用 enable_resultcache GUC 将该功能关闭来获得旧的行为。目前,此功能默认启用。是否会为此版本保留该设置还有待观察。此外,“Result Cache”这个名称是我在开始编写此补丁时能想到的最好的名称。似乎没有人强烈反对这个名称。有些人确实提出了其他名称,但在关于名称的简短讨论中,似乎没有哪个名称占主导地位。让我们通过 Beta 测试期看看当前名称是否能让足够多的人满意。如果有关于更好名称的共识,我们可以在发布前更改它。请参阅下面的第二个讨论链接,了解关于“Result Cache”名称的讨论。作者:David Rowley 审阅者:Andy Fan, Justin Pryzby, Zhihong Yu 测试者:Konstantin Knizhnik 讨论:https://postgr.es/m/CAApHDvrPcQyQdWERGYWx8J%2B2DLUNgXu%2BfOSbQ1UscxrunyXyrQ%40mail.gmail.com 讨论:https://postgr.es/m/CAApHDvq=yQXr5kqhRviT2RhNKwToaWr9JAN5t+5_PzhuRJ3wvg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b6002a796dc0bfe721db5eaa54ba9d24fd9fd416

  • 撤销 b6002a796。这删除了“添加 Result Cache 执行节点”。似乎在缓存命中和未命中的跟踪方面存在一些奇怪的问题,正如许多 buildfarm 动物所指出的那样。问题尚不清楚,因为计划的其他部分表明缓存工作正常,只是命中和未命中被报告为 0。这对 buildfarm 如此破碎的时间来说尤其糟糕,所以在有更多动物变红之前撤销。讨论:https://postgr.es/m/CAApHDvq_hydhfovm4=izgWs+C5HqEeRScjMbOgbpC-jRAeK3Yw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/28b3e3905c982c42fb10ee800e6f881e9742c89d

  • 添加 Result Cache 执行节点(第二次)。我们在此添加了一个名为“Result Cache”的新执行节点类型。规划器可以在计划中包含此节点类型,以便执行程序缓存参数化嵌套循环连接的内侧结果。这允许缓存参数集对应的元组,以便在节点再次看到相同的参数值时,它可以直接返回缓存的元组,而无需再次扫描连接的内侧。在内部,结果缓存使用哈希表来快速查找先前缓存的元组。对于某些数据集,这可以显著提高连接的性能。使用这种新节点类型的最佳场景是连接问题,其中连接的内侧的元组大部分没有与外侧的连接伙伴匹配。在这种情况下,哈希连接必须哈希从未被查找过的值,从而导致哈希表膨胀并可能导致其多次批处理。合并连接必须跳过所有不匹配的行。如果我们使用带有结果缓存的嵌套循环连接,那么我们只缓存至少有一个连接伙伴在外侧的元组。当查找的唯一值较少且每个值的查找次数很多时,使用带有结果缓存的参数化嵌套循环的优势会增加。此外,查找缓存的哈希探查可能比哈希连接中的哈希探查快得多,因为结果缓存的哈希表通常比哈希连接的哈希表小得多,这是因为结果缓存只缓存有用的元组而不是内侧连接的所有元组。当哈希连接的哈希表不再适合 CPU 的 L3 缓存,而结果缓存的哈希表可以时,这种哈希探查性能的差异更为显著。每次哈希探查的哈希桶的显式“随机”访问可能导致大哈希表的 L3 缓存命中率较低。较小的哈希表通常性能更好。用于缓存的哈希表将大小限制为不超过 work_mem * hash_mem_multiplier。我们维护一个用于此缓存的键的 dlist,当添加新元组并意识到我们已经超出内存预算时,我们会逐出最近最少使用的缓存条目,直到有足够的内存将新元组添加到缓存中。对于参数化嵌套循环连接,我们现在考虑在嵌套循环节点和其内侧节点之间使用这些结果缓存节点之一。我们根据成本来确定何时可能有用,成本主要取决于预期的缓存命中率。估计缓存命中率依赖于对嵌套循环的参数有良好的唯一值估计。目前,规划器只会考虑为参数化嵌套循环连接使用结果缓存。这适用于常规连接和 LATERAL 类型到子查询的连接。将来,此新节点也可用于其他用途,例如缓存来自相关子查询的结果。然而,由于在计算估计缓存命中率时,从外侧计划获取唯一值估计存在一些困难,因此此处未实现。我们目前在查询规划之前规划内侧计划,因此无法很好地知道结果缓存是否有用,因为在生成外侧计划之前,我们无法估计子计划将被调用的次数。这里添加的功能是新引入了对 join search 期间 estimate_num_groups() 返回值的依赖。以前,在 join search 期间,我们只需要执行选择性估计。通过此提交,我们需要使用 estimate_num_groups() 来估计结果缓存的命中率。简单来说,如果我们预期有 10 个唯一值和 1000 行外侧数据,那么我们估计命中率为 99%。由于缓存命中与扫描嵌套循环连接内侧的底层节点相比非常便宜,因此这将显著降低规划器连接的成本。然而,在这里很容易看出,当 estimate_num_groups() 错误地返回一个远低于实际唯一值数量的值时,情况会变得糟糕。如果发生这种情况,那么我们可能会使用带有结果缓存的嵌套循环连接,而不是其他连接类型,例如合并连接或哈希连接。我们已知的唯一值估计存在问题,因此在这里额外的依赖可能会导致规划器选择比之前的功能更慢的计划。当已连接多个表或 WHERE 子句过滤掉与我们正在估计的唯一值数量相关的表达式集时,唯一值估计也相当难以准确估算。目前,我们在查询规划期间为结果缓存进行的成本计算相当依赖于唯一值估计的准确性。当这些估计准确时,我们通常会看到包含结果缓存的计划执行速度更快。然而,在实际情况中,我们可能会发现我们需要更改成本计算,以减少对唯一值估计准确性的信任,甚至可能默认禁用此功能。当我们教查询规划器执行新技巧时,它可能会错误地使用该技巧并导致回归,这总是有风险的。用户可以通过使用 enable_resultcache GUC 将该功能关闭来获得旧的行为。目前,此功能默认启用。是否会为此版本保留该设置还有待观察。此外,“Result Cache”这个名称是我在开始编写此补丁时能想到的最好的名称。似乎没有人强烈反对这个名称。有些人确实提出了其他名称,但在关于名称的简短讨论中,似乎没有哪个名称占主导地位。让我们通过 Beta 测试期看看当前名称是否能让足够多的人满意。如果有关于更好名称的共识,我们可以在发布前更改它。请参阅下面的第二个讨论链接,了解关于“Result Cache”名称的讨论。作者:David Rowley 审阅者:Andy Fan, Justin Pryzby, Zhihong Yu, Hou Zhijie 测试者:Konstantin Knizhnik 讨论:https://postgr.es/m/CAApHDvrPcQyQdWERGYWx8J%2B2DLUNgXu%2BfOSbQ1UscxrunyXyrQ%40mail.gmail.com 讨论:https://postgr.es/m/CAApHDvq=yQXr5kqhRviT2RhNKwToaWr9JAN5t+5_PzhuRJ3wvg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9eacee2e62d89cab7b004f97c206c4fba4f1d745

  • 尝试修复不稳定的 Result Cache 回归测试。force_parallel_mode = regress 导致比我预想的更多问题。似乎 leader 和单个 worker 都可以参与执行。我错误地认为只有 worker 进程会做任何工作。由于哪个进程有机会处理计划并不确定,因此最好为这些测试禁用 force_parallel_mode。至少这样做似乎比切换到仅 EXPLAIN 而不是 EXPLAIN ANALYZE 要好。此外,我忽略了一个事实,即 Result Cache 下方子计划的执行次数将取决于缓存驱逐。32 位机器将使用更少的内存并从缓存中驱逐更少的元组。这导致子节点在 32 位机器上执行的次数更少。我们将在每个节点中将循环次数清零。 https://git.postgresql.org/pg/commitdiff/a4fac4ffe8f8d543a10ac7debf1157e34963ece3

  • 删除 Result Cache 代码中无用的断言。测试一个无符号变量是否 >= 0 是没有意义的。remove_cache_entry() 中有足够的代码可以在启用断言的构建中验证缓存内存计数是正确的。即使这些断言检查的是有符号变量的 >= 0,它们也没有增加太多覆盖。报告者:Andres Freund 讨论:https://postgr.es/m/20210402204734.6mo3nfacnljlicgn@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1267d9862fc6a4f8cdc0ca38d1988b61f39da585

Peter Geoghegan 提交

Peter Eisentraut 提交

Andrew Dunstan 推送

Álvaro Herrera 提交

Etsuro Fujita 推送

Amit Kapila 提交

Tom Lane 提交

  • 进一步调整 pg_dump 对 default_toast_compression 的处理。如 bbe0a81db 提交所示,来自 v14 之前的服务器的 pg_dump 有效地表现得如同您使用了 --no-toast-compression。我认为更合适的是让它表现得好像 default_toast_compression 被设置为 "pglz",这样就可以保留表的 toast 压缩行为。如果您想要这种行为,仍然可以通过指定该开关来实现。讨论:https://postgr.es/m/1112852.1616609702@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/54bb91c30e3964fd81059e6b02e377cc9dd2d64c

  • 移除 ExecARDeleteTriggers/ExecARUpdateTriggers 中的小效率问题。在检查 nodeModifyTable.c 时,我偶然发现,虽然它对 ExecBR*Triggers 和 ExecIR*Triggers 的调用受到测试是否有点相关触发器的保护,但它对 ExecAR*Triggers 的调用却不是;后者函数自己执行等效的测试。考虑到涉及更复杂的条件,这似乎是合理的,但不太合理的是,ExecAR* 函数在没有工作可做时也没有小心地不做任何工作。ExecARInsertTriggers 正确地做到了这一点,但另外两个函数都会强制创建一个查询可能没有用的槽。ExecARUpdateTriggers 此外还对该槽执行了一个通常无用的 ExecClearTuple()。在实际工作负载中,这可能都相当微小,但节省一个周期就是赢得一个周期。 https://git.postgresql.org/pg/commitdiff/65158f497a7d7523ad438b2034d01a560fafe6bd

  • 重构 UPDATE 和 DELETE 的计划和执行。此补丁进行了两组密切相关的更改:1. 对于 UPDATE,ModifyTable 节点的子计划现在只传递更改列的新值(即查询的 SET 子句中计算的表达式)以及行标识信息(如 CTID)。ModifyTable 必须重新获取原始元组,以合并未更改列的旧值。核心优点是,更改的列在继承或分区目标关系的所有表之间是统一的,而其他列可能不是。次要优点是,当 UPDATE 涉及连接时,需要传递到计划树的数据量较少。缺点当然是需要额外获取要更新的每个元组。然而,这在上下文中几乎是免费的;即使是输入输出的测试也不会显示它会增加总查询成本的百分之几。有时,将重新获取与 ModifyTable 为标记旧元组已死而必须进行的元组访问相结合会很有趣;但这需要大量重构,而且似乎不会带来太多好处,因此此补丁并未尝试这样做。2. 对于继承的 UPDATE/DELETE,我们现在不再为每个目标关系生成一个单独的子计划,而是生成一个子计划,它与 SELECT 的计划完全相同,然后在其之上附加 ModifyTable。为了让 ModifyTable 知道传入的行属于哪个目标关系,会向行标识信息添加一个 tableoid junk 列。这消除了 inheritance_planner() 这个糟糕的 hack,消除了在有许多不可剪枝的目标关系的情况下 O(N^2) 的规划成本和内存消耗。第 2 点当然需要第 1 点,这样子计划返回的非 junk 列才有一个统一的定义。但是,如果我们想保留在分区层次结构中同时拥有普通表和外部表的能力,我们就不能坚持行标识 junk 列的统一定义。由于让每个子表拥有自己的行标识列的扩展性不高,因此此补丁包含了将相似的行标识列合并到一个子计划结果列中的机制。特别地,我们可以通过假装它们是 RECORD 类型来将 FDW 用于行标识的整个行 Vars 合并到一个列中。(不过,实际的复合 Datums 仍然可以用表的行类型 OID 进行标记。)还有一些工作可以进一步优化此补丁中的残余效率问题,但现在可以提交了。FDW 作者应注意几项 API 更改:* AddForeignUpdateTargets() 的参数列表已更改,添加 junk 列到查询的方法也已更改。请改用 add_row_identity_var() 而不是直接操作解析树。您可能还想仔细考虑您添加的内容。* PlanDirectModify() 现在必须更努力地找到 ForeignScan 计划节点;如果外部表是分区层次结构的一部分,那么 ForeignScan 可能不是 ModifyTable 的直接子节点。请参阅 postgres_fdw 获取示例代码。* 要检查一个关系是否是目标关系,仅将其 relid 与 root->parse->resultRelation 进行比较已不再足够。相反,根据需要将其与 all_result_relids 或 leaf_result_relids 进行比较。Amit Langote 和 Tom Lane 讨论:https://postgr.es/m/CA+HiwqHpHdqdDn48yCEhynnniahH78rwcrv1rEX65-fsZGBOLQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/86dc90056dfdbd9d1b891718d2e5614e3e432f35

  • 改进一些与复制相关的错误消息的样式。将远程端的错误消息放在主错误字符串中,而不是将其归入 errdetail()。虽然如果远程端发送给我们一个非常长的错误消息,这可能会显得尴尬,但它更符合我们的消息样式指南,并且在 errdetail 可能被丢弃的情况下更有用。Peter Smith 讨论:https://postgr.es/m/CAHut+Ps-Qv2yQceCwobQDP0aJOkfDzRFrOaR6+2Op2K=WHGeWg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6197db5340b8154adce1c6d07f6d3325547429c1

  • 抑制 libpq_pipeline.c 中的编译器警告。一些编译器似乎担心 recv_step 可能不是定义的 enum 值之一。以不同于 9fb9691a8 中实现的方式来抑制关于未初始化 cmdtag 的警告。 https://git.postgresql.org/pg/commitdiff/522d1a89f8d7ed45681988c60bd0a687332a4023

  • 不要过早地将值挤入短整型。自 a4d75c86b 以来,一些 buildfarm 成员一直在警告 Assert(attnum <= MaxAttrNumber); 对于 attnum 是 AttrNumber 是无用的。我不确定从位图出来的值是否真的会超过 MaxAttrNumber,但我们似乎认为在 7300a6995 中是可能的。将中间变量恢复为 int,以便我们拥有与以前相同的溢出保护。 https://git.postgresql.org/pg/commitdiff/c545e9524dcfcfce25c370f584b31562e8d7a4b7

  • 在非断言构建中抑制编译器警告。根据 buildfarm。 https://git.postgresql.org/pg/commitdiff/8998e3cafa23632790787b8cc726998e84067259

  • 修复 pqTraceFormatTimestamp 中的可移植性和安全问题。消除 time_t 和 pg_time_t 之间的混淆;gettimeofday() 和 localtime() 都不处理后者。libpq 确实不应该使用 <pgtime.h>。使用 snprintf 而不是 sprintf,以确保我们不会溢出提供的缓冲区。(不太可能,但为了安全起见。)根据 buildfarm。 https://git.postgresql.org/pg/commitdiff/f1be740a991406d7885047beb971e1ff5dbe8b71

  • 修复 isprint() 的不可移植用法。我们必须将 <ctype.h> 函数的参数转换为 unsigned char,以避免 char 为有符号数时出现问题。说到这个,考虑到这是一个 <ctype.h> 函数,我们没有收到更多关于未包含该头文件的抱怨是相当令人惊讶的。根据 buildfarm。 https://git.postgresql.org/pg/commitdiff/9e20406dd847d0f8c1cbd803786c6d0ad33bcbdd

  • 重新考虑 pg_restore 检测归档文件格式的错误设计代码。尽管有清晰的注释指出 ReadHead() 和 _discoverArchiveFormat() 中重复的代码段需要同步,但它们没有同步:后者没有 bother 应用前者中的任何健全性检查。我们之所以错过这一点,部分原因是这些检查在常用的测试场景中不会失败,部分原因是如果两个段都执行(除了需要自动检测非可寻址 stdin 源的格式),这种疏忽就会被掩盖。然而,在这种满足所有这些要求的情况下——例如,尝试从不可寻址的 stdin 读取比支持的更新的归档格式——pg_restore 会错过版本检查,并且可能会转储核心或以其他方式行为异常。这一切都很荒谬,因为除了验证文件以 "PGDMP" 开头的那一行之外,似乎没有多少理由重复该逻辑。似乎有一个未记录的假设,即多个主要格式(足以需要单独的读取器模块)将共享自定义格式头的最初六个字段。这似乎不太可能,所以让我们通过删除 _discoverArchiveFormat() 中的重复逻辑来修复它。成功自动检测后,还删除无效的尝试将文件指针移回文件开头。这浪费了周期,并且意味着我们需要验证四种行为而不是两种。根据 Sergey Koposov 的 bug #16951。这个问题已经存在几十年了,所以回溯到所有支持的版本。讨论:https://postgr.es/m/16951-a4dd68cf0de23048@postgresql.org https://git.postgresql.org/pg/commitdiff/ec03f2df17a8ba5b431b34dd924e020a0be729f6

  • 重新考虑 SP-GiST 中按值传递的叶子 datums 的处理。SP-GiST 中的现有约定是,任何按值传递的数据类型都以 Datum 表示形式存储,即,即使 typlen 小于此,其宽度也为 sizeof(Datum)。对于前缀 datums 和内部(上层)元组中的节点标签 datums,这还可以,或者至少为时已晚,无法更改。但对于叶子 datums 来说,这是有问题的,因为我们更希望它们以 Postgres 标准的磁盘表示形式存储,这样我们就可以轻松地将叶子元组扩展为携带额外的“包含”列。然而,我相信我们可以就这样改变它。这将是一个不可接受的磁盘格式中断,但有两个重要的缓解因素:1. 似乎不太可能有任何 SP-GiST opclasses 使用按值传递的叶子数据类型。当然,核心中的任何一个都没有,codesearch.debian.net 也从未听说过。考虑到 SP-GiST 的优势,很难想象叶子级别的值既小又固定宽度。 (例如,如果你想用字节作为叶子级别的索引文本值,那么每个文本字符串都必须用每前导字节一个内部元组级别来表示,这将非常浪费空间并且访问速度很慢。你总是希望使用尽可能少的内部元组级别,并将尽可能多的内容保留在叶子值中。)2. 即使你有一个这样的索引,这个改变只会破坏大端机器上的东西。在小端机器上,Datum 格式的高位字节现在只会显得是对齐填充空间。所以,将代码更改为以其通常的磁盘形式存储按值传递的叶子 datums。内部元组 datums 不受影响。这是从一个更大的补丁中提取出来的,该补丁旨在支持“包含”列。我单独提交它以在我们的提交日志中可见。Pavel Borisov 和 Tom Lane,由 Andrey Borodin 审阅 讨论:https://postgr.es/m/CALT9ZEFi-vMp4faht9f9Junb1nO3NOSjhpxTmbm1UGLMsLqiEQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1ebdec8c03294e55a9fdb6e676a9e8de680231cc

  • 在 Windows 上也剥离错误消息中报告的文件名。提交 dd136052b 确立了一个策略,即错误消息 FILE 项应仅包含报告源文件的基本名称,以实现统一和简洁。我们现在注意到,一些 Windows 编译器在 FILE 字符串中使用反斜杠,因此也要在反斜杠处截断。这有望修复新 libpq_pipeline 测试模块的一些平台差异结果。讨论:https://postgr.es/m/3650140.1617372290@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/53aafdb9ff6a561c7dea0f428a7c168f2b7e0f16

  • 改进 psql 在编辑器未保存退出时的行为。在编辑之前的查询缓冲区时,如果编辑器在未修改临时文件的情况下退出,则清除查询缓冲区,而不是重新加载(可能重新执行)之前的查询缓冲区。这降低了意外重新执行您不打算执行的操作的可能性。同样,在 "\e file" 中,如果文件实际上未被修改,则不将其加载到查询缓冲区。在 "\ef" 和 "\ev" 中,如果没有进行更改,则清除查询缓冲区而不是将其加载到函数或视图定义中。我们未能调用编辑器或它返回非零状态的情况,都被视为与未修改文件的情况相同。Laurenz Albe,由 Jacob Champion 审阅 讨论:https://postgr.es/m/0ba3f2a658bac6546d9934ab6ba63a805d46a49b.camel@cybertec.at https://git.postgresql.org/pg/commitdiff/55873a00e3c3349664e7215077dca74ccea08b4d

  • 修复 SP-GiST 中属性类型和叶子存储类型之间的混淆。根据文档,传递给 opclass 配置函数的 attType(核心代码也依赖于它)是正在索引的堆列或表达式的类型。但实际上传递的是索引列存储的类型。这对于用户定义的 SP-GiST opclasses 没有区别,因为我们不允许使用 CREATE OPCLASS 的 STORAGE 子句,所以这两种类型是相同的。但是,不允许这样做是没有意义的,因为内置的 poly_ops opclass 的 opckeytype 与 opcintype 的值不同,并且如果您想进行有损存储,那么类型必须确实不同。(因此,执行有损存储的用户定义 opclasses 必须谎称索引中的类型。)因此,删除此限制,并确保在相关的地方使用输入列类型而不是 opckeytype。为了向后兼容现有的用户定义 opclasses,我们不能完全坚持指定的 leafType 与 STORAGE 子句匹配;而是添加一个 amvalidate() 警告,如果它们不匹配。还修复了一些仅在尝试返回索引条目而 attType 与 attLeafType 不同时才会出现的错误。这些错误没有被报告并不奇怪,因为这种差异的唯一常见原因是进行有损存储叶子值,从而使得索引扫描不可能。添加一个 src/test/modules 模块来测试 attType 与 attLeafType 不同但仍支持索引扫描的情况。讨论:https://postgr.es/m/3728741.1617381471@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ac9099fc1dd460bffaafec19272159dd7bc86f5b

Stephen Frost 已推送

Bruce Momjian 已推送

Michaël Paquier 提交

  • 为 pg_dump 添加 --extension 支持。指定后,只有匹配给定模式的扩展才会被包含在转储中。与 --table 和 --schema 类似,当使用 --strict-names 时,需要完全匹配。另外,与其他两个选项一样,此新选项不能保证依赖对象已被转储,因此恢复可能会在干净的数据库上失败。在 test_pg_dump/ 中添加了测试,通过一系列正面和负面案例,有或没有扩展内容添加到生成的转储中进行检查。作者:Guillaume Lelarge 审阅者:David Fetter, Tom Lane, Michael Paquier, Asif Rehman, Julien Rouhaud 讨论:https://postgr.es/m/CAECtzeXOt4cnMU5+XMZzxBPJ_wu76pNy6HZKPRBL-j7yj1E4+g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6568cef26e0f40c25ae54b8e20aad8d1410a854b

  • 修复 parsenodes.h 中的注释。CreateStmt->inhRelations 是 RangeVars 的列表,但注释对此不正确。作者:Julien Rouhaud 讨论:https://postgr.es/m/20210330123015.yzekhz5sweqbgxdr@nol https://git.postgresql.org/pg/commitdiff/7ef64e7e72a65f191fc2f7d4bbe220f53dd8d5de

  • 将一些客户端特定例程从 SSLServer 移动到 PostgresNode。test_connect_ok() 和 test_connect_fails() 一直是 SSL 测试的一部分,并检查连接到后端是否应该成功或失败,并且如果连接失败,libpq 会丢弃一些特定的错误模式的健全性检查。这在两个方面都根本错误。首先,SSLServer.pm 主要用于设置和更改 PostgresNode 的 SSL 配置,与客户端无关。其次,鉴于 b34ca595,情况变得更糟,SSL 测试将通过使用 psql 命令结束,该命令可能不来自节点设置的同一安装。此提交将这些客户端例程移至 PostgresNode,从而更容易重构 SSLServer 以使其更了解 SSL 实现。 LDAP、Kerberos 和认证测试套件也可以重用它进行连接检查,并且后续的补丁应该扩展这些接口以匹配后端日志模式。作者:Michael Paquier 审阅者:Andrew Dunstan, Daniel Gustafsson, Álvaro Herrera 讨论:https://postgr.es/m/YGLKNBf9zyh6+WSt@paquier.xyz https://git.postgresql.org/pg/commitdiff/0d1a33438d3a88938264e12e94c22818307d2f4d

  • 文档:澄清 ACCESS EXCLUSIVE 锁在各个部分的使用。文档的某些部分使用“独占锁”来描述在给定操作期间获取 ACCESS EXCLUSIVE 锁。这可能会让读者感到困惑,因为 EXCLUSIVE 锁允许 ACCESS SHARE,但对于那些部分描述的情况则不然。作者:Greg Rychlewski 讨论:https://postgr.es/m/CAKemG7VptD=7fNWckFMsMVZL_zzvgDO6v2yVmQ+ZiBfc_06kCQ@mail.gmail.com 回溯到:9.6 https://git.postgresql.org/pg/commitdiff/ffd3391ea94165fbb5adc9534894c62d41138505

  • 提高 reloptions.sql 中 vacuum_truncate 测试的稳定性。该测试一直使用简单的 VACUUM 和 pg_relation_size() 来检查关系是否被物理截断,但忘记了某些并发活动(如检查点缓冲区写入)可能会导致某些页面被跳过。第二个启用 vacuum_truncate 的测试可能会失败,因为它看到了一个非空关系。第一个测试不会失败,但最终可能测试的行为与预期不符。两个测试都获得了 FREEZE 选项,以使 vacuum 更具侵略性并防止页面跳过。这与 c2dc1a7 中修复的问题类似。作者:Arseny Sher 审阅者:Masahiko Sawada 讨论:https://postgr.es/m/87tuotr2hh.fsf@ars-thinkpad 回溯到:12 https://git.postgresql.org/pg/commitdiff/fe246d1c111d43fd60a1b0afff25ed09b7ae11eb

  • doc: 澄清如何生成非排他备份的文件。当前关于如何编写 backup_label 和 tablespace_map 文件的说明令人困惑。例如,在 Windows 上以文本模式打开文件并复制粘贴文件内容,由于生成了额外的 CRLF 字符,将导致恢复失败。文档没有明确说明这一点,并且根据讨论,这种情况不被认为是支持的场景。此提交扩展了文档,说明可能需要在写入数据之前以二进制模式打开文件。Reported-by: Wang Shenhao Author: David Steele Reviewed-by: Andrew Dunstan, Magnus Hagander Discussion: https://postgr.es/m/8373f61426074f2cb6be92e02f838389@G08CNEXMBPEKD06.g08.fujitsu.local Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/6fb66c268df2de1112cac3cf0a6cf0a8b96ceaf0

  • 重构 HMAC 实现。与 cryptohash 实现类似,此提交将现有的 HMAC 代码重构为一组 API,可以与 PostgreSQL 构建时支持的任何加密库(目前仅 OpenSSL)进行插件式集成。如果不存在此类库,则提供了一个备用实现。这些新 API 的设计与现有的 cryptohash 层类似,因此这里没有真正的新设计,只包含关于缓冲区边界检查和内存处理的相同逻辑。HMAC 依赖于 cryptohashes,因此 cryptohash{_openssl}.c 支持的所有 cryptohash 类型都可以与 HMAC 一起使用。此重构的主要优势在于 SCRAM,它包含了自己的 SHA256 HMAC 实现,而无需依赖现有的加密库,即使 PostgreSQL 是使用其支持构建的。此代码已在 Windows 和 Linux 上进行测试,有或没有 OpenSSL,覆盖了 HEAD 中从 1.1.1 到 1.0.1 的所有支持版本。我还通过使用一些示例结果、我自己的自定义扩展以及通过 SCRAM 与客户端和后端在不同主版本之间的交叉检查,确认了实现的正常工作。Author: Michael Paquier Reviewed-by: Bruce Momjian Discussion: https://postgr.es/m/X9m0nkEJEzIPXjeZ@paquier.xyz https://git.postgresql.org/pg/commitdiff/e6bdfd9700ebfc7df811c97c2fc46d7e94e329a2

  • 在 SSL TAP 测试中使用更详细的匹配模式来匹配错误。src/test/ssl/ 的 TAP 测试使用了一些通用的匹配模式来检查一些失败场景,例如“SSL error”或仅仅是“FATAL”。这些是在 081bfc1 中引入的。这些消息本身并没有错,但当集成新的 SSL 库时,很难知道这些错误是否合法,并且现有场景可能会以不正确的方式失败。此提交通过添加 OpenSSL 生成的信息,使所有这些消息更加详细。幸运的是,HEAD 支持的所有版本都使用相同的错误消息(在运行从 1.0.1 到 1.1.1 的测试后进行了检查),因此更改是直接的。Reported-by: Jacob Champion, Álvaro Herrera Discussion: https://postgr.es/m/YGU3AxQh0zBMMW8m@paquier.xyz https://git.postgresql.org/pg/commitdiff/8d3a4c3eae5367fba60ab77c159814defba784fe

Noah Misch 推送

Joe Conway 推送

  • 修复 has_column_privilege 函数的边界情况。根据注释,当向 has_column_privilege() 传递无效或已删除的列 oid 时,意图一直是返回 NULL。但是,当调用者具有表级别权限时,由于首先检查了表权限,因此永远不会发现无效/丢失的列。通过引入 pg_attribute_acl(check|mask) 和 pg_class_acl(check|mask) 的扩展版本来解决此问题,这些版本接受一个新参数 is_missing。当 is_missing 为 NULL 时,保留旧行为。但当调用者传递 is_missing 时,不会为已删除或丢失的列/关系抛出 ERROR,并且 is_missing 被翻转为 true。这反过来允许 has_column_privilege 首先检查列权限,从而提供所需的语义。不向后移植,因为它是一个用户可见的行为更改,以前没有投诉,并且修复有点侵入性。Author: Joe Conway Reviewed-By: Tom Lane Reported by: Ian Barwick Discussion: https://postgr.es/m/flat/9b5f4311-157b-4164-7fe7-077b4fe8ed84%40joeconway.com https://git.postgresql.org/pg/commitdiff/b12bd4869b5e64b742a69ca07915e2f77f85a9ae

  • 澄清 RESET ROLE 文档。命令行选项或先前的“ALTER (ROLE|DATABASE) ... SET ROLE ...”命令可以更改会话默认角色的值。在存在其中一个的情况下,RESET ROLE 将当前用户标识更改为默认角色,而不是会话用户标识。修复文档以反映这一现实。向所有支持的版本回溯。Author: Nathan Bossart Reviewed-By: Laurenz Albe, David G. Johnston, Joe Conway Reported by: Nathan Bossart Discussion: https://postgr.es/m/flat/925134DB-8212-4F60-8AB1-B1231D750CB4%40amazon.com Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/174edbe9f9c1538ab3347474e96d176223591cd1

Heikki Linnakangas 提交

  • 为编码转换函数添加 'noError' 参数。使用 'noError' 参数,您可以在不知道字符边界的情况下尝试转换缓冲区。现在函数需要返回成功转换的输入字节数。这是一个向后不兼容的更改,如果您使用 CREATE CONVERSION 创建了自定义编码转换。这会在 pg_upgrade 中添加一个检查,如果存在任何用户定义的编码转换,则拒绝升级。自定义转换非常罕见,我不知道有任何常用的扩展会使用此功能。没有其他对象可以依赖转换,因此如果您有一个,可以在升级前轻松删除它,并在升级后使用更新的版本重新创建它。为内置编码转换添加回归测试。这并不涵盖所有转换,但它涵盖了 conv.c 中用于实现转换的所有内部函数。Reviewed-by: John Naylor Discussion: https://postgresql.ac.cn/message-id/e7861509-3960-538a-9025-b75a61188e01%40iki.fi https://git.postgresql.org/pg/commitdiff/ea1b99a6619cd9dcfd46b82ac0d926b0b80e0ae9

  • 以更大的块进行 COPY FROM 编码转换/验证。这通过减少转换/验证函数的调用次数并允许其处理更大的输入,带来了小幅性能提升。此外,重新组织输入管道使并行解析输入更容易:在将输入转换为数据库编码后,可以并行进行下一阶段的换行符查找,因为在我们支持的服务器编码中,多字节字符中不会嵌入换行符。这改变了一个边界情况的行为:如果客户端和服务器编码是相同的单字节编码(例如 latin1),以前输入不会被检查零字节('\0')。任何包含零字节的字段都会在零处截断。但如果需要编码转换,转换例程会在零处抛出错误。此提交后,输入始终会被检查零字节。Reviewed-by: John Naylor Discussion: https://postgresql.ac.cn/message-id/e7861509-3960-538a-9025-b75a61188e01%40iki.fi https://git.postgresql.org/pg/commitdiff/f82de5c46bdf8cd65812a7b04c9509c218e1545d

Robert Haas 提交

Fujii Masao 提交

Thomas Munro 推送

Andres Freund 提交

  • 将 wait event 相关代码从 pgstat.[ch] 分离到 wait_event.[ch]。wait event 相关代码独立于 pgstat.[ch] 的其余部分, nontrivial 且频繁更改。将其放入自己的文件集中。由于似乎没有一个好的预先存在的目录来存放此类代码,因此添加了 src/backend/utils/activity。Reviewed-By: Robert Haas robertmhaas@gmail.com Discussion: https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/a333476b925134f6185037eaff3424c07a9f466f

  • 不依赖 pgstat.h 来间接包含 storage/ 头文件。即将到来的补丁可能会删除(现在是间接的)proc.h 包含(它又包含其他头文件),并且修改后的文件直接包含其依赖项会更清晰…… Discussion: https://postgr.es/m/20210402194458.2vu324hkk2djq6ce@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1d9c5d0ce2dcac05850401cf266a9df10a68de49

  • 将后端状态和进度相关功能从 pgstat.c 分离出去。后端状态(支持 pg_stat_activity)和命令进度(支持 pg_stat_progress*)相关代码在很大程度上独立于 pgstat.[ch] 的其余部分(支持累积数据的视图,如 pg_stat_all_tables)。另请参阅 a333476b925。此提交不重命名函数名以使与 pgstat_其余部分的区别更清晰 - 这会更具侵入性且不明显有益。如果我们将来决定进行此类重命名,最好将其与代码移动分开进行。Robert 的审查是早期版本。Reviewed-By: Robert Haas robertmhaas@gmail.com Discussion: https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/e1025044cd4e7f33f7304aed54d5778b8a82cd5d

  • 提高 wait event 报告的效率,移除 proc.h 依赖。pgstat_report_wait_start() 和 pgstat_report_wait_end() 到目前为止需要两个条件分支。一个用于检查 MyProc 是否为 NULL,另一个用于检查 pgstat_track_activities 是否设置。由于 wait events 用于相对轻量级的操作,并且是内联的(降低了分支预测器的有效性),这并不理想。对 MyProc 的依赖有第二个缺点:低级子系统,如 storage/file/fd.c,报告 wait events,但从架构上来说,它们最好不要依赖于像 proc.h(定义 PGPROC)这样的进程间子系统。在此更改之后,包含 pgstat.h(以及显而易见的其子组件,如 backend_status.h、wait_event.h 等)将不再拉入 IPC 相关头文件。这些目标(效率和抽象)通过使 pgstat_report_wait_start/end() 不与 MyProc 交互,而是使用新的 my_wait_event_info 变量来实现。在后端启动时,它指向一个局部变量,消除了检查 MyProc 是否为 NULL 的需要。在进程初始化期间,my_wait_event_info 被重定向到 MyProc->wait_event_info。在关闭时,这被逆转。由于 wait event 报告现在不需要知道 wait event 存储在哪里,因此它不需要知道 PGPROC。移除检查 pgstat_track_activities 的分支更简单:不再检查。由于分支而产生的成本通常高于存储成本,即使不是,pgstat_track_activities 也很少被禁用。现在提交这项工作的主要动机是,从 pgstat.h 中移除(间接的)pgproc.h 包含简化了将统计信息报告移至共享内存的补丁(该补丁仍有可能在 14 中发布)。Author: Andres Freund andres@anarazel.de Discussion: https://postgr.es/m/20210402194458.2vu324hkk2djq6ce@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/225a22b19ed2960acc8e9c0b7ae53e0e5b0eac87

Tomáš Vondra 提交了

待处理补丁

James Hilliard 发送了另一个补丁修订版,用于修复 OSX 的 preadv/pwritev 支持检测。

Mark Rofail 发送了另一个补丁修订版,用于实现外键数组。

Tomáš Vondra 发送了一个补丁,通过新的子命令 ANALYZE (MERGE) 来合并来自子关系(child relations)的统计信息。

Zeng Wenjing 发送了另一个版本的补丁,用于实现全局临时表。

Marcus Wanner 发送了另外四个补丁修订版,用于向输出插件的 filter_prepare 回调添加一个 xid 参数。

Euler Taveira de Oliveira 发送了另一个补丁修订版,用于为逻辑复制添加由 WHERE 子句指定的行过滤。

Peter Smith 发送了另一个补丁修订版,用于为内置逻辑复制添加对预备事务(prepared transactions)的支持。

Arne Roland 发送了另外两个补丁修订版,用于使 ALTER TRIGGER ... RENAME TO 在分区表上生效。

Tang 发送了一个补丁,用于更新 nbtsearch.c 的版权年份。

Paul Guo 发送了另一个补丁修订版,用于支持从带有表空间(tablespaces)的备份中初始化节点,修复在备机上重放创建数据库记录,以及修复数据库创建/删除 WAL 描述。

Masahiro Ikeda 发送了另外两个补丁修订版,用于加速 WAL 统计信息的报告。

Daniil Zakhlystov 发送了另外两个补丁修订版,用于添加 zlib 和 zstd 流式压缩,并实现 libpq 压缩。

Atsushi Torikoshi 和 Fujii Masao 互换了补丁,以获取任意后端进程的内存上下文。

John Naylor 发送了两个补丁修订版,用于记录最近添加的 date_bin() 函数。

Dean Rasheed 和 Fabien COELHO 互换了补丁,向 pgbench 添加了一个伪随机排列函数。

Isaac Moreland 发送了一个补丁,添加了一个 abs(interval) 函数以及相关的 @ 运算符。

Kyotaro HORIGUCHI 发送了一个补丁,使 box 类型的描述更清晰。

Vigneshwaran C 发送了另一个补丁修订版,用于在预备事务锁定了系统表/用户目录表时使其失败。

Douglas Hirn 发送了另一个补丁修订版,允许在 WITH RECURSIVE 中使用多个线性递归自引用。

Sait Talha Nisanci 发送了一个补丁,旨在修复一个表现为 record_type_typmod_compare 崩溃的 bug。

Tomáš Vondra 发送了一个补丁,使用扩展统计信息来改进连接(join)估算。

Stephen Frost 发送了另一个补丁修订版,用于将默认角色(default roles)重命名为预定义角色(predefined roles)。

Vigneshwaran C 发送了三个补丁修订版,用于处理复制槽统计信息被覆盖的问题,并向复制统计信息添加总事务数和总事务字节数。

Peter Geoghegan 发送了另外两个补丁修订版,用于简化 VACUUM 管理的状态,重构 lazy_scan_heap(),从 vacuumlazy.c 中移除 tupgone 特殊情况,在 VACUUM 时截断行指针数组,并在某些情况下绕过索引 vacuuming。

Peter Geoghegan 和 Matthias van de Meent 互换了补丁,用于在页面有尾部未使用的 ItemIds 时截断页面的行指针数组,并在 PageRepairFragmentation 中清除空闲页面空间。

Tang 发送了另一个补丁修订版,用于在 psql 中支持对大写字符输入的查询结果进行 tab 补全。

Fujii Masao 发送了另一个补丁修订版,用于修复 walreciever 中的断言失败。

John Naylor 发送了另一个补丁修订版,用两个更快的实现替换 pg_utf8_verifystr():一个用于使用 SSE-4.1 指令集的 Intel 类处理器,另一个使用自定义的备用函数,而不是依赖 pg_utf8_verifychar() 和 pg_utf8_isvalid() 的函数。

Peter Eisentraut 发送了另一个补丁修订版,将 EXTRACT 的返回类型更改为 numeric。

Stephen Frost 发送了一个补丁,添加了 pg_read_all_data 和 pg_write_all_data 角色。

Thomas Munro 发送了一个补丁,在 OpenBSD 上使用 POSIX_NAMED_SEMAPHORES。

Fujii Masao 和 Bharath Rupireddy 互换了补丁,为 postgres_fdw 添加了一个服务器级别选项 keep_connections,以不缓存连接。

Heikki Linnakangas 发送了一个补丁,通过强制前瞻来简化 COPY FROM 解析。

Daniel Gustafsson 发送了另外两个补丁修订版,用于支持 NSS 作为 libpq TLS 后端。

Yuzuko Hosoya 和 Álvaro Herrera 互换了补丁,以修复分区表上的 autovacuum。

Bharath Rupireddy 发送了一个补丁,在分区表的持久性(persistence)被更改时发出警告。

Amit Langote 发送了另一个补丁修订版,用于在分区表上也创建外键触发器,并使用相同的触发器在跨分区更新期间正确强制执行外键。

Euler Taveira de Oliveira 发送了另一个补丁修订版,用于重构 parse_output_parameters 函数,使其使用封装所有 pgoutput 选项的 PGOutputData 结构而不是多个参数,并使用该结构将逻辑解码消息支持添加到 pgoutput。

Peter Eisentraut 发送了另一个补丁修订版,实现了 SQL 标准的函数体。

Justin Pryzby 发送了另一个补丁修订版,实现了分区表的 CLUSTER。

Amit Langote 发送了另外两个补丁修订版,用于导出 get_partition_for_tuple(),并使用它来避免对某些 RI 检查使用 SPI。

Julien Rouhaud 发送了另外三个补丁修订版,用于将 pg_stat_statements 的查询打乱(jumbling)移到核心,并使用它在 pg_stat_activity、log_line_prefix 和 verbose explain 中暴露 queryid。

Joel Jacobson 发送了一个补丁,添加了一个 MotD 函数。

Bharath Rupireddy 发送了另一个补丁修订版,实现了 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION ...

Erik Rijkers 发送了另一个补丁修订版,修复了一个过时的、令人困惑的 JSON 示例。

Kazutaka Onishi 发送了六个补丁修订版,实现了对外部表(foreign tables)的 TRUNCATE 操作。

Thomas Munro 发送了另一个补丁修订版,为 SLRUs 添加了一个缓冲区映射表,并使所有 SLRU 缓冲区大小可配置。

Takamichi Osumi 发送了另外两个补丁修订版,用于保护归档恢复不丢失数据。当在归档恢复期间检测到使用 wal_level=minimal 生成的 WAL 时,此补丁会禁用服务器启动。无论 EnableHotStandby 的值如何,都应该这样做,因为我们认为 wal_level=minimal 时期不会发生。此补丁的动机是保护用户最终在备用模式下获得可能丢失数据的副本,并在恢复模式下获得丢失数据的服务器。

Amit Langote 发送了另一个补丁修订版,用于延迟设置 ForeignScanState.resultRelInfo,并延迟初始化结果关系信息。

Justin Pryzby 发送了一个补丁,将 track_activity_query_size 设为 STATS_COLLECTOR 类别,确保 log_autovacuum_min_duration 为 LOGGING_WHAT,将 track_commit_timestamp 设为 REPLICATION_SENDING,并将 force_parallel_mode 改为 DEVELOPER GUC,并从示例配置中移除它。

Pavel Stěhule 提交了另一个修订版的补丁,以实现模式变量。

Anton Voloshin 发送了一个补丁,修复了 collationcmds.c 中的一个拼写错误。

Zhihong Yu 发送了一个补丁,移除了 AttrDefaultFetch 中一个未使用的变量。

Amit Langote 发送了另一个版本的补丁,允许在跨分区更新期间批处理插入。

Anton Voloshin 发送了一个补丁,在 icu_convert_case() 中使用 repalloc() 而不是 palloc(),因为相关的结构可能已经被 palloc() 了。

Tom Lane 发送了一个补丁,修复了一些 adbin 不一致的地方。