2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 每周新闻 - 2020 年 12 月 20 日

发布于 2020-12-20,作者 PWN
PWN

PostgreSQL 每周新闻 - 2020 年 12 月 20 日

FOSDEM PGDay 2021 将于 2021 年 2 月 6-7 日在线举行。https://fosdem.org/2021/

行为准则委员会欢迎新成员 Michael Goldberg https://postgresql.ac.cn/about/policies/coc_committee/

本周人物:https://postgresql.life/post/keith_fiske/

PostgreSQL 产品新闻

PoWA 4.1,一款 PostgreSQL 性能工具,已发布。https://github.com/powa-team/powa-archivist/releases/tag/REL_4_1_0

Database .NET v31.5,一款多数据库管理工具,现已支持 PostgreSQL,已发布。https://fishcodelib.com/Database.htm

pgAdmin4 4.29,一款 PostgreSQL 的 Web 和原生 GUI 控制中心,已发布。https://www.pgadmin.org/docs/pgadmin4/dev/release_notes_4_29.html

12 月 PostgreSQL 工作岗位

http://archives.postgresql.org/pgsql-jobs/2020-12/

PostgreSQL 相关新闻

Planet PostgreSQL:http://planet.postgresql.org/

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

Michaël Paquier 提交

Jeff Davis 推送

Tom Lane 提交

  • 改进 hash_create() 的 API 以增加健壮性。发明了一个新的标志位 HASH_STRINGS 来指定 C 字符串哈希,这以前是默认行为;并添加断言,要求 HASH_STRINGS、HASH_BLOBS 和 HASH_FUNCTION 标志位中必须只有一个被设置。这是为了防止类似提交 a1b8aa1e4 中修复的疏忽(例如,错误地省略 HASH_BLOBS)再次发生。此外,当指定 HASH_STRINGS 时,要求 keysize 必须大于 8 字节。这是一个启发式方法,但它应该可以捕获对整数或指针键意外使用 HASH_STRINGS 的情况。(几乎所有现有用例都将 keysize 设置为 NAMEDATALEN 或更大,因此几乎没有理由认为此限制会产生问题。)调整 hash_create(),强制设置 HASH_ELEM 标志位,并移除其对 keysize 和 entrysize 的默认值。由于这些默认值未被记录且基本无用,因此没有调用者省略 HASH_ELEM。此外,从那些拥有 HASHCTL 参数结构体的调用者中移除 memset 将其清零。这从来不是真正必要的,虽然它不是一个糟糕的编码约定,但令人困惑的是,有些调用者这样做了,而有些没有。我们最好通过标准化为“不这样做”来节省一些周期。还改进了 hash_create() 的文档。顺便,通过将键存储为二进制 Oid 而不是字符串,改进了 reinit.c 对哈希表的使用;并且,由于这是一个临时哈希表,因此将其分配在 CurrentMemoryContext 中以保持整洁。讨论:https://postgr.es/m/590625.1607878171@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b3817f5f774663d55931dd4fab9c5a94a15ae7ab

  • 修正 varchar_2.out 以匹配 cs_CZ 区域设置的实际情况。似乎是 c06d6aa4c 中的复制粘贴错误。来自 buildfarm。 https://git.postgresql.org/pg/commitdiff/88e014c149cc396fb218b08eda17c47d5b33e94f

  • 在 relmapper init 中避免源和目标相同的 memcpy()。严格按照 C 标准的解释,memcpy(x,x,n) 是未定义的,尽管很难想象有哪个实现会真正出错。然而,像 valgrind 这样的分析工具可能会对此抱怨;因此,我们将在 relmapper.c 中添加一个临时修复,避免这样做。另请参阅 5b630501e、d3f4e8a8a、ad7b48ea0 以及其他类似的修复。显然,那些人都没有尝试过 valgrinding initdb?这种情况存在了足够长的时间,以至于我惊讶于它之前没有被报告过。后向移植,以防有人想在会抱怨此问题的平台上使用后向分支;我们也已经后向移植了那些早期的修复。讨论:https://postgr.es/m/161790.1608310142@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/53d4f5fef04653fc495ae385a9c2f78c77e5c7d9

  • 添加一些遗漏的 .gitignore 条目。任何忽略 /output_iso/ 的子目录也应该忽略 /tmp_check_iso/,它可能是在失败的 pg_isolation_regress_check 运行后留下的。我认为这些条目已经错误一段时间了,但在后向分支中修复它们似乎并不重要。 https://git.postgresql.org/pg/commitdiff/8afca702ecbf0730b6175afda0cecbbf0a1967e7

  • 删除 src/test/Makefile 中不再需要的 ALWAYS_SUBDIRS 条目。提交 257836a75 添加了“locale”子目录到 SUBDIRS,但忽略了将其从 ALWAYS_SUBDIRS 中移除。这个疏忽没有功能上的影响,因为过滤器函数无论如何都会将其移除。尽管如此,对于读者来说,将子目录同时列在两个地方是令人困惑的,尤其是因为它使得相关的注释成为一个部分谎言。 https://git.postgresql.org/pg/commitdiff/08b01d4dd982b491a2f9641804b368185b8f4c53

  • 在 pgstat_recv_replslot 中避免源和目标相同的 memcpy()。与提交 53d4f5fef 和之前的修复是同一类问题;也由似乎比 buildfarm 更挑剔的 valgrind 测试发现。这是提交 986816750 中的一个疏忽。由于这是 HEAD 中的新内容,因此无需后向移植。 https://git.postgresql.org/pg/commitdiff/ed6329cfa975a13c58c44676464585cda5d317b3

  • 文档:改进 pgbench 脚本权重描述。指出如果您想编写包含“@”的脚本文件名时要使用的解决方法。稍微整理一下文字。作者:Fabien Coelho,我进行了额外的润色 讨论:https://postgr.es/m/1c4e81550d214741827a03292222db8d@G08CNEXMBPEKD06.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/1990ce186ee64f24dcff885a87cea04e3dfd8166

