Pgpool-II 4.2.0 发布,这是一个用于 PostgreSQL 的连接池和语句复制系统。 https://www.pgpool.net/docs/42/en/html/release-4-2-0.html
pgBadger v11.4 发布,这是一个用 Perl 编写的 PostgreSQL 日志分析和图形工具。 https://github.com/darold/pgbadger/releases
Database Lab 2.0 发布,这是一个用于快速克隆大型 PostgreSQL 数据库以构建非生产环境的工具: https://postgres.ai/blog/dle-2.0-release/
pgagroal 1.0.0 发布,这是一个高性能的原生协议连接池,用于 PostgreSQL。 https://agroal.github.io/pgagroal/release/announcement/2020/11/24/pgagroal-1.0.0.html
http://archives.postgresql.org/pgsql-jobs/2020-11/
Planet PostgreSQL: http://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tom Lane 提交
允许多行 INSERT 指定生成列的 DEFAULT 值。之前可以指定 "INSERT INTO tab(generated_col) VALUES (DEFAULT)" 而不报错。但多行 VALUES 列表的等效情况即使正确指定了每行的 DEFAULT 也会报错。修复了这个问题。同时,改进了与 OVERRIDING SYSTEM/USER 值相关的附近逻辑的测试用例。Dean Rasheed 讨论: https://postgr.es/m/9q0sgcr416t.fsf@gmx.us https://git.postgresql.org/pg/commitdiff/17958972fe3bb03454a4b53756b29d65dc285efa
改进了两个与生成列相关的错误消息的措辞。澄清了只要插入的是 DEFAULT 占位符,就可以“插入”到生成列。此外,使用 ERRCODE_GENERATED_ALWAYS 替换 ERRCODE_SYNTAX_ERROR;似乎没有理由使用不太具体的 errcode。讨论: https://postgr.es/m/9q0sgcr416t.fsf@gmx.us https://git.postgresql.org/pg/commitdiff/d36228a9fcdccd57a7dc332572eb9837c7c301e6
重命名“点严格在点之上/之下”的比较运算符。历史上,这些运算符被称为 >^ 和 <^,但这与 box、polygon 和 circle 运算符(分别命名为 |>> 和 <<|)不一致。更糟糕的是,>^ 和 <^ 名称用于 box 类型的非严格上下测试。因此,发明了遵循更常见命名的新运算符。旧运算符目前仍然可用,并且相关的索引 opclass 也仍然接受它们。但有弃用通知,所以也许有一天我们可以去掉它们。Emre Hasegeli,Pavel Borisov 审阅 讨论: https://postgr.es/m/24348.1587444160@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0cc99327888840f2bf572303b68438e4caf62de9
移除不必要的 #include。Justin Pryzby 讨论: https://postgr.es/m/20201123205505.GJ24052@telsasoft.com https://git.postgresql.org/pg/commitdiff/3b9b01f75d6e2d7bf9e0bf8ec958ce420aa037c2
集中处理跳过无用的 ereport/elog 调用逻辑。虽然 ereport() 和 elog() 本身在错误消息级别太低以至于无法打印时成本很低,但有些地方需要在调用这些宏之前做大量工作。为了允许在不打印任何内容时优化掉这些设置工作,让 elog.c 导出一个新函数 message_level_is_interesting(elevel),该函数报告 ereport/elog 是否会执行任何操作。在需要的地方使用它,这些地方之前有 ad-hoc 直接测试 log_min_messages 等。还教会 ProcSleep 使用它来避免一些工作。(可能还有其他地方可以有用地使用它;我没有仔细搜索。)在 elog.c 中,进行一些重构,以避免重复的策略设置逻辑。编写该代码时,我们并未依赖内联函数;因此,为了效率,它有一些重复,我已经将其删除。Alvaro Herrera 和 Tom Lane 讨论: https://postgr.es/m/129515.1606166429@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/789b938bf2b8e38d0894261eae6bc84bbbb4714e
为内联函数声明添加“inline”标记。我很难确定 C 标准的文字是否要求这样做,但我们确实有几个 buildfarm 成员在未这样做时会发出警告。c532d15dd 中的疏忽。 https://git.postgresql.org/pg/commitdiff/ec05bafdbbf474bf0a1416772da31f9f1f27fa1e
避免向客户端发送大量 ParameterStatus 消息。到目前为止,我们会在任何 GUC_REPORT 变量的活动值发生变化时立即向客户端发送一条 ParameterStatus 消息。这在功能设计时勉强可以接受;现在我们有了函数 SET 子句等,出现了一个非常合理的用例,即一个 GUC_REPORT 变量在单个查询中可能会改变多次——甚至可能回到其原始值。幸运的是,我们的大多数 GUC_REPORT 变量不太可能经常更改;但有一些提议正在进行中,以扩大该集合,甚至使其可由用户配置。因此,让我们修复问题,使其每个变量每个查询最多生成一条 ParameterStatus 消息,并且仅在查询结束值与我们上次报告的值不同时才发送任何消息。讨论: https://postgr.es/m/5708.1601145259@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2432b1a04087edc2fd9536c7c9aa4ca03fd1b363
文档:对第 11.2 节“索引类型”进行小改进。将每个索引类型的讨论分成 <sect2>,使其在视觉上更分开且更易于查找。改进标记,并对措辞进行一些小的调整。这也修复了一个指向现已弃用的 point 运算符 <^ 和 >^ 的无关引用。Dagfinn Ilmari Mannsåker,David Johnston 和 Jürgen Purtz 审阅 讨论: https://postgr.es/m/877dukhvzg.fsf@wibble.ilmari.org https://git.postgresql.org/pg/commitdiff/85b4ba73423b480902206ca04330c1cbea371c3c
在 psql 的 \d 命令中,不要截断属性默认值。历史上,psql 会将列的默认表达式文本截断为 128 个字符。这与其他 describe.c 中的行为都不一样,而且现在只应用于表达式本身,而不应用于可能围绕它的“generated always as (...) stored”文本,这变得特别令人困惑。对我们的 git 历史的挖掘表明,最初限制的动机并不是真正限制显示宽度(我长期以来一直以为是这样),而是为了安全地使用固定宽度的输出缓冲区来存储结果。当然,那个实现限制早已消失,但限制仍然存在。让我们把它去掉。同时,重新排列关于何时释放输出字符串的逻辑,使其不再依赖于对 attidentity 和 attgenerated 可能值的未声明假设。根据 David Turon 的 bug #16743。向 v12(GENERATED 引入的版本)回溯。(可以说我们可以更早地回溯,但我犹豫要更改长期稳定的分支的行为。)讨论: https://postgr.es/m/16743-7b1bacc4af76e7ad@postgresql.org https://git.postgresql.org/pg/commitdiff/314fb9baeacb3426a5d9a26132aae8d828cc0ad7
修复 LISTEN/NOTIFY 处理中最近引入的竞态条件。Commit 566372b3d 修复了一些涉及并发 SimpleLruTruncate 调用的竞态条件,但它在 async.c 中引入了新的竞态条件。一个新监听的后端可能会尝试读取正在被截断的 Notify SLRU 页,可能导致错误。此外,QUEUE_TAIL 指针可能被设置为一个值,该值不等于任何后端的队列位置。虽然在 v13 及更高版本中这相对无害(归功于 commit 51004c717),但在旧分支中,它导致了近乎永久的队列截断逻辑禁用,因此继续使用 NOTIFY 会导致队列已满警告,并最终无法发送更多通知。(服务器重启足以解决这个问题,但它仍然非常令人不愉快。)问题的核心是混淆 QUEUE_TAIL 是代表队列的“逻辑”尾部(即,最早仍有关联的数据)还是“物理”尾部(我们尚未截断的最旧数据)。为了修复,将其拆分为两个变量。QUEUE_TAIL 恢复其作为逻辑尾部的定义,并引入一个新变量来跟踪最早的未截断页。根据 Mikael Gustavsson 的报告。与之前的补丁一样,回溯到所有支持的分支。讨论: https://postgr.es/m/1b8561412e8a4f038d7a491c8b922788@smhi.se https://git.postgresql.org/pg/commitdiff/9c83b54a9ccdb111ce693ada2309475197c19d70
清理 src/test/locale/ 中的测试。257836a75 中的疏忽,它添加了这些测试。 https://git.postgresql.org/pg/commitdiff/b90a7fe15f78b1e2513cbcb27a33f4adc47bcd3d
文档:澄清 PQconnectdbParams() 的行为。文档省略了一个关键细节,即关键字数组中的条目如果其对应的值数组条目为 NULL 或空字符串,则会被忽略;它不会覆盖参数的任何先前获取值。(参见 conninfo_array_parse()。)我以为这会强制设置回默认值,这导致我遇到了 bug #16746;但事实并非如此。在处理此问题时,我无法抗拒地对 PQconnectdbParams() 的描述以及关于连接 URI 语法的章节进行了一些文风上的修改。讨论: https://postgr.es/m/931505.1606618746@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d5e2bdf7dda712a60234f08e036ec9de28085a2d
Heikki Linnakangas 提交
将 copy.c 分成四个文件。Copy.c 已经变得非常庞大。将其分成更易于管理的几部分:- copy.c 现在只包含少数函数,这些函数是 COPY FROM 和 COPY TO 通用的。- copyto.c 包含 COPY TO 的代码。- copyfrom.c 包含初始化 COPY FROM 和将元组插入正确表的代码。- copyfromparse.c 包含从客户端/文件/程序读取输入文本/CSV/二进制格式并解析成元组的代码。所有这些部分都相当复杂,并且彼此相对独立。有一个正在讨论中的补丁实现了并行 COPY FROM,它将为 COPY FROM 路径添加大量新代码,另一个补丁允许 INSERT 使用与 COPY FROM 相同的多插入机制,这两者都需要重构该代码。考虑到这两个补丁将导致 copy.c 代码大量变动,现在似乎是进行此重构的好时机。CopyStateData 结构也已拆分。所有格式选项,如 FORMAT、QUOTE、ESCAPE,都被放入一个新的 CopyFormatOption 结构中,该结构由 COPY FROM 和 TO 使用。其他状态数据保存在单独的 CopyFromStateData 和 CopyToStateData 结构中。Reviewed-by: Soumyadeep Chakraborty、Erik Rijkers、Vignesh C、Andres Freund 讨论: https://postgresql.ac.cn/message-id/8e15b560-f387-7acc-ac90-763986617bfb%40iki.fi https://git.postgresql.org/pg/commitdiff/c532d15dddff14b01fe9ef1d465013cb8ef186df
修复了几个引用 copy.c 的注释。在前一个提交中遗漏了这些。 https://git.postgresql.org/pg/commitdiff/68b1a4877ef54f5ee6e05c64876655dd13d2c73b
将 per-agg 和 per-trans 重复查找移至规划器。这有一个好处,即聚合的成本估计可以正确地计算转换函数和最终函数的调用次数。增加目录版本,因为视图可以包含 Aggrefs。Reviewed-by: Andres Freund 讨论: https://postgresql.ac.cn/message-id/b2e3536b-1dbc-8303-c97e-89cb0b4a9a48%40iki.fi https://git.postgresql.org/pg/commitdiff/0a2bc5d61e713e3fe72438f020eea5fcc90b0f0b
修复预期的输出:聚合权限检查的顺序已更改。Commit 0a2bc5d61e 更改了聚合最终函数和转换函数的权限检查顺序。这导致此 sepgsql 回归测试中的 LOG 消息打印顺序发生变化。调整预期输出。根据 rhinoceros 上的 buildfarm 故障。 https://git.postgresql.org/pg/commitdiff/8818ad5b1557d42cd58e5196fac7084a2389bdad
Álvaro Herrera 提交
使 funcapi.c 中的一些健全性检查更详细。funcapi.c 中的一些健全性检查没有提及所有可能的失败子句,这让添加了错误目录数据的开发人员感到困惑。使错误更详细,以避免浪费时间查找错误。根据 Craig Ringer 的抱怨。Reviewed-by: Tom Lane tgl@sss.pgh.pa.us 讨论: https://postgr.es/m/CAMsr+YH7Kd87A3cU5m_wKo46HPQ46zFv5wesFNL0YWxkGhGv3g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/fe051291550ab88267ce3104e9833925bf757393
在罕见情况下,避免 ProcArrayLock 被持有过长时间。在取消自动清理(autovacuum)工作进程时,我们会持有 ProcArrayLock 来格式化调试日志字符串。通过保存生成消息所需的数据,并在锁定区域外进行格式化,可以缩短此时间。这不算非常关键,因为它仅在非常罕见的情况下发生:当后端进行死锁检测,并且恰好被正在运行自动清理的 autovacuum 阻止时。尽管如此, ProcArrayLock 处理过程中的中断也无需发生,因为在某些情况下,ProcArrayLock 的流量可能非常大。在此期间,按照 Michael Paquier 的建议,重构代码,以便仅在真正使用时才打印字符串。讨论: https://postgr.es/m/20201118214127.GA3179@alvherre.pgsql Reviewed-by: Michael Paquier michael@paquier.xyz https://git.postgresql.org/pg/commitdiff/450c8230b1f7eed1e927c44fb710d80502bea1d2
避免并发索引中的虚假等待。在 CREATE INDEX CONCURRENTLY (CIC) 和 REINDEX CONCURRENTLY (RC) 的各个等待阶段,我们等待其他进程释放它们的快照;这通常是正确的。但是,其他表上的 CIC 进程不可能影响“此”表上的 CIC 或 RC,因此我们无需等待这些进程。此提交在 MyProc->statusFlags 中添加了一个标志,以指示当前进程正在执行 CIC,以便其他执行 CIC 或 RC 的进程在等待时可以忽略它。请注意,此逻辑仅在索引不访问其他表时有效。为简单起见,如果索引具有表达式列或 WHERE 子句,我们则不设置标志。(有可能存在不访问其他表的表达式索引或部分索引,但找出这一点需要更多工作。)此标志也有可能被执行 REINDEX CONCURRENTLY 的进程使用以被跳过;并且被 VACUUM 忽略执行 CIC 或 RC 的进程(用于计算 Xmin)。这留待以后提交。作者:Álvaro Herrera alvherre@alvh.no-ip.org 作者:Dimitry Dolgov 9erthalion6@gmail.com Reviewed-by: Michael Paquier michael@paquier.xyz 讨论: https://postgr.es/m/20200810233815.GA18970@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/c98763bf51bf610b3ee7e209fc76c3ff9a6b3163
恢复更新 statusFlags 的锁级别。撤销 27838981be9d(保留了一些注释)。根据讨论,似乎不能放松此处的锁级别;要使其安全,必须在设置标志和设置事务 Xid 之间存在内存屏障,这也许不会太糟糕;但读者的那边也必须有屏障,从性能角度来看可能不好。也许这个分析是错误的,并且出于某种原因是安全的,但证明这一点并非易事。讨论: https://postgr.es/m/20201118190928.vnztes7c2sldu43a@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/dcfff74fb16622898a9d1df33e530f477caab095
David Rowley 提交
定义 pg_attribute_cold 和 pg_attribute_hot 宏。适用于支持 __has_attribute 和 __has_attribute (hot/cold) 的编译器。__has_attribute 支持 gcc >= 5、clang >= 2.9 和 icc >= 17。后续提交将实现这些宏的一些用法。作者:David Rowley Reviewed-by: Andres Freund、Peter Eisentraut 讨论: https://postgr.es/m/CAApHDvrVpasrEzLL2er7p9iwZFZ%3DJj6WisePcFeunwfrV0js_A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/697e1d02f53f985992a4f479b0b08fca5c272c6c
改进 elog/ereport ERROR 调用中的编译器代码布局。在这里,我们使用一些预处理器技巧来使支持的编译器将生成的代码布局得更优,使得与 elog(ERROR)/ereport(ERROR) 调用在同一分支中的代码远离热路径。实际上,这减少了热代码的大小,意味着它可以占用更少的缓存行。在高度 CPU 密集型工作负载中使用 pgbench 的 TPC-b 基准测试,性能提高了 10-15%。这里实现的效果与将错误条件放在 unlikely() 宏内部非常相似。例如;if (unlikely(x < 0)) elog(ERROR, "invalid x value"); 现在不需要在此处使用 unlikely(),因为 elog 和 ereport 使用的通用宏将看到 elevel >= ERROR,并使用 pg_attribute_cold 标记版本的 errstart()。当 elevel < ERROR 或无法确定其为常量时,将保持原始行为。作者:David Rowley Reviewed-by: Andres Freund、Peter Eisentraut 讨论: https://postgr.es/m/CAApHDvrVpasrEzLL2er7p9iwZFZ%3DJj6WisePcFeunwfrV0js_A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/913ec71d682e99852cc188a7edbdccd02d42b4b3
修复 __has_attribute 的不可移植用法。这将修复 697e1d02f 引起的编译中断,该中断似乎破坏了 GCC 版本 < 5 的构建。根据 GCC 手册,__has_attribute 是一个“特殊运算符”,必须在预处理器测试中不带任何其他条件进行测试。根据 Greg Nancarrow 通过 GCC 手册的建议。Reported-by: Greg Nancarrow 讨论: https://postgr.es/m/CAJcOf-euSu8fhC10v476o9dqnjqKysVs1_vRms-_fvajpZ3kFw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1fa22a43a56e1fe44c7bb3a3d5ef31be5bcac41d
整理 pg_attribute_hot 和 pg_attribute_cold 的定义。1fa22a43a 是对我在 697e1d02f 中引入的便携性问题的快速修复。1fa22a43a 在预处理器逻辑中添加了一些我不太希望的额外情况。Andres Freund 和 Dagfinn Ilmari Mannsåker 提出了更好的方法。顺便,也调整了这些宏的唯一当前用法,使宏出现在函数返回类型之前。这现在与函数定义的做法相匹配。讨论: https://postgr.es/m/20200625163553.lt6wocbjhklp5pl4@alap3.anarazel.de 讨论: https://postgr.es/m/87pn43bmok.fsf@wibble.ilmari.org https://git.postgresql.org/pg/commitdiff/b0727ae99b7056ca88e9708c014a86f6e611d938
临时修复 MinGW 8.1 中的 **attribute**((cold)) 编译器错误。Buildfarm 成员 walleye 运行 MinGW 8.1 以来,一直存在自 697e1d02f 和 913ec71d6 以来出现的各种问题。这似乎是汇编器中的一个错误,该错误已在后续版本中修复。目前,为了让该 animal 重新正常运行,让我们在该编译器上将 pg_attribute_cold 和 pg_attribute_hot 定义为空宏。希望我们能得到该 animal 所有者的支持,升级到一个不太有问题的编译器,并在以后恢复此更改。讨论: https://postgr.es/m/286560.1606233316@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/687f6163447514c23b44a981540987013529a9ec
Michaël Paquier 提交
在 LWLock 初始化中使用宏代替硬编码的偏移量。这使得代码更容易理解,因为初始化依赖于一个与已定义的等效宏集重叠的偏移量,这些宏集已经在其他地方使用。作者:Japin Li 讨论: https://postgr.es/m/MEYP282MB1669FB410006758402F2C3A2B6E00@MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/d03d7549b29236e300aceac0c22173cf19acc675
移除 catalog 函数 currtid()。currtid() 和 currtid2() 是一组未公开的函数,它们唯一已知的用户是 Postgres ODBC 驱动程序,该驱动程序能够检索调用这些函数的调用者提供的元组的最新 TID 版本。如 Postgres ODBC 所用,currtid() 是一个快捷方式,可以在元组插入后通过传递 OID 为 0(魔术值)来检索后端中加载的最后一个 TID。此提交中已将其删除,因为它在驱动程序开始使用“RETURNING ctid”进行插入后已过时,而该子句自 Postgres 8.2(使用 RETURNING 在性能上更好,因为它减少了与后端的往返次数)以来一直支持。currtid2() 仍被驱动程序使用,因此目前保留。请注意,为向后兼容起见,此函数保留其原始形状。根据与许多人(包括 Andres Freund、Peter Eisentraut、Álvaro Herrera、Hiroshi Inoue、Tom Lane 和我本人)的讨论。增加 catalog 版本。讨论: https://postgr.es/m/20200603021448.GB89559@paquier.xyz https://git.postgresql.org/pg/commitdiff/7b94e999606e2e2e10d68d544d49fc5a5d5785ac
Fujii Masao 提交
文档:从一些索引项中删除不必要的空格字符。之前,一些索引项在文档中有“ ,”(即空格加逗号),如下所示。由于逗号前的空格字符是不必要的,因此此提交将其删除,以与其他索引项保持一致。parallel_leader_participation 配置参数,其他规划器选项 作者:Fujii Masao Reviewed-by: Euler Taveira 讨论: https://postgr.es/m/e87b4ddf-1498-2850-bf55-519df3928fd4@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/e522024bd8dd28a0f13dcccfd39170698f45c939
文档:添加关于预处理语句的重新分析和重新规划的描述。当语句使用的数据库对象发生定义性更改或其规划器统计信息更新时,预处理语句会被重新分析和重新规划。前者之前已有文档记录,但后者之前没有。此提交将后者添加到文档中。作者:Atsushi Torikoshi Reviewed-by: Andy Fan、Fujii Masao 讨论: https://postgr.es/m/3ac82f4817c9fe274a905c8a38d87bd9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/4a36eab79a193700b7b65baf6c09c795c90c02c6
pg_stat_statements:跟踪 pgss 条目被取消分配的次数。如果观察到的不同语句多于 pg_stat_statements.max,则会取消分配关于执行次数最少的语句的 pg_stat_statements 条目。此提交使我们能够跟踪这些条目被取消分配的总次数。此数字可以在此提交添加的 pg_stat_statements_info 视图中查看。当调整 pg_stat_statements.max 参数时,这很有用。如果它很高,即条目被频繁取消分配,这可能会导致性能回归,我们可以增加 pg_stat_statements.max 来避免频繁的取消分配。pg_stat_statements_info 视图旨在显示 pg_stat_statements 模块本身的统计信息。目前它只有一个列“dealloc”,表示条目被取消分配的次数。但即将发布的补丁将在视图中添加其他列(例如,最后一次重置 pg_stat_statements 统计信息的时间)。作者:Katsuragi Yuta、Yuki Seino Reviewed-by: Fujii Masao 讨论: https://postgr.es/m/0d9f1107772cf5c3f954e985464c7298@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/9fbc3f318d039c3e1e8614c38e40843cf8fcffde
在 worker_spi 中使用标准的 SIGHUP 和 SIGTERM 信号处理程序。以前 worker_spi 使用自定义的 SIGHUP 和 SIGTERM 信号处理程序。此提交使 worker_spi 使用标准信号处理程序,以简化代码。请注意,在 worker_spi 中,die() 被用作标准的 SIGTERM 信号处理程序,而不是 SignalHandlerForShutdownRequest() 或 bgworker_die()。以前,退出处理只能在主循环内退出,而不能在它调用的后端代码内退出。这就是为什么在这里需要使用 die(),以便 worker_spi 在执行查询时能够响应 SIGTERM 信号。也许可以说 worker_spi 在查询执行期间无法响应 SIGTERM 是一个错误。但由于 worker_spi 只是后台 worker 代码的一个示例,因此我们不进行回溯。感谢 Craig Ringer 报告和调查此问题。作者:Bharath Rupireddy Reviewed-by: Fujii Masao 讨论: https://postgr.es/m/CALj2ACXDEZhAFOTDcqO9cFSRvrFLyYOnPKrcA1UG4uZn9hUAVg@mail.gmail.com 讨论: https://postgr.es/m/CAGRY4nxsAe_1k_9g5b47orA0S011iBoHsXHFMH7cg7HV0O1bwQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2a0847720ae6fa4180bfbe404e4e6bbf2f737708
在 test_shm_mq worker 中使用标准的 SIGTERM 信号处理程序 die()。以前 test_shm_mq worker 将 die() 的简化版本用作 SIGTERM 信号处理程序。此提交使其使用 die() 来简化代码。从代码上看,die() 和之前使用的简化版本之间的区别在于信号处理程序是否可以直接调用 ProcessInterrupts()。但在后台 worker 中,DoingCommandRead 标志永远不会为真,die() 也永远不会直接调用 ProcessInterrupts()。因此,test_shm_mq worker 可以像其他 bgworker 进程(例如,逻辑复制应用启动器或 autoprewarm worker)当前那样安全地使用 die()。感谢 Craig Ringer 报告和调查此问题。作者:Bharath Rupireddy Reviewed-by: Fujii Masao 讨论: https://postgr.es/m/CAGRY4nxsAe_1k_9g5b47orA0S011iBoHsXHFMH7cg7HV0O1bwQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ef848f4ac5a4bd072c65867186268775acfb4298
修复 CLUSTER 进度报告扫描的块数。以前,pg_stat_progress_cluster 视图将堆扫描的当前块号报告为扫描的堆块数(即 heap_blks_scanned)。当启用 synchronize_seqscans 时,此报告的数字可能不正确,因为它允许堆扫描从中间块开始。这可能导致 heap_blks_scanned 列发生回绕。此提交通过计算从堆扫描开始的块到扫描的当前块的块数来修复此错误,并在 heap_blks_scanned 列中报告该数字。此外,在 pg_stat_progress_cluster 视图中,如果最后一个扫描的页面是空的,heap_blks_scanned 在堆扫描阶段结束时可能无法达到 heap_blks_total。此提交通过在堆扫描阶段完成后手动将 heap_blks_scanned 更新为与 heap_blks_total 相同的值来修复此错误。回溯到 v12(引入 pg_stat_progress_cluster 视图的版本)。Reported-by: Matthias van de Meent 作者:Matthias van de Meent Reviewed-by: Fujii Masao 讨论: https://postgr.es/m/CAEze2WjCBWSGkVfYag001Rc4+-nNLDpWM7QbyD6yPvuhKs-gYQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3df51ca8b39f08ef19a77b9776f2547c86b70c49
Andrew Gierth 推送
Amit Kapila 提交
移除 ri_PlanCheck 顶部的过时注释。Commit 5b7ba75f7f 移除了未使用的参数,但忘记更新附近的注释。作者:Li Japin Backpatch-through:13(引入于此)讨论: https://postgr.es/m/0E2F62A2-B2F1-4052-83AE-F0BEC8A75789@hotmail.com https://git.postgresql.org/pg/commitdiff/805b816305b62cb3e2670418ced8f7184a2d29c7
在更多地方使用枚举类型来表示逻辑复制消息类型。Commit 644f0d7cc9 添加了逻辑复制消息类型枚举,用于代替字符字面量,但仍遗漏了一些字符替换。作者:Peter Smith Reviewed-by: Amit Kapila 讨论: https://postgr.es/m/CAHut+PsTG=Vrv8hgrvOnAvCNR21jhqMdPk2n0a1uJPoW0p+UfQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3a8f73ec274bf8cc6066ea315f1a5a022214b02
修复 tablesync worker 中未完成事务的复制。Tablesync worker 在单个事务中运行,但在流式传输模式下,我们在 stream_stop、stream_abort 和 stream_commit 时提交了事务。我们需要避免在 tablesync worker 的流式传输模式下提交事务。顺便,将 process_syncing_tables 的调用移至 apply_handle_stream_commit 之后,在清理流文件之后。这将允许在 tablesync worker 退出之前进行文件清理,否则这些文件将由某个 proc 退出例程处理。作者:Dilip Kumar Reviewed-by: Amit Kapila 和 Peter Smith Tested-by: Peter Smith 讨论: https://postgr.es/m/CAHut+Pt4PyKQCwqzQ=EFF=bpKKJD7XKt_S23F6L20ayQNxg77A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0926e96c493443644ba8e96b5d96d013a9ffaf64
Thomas Munro 推送
Peter Eisentraut 提交
使 bind() 失败的错误提示更准确。提示“Is another postmaster already running ...”(是否已有另一个 postmaster 正在运行...)仅应在错误确实是关于其他进程已在使用地址时打印。在其他情况下,它会产生误导。因此,只有当 errno == EADDRINUSE 时才显示此提示。此外,由于文件系统命名空间中的 Unix 域套接字永远不会为现有文件报告 EADDRINUSE(它们只会覆盖它),因此提示中“If not, remove socket file "%s" and retry.”(如果不是,请删除套接字文件“%s”然后重试。)部分永远不会发生,所以将其删除。抽象命名空间中的 Unix 域套接字可以报告 EADDRINUSE,但在这种情况下没有文件可删除,因此提示在那里也不起作用。Reviewed-by: Michael Paquier michael@paquier.xyz 讨论: https://postgresql.ac.cn/message-id/flat/6dee8574-b0ad-fc49-9c8c-2edc796f0033@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/d5d91acdccae6b322a5634be2c66d62fc6b9a43d
添加对抽象 Unix 域套接字的支持。这是正常 Unix 域套接字的一种变体,它不使用文件系统,而是使用单独的“抽象”命名空间。在用户界面上,这样的套接字用以“@”开头的名称表示。目前在 Linux 和 Windows 上受支持。Reviewed-by: Michael Paquier michael@paquier.xyz 讨论: https://postgresql.ac.cn/message-id/flat/6dee8574-b0ad-fc49-9c8c-2edc796f0033@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/c9f0624bc2f544baacafa38e3797d5323401d039
文档:修复拼写错误。作者:Justin Pryzby pryzby@telsasoft.com 讨论: https://postgresql.ac.cn/message-id/20201121194105.GO24784@telsasoft.com https://git.postgresql.org/pg/commitdiff/2fbd786c3446b1bc90f396d3fa5f4614b0a57d89
tablefunc:拒绝传递给 normal_rand() 的负元组数量。该函数将返回的第一个参数(元组数量)转换为无符号整数,当传递负值时,这会变成一个巨大的数字。这会导致函数执行时间过长。相反,拒绝负值。(如果有人确实想生成更多结果行,他们应该考虑添加 bigint 或 numeric 变体。)同时,改进 SQL 测试以测试该函数返回的元组数量。作者:Ashutosh Bapat ashutosh.bapat@2ndquadrant.com 讨论: https://postgresql.ac.cn/message-id/CAG-ACPW3PUUmSnM6cLa9Rw4BEC5cEMKjX8Gogc8gvQcT3cYA1A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f73999262ed6c40d9a7c3d7cccec7143d4d15287
Noah Misch 推送
Amul Sul 发送了实现 ALTER SYSTEM READ {ONLY|WRITE} 的补丁的又一修订版。
Daniel Vérité 发送了实现 libpq 的 batch/pipelining 的补丁的又一修订版。
Justin Pryzby 和 Tomáš Vondra 交换了实现表达式上扩展统计信息的补丁。
Álvaro Herrera 发送了避免 brin 摘要错误(如果索引被并发重索引,则可能发生)的补丁的又一修订版。
Álvaro Herrera 发送了一个补丁,修复了一个 bug,该 bug 表现为 walsender 在关闭过程中卡住而不关闭,从而阻止 postmaster 通过检查 XLogRecPtrIsInvalid(replicatedPtr) 是否为 true 来完成关闭周期。
Zeng Wenjing 发送了三个更多修订版的补丁,以实现全局临时表。
Bharath Rupireddy 发送了两个更多修订版的补丁,以实现 postgres_fdw 连接缓存——使远程会话持续到本地会话退出。
Bharath Rupireddy 和 Heikki Linnakangas 交换了补丁,使得在安全的情况下可以在 CREATE TABLE AS 中使用并行插入。
Tomáš Vondra 发送了使用非易失性存储作为 WAL 缓冲区的补丁的又一修订版。
Takayuki Tsunakawa 发送了两个更多修订版的补丁,为外部表添加了批量插入。
Justin Pryzby 发送了允许 INSERT SELECT 使用 BulkInsertState、使 INSERT SELECT 使用 multi_insert 并动态切换到 multi-insert 模式的补丁的又一修订版。
Michaël Paquier 发送了重构 SHA2 和 crypto hash API、将 cryptohash_openssl.c 切换为使用 EVP,以及让 pgcrypto 为 EVP 使用核心的 resowner 设施的补丁的又一修订版。
Justin Pryzby 发送了允许 CLUSTER、VACUUM FULL 和 REINDEX 动态更改表空间的补丁的又一修订版。
Keisuke Kuroda 发送了一个补丁,通过减小 ri SPI 计划哈希的大小来修复在具有 FK 的分区表上出现巨大内存消耗的 bug。
Konstantin Knizhnik 发送了两个更多修订版的补丁,以实现 libpq 的自定义压缩。
Takamichi Osumi 发送了一个补丁,使其有可能禁用 WAL 日志记录以加速批量加载。
Nathan Bossart 发送了两个补丁,为 CHECKPOINT 添加了 FAST 选项。
Amit Kapila、Ajin Cherian 和 Peter Smith 交换了实现两阶段事务逻辑解码的补丁。
David Rowley 发送了一个补丁,定义 pg_attribute_cold 和 pg_attribute_hot 为 minGW 8.1 上的空宏,以避免该工具链中的 bug。
Li Japin 发送了一个补丁的又一修订版,通过新的 GUC idle_session_timeout 允许终止空闲会话,并减少 setitimer() 的调用次数。
Euler Taveira de Oliveira 发送了一个补丁,将逻辑解码消息添加到 pgoutput,在流式传输时添加 xid 到消息,解释了为什么 LOGICAL_REP_MSG_MESSAGE 被忽略,简化了 parse_output_parameters 函数使其接受整个 PGOutputData 而不是零散部分,调整了消息的 in_streaming,并全面检查了测试以应对所有这些变化。
Peter Eisentraut 提交了另一个补丁修订版,添加了 result_format_auto_binary_types 设置。
Michaël Paquier 发送了一个补丁的又一修订版,修复了一个 bug,该 bug 表现为 vac_update_datfrozenxid 在 pg_database 元组包含 toast 属性时会引发“错误的元组长度”。
Kyotaro HORIGUCHI 发送了又一个补丁的修订版,以修复几何类型中 NaN 的处理。
Masahiko Sawada 发送了一个补丁的又一修订版,为多个外部服务器启用了两阶段提交。
Daniel Gustafsson 发送了一个补丁的又一修订版,使得可以联机启用和禁用数据校验和。
Alexander Korotkov 发送了一个补丁,实现了一个内置的基础设施,用于在自动化测试套件中重现并发问题。该基础设施的核心是“停止事件”,它们是代码中的特殊位置,可以在满足某些条件时停止执行。
Peter Eisentraut 发送了一个补丁的又一修订版,根据 SQL 标准在公用表表达式中实现了 SEARCH 和 CYCLE 子句。
Thomas Munro 发送了一个补丁的又一修订版,旨在让 latches 发送更少的信号,使用 SIGURG 而不是 SIGUSR1 用于 latches,为 epoll latches 使用 signalfd,并为 kqueue latches 使用 EVFILT_SIGNAL。
Tom Lane 发送了一个补丁的又一修订版,用于在查询结束时报告 GUC 更改。
Peter Smith 发送了一个补丁,使用枚举来表示消息类型。
David Zhang 发送了三个补丁的修订版,为 pgbench 添加了表访问方法作为选项。
Anastasia Lubennikova 发送了一个补丁,用于处理传递给 normal_rand() 的负元组数量。
Peter Eisentraut 发送了一个补丁,使 pageinspect 能够将块号参数更改为 bigint。
Bertrand Drouvot 发送了四项更多修订版的补丁,以通过新的 GUC log_recovery_conflict_waits 来记录待机恢复冲突等待。
Kasahara Tatsuhito 发送了三项更多修订版的补丁,以修复因大量表导致的 autovacuum 问题的 bug。
Masahiko Sawada 发送了一个补丁的又一修订版,为 pg_stat_wal 视图添加了基本统计信息。
Takamichi Osumi 发送了一个补丁,以防止归档恢复命中来自 wal_level=minimal 的 WAL 并且服务器继续工作的场景,这种情况可能导致数据未被复制。
Euler Taveira de Oliveira 发送了一个补丁,在后端崩溃后删除临时文件,以避免因多次崩溃可能导致的 ENOSPC 条件。
Pavel Borisov 发送了一个补丁的又一修订版,使用 SP-GiST 索引访问方法实现覆盖索引。
Kirk Jamison 发送了另一个修订版的补丁,以在恢复期间防止使 smgrextend() 中的块失效,向 smgrnblocks() 添加一个用于缓存块的 bool 参数,在恢复期间通过避免扫描整个缓冲区池来缩减 DropRelFileNodeBuffers()(当关系足够小时或要失效的总块数低于完全扫描的阈值时),并使 DropRelFileNodesAllBuffers() 在恢复期间(当关系足够小时或要失效的块数低于完全扫描阈值时)跳过扫描整个缓冲区池耗时的操作。
Krunal Bauskar 和 Alexander Korotkov 交换了补丁,以改进 ARM 上的自旋锁实现。
Arne Roland 发送了三个补丁的修订版,以确保重命名分区表上的触发器也会重命名分区上的触发器。
Bharath Rupireddy 发送了一个补丁,用于修复 pg_workers 关闭时的错误消息,使其谈论后台工作进程而不是适用于其他情况的不存在的连接。
Stephen Frost 发送了一个补丁的又一修订版,在需要时将 GSS 信息添加到授权连接的日志消息中。
Michael Banck 发送了一个补丁,以澄清 CREATEROLE 角色可以授予默认角色的事实。
Ashutosh Bapat 和 Alexander Korotkov 交换了使 LSN 易于打印的补丁。
Andreas Karlsson 发送了一个 PoC 补丁,以修复 btree_gist 提供的扩展因丢弃 netmask 信息而导致的 inet/cidr 支持损坏的问题。
Pavel Stěhule 和 Justin Pryzby 交换了补丁,使得 pg_dump 可以从文件中读取要转储的表。
Justin Pryzby 发送了一个补丁的又一修订版,使 CLUSTER ON 成为 pg_dump 中的一个独立转储对象,为分区表实现 CLUSTER,将 indisclustered 的更改传播到子/父表,使父索引失效,使父索引在附加时进行集群,并保留聚集分区索引的子代的 indisclustered。
Simon Riggs 发送了一个补丁的又一修订版,为 VACUUM 添加了 FAST_FREEZE 选项。
Simon Riggs 发送了一个补丁,为 lazy VACUUM 实现 one_freeze 然后 max_freeze。
Justin Pryzby 发送了一个补丁的又一修订版,使 pg_ls_* 显示目录和共享文件集。
Justin Pryzby 发送了一个补丁的又一修订版,移除了对 pg_dump 的 8.1 之前的开关行为的引用。
Justin Pryzby 发送了一个补丁的又一修订版,允许对分区表使用 CREATE INDEX CONCURRENTLY,为更多集成添加 SKIPVALID 标志,并使 ReindexPartitions() 设置 indisvalid。
Paul A Jungwirth 发送了两个更多修订版的补丁,以实现 multiranges。
Dean Rasheed 发送了一个补丁的又一修订版,以改进 OR 子句的估计。
James Coleman 发送了一个补丁,如果 gather merge 路径排序不充分,则报错。
James Coleman 发送了另一个修订版的补丁,以确保 generate_useful_gather_paths 不会跳过未排序的子路径,在 generate_useful_gather_paths 中强制路径键的并行安全性,禁止在 proactive sort 中使用 SRF,删除 volatile expr target 搜索,理由是那时不需要它,并在 prepare_sort_from_pathkeys 中记录 find_em_expr_usable_for_sorting_rel。