本周人物:https://postgresql.life/post/jan_karremans/
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
https://archives.postgresql.org/pgsql-jobs/2021-04/
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 提交
在 strings 测试中重置 standard_conforming_strings。在一些与 standard_conforming_strings 行为相关的测试之后,该值没有重置为默认值。因此,该文件中的其余测试以非默认设置运行,这影响了一些测试的结果。为了清晰起见,重置该值并再次以默认设置运行其余测试。 https://git.postgresql.org/pg/commitdiff/ebedd0c78fc51c293abe56e99a18c67af14da0c9
添加 unistr 函数。这允许使用 Unicode 转义序列解码字符串。它类似于 Unicode 转义字符串,但提供了更多灵活性。作者:Pavel Stehule pavel.stehule@gmail.com 审阅者:Asif Rehman asifr.rehman@gmail.com 讨论:https://postgresql.ac.cn/message-id/flat/CAFj8pRA5GnKT+gDVwbVRH2ep451H_myBt+NTz8RkYUARE9+qOQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f37fec837ce8bf7af408ba66d32099e5a0182402
稍微清理 date_part 测试。一些 timestamp 和 timestamptz 的测试在 date.sql 测试文件中。将它们移动到适当的文件,或删除已存在于那里的测试用例。 https://git.postgresql.org/pg/commitdiff/efcc7572f532ea564fedc6359c2df43045ee7908
为 timestamp 和 timestamptz 类型添加上限测试。现有的回归测试仅测试了 timestamp 和 timestamptz 类型支持范围的下限,因为“整数和浮点时间戳之间的上限不同,因此没有检查”。由于这已过时,因此添加了类似的上限测试。 https://git.postgresql.org/pg/commitdiff/bc9f1afdebc98b490d0a00468d75e8e4d080afb0
为接近时间戳范围上限的 epoch 的 date_part 添加测试。这测试了 date_part('epoch', timestamp[tz]) 实现中的一个特殊情况,以前未被测试过。 https://git.postgresql.org/pg/commitdiff/6131ffc43ff3d2f566e93f017e56a09e4e717318
文档:从 unistr 示例中删除西里尔语。PDF 构建目前不支持,所以我们不使用它。 https://git.postgresql.org/pg/commitdiff/287d2a97c1de07486e4525c8ad06258f04bd6268
添加 errhint_plural() 函数并使用它。类似于现有的 errmsg_plural() 和 errdetail_plural()。一些 errhint() 调用尚未得到适当的复数处理。 https://git.postgresql.org/pg/commitdiff/91c5a8caaa61055959aa5fb68a00e5f690e39a34
将 p_names 字段添加到 ParseNamespaceItem。ParseNamespaceItem 曾假设 p_rte->eref 描述了 nsitem 暴露的表和列别名。通过在 nsitem 中创建单独的 p_names 字段来放松此限制。这主要是为 JOIN USING 别名的一个补丁做准备,但它可以在常见代码路径中节省一次间接引用,因此它可能本身就有好处。作者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgresql.ac.cn/message-id/785329.1616455091@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/66392d396508c91c2ec07a61568bf96acb663ad8
允许将别名附加到 JOIN ... USING。这允许类似 SELECT ... FROM t1 JOIN t2 USING (a, b, c) AS x 的语法,其中 x 具有 a、b、c 列,并且与常规别名不同,它不会隐藏被连接的表 t1 和 t2 的范围变量。根据 SQL:2016 功能 F404“公共列名的范围变量”。审阅者:Vik Fearing vik.fearing@2ndquadrant.com 审阅者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgresql.ac.cn/message-id/flat/454638cf-d563-ab76-a585-2564428062af@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/055fee7eb4dcc78e58672aef146334275e1cc40d
使 extract(timetz) 测试更有趣。使用带有非零分钟的时区偏移量,使 timezone_minute 测试有意义。 https://git.postgresql.org/pg/commitdiff/e2639a767bfa1afebaf1877515a1187feb393443
修复 extract(timezone_minute) 的内部公式。通过多年的各种重构,extract(timezone_minute from time with time zone) 和 extract(timezone_minute from timestamp with time zone) 的实现,通过互换使用 SECS_PER_MINUTE 和 MINS_PER_HOUR,最终产生了两个相同但同样不合理的公式。当然,这两个数字是相同的,所以公式是有效的,但为了提高可读性,我们将其修复为语义上正确的。 https://git.postgresql.org/pg/commitdiff/91e7c903291116bd081abe7d4a058d40a2a06e16
为 eval_const_expressions 添加 NullIfExpr 支持。作者:Hou Zhijie houzj.fnst@cn.fujitsu.com 讨论:https://postgresql.ac.cn/message-id/flat/7ea5ce773bbc4eea9ff1a381acd3b102@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/9c5f67fd6256246b2a788a8feb1d42b79dcd0448
Andrew Dunstan 推送
允许匹配客户端证书的 DN 以进行身份验证。目前我们只识别证书主题的通用名(CN)来匹配用户名。因此,主题为 '/OU=eng/CN=fred' 和 '/OU=sales/CN=fred' 的证书将具有相同的连接权限。此补丁提供了一个选项来匹配整个专有名称(DN),而不是仅仅匹配 CN。在任何使用客户端证书身份的 hba 行中,都有一个 'clientname' 选项,其值可以是 'DN' 或 'CN'。默认值是 'CN',即当前过程。DN 与 RFC2253 格式的 DN 进行匹配,该格式如下所示:'CN=fred,OU=eng'。这个功能可能最好与 ident map 结合使用。讨论:https://postgr.es/m/92e70110-9273-d93c-5913-0bccb6562740@dunslane.net 审阅者:Michael Paquier, Daniel Gustafsson, Jacob Champion https://git.postgresql.org/pg/commitdiff/6d7a6feac48b1970c4cd127ee65d4c487acbb5e9
修复 6d7a6feac4 中的拼写错误。根据 Daniel Gustafsson 的抱怨 https://git.postgresql.org/pg/commitdiff/1877c9ac3acc05cc787dd6392d073202f8c8ee21
Álvaro Herrera 提交
psql:在打印之前调用 clearerr()。我们从未对输出流调用 clearerr(),这会导致在看到 EOF 后,每个结果打印一条消息:无法打印结果表:成功。此消息由提交 b03436994bcc(在 pg13 时代)添加;在此之前,错误指示符从未被检查过。因此,仅回溯到该提交,即使实际的错误(即,错误指示符从未被清除的事实)是更早的。 https://git.postgresql.org/pg/commitdiff/8d645a116ef6e04bfb03e259149b8e163dbdf50c
改进 PQtrace() 的输出格式。将 PQtrace 输出格式从其古老(且大多无用)的字节级输出格式转换为逻辑消息级输出,使其更易于使用。此实现允许代码(如实所写)通过查看协议文档来编写,这更能令人信服地证明这三者(文档、跟踪代码和实际代码)实际匹配。作者:岩田 彩 (Aya Iwata) iwata.aya@fujitsu.com 审阅者:綱川 貴之 (Takayuki Tsunakawa) tsunakawa.takay@fujitsu.com 审阅者:Kirk Jamison k.jamison@fujitsu.com 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Tom Lane tgl@sss.pgh.pa.us 审阅者:黒田 隼人 (Hayato Kuroda) kuroda.hayato@fujitsu.com 审阅者:“Nagaura, Ryohei” nagaura.ryohei@jp.fujitsu.com 审阅者:Ryo Matsumura matsumura.ryo@fujitsu.com 审阅者:Greg Nancarrow gregn4422@gmail.com 审阅者:Jim Doty jdoty@pivotal.io 审阅者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/71E660EB361DF14299875B198D4CE5423DE3FBA4@g01jpexmbkw25 https://git.postgresql.org/pg/commitdiff/198b3716dba68544b55cb97bd120738a86d5df2d
libpq_pipeline:添加 PQtrace() 支持和测试。由提交 acb7e4eb6b1c 最近引入的 libpq_pipeline 程序非常适合测试 PQtrace() 功能,因此我们让它来实现这一点。作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20210327192812.GA25115@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/7bebd0d00998a28449d83376f4bcdeec65d5eea6
修复 libpq_pipeline 的一些测试问题。pipeline_abort 测试在一个模式下没有检查它是否收到了预期的行数;我们现在让它这样做。这并没有解决实际问题(我们仍然不知道是什么问题),但至少它应该比仅在跟踪输出中可见的区别更明显。在此期间,修复了测试中的其他不妥之处:* 我颠倒了 like() 中结果和预期值的顺序。* 来自 -t 的输出跟踪被放在了 log 目录中,这意味着 buildfarm 脚本无用地捕获了它们。将它们放在单独的 tmp_check/traces 目录中,以避免弄乱 buildfarm 结果。* pipelined_insert 测试使用了过多的行数。稍微减少行数并添加一个填充列,使每个插入都稍微庞大一些,同时仍然足够多,可以填满一个缓冲区并迫使我们切换模式。 https://git.postgresql.org/pg/commitdiff/db973ffb3ca43e65a0bf15175a35184a53bf977d
在 libpq_pipeline 中禁用 force_parallel_mode。一些使用 force_parallel_mode=regress 的 buildfarm 动物测试失败,因为错误比成功的行更快地报告。借此机会将 lc_messages 的 SET 移出跟踪部分,因为它不太有趣。诊断者:Tom Lane tgl@sss.pgh.pa.us 讨论:https://postgr.es/m/3304521.1617221724@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a6d3dea8e5e0c8a0df2f95d66b6c3903a4354ca0
创建连接时将 conn->Pfdebug 初始化为 NULL。未能这样做可能导致崩溃,并且我怀疑这正是 buildfarm 成员报告神秘失败的原因。这是一个古老的 bug,但我不会回溯,因为显然没有人关心旧版本的 PQtrace。讨论:https://postgr.es/m/3333908.1617227066@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aba24b51cc1b045a9810458b4bb15fee2c182948
从 PQtrace() 中删除 setvbuf() 调用。它放错了地方——不是 libpq 的输出流可以那样调整。特别是,POSIX 说它必须在对文件进行任何其他操作之前调用,所以如果一个流以前被调用应用程序使用过,可能会发生糟糕的事情。为保险起见,将 setvbuf() 放在 libpq_pipeline 中。此外,将 libpq_pipeline.c 中的 fopen(..., "w+") 减少为 fopen(..., "w")。不清楚这是否解决了任何问题,但我们并没有在任何地方使用 w+。根据 Tom Lane 的抱怨。讨论:https://postgr.es/m/3337422.1617229905@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6ec578e60101c3c02533f99715945a0400fb3286
libpq_pipeline:必须 strdup(optarg) 以避免崩溃。我忘了在处理 argv[] 时 strdup()。显然,许多平台隐藏了此错误,但在那些没有的平台上,您可能会遇到程序崩溃。修复。根据 buildfarm 成员 drongo,它是 buildfarm 中唯一出现此问题的成员。同时,将“numrows”处理移出特殊情况的范围,并将其作为 getopt 的 -r。 (类似的事情也可以应用于 'conninfo',但当前程序的使用不值得花费时间——在其他地方我们没有以如此简单的方式使用 conninfo。)讨论:https://postgr.es/m/20210401124850.GA19247@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/dde1a35aee6266dc8105717275335c46cd2b3650
修复 libpq_pipeline 中的 setvbuf() 引起的崩溃。Windows 不喜欢 setvbuf(..., _IOLBF),如果使用它会崩溃,这导致了 libpq_pipeline 一直以来的失败……我们的 port.h 早就知道这一点:它在该平台上提供了定义为 _IONBF 的 PG_IOLBF。遵循它的建议。同时,去掉了一个使用错误大小常量的伪位移。将常量装饰为 LL 以修复。同时,删除了一个无意义的加法,它只会使事情变得混乱。所有这些都由 Tom Lane 诊断。讨论:https://postgr.es/m/3458958.1617302154@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a68a894f0198aaeffa81b3027f135adcdaa8abf6
Etsuro Fujita 推送
更新过时的注释。回溯到所有支持的分支。作者:Etsuro Fujita 讨论:https://postgr.es/m/CAPmGK17DwzaSf%2BB71dhL2apXdtG-OmD6u2AL9Cq2ZmAR0%2BzapQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc2797ebb14bae663da1ee7845774dd98716c0d0
添加对异步执行的支持。这实现了异步执行,它会并发运行非并行感知 Append 的多个部分,而不是串行运行,以便在可能的情况下提高性能。目前,唯一可以并发运行的节点类型是作为此类 Append 的直接子节点的 ForeignScan。在这种情况下,如果这些 ForeignScans 访问不同的远程服务器的数据,它将并发运行这些 ForeignScans,并重叠执行的远程操作,从而提高性能,尤其是在操作涉及耗时的操作(如远程连接和远程聚合)时。将来,我们可能会将其扩展到其他节点类型,如 ForeignScans 上的连接或聚合。它还为 postgres_fdw 提供了支持,该支持由表级/服务器级选项“async_capable”启用。默认值为 false。Robert Haas, Kyotaro Horiguchi, Thomas Munro 和我。此提交主要基于 Robert Haas 提出的补丁,但也使用了 Kyotaro Horiguchi 提出的补丁和 Thomas Munro 提出的补丁中的内容。审阅者:Kyotaro Horiguchi, Konstantin Knizhnik, Andrey Lepikhov, Movead Li, Thomas Munro, Justin Pryzby 等。讨论:https://postgr.es/m/CA%2BTgmoaXQEt4tZ03FtQhnzeDEMzBck%2BLrni0UWHVVgOTnA6C1w%40mail.gmail.com 讨论:https://postgr.es/m/CA%2BhUKGLBRyu0rHrDCMC4%3DRn3252gogyp1SjOgG8SEKKZv%3DFwfQ%40mail.gmail.com 讨论:https://postgr.es/m/20200228.170650.667613673625155850.horikyota.ntt%40gmail.com https://git.postgresql.org/pg/commitdiff/27e1f14563cf982f1f4d71e21ef247866662a052
Amit Kapila 提交
为输出插件的 filter_prepare 回调添加 xid 参数。除了 gid,这提供了另一种识别事务的方法。使用 xid 以某种方式准备事务的用户可以使用它来过滤准备好的事务。后续的 COMMIT PREPARED 或 ROLLBACK PREPARED 命令会携带这两个标识符,从而允许输出插件选择使用哪个。作者:Markus Wanner 审阅者:Vignesh C, Amit Kapila 讨论:https://postgr.es/m/ee280000-7355-c4dc-e47b-2436e7be959c@enterprisedb.com https://git.postgresql.org/pg/commitdiff/f64ea6dc5c8ccaec9a3d3d39695ca261febb6883
文档:对 tablesync slots 使用一致的术语。文档的某些部分将它们称为 tablesync slots,而在其他地方则称为 table synchronization slots。为了保持一致,我们在所有地方都将它们称为 table synchronization slots。作者:Peter Smith 审阅者:Amit Kapila 讨论:https://postgr.es/m/CAHut+PvzYNKCeZ=kKBDkh3dw-r=2D3fk=nNc9SXSW=CZGk69xg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9f45631766bd0c51a74102770737ba3b0561977e
在 postgres_fdw 测试中删除多余的分号。作者:Suraj Kharage 审阅者:Bharath Rupireddy, Vignesh C 讨论:https://postgr.es/m/CAF1DzPWRfxUeH-wShz7P_pK5Tx6M_nEK+TkS8gn5ngvg07Q5=g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/13cb5bd84657ed49021fe6fc4ce46601c315c9a5
确保在检测到解码期间并发中止时发送 prepare。在解码已准备好的事务时,它可能会通过 ROLLBACK PREPARED 命令并发中止。在这种情况下,我们会在 WAL 中发现这种情况时跳过所有更改并直接发送 Rollback Prepared。然而,下游不知道此类事务的 GID。因此,即使检测到并发中止,也要确保发送 prepare。作者:Ajin Cherian 审阅者:Markus Wanner, Amit Kapila 讨论:https://postgr.es/m/f82133c6-6055-b400-7922-97dae9f2b50b@enterprisedb.com https://git.postgresql.org/pg/commitdiff/4778826532a62fd6e4d3fdeef9532c943604c730
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 已推送
在 vacuum/autovacuum 睡眠中使用 WaitLatch。在 vacuum_delay_point() 中使用 WaitLatch 而不是 pg_usleep()。这样做的好处是我们可以在进行 vacuum 操作时,及时意识到 postmaster 是否已被终止(在上次决定休眠后)。审阅者:Thomas Munro 讨论:https://postgr.es/m/CAFh8B=kcdk8k-Y21RfXPu5dX=bgPqJ8TC3p_qxR_ygdBS=JN5w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4753ef37e0eda4ba0af614022d18fcbc5a946cc9
为已弃用和重命名的函数和设置添加文档部分。新的附录将重命名或删除的设置、命令等信息归集到文档的一个不显眼的部分。保留每个子部分中的原始 id 元素,以确保 HTML 文档生成相同的filenames。这可以防止 Web 上的 /current/ 链接中断,并允许 Web 文档用户从旧版本页面链接到新版本中的更改信息。在此更改之前,链接到重命名部分(如 recovery.conf 文档)的 /current/ 将只返回 404。同样,如果有人搜索 recovery.conf,他们会找到 pg11 文档,但没有 /12/ 或 /current/ 链接,因此他们无法轻松找到它在 pg12 中被删除以及如何适应。还添加了索引条目,以便为那些知道旧名称但不知道我们如何更改它的人提供一个面包屑路径。因此,试图找出如何在 PostgreSQL 12+ 中设置 standby_mode 或 pg_resetxlog 去向的用户,现在有更多机会找到这些信息。Craig Ringer 和 Stephen Frost 审阅者:Euler Taveira 讨论:https://postgr.es/m/CAGRY4nzPNOyYQ_1-pWYToUVqQ0ThqP5jdURnJMZPm539fdizOg%40mail.gmail.com 回溯到:10 https://git.postgresql.org/pg/commitdiff/3b0c647bbfc52894d979976f1e6d60e40649bba7
将 Default Roles 重命名为 Predefined Roles。术语“默认角色”不太贴切,因为这些角色在安装后无法修改或删除,因此将其重命名为“预定义角色”,并在新添加的废弃附录中添加一个条目,以帮助当前版本的用户找到新文档。Bruce Momjian 和 Stephen Frost 讨论:https://postgr.es/m/157742545062.1149.11052653770497832538%40wrigleys.postgresql.org 和 https://postgresql.ac.cn/message-id/20201120211304.GG16415@tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/c9c41c7a337d3e2deb0b2a193e9ecfb865d8f52b
Bruce Momjian 已推送
在消息中,对 -1 使用单数名词,就像我们对 +1 一样。输出“-1 year”,而不是“-1 years”。报告者:neverov.max@gmail.com Bug:16939 讨论:https://postgr.es/m/16939-cceeb03fb72736ee@postgresql.org https://git.postgresql.org/pg/commitdiff/5da9868ed983f95cc1cff80dcd81252a513774f8
调整 dblink 回归测试的预期输出以适应提交 5da9868ed9。看起来 -1/单数输出在 dblink 回归测试中使用。报告者:Álvaro Herrera 讨论:https://postgr.es/m/20210330231506.GA10666@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/9ee7d533dacf8594057ced2d016250f09056c284
文档:提及可以跳过中间的大版本。还提到应该阅读中间的大版本说明。此更改也已应用于网站。讨论:https://postgr.es/m/20210330144949.GA8259@momjian.us 回溯到:9.6 https://git.postgresql.org/pg/commitdiff/2bda93f813919b58225f5a0e282e10b98d7633d4
/ecpg/pgtypeslib 中使用 MONTHS_PER_YEAR 宏而不是 '12'。所有其他地方都已经恰当地使用了 MONTHS_PER_YEAR。回溯到:9.6 https://git.postgresql.org/pg/commitdiff/84bc2b17523ef485f102be7f00f7affb88f00f18
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 提交
HeapTupleSatisfies* 的检查顺序,以避免得出错误结论。Mark Dilger 和 Robert Haas Discussion: http://postgr.es/m/CA+Tgmob6sii0yTvULYJ0Vq4w6ZBmj7zUhddL3b+SKDi9z9NA7Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3b6c1259f9ca8e21860aaf24ec6735a8e5598ea0Fujii Masao 提交
修复注释中的拼写错误。Author: Masahiko Sawada Discussion: https://postgr.es/m/CAD21AoA1YL7t0nzVSEySx6zOaE7xO3r0jyu8hkitGL2_XbaMxQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/98e5bd103f887326e381c509c2fbe879ba3ea2f3
修复 pgstat_report_replslot() 以使用其参数的正确数据类型。pgstat_report_replslot() 的调用者将 int64 值传递给该函数。该函数还将这些值存储在 PgStat_MsgReplSlot 结构体的 PgStat_Counter(即 int64)字段中。但以前该函数使用“int”作为某些参数的数据类型,这可能导致值溢出。为避免此风险,此提交修复了 pgstat_report_replslot() 以使用 PgStat_Counter 类型作为参数。由于它们是统计计数器,因此使用 PgStat_Counter(用于计数器的类型)而不是 int64。Reported-by: Vignesh C Author: Vignesh C Reviewed-by: Jeevan Ladhe, Fujii Masao Discussion: https://postgr.es/m/CALDaNm080OpG=ZwOb0i8EyChH5SyHAMFWJCKaKTXmrfvJLbgaA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/96bdb7e19de80a0c9521c5696455bca2a685c919
postgres_fdw: 添加控制连接是否保持打开的选项。此提交添加了一个新选项 keep_connections,该选项控制 postgres_fdw 是否保持与外部服务器的连接打开,以便后续查询可以重用它们。此选项只能为外部服务器指定。默认值为 true。如果设置为 false,所有到外部服务器的连接将在事务结束时被丢弃。将来查询使用外部表时,关闭的连接将被重新建立。此选项很有用,例如,当用户想防止连接耗尽外部服务器的连接容量时。Author: Bharath Rupireddy Reviewed-by: Alexey Kondratov, Vignesh C, Fujii Masao Discussion: https://postgr.es/m/CALj2ACVvrp5=AVp2PupEm+nAC8S4buqR3fJMmaCoc7ftT0aD2A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b1be3074ac719ce8073fba35d4c8b52fb4ddd0c3
pg_checksums: 修复进度报告。pg_checksums 使用两个计数器,总大小和当前大小,来计算进度。以前 pg_checksums 报告的进度在最后无法达到 100%。此问题的原因是,每个文件中除新页面外的页面大小被计为当前大小,而每个文件的大小被计为总大小。也就是说,所有新页面的总大小可能被报告为总大小和当前大小之间的差值。此提交通过使 pg_checksums 将每个文件中包括新页面在内的所有页面大小计为当前大小来解决此问题。回溯到添加进度报告的 v12 版本。Reported-by: Shinya Kato Author: Shinya Kato Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/TYAPR01MB289656B1ACA0A5E7CAD07BE3C47A9@TYAPR01MB2896.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/2eb1fc8b1ae8b974007e85636fc7336a9b5d7222
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 提交了
修复 BRIN minmax-multi 对于 interval 类型距离的计算。interval 类型距离的计算将月份视为 31 天,这与 interval 比较器(使用 30 天)不一致。因此,当 (a<b) 时,可能会出现负距离,从而触发一个断言。通过采用与 interval_cmp_value 相同的逻辑来修复。Reported-by: Jaime Casanova Discussion: https://postgr.es/m/CAJKUy5jKH0Xhneau2mNftNPtTy-BVgQfXc8zQkEvRvBHfeUThQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2b10e0e3c2ca14d732521479123e5d5e2094e143
修复 BRIN minmax-multi 对于 timetz 类型距离的计算。距离计算忽略了时区,因此即使 (b > a),(b-a) 的结果也可能为负。通过考虑时区差异来修复。Reported-by: Jaime Casanova Discussion: https://postgr.es/m/CAJKUy5jLZFLCxyxfT%3DMfK5mtPfSzHA1rVLowR-j4RRsFVvKm7A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/7262f2421a1e099a631356f7b80ad198e34e2a8a
修复 BRIN minmax-multi 对于 inet 类型距离的计算。距离计算忽略了掩码,这与 inet 比较器不同,导致在某些情况下出现负距离。通过在 brin_minmax_multi_distance_inet 中应用掩码来修复。我曾考虑直接调用 inetmi() 来计算增量,但这也没有考虑掩码。Reviewed-by: Zhihong Yu Discussion: https://postgr.es/m/1a0a7b9d-9bda-e3a2-7fa4-88f15042a051%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/e1fbe1181c86247eaf8b4b142b81361ce4efcc66
修复 BRIN minmax-multi 调用中的参数顺序。BRIN minmax-multi consistent 函数错误地假设它可以查找运算符,然后交换参数以获取其换位算子。例如,<(a,b) 将被调用为 <(b,a) 来得到 >(a,b)。当参数类型相同时,这可以工作,但使用跨类型 opclasses 则会失败。例如,我们不能交换 <(float4,float8) 参数。通过以正确的顺序传递参数来修复。Discussion: https://postgr.es/m/CAJKUy5jLZFLCxyxfT%3DMfK5mtPfSzHA1rVLowR-j4RRsFVvKm7A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/1dad2a5ea3d14dd205603c31cc94ec088183ab2a
为 minmax-multi macaddr8 类型添加回归测试。BRIN minmax-multi opclasses 的回归测试几乎测试了所有支持的数据类型,除了 macaddr8。所以这个添加了它。 https://git.postgresql.org/pg/commitdiff/4908684ddab35135869efa2af6b49c4d67c422f9
修复 brin_minmax_multi_union 中的错误。调用 sort_expanded_ranges() 时,我们需要记住返回值,因为该函数既排序又去重范围。因此范围的数量可能会减少。brin_minmax_multi_union 未能做到这一点,导致由于无效范围(minval/maxval 相等但未标记为已压缩)而崩溃。Reported-by: Jaime Casanova Discussion: https://postgr.es/m/20210404052550.GA4376%40ahch-to https://git.postgresql.org/pg/commitdiff/d9c5b9a9eeb9e3061ae139e0e564ce5358c94001
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 不一致的地方。