Peter Eisentraut 提交

Tomáš Vondra 提交了

Álvaro Herrera 提交

  • 移除无用的变量存储。错误地引入于 4cbe3ac3e867;错误在 148e632c0541 中修复,但存储被意外保留。 https://git.postgresql.org/pg/commitdiff/a18422a3adf79815fecb50a029b63a8e85ca9d21

Peter Geoghegan 提交

  • 移除过时的 btrescan() 注释。“Ordering stuff”指的是 _bt_first() 对 _bt_orderkeys() 的调用。然而,_bt_orderkeys() 函数已在提交 fa5c8a055a0 中重命名为 _bt_preprocess_keys()。_bt_preprocess_keys() 已经在移除的注释之后被直接引用,这似乎足够了。 https://git.postgresql.org/pg/commitdiff/41ddc27f66fd398abe96e98f3e892a36270db9aa

Bruce Momjian 已推送

Fujii Masao 提交

  • 撤销“放弃用于通知 startup 进程的专用闩锁”。撤销 ac22929a26 以及后续修复 113d3591b8。因为它破坏了这样一种假设,即 startup 进程在等待 buffer pin 上的恢复冲突时,应该只由 buffer unpin 或 ResolveRecoveryConflictWithBufferPin() 中启用的超时来唤醒。例如,这导致 SIGHUP 信号处理程序或 walreceiver 进程不必要地频繁唤醒 startup 进程。此外,添加了关于为什么不应删除已撤销补丁试图删除的专用闩锁的注释。感谢 Kyotaro Horiguchi 的讨论。作者:Fujii Masao 讨论:https://postgr.es/m/d8c0c608-021b-3c73-fffd-3240829ee986@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/00f690a239932e477f25120d19b08aacdc30deb7

  • pg_stat_statements:跟踪所有统计信息最后重置的时间。此提交向 pg_stat_statements_info 视图添加了“stats_reset”列。此列指示 pg_stat_statements 视图中所有统计信息最后重置的时间。根据讨论,此提交还更改了 pg_stat_statements_info 代码,以便“dealloc”列与“stats_reset”同时重置,即每当删除所有 pg_stat_statements 条目时,以保持一致性。以前,“dealloc”仅在调用 pg_stat_statements_reset(0, 0, 0) 时重置,而在调用带有非零参数的 pg_stat_statements_reset() 时丢弃所有条目时不会重置。这令人困惑。作者:Naoki Nakamichi, Yuki Seino 审阅者:Yuki Seino, Kyotaro Horiguchi, Li Japin, Fujii Masao 讨论:https://postgr.es/m/c102cf3180d0ee73c1c5a0f7f8558322@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/2e0fedf0362cc964c4dae42258455b6391051e70

Amit Kapila 提交

