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.conf 重载 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 清理,因为它最初与 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_valid 从未被使用,但在检查的第一个位置仍会检查 0 的结果值。这与 607f8ce 类似。btree_gist 只是从后端 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
在 post-copy errmsg 中发出命名空间。在 VACUUM 或 CLUSTER 命令期间,初始输出会发出完全限定的关系路径(包括命名空间)。但是,操作后的 errmsg 只发出关系名称,当使用 vacuumdb 进行多任务处理时,输出可能会难以解析,因为来自不同任务的输出可能会交错。在操作后的 errmsg 中包含完整路径,以与初始 errmsg 保持一致。作者: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 提交了
Tom 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 起来,而不是完全删除它们。顺便,添加一些测试用例以提高该区域以及 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 更改扩展成员资格。如果在扩展更新脚本中对预先存在的、独立的(free-standing)对象调用 recordDependencyOnCurrentExtension,该对象将归扩展所有。在我们当前的 code 中,这可能发生在三种情况下:* 替换“shell”类型或运算符。* CREATE OR REPLACE 覆盖现有对象。* ALTER TYPE SET、ALTER DOMAIN SET 和 ALTER OPERATOR SET。第一个情况是故意的行为,正如 GenerateTypeDependencies 的现有注释所述。对于 CREATE OR REPLACE,这似乎也是适当的行为;至少,明显的替代方案并不更好。但是,它发生在 ALTER 期间是一个共享代码(GenerateTypeDependencies 和 makeOperatorDependencies)在 CREATE 和 ALTER 情况之间使用的结果。由于扩展脚本不太可能 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 对 aggregate FILTER 子句的检查。 FILTER 子句中的递归实现错误,导致 FILTER 子句最顶层的相关 Var 或 Aggref 被忽略。(当然,这必须是一个普通的布尔 Var 或返回布尔值的聚合。)后果是聚合的正确语义级别被错误识别,这可能导致查询行为不符合规范。如果 FILTER 表达式是一个聚合,这也可能导致未能发出预期的“聚合函数调用不能嵌套”错误,因为规划器和执行器不期望出现这种情况,这可能会导致稍后出现核心转储。根本原因是在提交 b560ec1b0 中盲目复制了一些假设它正在递归到 List 的代码,因此没有检查顶层节点。为了防止关于为什么此调用与其他调用不同的问题,以及可能的未来复制粘贴错误,让我们更改 check_agg_arguments 中的所有三个 check_agg_arguments_walker 调用,即使只有 filter 子句的调用实际上是错误的。根据 Zhiyong Wu 的 bug #17152。自从我们实现 FILTER 以来一直如此,因此回溯补丁到所有支持的版本。(测试表明,v11 之前的分支由于 ExecInitAgg 中的“冗余”检查而设法避免在 bad_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。这导致了奇怪的错误,甚至后来崩溃。这个 bug 非常古老,但并不令人意外,因为没有人注意到,因为在非视图规则中使用 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 中的性能 bug。在迭代节点 i'th 子匹配中检测到子匹配“dissect”失败(即反向引用匹配失败)后,我们应该通过调整 i'th 子匹配的尝试长度来继续。但是,如代码所示,这些函数更改了最后一个子匹配的尝试长度,并且只有在用尽该子匹配的所有可能性后,它们才会回溯以调整倒数第二个子匹配,然后是倒数第三个,等等;所有这些都是浪费精力,因为只有更改第 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://postgresql.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://postgresql.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://postgresql.ac.cn/message-id/18c78a01-4a34-9dd4-f78b-6860f1420c8e@enterprisedb.com https://git.postgresql.org/pg/commitdiff/5b3f471ff23a2773e6c1ee1704377581c987107d
psql:提高查询取消测试的可移植性。一些 shell apparently 不支持 $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