https://archives.postgresql.org/pgsql-jobs/2021-11/
Nordic PGDay 2022 将于2022年3月22日在芬兰赫尔辛基的 Hilton Helsinki Strand Hotel 举行。征稿截止日期为2021年12月31日 详情
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 每周新闻由 David Fetter 为您呈现
请于太平洋时间周日下午3:00前将新闻和公告提交至 david@fetter.org。
Peter Geoghegan 推送了:
移除 lazy_scan_heap 的并行 VACUUM 注释块。这不应放在关于 lazy_scan_heap 执行的任务的非常高层次讨论旁边。在 vacuumlazy.c 顶部已经有一个类似的、更长的注释块直接提到了 lazy_scan_heap。 https://git.postgresql.org/pg/commitdiff/97f5aef609ce51422934b7dbdba599a7de4dbafd
恢复对标记为 full 的页面考虑 HOT。提交 2fd8685e7f 简化了 heap_update() 中对修改属性的检查。这包括一个影响标记为 PD_PAGE_FULL 的页面的微优化:甚至不尝试使用 HOT,以节省确定 HOT 安全性的几个周期。假设是这次不会成功,因为上次也没有成功。移除此微优化。它只能节省绝大多数 heap_update() 调用消耗的周期,这似乎不值得增加的复杂性。而且完全有可能某些工作负载随着微优化的反复应用会随时间变差,尽管短期内平均节省了一些周期。Author: Peter Geoghegan pg@bowt.ie Reviewed-By: Álvaro Herrera alvherre@alvh.no-ip.org Discussion: https://postgr.es/m/CAH2-WznU1L3+DMPr1F7o2eJBT7=3bAJoY6ZkWABAxNt+-afyTA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1a6f5a0e876306293fda697e7820b404d5b93693
更新 vacuumlazy.c 的高层次注释。更新 vacuumlazy.c 文件头注释(以及 lazy_scan_heap 函数上方的注释),这些注释主要是在引入 HOT 优化之前编写的,当时 lazy_scan_heap 做的事情少得多,而且在初始堆遍历期间并不实际执行裁剪。由于 lazy_scan_heap 现在将更多工作委托给低层次函数,通过讨论规定每个阶段顺序的高层次不变量来介绍该函数是有意义的。同时降低内存耗尽 TID 情况的重要性,因为推迟该讨论使得更容易谈论核心重要性的问题。最后,从头注释中移除关于并行 VACUUM 的讨论。这些注释价值不大,而且放在了错误的位置。 https://git.postgresql.org/pg/commitdiff/12b5ade9023f3ecaddcbc423a22dc284c91c79f6
vacuumlazy.c: 优先使用术语"清理锁"。术语"超级排他锁"是"清理锁"的一个可接受的同义词。即便如此,在同一文件中从一个术语切换到另一个术语是令人困惑的。在 vacuumlazy.c 中统一使用"清理锁"。根据 Andres Freund 的意见。 https://git.postgresql.org/pg/commitdiff/276db875d4f9be2911582f367596d444d6986c77
Fujii Masao 推送了:
Peter Eisentraut 推送了:
向 fmgr magic block 添加 ABI 额外字段。这允许衍生产品有意使其 fmgr ABI 不兼容,并提供清晰的错误消息。Discussion: https://www.postgresql.org/message-id/flat/55215fda-db31-a045-d6b7-d6f2d2dc9920%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/d6d1dfcc99e3dd6e70e2a7024924e491bb7a9670
修复不正确的格式占位符。同时为底层变量选择更好的类型以使其更一致。 https://git.postgresql.org/pg/commitdiff/fb5961fd13b1262df280e400645bdf4ed192f058
移除不需要的 Python include。包含 <compile.h> 和 <eval.h> 自 Python 2.4 以来就不再需要,因为它们通过 <Python.h> 被包含。此外,<eval.h> 正在 Python 3.11 中被移除。所以移除这些 include。Reviewed-by: Tom Lane tgl@sss.pgh.pa.us Discussion: https://www.postgresql.org/message-id/flat/84884.1637723223%40sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/99e4d24a9d77e7bb87e15b318e96dc36651a7da2
更新注释。多处想要指出元组描述符不包含 pg_attribute 的可变长度字段。这始于添加 attacl 时,但此后又添加了更多字段,这些注释没有被一致地更新。重新措辞使目的更清楚,我们不必继续更新它们。 https://git.postgresql.org/pg/commitdiff/36cb5e7c512bef394c9288786c62ef0eb1e891ba
Álvaro Herrera 推送了:
在注释中添加缺失的词。由 Zhihong Yu 报告。Discussion: https://postgr.es/m/CALNJ-vR6uZivg_XkB1zKjEXeyZDEgoYanFXB-++1kBT9yZQoUw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/67385544ce672a9a53cfd51b39c1ff9048d65585
autovacuum: 改进几处的措辞。autovacuum 代码中的一些字符串(一个 WARNING 和一些内存上下文名称)是在"worker"没有其他可能含义的时代编写的,但那个时代早已过去。对此更加具体。同时,将 WARNING 从 elog() 改为 ereport(),以增加可翻译性。Author: Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com Reviewed-by: Nathan Bossart bossartn@amazon.com Reviewed-by: Justin Pryzby pryzby@telsasoft.com Reviewed-by: Kyotaro Horiguchi horikyota.ntt@gmail.com Reviewed-by: Dilip Kumar dilipbalaut@gmail.com Reviewed-by: Masahiko Sawada sawada.mshk@gmail.com Discussion: https://postgr.es/m/CALj2ACX2UHp76dqdoZq92a7v4APFuV5wJQ+AUrb+2HURrKN=NQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/042412879e35791a65509f2786b4954a273466e5
对 XLogReaderAllocate 中的 OOM 更加具体。一些地方可以从添加 errdetail() 中受益,这与我们在其他地方已经做的一致;而那些不能承受 errdetail() 的地方可以获得更具描述性的主要消息。Author: Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com Reviewed-by: Daniel Gustafsson daniel@yesql.se Reviewed-by: Julien Rouhaud rjuju123@gmail.com Discussion: https://postgr.es/m/CALj2ACV+cX1eM03GfcA=ZMLXh5fSn1X1auJLz3yuS1duPSb9QA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2fed48f48f7f2f7a6d6f6d020f046efe3c249828
修复 OVERWRITTEN_CONTRECORD 中错误的 LSN 确定。在提交 ff9f111bce24 中,当前一条记录恰好在页面边界结束时,我混淆了页面中第一条记录的 LSN 的不一致定义。正确的 LSN 应调整以跳过 WAL 页头;我在设置 XLogReaderState->overwrittenRecPtr 时未能使用它,因此在 WAL 重放时 VerifyOverwriteContrecord 会拒绝让重放继续越过该记录。回溯移植到 10。9.6 也包含此 bug,但已不再维护。Discussion: https://postgr.es/m/45597.1637694259@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/44bd3ed332d6ad3207f38b3b6deb6083f0baddf5
记录 max_slot_wal_keep_size 的单位。文档片段未提及单位,也缺少可更改性的说明。回溯移植到 13。Reviewed-by: Kyotaro Horiguchi horikyota.ntt@gmail.com Reported by: b1000101@pm.me Discussion: https://postgr.es/m/163760291192.26193.10801700492025355788@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/013bb6c8c0b5b0ac7948d7126685008505b3aa58
编辑 vacuumdb --analyze-in-stages 文档片段。我犯了一些拼写错误,Nikolai Berkoff 提出了措辞修改建议。Discussion: https://postgr.es/m/VMwe7-sGegrQPQ7fJjSCdsEbESKeJFOb6G4DFxxNrf45I7DzHio7sNUH88wWRMnAy5a5G0-FB31dxPM47ldigW6WdiCPncHgqO9bNl6F240=@pm.me https://git.postgresql.org/pg/commitdiff/dd484c97f55be8336fcb41470768c5b8ae347d13
加固 be-gssapi-common.h 以通过 headerscheck。用测试检查 configure 是否启用了该功能来包围内容,以在没有安装 GSSAPI 的系统上静默头文件检查工具。回溯移植到出现该文件的 12 版本。Discussion: https://postgr.es/m/202111161709.u3pbx5lxdimt@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/f744519326e1ce4774d0966f7848601a8327eeaa
Tom Lane 推送了:
在检查 TAP 测试所需的模块时,探测 $PROVE 而非 $PERL。通常 "prove" 和 "perl" 来自同一个 Perl 安装,但我们支持它们不同的情况(主要因为 MSys 构建农场机器需要这个)。在这种情况下,AX_PROG_PERL_MODULES 完全是错误的工具,因为它检查的是 "perl" 有什么。取而代之的是,制作一个包含所需模块的小 TAP 测试脚本,并在 "prove" 下运行它。此更改后我们根本不需要 ax_prog_perl_modules.m4,所以移除它。为了构建农场的利益,回溯移植到所有支持的分支。Andrew Dunstan and Tom Lane, per an observation by Noah Misch Discussion: https://postgr.es/m/E1moZHS-0002Cu-Ei@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/c4fe3199a6d65212537a59eb0d7e6fad22b9e903
修复带有已删除列的生成列的 pg_dump --inserts 模式。如果表包含一个生成列且其前面有一个已删除的列,dumpTableData_insert 未能考虑到已删除的列,会在错误的列中发出 DEFAULT 占位符。这导致恢复时失败。默认的 COPY 代码路径没有此 bug,这可能解释了为什么它没有更早被发现。在修复的同时,我们可以更智能地处理这种情况:(1) 避免不必要地获取生成列的值,(2) 如果使用 --column-inserts,也从输出中省略生成列。虽然这些模式的性能预计不如 COPY 路径,但我们不妨尽可能高效;它不会增加太多复杂性。根据 Дмитрий Иванов 的报告。回溯移植到引入生成列的 v12。Discussion: https://postgr.es/m/CAPL5KHrkBniyQt5e1rafm5DdXvbgiiqfEQEJ9GjtVzN71Jj5pA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0b126c6a4b00972f2f3533e1718bbe297e2851c2
消除 perlcritic 警告。根据构建农场。 https://git.postgresql.org/pg/commitdiff/db3a660c6327a6df81a55c4aa86e6c0837ecd505
调整 pg_dump 中类型转换的优先级排序。当存储的表达式依赖于用户定义的类型转换时,后端将依赖记录为在类型转换的实现函数上——或者实际上,如果没有涉及转换函数而只是 RelabelType 或 CoerceViaIO,则根本不记录依赖。这对 pg_dump 来说是有问题的,因为它有可能以错误的顺序转储导致恢复失败。鉴于之前没有报告,风险并不高,但如果类型转换用于某些视图(其行类型随后用作其他函数的输入或结果类型),则可以证明这一点。(这导致视图被提升到转储的函数部分,在类型转换之前。)逻辑上完全可靠的修复需要在表达式的解析形式中包含类型转换的 OID,然后 dependency.c 可以提取它,存储的依赖将强制 pg_dump 做正确的事情。这样的更改将相当具有侵入性,当然不可回溯移植。此外,由于我们更希望使用类型转换语法的表达式与通过显式函数调用做同样事情的表达式 equal(),类型转换 OID 字段必须具有特殊的"比较时忽略"语义,使事情变得复杂。所以,让我们改为通过 pg_dump 中一个非常简单的修改来修复:更改对象类型优先级顺序,使类型转换初始排序在函数之前、紧跟类型之后。这以相当直接的方式修复了没有实现函数的类型转换的问题。对于有实现函数的类型转换,实现函数将通过依赖排序步骤被提升到类型转换之前,因此我们仍然有一个有效的转储顺序。根据 Дмитрий Иванов 的报告。回溯移植到所有支持的分支。Discussion: https://postgr.es/m/CAPL5KHoGa3uvyKp6z6m48LwCnTsK+LRQ_mcA4uKGfqAVSEjV_A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b55f2b6926556115155930c4b2d006c173f45e65
Doc: 改进关于 nextval()/setval() 的文档。澄清 nextval 和 setval 的结果在调用事务提交之前不保证持久。一些人似乎从"这些函数永远不会被回滚"的声明中得出了相反的结论,因此重新措辞以避免完全那样说。Discussion: https://postgr.es/m/CAKU4AWohO=NfM-4KiZWvdc+z3c1C9FrUBR6xnReFJ6sfy0i=Lw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4ac452e2285da347c75f5960ae211e183a87b57b
Michaël Paquier 推送了:
添加用于监控复制槽目录内容的 SQL 函数。此提交添加了一组能够查看与复制槽相关的各种路径内容的函数:- pg_ls_logicalsnapdir,用于 pg_logical/snapshots/ - pg_ls_logicalmapdir,用于 pg_logical/mappings/ - pg_ls_replslotdir,用于 pg_replslot/<slot_name>/ 这些函数旨在被监控工具使用。与 pg_ls_dir() 不同,可以将执行权限授予非超级用户。pg_monitor 的角色成员可以访问这些函数。升级目录版本。Author: Bharath Rupireddy Reviewed-by: Nathan Bossart, Justin Pryzby Discussion: https://postgr.es/m/CALj2ACWsfizZjMN6bzzdxOk1ADQQeSw8HhEjhmVXn_Pu+7VzLw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1922d7c6e1a74178bd2f1d5aa5a6ab921b3fcd34
在构建脚本中添加 Visual Studio 2022 支持。文档和与 VS 相关的任何代码路径都已更新以保持整体一致。与 2017 和 2019 类似,我们用于确定使用哪些代码路径进行构建的 VS 版本和 nmake 版本之间仍然以各自的方式不一致。回溯移植到 10,以便构建农场成员能够在所有支持的稳定分支上使用此新版本的 Visual Studio。Author: Hans Buschmann Discussion: https://postgr.es/m/1633101364685.39218@nidsa.net Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/b2265d305d81b0c1a2cec6c5b66a190a9e69e853
移除写入文件头失败时无用的 LZ4 系统调用。如果写入 LZ4 文件头时发生错误,在 write() 的错误代码路径中会调用 LZ4F_compressEnd(),之后调用 LZ4F_freeCompressionContext() 完成清理。代码本身没有问题,但 LZ4F_compressEnd() 证明不是必要的,因为在此阶段没有内容需要刷新,所以移除它。根据 Jeevan Ladhe 和 Robert Haas 的意见。Discussion: https://postgr.es/m/CAOgcT0PE33wbD7giAT1OSkNJt=p-vu8huq++qh=ny9O=SCP5aA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f79962d8264b8d205ce45a8aa11d1b37f9592a81
修复 Windows 上标准流的 fstat() 模拟。win32stat.c 中 fstat() 的模拟在使用流作为参数时导致两个问题,在 EINVAL 上失败:- psql 的 \copy 在使用流时会崩溃。- pg_recvlogical 在 -f - 时会失败。copyselect.sql 中的主测试套件测试覆盖了第一种情况,第二种情况有 TAP 测试。然而,在两种情况下,由于标准流总是被重定向,自动化测试没有注意到这些问题,需要在 Windows 上的终端才能重现。此问题在 bed9075 中引入,问题的根源是 GetFileInformationByHandle() 不能直接在流上工作,因此此提交添加了一个额外的代码路径来模拟并返回最符合实际的一组统计信息。注意,重定向的流依赖可以用 GetFileInformationByHandle() 查询的句柄,但我们可以依赖 GetFinalPathNameByHandleA() 来检测这种情况。Author: Dmitry Koval, Juan José Santamaría Flecha Discussion: https://postgr.es/m/17288-6b58a91025a8a8a3@postgresql.org Backpatch-through: 14 https://git.postgresql.org/pg/commitdiff/10260c794b211117a56ee2eb2deacf609bcca25f
阻止对副本标识索引中列的 ALTER TABLE .. DROP NOT NULL。直接依赖索引的副本标识依赖于一组属性,其中之一是此索引中定义的所有列必须标记为 NOT NULL。ALTER TABLE DROP NOT NULL 的逻辑中存在漏洞,可以移除作为副本标识使用的索引中列的 NOT NULL 属性,因此阻止它以避免将来逻辑解码出现问题。主键的列已经进行了相同的检查,因此修复很直接。Author: Haiying Tang, Hou Zhijie Reviewed-by: Dilip Kumar, Michael Paquier Discussion: https://postgr.es/m/OS0PR01MB6113338C102BEE8B2FFC5BD9FB619@OS0PR01MB6113.jpnprd01.prod.outlook.com Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/f0d43947a1b0c30f0bf2c117cd78bf95a3161268
David Rowley 推送了:
允许 Memoize 在二进制比较模式下运行。Memoize 之前总是使用缓存键类型的哈希相等运算符来确定当前参数集是否与之前缓存的集合相同。某些类型(如浮点数)的 -0.0 和 +0.0 在二进制表示上不同但被哈希相等运算符视为相等,这可能会导致问题,除非连接使用相同的运算符。在这里我们为 Memoize 添加了二进制模式,允许它通过逐位比较而非使用哈希相等运算符来将当前参数集与先前缓存的值进行比较。此二进制模式始终用于 LATERAL 连接,当任何连接运算符不可哈希时也用于普通连接。Reported-by: Tom Lane Author: David Rowley Discussion: https://postgr.es/m/3004308.1632952496@sss.pgh.pa.us Backpatch-through: 14, where Memoize was added https://git.postgresql.org/pg/commitdiff/e502150f7d0be41e3c8784be007fa871a32d8a7f
当非键参数更改时刷新 Memoize 缓存。Memoize 节点下方的子计划可能包含来自 Memoize 节点上方的参数。如果此参数更改,缓存条目可能因新的参数值而过时。之前 Memoize 错误地没有意识到这一点。我们在这里通过在非缓存键参数更改时刷新缓存来修复。Bug: #17213 Reported by: Elvis Pranskevichus Author: David Rowley Discussion: https://postgr.es/m/17213-988ed34b225a2862@postgresql.org Backpatch-through: 14, where Memoize was added https://git.postgresql.org/pg/commitdiff/1050048a315790a505465bfcceb26eaf8dbc7e2e
撤回"当非键参数更改时刷新 Memoize 缓存"。此提交撤回了 1050048a315790a505465bfcceb26eaf8dbc7e2e。 https://git.postgresql.org/pg/commitdiff/dad20ad4709f602b4827a1ab2b0e715f36c548c3
当非键参数更改时刷新 Memoize 缓存,第2次。Memoize 节点下方的子计划可能包含来自 Memoize 节点上方的参数。如果此参数更改,缓存条目可能因新的参数值而过时。之前 Memoize 错误地没有意识到这一点。我们在这里通过在非缓存键参数更改时刷新缓存来修复。Bug: #17213 Reported by: Elvis Pranskevichus Author: David Rowley Discussion: https://postgr.es/m/17213-988ed34b225a2862@postgresql.org Backpatch-through: 14, where Memoize was added https://git.postgresql.org/pg/commitdiff/411137a429210e432f923264a8e313a9872910ca
Amit Kapila 推送了:
SnapBuild* 宏。在 slot.c 和 snapbuild.c 中使用了相同的宏名称 SnapBuildOnDiskNotChecksummedSize 和 SnapBuildOnDiskChecksummedSize。此补丁将 slot.c 中的它们重命名为 ReplicationSlotOnDiskNotChecksummedSize 和 ReplicationSlotOnDiskChecksummedSize,与其他宏类似。这使 slot.c 中的所有宏名称看起来一致。Author: Bharath Rupireddy
Discussion:
https://postgr.es/m/CALj2ACVZo-piDGzBOJRY4ob=_goFR6t9DhZMDMjJWN7LQs34Aw@mail.gmail.com
https://git.postgresql.org/pg/commitdiff/875e02c2dff34f1bc9f3832a4f83c34bf300eb9fRobert Haas 推送了:
修复检测不正确时间线切换的边界情况失败。rescanLatestTimeLine() 包含一个防止切换到在当前恢复点之前从当前时间线分叉的时间线的保护,但如果时间线切换发生在第一条 WAL 记录(必须是检查点记录)被读取之前,该保护不起作用。没有此补丁,在这种情况下可能发生不正确的时间线切换。这是因为 rescanLatestTimeLine() 依赖全局变量 EndRecPtr 来理解 WAL 重放的当前位置。然而,代码中此处的 EndRecPtr 包含的是最后重放记录的终点,而不是当前正在重放的记录的起点或终点。因此,在任何记录被重放之前,它是零,导致健全性检查始终通过。修复方法是显式传递正确的时间线。补丁由我编写,reviewed by Amul Sul。Discussion: http://postgr.es/m/CA+Tgmoao96EuNeSPd+hspRKcsCddu=b1h-QNRuKfY8VmfNQdfg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e7ea2fa342b008ae97e794b0fa2ee538ddcee3b7
xlog.c: 移除全局变量 ReadRecPtr 和 EndRecPtr。在大多数地方,这些变量必然存储与 WAL 重放期间使用的 XLogReaderState 的同名成员相同的值,因为 ReadRecord() 在 XLogReadRecord() 返回后立即将结构成员的值赋给全局变量。然而,XLogBeginRead() 调整结构成员但不调整全局变量,因此在 XLogBeginRead() 之后和 XLogReadRecord() 完成之前,值可能不同。否则,它们必须相同。根据我的分析,唯一在可能与结构成员值不同时引用任一变量的地方是 XLogPageRead 中对 EndRecPtr 的引用。因此,在我们使用全局变量的每个其他地方,我们可以切换到使用结构成员,并移除全局变量。Discussion: http://postgr.es/m/CA+Tgmoao96EuNeSPd+hspRKcsCddu=b1h-QNRuKfY8VmfNQdfg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d2ddfa681db27a138acb63c8defa8cc6fa588922
Heikki Linnakangas 推送了:
Andres Freund 推送了:
Daniel Gustafsson 推送了:
修复 REVOKE ROLE 语句中的 GRANTED BY 支持。提交 6aaaa76bb 为 GRANT 和 REVOKE 语句添加了 GRANTED BY 子句支持,但遗漏了在 REVOKE ROLE 情况下检查角色的支持。通过检查解析的角色是否匹配 CURRENT_ROLE/CURRENT_USER 要求来修复,并为此添加了一些测试。回溯移植到引入 GRANTED BY 支持的 v14。Discussion: https://postgr.es/m/B7F6699A-A984-4943-B9BF-CEB84C003527@yesql.se Backpatch-through: 14 https://git.postgresql.org/pg/commitdiff/b2a459edfe645747744402f23de041e9c0a3cd93
添加 REVOKE ADMIN OPTION 测试。REVOKE ADMIN OPTION FOR <role_name> 语法没有足够的测试覆盖。通过在权限测试套件中添加覆盖来修复。Author: Mark Dilger mark.dilger@enterprisedb.com Discussion: https://postgr.es/m/333B0203-D19B-4335-AE64-90EB0FAF46F0@enterprisedb.com https://git.postgresql.org/pg/commitdiff/4597fd78d6dea2235cb948ea036c2d61057c415c