Alexander Korotkov 提交了

  • 多范围数据类型。多范围基本上是已排序的、不重叠的范围数组,上面定义了集合论运算。自 v14 起,每个范围类型都会自动获得一个对应的多范围数据类型。存在命名多范围类型的手动和自动机制。可以使用 CREATE TYPE 中的 multirange_type_name 属性指定多范围类型名称。否则,会自动生成多范围类型名称。如果范围类型名称包含“range”,则将其更改为“multirange”。否则,我们在末尾添加“_multirange”。多范围的实现具有节省空间的内部表示格式,该格式避免了额外的填充和 OID 的重复存储。总之,这种格式允许以 O(n) 的时间复杂度按索引获取特定范围。已为多范围实现了统计信息收集和选择性估计。为此,已存储的多范围近似为没有间隔的并集范围。该字段将来可能需要改进。Catversion 已增加。讨论:https://postgr.es/m/CALNJ-vSUpQ_Y%3DjXvTxt1VYFztaBSsWVXeF1y6gTYQ4bOiWDLgQ%40mail.gmail.com 讨论:https://postgr.es/m/a0b8026459d1e6167933be2104a6174e7d40d0ab.camel%40j-davis.com#fe7218c83b08068bfffb0c5293eceda0 作者:Paul Jungwirth,由我修订 审阅者:David Fetter, Corey Huinker, Jeff Davis, Pavel Stehule 审阅者:Alvaro Herrera, Tom Lane, Isaac Morland, David G. Johnston 审阅者:Zhihong Yu, Alexander Korotkov https://git.postgresql.org/pg/commitdiff/6df7a9698bb036610c1e8c6d375e1be38cb26d5f

  • pg_dump.c 中关于多范围的修复。此提交修复了两个错误的版本号检查和一个错误的空值检查。 https://git.postgresql.org/pg/commitdiff/8344d72cccae699e13884a5705b91dc1c4747c03

  • 修正 6df7a9698b 引入的编译器警告。 https://git.postgresql.org/pg/commitdiff/11072e86939d2f5ca0a97c709b46f29ea8b57590

待处理补丁

Michaël Paquier 发送了引入 SHA1 cryptohash 基础设施的补丁的另一个修订版。

Andrey Borodin 发送了补丁的另一个修订版,用于在 GetMultiXactIdMembers 中使用共享锁来处理偏移量和成员,使 MultiXact 本地缓存大小可配置,添加一个条件变量来等待下一个 MultXact 偏移量(在某个角落情况),并添加 GUCs 来调整 MultiXact SLRUs。

Kyotaro HORIGUCHI 发送了一个补丁,以确保仅在适当的情况下(即仅在非备用节点上)取消无效页面头错误消息。

Andrey V. Lepikhov 发送了补丁的另一个修订版,将多插入决策逻辑移至执行器,并将其与 FDW API 的三个新方法一起使用:BeginForeignCopy、ExecForeignCopy 和 EndForeignCopy,以加速应用于具有远程分区的表的 COPY FROM。

Fujii Masao 发送了补丁的另外两个修订版,添加了一个 log_recovery_conflict_waits GUC,该 GUC 顾名思义。

Tom Lane 发送了补丁的两个修订版,以修正 PL/pgsql 进行赋值的方式。

Bharath Rupireddy 和 Hou Zhijie 交换了补丁,使得可以在 CTAS 中使用并行 INSERT。

Nathan Bossart 和 Kyotaro HORIGUCHI 交换了旨在修复归档状态“.ready”文件可能过早创建的 bug 的补丁。

Kirk Jamison 发送了补丁的另一个修订版,使用 dlist 使删除关系缓冲区更有效。

Amit Kapila 发送了补丁的另外三个修订版,以实现两阶段事务的逻辑解码。

Yuzuko Hosoya 发送了补丁的另一个修订版,以使 autoanalyze 在分区表上工作得更好。

Atsushi Torikoshi 发送了一个补丁,向 pg_locks 视图添加了一个 wait_start 列。

Iwata Aya 发送了补丁的另一个修订版,向 libpq 添加了跟踪。

Laurenz Albe 发送了对补丁的两个修订,以将会话统计信息添加到 pg_stat_database。

Peter Eisentraut 发送了补丁的另一个修订版,将 EXTRACT 的返回类型更改为 numeric。

Fabrízio de Royes Mello 发送了补丁的另一个修订版,以在备用服务器上实现最小逻辑解码。

Justin Pryzby 发送了补丁的另外两个修订版,允许 CLUSTER、VACUUM FULL 和 REINDEX 动态更改表空间。

Jeff Davis 发送了一个补丁,以强制执行 ASCII 恢复点名称。

Bharath Rupireddy 发送了一个旨在修复 postgres_fdw 中的缓存连接泄漏 bug 的补丁(当关联的用户映射被删除时),通过将关闭所有无效连接的位置移至 pgfdw_xact_callback() 来实现。

