安全版本 13.4、12.8、11.13、10.18、9.6.23 和 14 Beta 3 已发布。请尽快升级。9.6 系列将于 2021 年 11 月 11 日停止修复。请立即规划主版本升级。
行为准则委员会 (Code of Conduct Committee) 正在寻找新成员,任期为 1-3 年。
pgbouncer 1.16.0 发布,这是一个 PostgreSQL 的连接池和其他功能 已发布
https://archives.postgresql.org/pgsql-jobs/2021-08/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Bruce Momjian 已推送
David Rowley 提交
为 MSVC x86_64 构建添加 POPCNT 支持。02a6a54ec 添加了代码,以便在许多常用平台上使用 POPCNT 指令。我们在这里也为 x86_64 机器上的 MSVC 做了同样的事情。MSVC 的 popcnt 内置函数似乎与 GCC 的不同,它们似乎总是会发出 popcnt 指令。在 GCC 中,行为取决于源文件是用 -mpopcnt 编译的还是没有。因此,MSVC 的内置函数被归入了 pg_popcount*_asm 函数,但这会使该函数名称失效,所以我们将其重命名为 pg_popcount*_fast()。作者:David Rowley 审阅者:John Naylor 讨论:https://postgr.es/m/CAApHDvqL3cbbK%3DGzNcwzsNR9Gi%2BaUvTudKkC4XgnQfXirJ_oRQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2e281249af6c702fd057f34150fd9ac6cb8c7a8b
在 EXPLAIN 中使用 ExplainPropertyInteger 来处理 queryid。这可以节省几行代码。另外添加一个注释,说明为什么我们使用 ExplainPropertyInteger 而不是 ExplainPropertyUInteger,因为 queryid 是 uint64 类型。作者:David Rowley 审阅者:Julien Rouhaud 讨论:https://postgr.es/m/CAApHDvqhSLYpSU_EqUdN39w9Uvb8ogmHV7_3YhJ0S3aScGBjsg@mail.gmail.com 回向支持:14,该代码最初在此版本添加 https://git.postgresql.org/pg/commitdiff/4a3d806f38f99fecf8f2a2bf7990a7ebea9b6c63
文档:修正 VACUUM 内存限制的误导性陈述。在 ec34040af 中,我曾提及将 vacuum 的 maintenance_work_limit 设置为高于 1GB 没有意义,但这是不正确的,因为 ginInsertCleanup() 在 VACUUM 时也会查看 maintenance_work_mem 的设置,而这并不限于 1GB。在此,我试图更清楚地说明限制仅在于 VACUUM 期间我们可以收集的死元组数量。我还添加了一个关于 autovacuum_work_mem 的注释来提及此限制。在 ec34040af 中我没有这样做,因为我曾错误地认为只需将该 GUC 的最大值限制为 1GB。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvpGwOAvunp-E-bN_rbAs3hmxMoasm5pzkYDbf36h73s7w@mail.gmail.com 回向支持:9.6,与 ec34040af 相同 https://git.postgresql.org/pg/commitdiff/deb6ffd4fdeb589de7a13ac1791380a7138cf59f
从 MSVC 构建脚本中移除一些特殊情况。这里我们添加了对 Makefiles 的额外解析,以确定何时添加对 libpgport 和 libpgcommon 的引用。我们还通过添加一些非常基本的逻辑来实现 Makefile 规则,当 .o 文件在 Makefile 中存在对应的 .l 和 .y 文件时添加它们,从而消除了添加当前 contrib_extrasource 的需求。这只是对 Makefiles 进行了一些非常基本的额外解析,试图使使用 make 和 MSVC 构建之间的保持一致。这恰好适用于我们当前的 Makefile 布局,但如果有人在 Makefile 中做了我们没有解析支持的事情,未来很容易就会被破坏。到时候我们再处理。作者:David Rowley 讨论:https://postgr.es/m/CAApHDvoPULi5JW3933NxgwxOmu9Ncvpcyt87UhEHAUX16QqmpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76ad24400d73fa10d527844d50bedf7dacb1e87b
修复 simplehash.h 中不正确的哈希表重调大小代码。这修复了 simplehash.h 中的一个错误,该错误导致在哈希表增长到 SH_MAX_SIZE (2^32) 时使用了不正确的尺寸掩码。当哈希表达到最大可能的桶数时,该代码错误地将尺寸掩码设置为 0。这会导致总是尝试使用第 0 个桶,由于冲突过多而导致尝试增长哈希表的无限循环。Apparently,simplehash 表很少会增长到这么大,因为这个错误可以追溯到 v10 版本,而且似乎没有人注意到。然而,最有可能注意到这个问题的地方可能是在内存中进行大型 Hash Aggregate 操作,其中分组数量接近 2^31。在此修复之后,代码现在最多可以正确处理接近 2^32 个组,并在尝试向哈希表插入更多项时会以以下错误失败:ERROR: hash table size exceeded。但是,work_mem(或较新版本中的 hash_mem_multiplier)设置通常会在达到这么多组之前导致 Hash Aggregate 溢出到磁盘。我进行的最小测试案例需要超过 192GB 的 work_mem 设置才能触发此错误。simplehash 哈希表也用于其他一些地方,例如 Bitmap Index Scans,但同样,哈希表的大小也受 work_mem 的限制,并且需要一个大约 16TB (2^31) 页的表和一个非常大的 work_mem 设置才能触发此问题。使用较小的 work_mem 值,表将变得有损耗,永远不会大到足以触发问题。作者:Yura Sokolov 审阅者:David Rowley, Ranier Vilela 讨论:https://postgr.es/m/b1f7f32737c3438136f64b26f4852b96@postgrespro.ru 回向支持:10,simplehash.h 在此版本添加 https://git.postgresql.org/pg/commitdiff/37450f2ca9ad430d78673cc26816fc2085e65904
Amit Kapila 提交
Tom Lane 提交
在可能的情况下避免确定正则表达式子表达式匹配。由于我们的正则表达式引擎的工作方式,识别带括号的子表达式的精确匹配位置是一项相当昂贵的操作,无论是正则表达式编译时(我们必须为每个带括号的子表达式创建一个优化的 NFA)还是运行时(确定精确匹配位置需要繁琐的搜索)。到目前为止,我们几乎没有尝试优化这种情况。此补丁识别出我们可以在编译时知道不需要子表达式匹配位置的情况,并指示正则表达式编译器不要为未在正则表达式中其他位置被反向引用引用的括号对创建每个子表达式的正则表达式。(为了保留语义,我们显然仍然必须确定反向引用引用的匹配位置。)用户可以通过谨慎地使用“非捕获”括号在可能的情况下获得相同的结果,但很少有人这样做。讨论:https://postgr.es/m/2219936.1628115334@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0e6aa8747d439bb7f08f95e358f0509c50396785
让 regexp_replace() 在可行时利用 REG_NOSUB。如果替换字符串不包含 \1...\9,则我们不需要子匹配位置,因此也可以在此使用 REG_NOSUB 优化。已经有一个用于查找反斜杠的替换字符串预扫描,因此将其扩展到检查数字,并重构以便在编译正则表达式之前完成。同时,尝试使用 memchr() 而不是手动循环来加速预扫描。这很可能在正则表达式本身的噪声中丢失,但也许不会。无论如何,这种编码更短。另外,添加一些测试用例以改进对 appendStringInfoRegexpSubstr() 的覆盖率不足的问题。讨论:https://postgr.es/m/3534632.1628536485@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/18bac60ede44359a1e577df80aef196e371c902e
修复 btree_gin 索引扫描在与“char”类型和 <!--<= 运算符配合使用时出现的错误。由于对“char”类型是带符号还是无符号的困惑,索引搜索如“col < 'x'”或“col <= 'x'”的扫描会从索引的中间开始而不是左端,因此会遗漏许多或所有应该找到的条目。幸运的是,这不是索引损坏的迹象。只有搜索逻辑有问题,我们可以修复它而不会产生不良的副作用。根据 Jason Kim 的报告。这个错误自 btree_gin 问世以来就一直存在,所以回向给所有支持的分支。讨论:https://postgr.es/m/20210810001649.htnltbh7c63re42p@jasonk.me https://git.postgresql.org/pg/commitdiff/a6bd28beb0639d4cf424e961862a65c466ca65bf
在 s_lock.h 中添加 RISC-V 自旋锁支持。与 ARM 的情况一样,只需使用 gcc 的 __sync_lock_test_and_set();,它将编译为 AMOSWAP.W.AQ,这正是我们需要的。可能有一天值得对 RISC-V 的原子操作做些工作,但对于一个可信的移植来说,这应该足够了。回向给所有支持的分支,以防有人想在 RISC-V 上尝试它们。作者:Marek Szuba 讨论:https://postgr.es/m/dea97b6d-f55f-1f6d-9109-504aa7dfa421@gentoo.org https://git.postgresql.org/pg/commitdiff/c32fcac56a212b4e6bb5ba63596f60a25a18109a
修正 s_lock_test 的错误。提交 80abbeba2 显然没有检查这段代码。另外,将生成的可执行文件添加到 .gitignore 中(所以有人尝试这个已经是很久以前的事了)。在尝试 RISC-V 自旋锁补丁时注意到。鉴于此代码已损坏 5 年而无人注意到,可能不值得回向。 https://git.postgresql.org/pg/commitdiff/0a208ed63ffe50a8d9d7c0b33996ec01cc4fdef6
Andres Freund 提交
修复 BootstrapModeMain() 中的错误断言。如其所示,由于我提交前的“简化”,该断言总是为真。根据 coverity 和 Tom Lane。 https://git.postgresql.org/pg/commitdiff/e12694523e7e4482a052236f12d3d8b58be9a22c
修复拼写错误。报告人:Michael Paquier michael@paquier.xyz-- 讨论:https://postgr.es/m/YRIlNQhLNfx555Nx@paquier.xyz https://git.postgresql.org/pg/commitdiff/1d5135f0043b32a7d9fdc66a9553c2078900e240
移除对没有 BGWORKER_SHMEM_ACCESS 的后台工作者的支持。没有共享内存访问权限的后台工作者自后台工作者推出后不久在 EXEC_BACKEND / Windows 构建中就一直存在问题,但并未得到报告。显然它们不常用。问题在于 bgworker 启动需要在 EXEC_BACKEND 子进程中连接到共享内存。StartBackgroundWorker() 会从未连接工作者的共享内存中分离,但此时我们已经初始化了引用共享内存的子系统。解决这个问题并非易事,因此移除不能连接到共享内存的选项似乎是最好的前进方向。在大多数用例中,连接到共享内存的优点远远大于缺点。由于到目前为止没有关于此问题的报告,我们决定不值得尝试在回向分支中解决此问题。根据与 Alvaro Herrera、Robert Haas 和 Tom Lane 的讨论。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210802065116.j763tz3vz4egqy3w@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/80a8f95b3bca6a80672d1766c928cda34e979112
Michaël Paquier 提交
在 ALTER TABLE 的表重写结束时添加对对象访问钩子的调用。ALTER TABLE .. SET {LOGGED,UNLOGGED,ACCESS METHOD} 将永远不会执行表级别的对象访问钩子,这与 SET TABLESPACE 不一致。请注意,与 SET TABLESPACE 不同,对于那些可能不执行物理重写的命令,我们保留了 no-op 情况,因为这需要跟踪命令是否已调用。另一个值得注意的地方是,重写结束时的物理文件交换会为交换操作创建的内部对象执行一些访问调用(例如,sepgsql 的测试会跳过内部对象),但这不会触发对操作进行的表上的钩子。f41872d 添加了对 ALTER TABLE 中 SET LOGGED/UNLOGGED 的支持,但明显忘记了考虑这一点。根据我的检查,sepgsql 在 ddl.sql 中的两个回归测试将在此测试中记录更多信息,这是构建农场成员 rhinoceros 很快就会告诉我们的。但我对其格式不太确定,所以这些尚未刷新。这可能是一个错误,但由于它可能改变任何使用对象访问钩子的行为,因此不进行回向。报告人:Jeff Davis 讨论:https://postgr.es/m/YQJKV29/1a60uG68@paquier.xyz https://git.postgresql.org/pg/commitdiff/7b565843a94412395149c6add0cbfc21d2bca0d4
修复 sepgsql 的回归测试输出。差异是由 7b56584 引起的,涉及到表重写的测试。根据构建农场成员 rhinoceros。讨论:https://postgr.es/m/YRHxXcyFjPuPTZui@paquier.xyz https://git.postgresql.org/pg/commitdiff/1e3445237b861fee2524defde79428058d90c0d8
在 psql 中为 DECLARE .. ASENSITIVE 添加制表符补全。此选项已在 dd13ad9 中引入。作者:Shinya Kato 讨论:https://postgr.es/m/TYAPR01MB289665526B76DA29DC70A031C4F09@TYAPR01MB2896.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/e2ce88b58f151753b094f28bc387cebae865927c
避免在 ROLLBACK PREPARED 中进行不必要的共享失效。性能提升很小,但这使得逻辑与 AtEOXact_Inval() 更一致。在这种情况下不需要其他失效,因为 PREPARE 已经处理了发送任何本地失效。作者:刘怀凌 审阅者:Tom Lane, Michael Paquier 讨论:https://postgr.es/m/OSZPR01MB6215AA84D71EF2B3D354CF86BE139@OSZPR01MB6215.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/710796f0542180cca18ee93889da692df642bdf2
Daniel Gustafsson 提交
移除未使用的回归测试证书 server-ss。在 e39250c64 中包含了 server-ss 证书,但在 TLS 回归测试中从未被使用,因此移除。作者:Jacob Champion 讨论:https://postgr.es/m/d15a9838344ba090e09fd866abf913584ea19fb7.camel@vmware.com https://git.postgresql.org/pg/commitdiff/152c2e0ae1a8d0ed810b2e833b536e64b91da0a6
在 pgcrypto 中禁用 OpenSSL EVP 摘要填充。pgcrypto 中的 PX 层独立于所有后端实现处理摘要填充。从 OpenSSL 3.0.0 开始,如果启用了填充,DecryptUpdate 不会刷新最后一个块,因此我们显式禁用它,因为我们不使用它。一旦构建农场对 OpenSSL 3 有足够的测试,这将回向给所有支持的版本。审阅者:Peter Eisentraut, Michael Paquier 讨论:https://postgr.es/m/FEF81714-D479-4512-839B-C769D2605F8A@yesql.se https://git.postgresql.org/pg/commitdiff/318df802355924015d4d8f21859bc0ef7a348970
为没有加载旧版 OpenSSL 3 添加替代输出。OpenSSL 3 引入了 providers 的概念以支持模块化,并将过时的密码移至新的 legacy provider。如果用户的 openssl.cnf 文件中未加载该 provider,将导致大量回归测试失败,因此添加了覆盖这些情况的替代输出。还记录了在使用启用 OpenSSL 的 pgcrypto 时加载 legacy provider 以使用旧密码的必要性。一旦构建农场对 OpenSSL 3 有足够的测试,这将回向给所有支持的版本。审阅者:Michael Paquier 讨论:https://postgr.es/m/FEF81714-D479-4512-839B-C769D2605F8A@yesql.se https://git.postgresql.org/pg/commitdiff/72bbff4cd6eaf55239ccef79cec61766b5f8f1d2
修复 sslsni connparam 布尔检查。sslsni 的检查仅检查参数是否存在,而不检查参数的实际值。这意味着 SNI 扩展始终处于开启状态。通过检查 sslsni 的值来修复,并且仅当 sslsni 被启用时才激活 SNI 扩展。还将文档更新为与其他布尔参数的文档保持一致。回向给 14 版本,在此版本中首次实现了 sslsni。审阅者:Tom Lane 回向支持:14,在此版本添加了 sslni https://git.postgresql.org/pg/commitdiff/512f4ca6c6b5d2e3a1620288048ccaa712121e12
Heikki Linnakangas 提交
John Naylor 提交了
修复哈希索引 README 中的语法错误。作者:Dilip Kumar 讨论:https://postgresql.ac.cn/message-id/CAFiTN-tjZbuY6vy7kZZ6xO%2BD4mVcO5wOPB5KiwJ3AHhpytd8fg%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/b05f7ecec44be22f6de703e5afdeb4ff3559315a
加速 Unicode 哈希函数的生成。Unicode 键集对生成完美哈希函数的素数很挑剔。调用者可能需要花费数秒钟迭代所有可能的候选乘数和种子组合,以找到一个有效的。Unicode 更新通常一年才发生一次,但这仍然不必要地减慢了 Unicode 脚本的开发和测试速度。为了解决这个问题,在最内层循环中迭代素数。这不会改变树中已有的任何函数。 https://git.postgresql.org/pg/commitdiff/ba958299eaf3d2f55bddb8efb037091d14ca6fd0
Tomáš Vondra 提交了
Thomas Munro 推送
Michael Meskes 已推送
Peter Eisentraut 提交