orafce_mail,一个类似于 Oracle 的 DBMS_MAIL 的实用程序,已发布。
https://archives.postgresql.org/pgsql-jobs/2021-08/
Planet PostgreSQL:https://planet.postgresql.org/
本周的 PostgreSQL 每周新闻由 David Fetter 为您带来
请在太平洋标准时间(PST8PDT)周日下午 3:00 前将新闻和公告发送至 david@fetter.org。
Michaël Paquier 推送了
在恢复时刷新 recovery_min_apply_delay 的应用延迟。此提交确保在重放延迟循环中等待由 recovery_min_apply_delay 定义的时间量时,在重新加载时正确处理,如果此 GUC 值已更新,则根据正在重放的提交记录的时间戳重新计算延迟。之前的行为会有问题,例如即使延迟减少或仅仅被取消,重放仍然会等待。如果应用延迟增加到更大的值,则等待将只尊重旧的设置值,提前完成。作者:Soumyadeep Chakraborty,Ashwin Agrawal 审核人:Kyotaro Horiguchi,Michael Paquier 讨论:https://postgr.es/m/CAE-ML+93zfr-HLN8OuxF0BjpWJ17O5dv1eMvSE5jsj9jpnAXZA@mail.gmail.com 向后移植:9.6 https://git.postgresql.org/pg/commitdiff/e4ba1005c0f7a95e3252f38aee02426117b8e12b
恢复将十六进制代码重构到 src/common/。这是以下提交的组合还原:- c3826f8,一个重构部分,将十六进制解码代码移动到 src/common/。此代码已由 aef8948 清理,因为它最初没有像 SCRAM 使用的 src/common/ 中的 base64 例程那样包含溢出检查,这使其目的不安全。- aef8948,对十六进制编码/解码代码进行更高级的重构,将其移动到 src/common/,并为十六进制解码和编码的结果缓冲区添加了健全性检查。正如 Hans Buschmann 所报告的那样,这些溢出检查代价很高,并且在解码/编码 bytea 或 LO 时,它们越长,可能会看到性能下降。在大型 bytea 值上工作的简单 SQL 在性能配置文件中显示出明显的差异。- ccf4e27,由 aef8948 使其成为可能的一次清理。还原所有这些提交将十六进制解码和编码的性能恢复到 ~13 中的状态。目前和 beta3 之后,这是最简单的选择。报告人:Hans Buschmann 讨论:https://postgr.es/m/1629039545467.80333@nidsa.net 向后移植:14 https://git.postgresql.org/pg/commitdiff/2576dcfb76aa71e4222bac5a3a43f71875bfa9e8
提高 btree_gist 中浮点数溢出检查的性能。当前代码可能会不必要地调用 isinf() (始终对参数值调用两次,而在某些情况下一次就足够了)。zero_is_valid 从未使用过,但在检查的第一个位置仍然检查结果值是否为 0。这类似于 607f8ce。btree_gist 只是复制粘贴了 backend float4/8 代码(如宏 CHECKFLOATVAL())中执行这些检查的代码来完成此工作。作者:Haiying Tang 讨论:https://postgr.es/m/OS0PR01MB611358E3A7BC3C2F874AC36BFBF39@OS0PR01MB6113.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/32cf7f7acce3891cbc3de53327704372bdd36d38
Daniel Gustafsson 推送了
澄清 initdb --sync-only 帮助消息和文档。initdb 的 --sync-only 帮助消息有点简洁,并且不是真正的不言自明。使其更清楚地表明 initdb --sync-only 将在同步后退出,并使用有关何时可以使用该选项的说明来扩展文档。同时使帮助输出与立即退出的其他输出保持一致。作者:Nathan Bossart,Gurjeet Singh 讨论:https://postgr.es/m/CABwTF4U6hbNNE1bv=LxQdJybmUdZ5NJQ9rKY9tN82NXM8QH+iQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ea499f3d28c657a044f0a948e6b77ac56f28a8f6
在复制后错误消息中发出命名空间。在 VACUUM 或 CLUSTER 命令期间,初始输出会发出带有命名空间的完全限定的关系路径。然而,操作后的错误消息仅发出关系名称,这可能导致当使用多个带有 vacuumdb 的作业时难以解析输出,因为来自不同作业的输出可能会交错。在操作后的错误消息中包含完整路径,使其与初始错误消息保持一致。作者:Mike Fiedler miketheman@gmail.com 审核人:Corey Huinker corey.huinker@gmail.com 讨论:https://postgr.es/m/CAMerE0oz+8G-aORZL_BJcPxnBqewZAvND4bSUysjz+r-oT1BxQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/069d33d0c5a021601245e44df77a0423ddd69359
在 BIO 上设置类型标识符。在 OpenSSL 中,有两种类型的 BIO(I/O 抽象):源/接收器和过滤器。源/接收器 BIO 是数据的源和/或接收器,即作用于套接字或文件的 BIO。过滤器 BIO 从另一个 BIO 获取输入流并对其进行转换。为了使 BIO_find_type() 能够遍历 BIO 链并正确找到所有特定类型的 BIO,它们应相应地设置类型位,源/接收器 BIO(PostgreSQL 实现的)使用 BIO_TYPE_SOURCE_SINK,而过滤器 BIO 使用 BIO_TYPE_FILTER。此外,基于文件描述符的 BIO 应该设置描述符位,BIO_TYPE_DESCRIPTOR。PostgreSQL 实现没有设置类型位,这长期以来都没有被注意到,因为它只与审核 OpenSSL 安装的代码或执行类似任务有关。但这又是 API 所要求的,因此可以修复此问题。向后移植到 9.6,因为这个错误已经存在很长时间了。作者:Itamar Gafni 讨论:https://postgr.es/m/SN6PR06MB39665EC10C34BB20956AE4578AF39@SN6PR06MB3966.namprd06.prod.outlook.com 向后移植:9.6 https://git.postgresql.org/pg/commitdiff/31f860a52bf97b898d8af6333b23869f1bbac17e
修复 pg_amcheck --skip 选项参数处理。为 all-visible 和 all-frozen 设置的 skip 选项不正确,因为它们使用了空格而不是连字符,从而在调用时导致语法错误。此外,还记录了不跳过任何页面的选项 (none),但未实现。向后移植到 pg_amcheck 引入的 14。错误:#17149 报告人:Chen Jiaoqian chenjq.jy@fujitsu.com 审核人:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/17149-5918ea748da36b15@postgresql.org 向后移植:14 https://git.postgresql.org/pg/commitdiff/500256d953444628164f0b77ef1ce8c9e05e575f
文档:修复逻辑解码示例中的错别字。修复了逻辑解码示例部分中出现的 "atleast" 的一处。讨论:https://postgr.es/m/5467E625-1369-48CF-BE62-3BB69395C1F1@yesql.se https://git.postgresql.org/pg/commitdiff/76987bad3380be862ea3cc36d1709134be126150
从 pg_amcheck 中删除 --quiet 选项。将 --quiet 与 --no-strict-names 结合使用时,其工作方式与文档不符,仍然会发出警告消息。由于 --quiet 标志的工作方式与其它实用程序不一致,因此通过删除该功能来修复此问题。向后移植到 pg_amcheck 引入的 14。错误:17148 报告人:Chen Jiaoqian chenjq.jy@fujitsu.com 审核人:Julien Rouhaud rjuju123@gmail.com 讨论:https://postgr.es/m/17148-b5087318e2b04fc6@postgresql.org 向后移植:14 https://git.postgresql.org/pg/commitdiff/9a9c8b92018d4d48f93cd8fa1895c53fa5946d75
John Naylor 推送了
pg_popcount{32,64}_slow
函数的包装器。David Rowley 审核和额外 hack,Álvaro Herrera 审核 讨论:https://postgres.ac.cn/message-id/flat/CAFBsxsE7otwnfA36Ly44zZO%2Bb7AEWHRFANxR1h1kxveEV%3DghLQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/4864c8e8f184a35ed1c2c51a15e9a455e9fbb398Tom Lane 推送了
减少待处理的失效消息的内存消耗。inval.c 中现有的数据结构对于注册少量缓存失效事件的命令或子事务的常见情况来说效率不高。虽然如果我们立即提交它并不重要,但在包含许多 DDL 操作的事务中,它可能会累积大量膨胀。通过对预期用例做出一些更多的假设,我们可以切换到使用密集打包数组的表示。虽然这消除了一些数据复制,但似乎在时间方面并没有太大差异。但是空间消耗大大减少了。由我打补丁;感谢 Nathan Bossart 的审核。讨论:https://postgr.es/m/2380555.1622395376@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/3aafc030a53621e91be2e7c1c72b5f3e8b103486
改进正则表达式编译器的弧移动/复制逻辑。函数 moveins()、copyins()、moveouts()、copyouts() 必须保持正则表达式 NFA 中没有重复弧的这种不变性。Spencer 的原始实现是 O(N^2),因为它单独检查每个源弧的匹配项。在提交 579840ca0 中,我通过添加排序/合并逻辑来改进它,如果需要移动/复制的弧的数量超过几个,则使用该逻辑。但是,我现在意识到这错过了一个机会。在许多调用站点,目标状态是新创建的,并且不能有任何可能重复的现有入弧(分别为出弧)。因此,花费任何周期来检查重复项都是浪费精力。在这些情况下,我们可以盲目地移动/复制所有源弧。添加代码路径来执行此操作。事实证明,对于 copyins()/copyouts(),所有调用站点都具有此属性,从而使其中的所有“改进”逻辑都完全无法访问。也许我们将来还会需要完整的功能,所以我只是对那些路径进行了 #ifdef'd 而不是完全删除它们。顺便说一句,添加一些测试用例以改进这方面的代码覆盖率,以及 regc_locale.c/regc_pg_locale.c 中的代码覆盖率。讨论:https://postgr.es/m/810272.1629064063@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/78a843f119ca7d4a6eb173a7ee3bed45889d48d8
减少新正则表达式测试中对语言环境行为的假设。我过于乐观地认为,基于 UTF8 的语言环境都会认为 U+1500 是 [[:alpha:]] 字符类的成员。调整提交 78a843f11 添加的测试用例,以避免该假设。我们可能需要进一步对其进行额叶切除,但这应该足以修复早期的 buildfarm 报告。https://git.postgresql.org/pg/commitdiff/b66336c4e1af0e8eae520623e4b018251807b0bb
防止 ALTER TYPE/DOMAIN/OPERATOR 更改扩展成员关系。如果在扩展更新脚本期间对预先存在的、独立的自由对象调用 recordDependencyOnCurrentExtension,则该对象将归扩展所有。在我们当前的代码中,这在三种情况下是可能的:*
替换“shell”类型或运算符。*
CREATE OR REPLACE 覆盖现有对象。*
ALTER TYPE SET、ALTER DOMAIN SET 和 ALTER OPERATOR SET。第一种情况是预期的行为,如 GenerateTypeDependencies 的现有注释所述。对于 CREATE OR REPLACE 来说,这似乎也是合适的行为;至少,显而易见的其他替代方案并不更好。然而,它在 ALTER 期间发生的事实是尝试在 CREATE 和 ALTER 情况之间共享代码(GenerateTypeDependencies 和 makeOperatorDependencies)的结果。由于扩展脚本不太可能 ALTER 一个不属于该扩展的对象,因此这种行为对于直接目标对象来说并不是很麻烦......但 ALTER TYPE SET 会递归到依赖的域,如果这些域不属于扩展,则让它们归扩展所有是非常不友好的。让我们通过重新定义 ALTER 情况来解决这个问题,使其永远不会改变扩展成员关系。我们可以通过仅在 ALTER TYPE SET 递归到域时更改行为来最大程度地减少行为更改,但这会使代码复杂化,并且它似乎不是一个更好的定义。根据 Alex Kozhemyakin 的 bug #17144。回溯到添加 ALTER TYPE SET 的 v13 版本。(其他情况较旧,但由于它们仅影响直接命名的对象,因此没有足够的问题来证明进一步更改行为的合理性。)讨论:https://postgr.es/m/17144-e67d7a8f049de9af@postgresql.org https://git.postgresql.org/pg/commitdiff/6b71c925cb817f79cb0d389edacdd033efaa301d
修复 check_agg_arguments 对聚合 FILTER 子句的检查。递归到 FILTER 子句的实现不正确,导致忽略了 FILTER 子句顶部的相关 Var 或 Aggref。(当然,那必须是一个普通的布尔 Var 或返回布尔值的聚合。)其结果是错误地识别聚合的正确语义级别,这可能导致不符合规范的查询行为。如果 FILTER 表达式是聚合,这还可能导致无法发出预期的“聚合函数调用不能嵌套”错误,这很可能会在稍后导致核心转储,因为规划器和执行器不希望出现这种情况。根本原因是提交 b560ec1b0 盲目地复制了一些代码,这些代码假设它正在递归到一个 List,因此没有检查顶层节点。为了避免出现关于为什么此调用看起来与其他调用不同的问题,以及未来可能出现的复制粘贴错误,让我们更改 check_agg_arguments 中所有三个 check_agg_arguments_walker 调用,即使只有 filter 子句的调用真正被破坏了。根据 Zhiyong Wu 的 bug #17152。自从我们实现 FILTER 以来,这个问题就一直是错误的,因此回溯到所有支持的版本。(测试表明,由于 ExecInitAgg 中“冗余”检查,v11 之前的分支设法避免了在错误的 Aggref 情况下崩溃。但我不确定这种保护有多彻底,而且无论如何,错误的行为问题仍然存在,因此也修复了 9.6 和 10。)讨论:https://postgr.es/m/17152-c7f906cc1a88e61b@postgresql.org https://git.postgresql.org/pg/commitdiff/2313dda9d493d3685ac7328b49dc6f5a87c1c295
避免在带有 FOR UPDATE 的规则中尝试锁定 OLD/NEW。在处理规则的查询时,transformLockingClause 忽略了排除 OLD/NEW 的伪 RTE。这会导致稍后出现奇怪的错误甚至崩溃。这个错误非常古老,但是没有人注意到并不奇怪,因为在非视图规则中使用 SELECT FOR UPDATE 的用例介于很少和不存在之间。尽管如此,崩溃是不应该发生的。根据 Zhiyong Wu 的 bug #17151。感谢 Masahiko Sawada 对问题的分析。讨论:https://postgr.es/m/17151-c03a3e6e4ec9aadb@postgresql.org https://git.postgresql.org/pg/commitdiff/8d2d6ec7708b475787fd92a9f828e554805e3df6
修复 regexp 的 citerdissect/creviterdissect 中的性能错误。在检测到迭代节点的第 i 个子匹配项中的子匹配项“解剖”失败(即,反向引用匹配失败)后,我们应该通过调整第 i 个子匹配项的尝试长度来继续。但是,按照编码的方式,这些函数更改了最后一个子匹配项的尝试长度,只有在耗尽该长度的所有可能性后,它们才会后退以调整倒数第二个子匹配项,然后是倒数第二个,等等;所有这些都是浪费精力,因为只有更改第 i 个子匹配项的开始或长度才有可能使其成功。这种疏忽造成了指数级性能下降的可能性。幸运的是,在大多数情况下,问题被其他地方应用的优化或约束所掩盖;这就解释了为什么我们以前没有注意到它。但是,通过相当简单(如果人为)的正则表达式,就有可能遇到这个问题。我的提交 173e29aa5 中的疏忽。现在这已经很古老了,所以回溯到所有支持的分支。讨论:https://postgr.es/m/1808998.1629412269@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/facce1da918a8bf55a8f54606512f944529cba85
改进有关滥用 SELECT INTO 的错误消息。改进 plpgsql 中的两个位置和 spi.c 中的一个位置,在这些位置,错误消息会令人困惑地告诉您不能使用 SELECT 查询,而您编写的确实是 SELECT 查询。实际问题是您不能在这些上下文中使用 SELECT ... INTO,但消息未能使这一点显而易见。特殊情况是 SELECT INTO,使这些错误更有帮助。此外,修复 plpgsql 中的相同位置,以及 exec_eval_expr() 中的几个消息,使其不在主要错误消息中引用整个被投诉的查询或表达式。这种行为很容易导致违反我们关于保持主要错误消息简短且单行的消息样式指南。此外,由于消息的重要部分在插入的文本之后,因此可能会使真正的问题很难看到。我们可以将查询或表达式报告为 errcontext 的第一行。根据 Roger Mason 的投诉。回溯到 v14,因为 (a) 这些消息中的一些是 v14 中新增的,并且 (b) v14 的可翻译字符串仍处于某种程度的变动中。当然,这个问题比这更早,但我犹豫是否要进一步改变其行为。讨论:https://postgr.es/m/1914708.1629474624@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/26ae66090398082c54ce046936fc41633dbfc41e
Álvaro Herrera 推送
Heikki Linnakangas 推送
Michael Meskes 推送
Amit Kapila 推送
修复 protocol.sgml 中的拼写错误。文档中“Stream Stop”消息拼写错误为“Stream End”。作者:Masahiko Sawada 回溯:14,这是引入该错误的地方。讨论:https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0ac1aee0d7d8d5c3493e6e8b1d3925af35a31648
将 LOGICAL_REP_MSG_STREAM_END 重命名为 LOGICAL_REP_MSG_STREAM_STOP。在代码中,大多数地方对逻辑流消息使用了“Stream Stop”术语。此提交通过将 LogicalRepMsgType “LOGICAL_REP_MSG_STREAM_END”重命名为 “LOGICAL_REP_MSG_STREAM_STOP” 来提高一致性。作者:Masahiko Sawada 审阅者:Hou Zhijie、Amit Kapila 讨论:https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4cd7a189687171374ff302ad71c99d39ff6d2bab
Andres Freund 推送
Peter Eisentraut 推送了
pg_resetwal: 改进数值命令行参数解析。检查 strtoul()/strtol() 后的 errno 以更好地处理超出范围的错误。对于超出范围的情况,strtoul() 会返回 ULONG_MAX,而之前的代码会继续使用该结果。报告者:Mark Dilger mark.dilger@enterprisedb.com 讨论:https://postgres.ac.cn/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/9a6345ed741783e8770ef160e822d2257873adef
pg_amcheck: 修复命令行上的块号解析。之前的代码无法处理 sizeof(long) == 4 的系统上的较高块号。复审者:Mark Dilger mark.dilger@enterprisedb.com 讨论:https://postgres.ac.cn/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/f1899f251df421a4715ce5e231855eb6914bf77d
psql: 添加查询取消的测试。psql 中的查询取消功能在 3a5130672296ed4e682403a77a9a3ad3d21cef75 (已回滚) 中被意外破坏,因此对此进行一些测试覆盖似乎很有用。复审者:Fabien COELHO coelho@cri.ensmp.fr 讨论:https://postgres.ac.cn/message-id/18c78a01-4a34-9dd4-f78b-6860f1420c8e@enterprisedb.com https://git.postgresql.org/pg/commitdiff/5b3f471ff23a2773e6c1ee1704377581c987107d
psql: 提高查询取消测试的可移植性。某些 shell 显然不支持 $PPID,因此在这种情况下跳过测试。https://git.postgresql.org/pg/commitdiff/c818c25f448d0085e1bb2be402463a4b28bc20c4
David Rowley 推送了
允许并行 DISTINCT。自 e06a38965 以来,我们一直支持并行聚合。当时,我们没有来得及添加并行 DISTINCT。因此,现在我们来做这件事。这是通过引入两阶段 DISTINCT 来实现的。第一阶段在并行工作进程上执行,行在那里通过哈希或排序/唯一化来去重。来自并行工作进程的结果被合并,然后串行执行最终的去重阶段,以消除由于合并每个并行工作进程的行而出现的任何重复行。作者:David Rowley 复审者:Zhihong Yu 讨论:https://postgr.es/m/CAApHDvrjRxVKwQN0he79xS+9wyotFXL=RmoWqGGO2N45Farpgw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/22c4e88ebff408acd52e212543a77158bde59e69
修复了由 22c4e88eb 导致的损坏的回归测试。根据 buildfarm 成员 hoverfly 和 thorntail https://git.postgresql.org/pg/commitdiff/945f395aeb74cea77d5239db01357bbcbea80534