Peter Smith 发送了补丁的另外两个修订版,使 tablesync 可以使用多个工作程序。

Bruce Momjian 和 Neil Chen 交换了实现密钥管理的补丁。

Tomáš Vondra 发送了补丁的另一个修订版,以在 generate_useful_gather_paths 中考虑未排序的路径,在 generate_useful_gather_paths 中检查并行安全性,在 disallow SRFs below Gather Merge 时考虑排序,在 find_em_expr_usable_for_sorting_rel 中避免搜索易变表达式,并改进 find_em_expr_usable_for_sorting_rel 注释,以阐明 find_em_expr_usable_for_sorting_rel 和 prepare_sort_from_pathkeys 之间的关系,即这两个地方需要共享哪些限制。

Laurenz Albe 发送了补丁的另一个修订版,以修复 psql 的 \e 系列函数中的一个严重违反 POLA 的情况,即如果用户在未进行任何更改的情况下退出编辑器,则会执行之前的查询。修复方法是清除查询缓冲区。

Heikki Linnakangas 发送了补丁的另一个修订版,通过使用单个数组和哈希而不是为每种对象类型使用一个来使 resowners 更易于扩展。

Justin Pryzby 发送了 pg_upgrade/test.sh 的另一个修订版,其中进行了一些更改,以允许从 v11 进行升级测试。

Heikki Linnakangas 发送了一个补丁,以以更大的块进行 COPY FROM 编码转换/验证。

Fujii Masao 发送了补丁的三个修订版,旨在修复后端和恢复之间的死锁检测失败的 bug,方法是添加对这种情况的检查。

Michaël Paquier 发送了补丁的两个修订版,以重构 HMAC 实现。

Konstantin Knizhnik 发送了补丁的两个修订版,以添加一种在登录时触发触发器的方式。

David Fetter 发送了一个补丁,实现了 psql 中的 \gsetenv,类似于 \gset,只是用于环境变量。

Önder Kalacı 发送了补丁的另一个修订版,以实现逻辑复制的行过滤。

Denis Smirnov 和 Konstantin Knizhnik 交换了实现 libpq 压缩的补丁。

Peter Eisentraut 发送了一个补丁,将 `make_*()` 函数的 seconds 参数更改为 numeric。

Fujii Masao 发送了一个补丁,旨在修复 STANDBY_LOCK_TIMEOUT 可能不会中断 ProcWaitForSignal() 的 bug,方法是确保 StandbyLockTimeoutHandler() 设置一个闩锁。

Bharath Rupireddy 发送了补丁的另一个修订版,以在 CTAS/CMV 中,如果关系已存在,则快速失败。

Gilles Darold 发送了补丁的另一个修订版,以修复 DDL 中函数命名空间可能在函数仍存在时消失的竞态条件。

Michaël Paquier 发送了一个补丁,以删除重复的 ASCII 检查,并使保留的检查更高效。

Justin Pryzby 发送了补丁的另外两个修订版,允许 psql 的 \dti+ 查看 `pg_toast.*`。

David CARLIER 发送了一个补丁,在 ARM 上实现了 SPIN_LOCK。

Michaël Paquier 和 Heikki Linnakangas 交换了旨在修复使用 OpenSSL 时 cryptohash 函数不正确分配处理的 bug 的补丁。

Tom Lane 和 Alexander Lakhin 交换了展示如何使用 Valgrind 进行 TAP 测试的补丁。

Craig Ringer 发送了一个补丁,通过修复一个错误的跟踪点来识别 tracepoint 中的 LWLocks,该错误跟踪点在 LWLockWaitForVar 中会触发 lwlock__acquire 事件,尽管该函数从未实际获取锁;为每个跟踪命中添加了 tranche id 和锁指针;为所有锁获取和释放添加了单个路径跟踪点;并添加了一些关于 LWLock tranche 的注释,以便为未来的读者澄清问题。

Konstantin Knizhnik 发送了一个补丁,重新实现了 BufferAlloc,在此过程中消除了双重锁定。

Pavel Stěhule 提交了另一个修订版的补丁,以实现模式变量。

Tom Lane 发送了一个补丁,以修复 jsonb_concat() 中的一个角落情况 bug。

Thomas Munro 发送了补丁的两个修订版,添加了 pg_preadv() 和 pg_pwritev(),它们提供了同步 scatter/gather I/O 例程,然后使用它们通过向量 I/O 来清零 WAL 段。

Tomáš Vondra 发送了另一个补丁修订版,用于实现 BRIN 多范围索引。