发布了 Crunchy PostgreSQL Operator 4.6.0,这是一个在 Kubernetes 上部署和管理开源 PostgreSQL 集群的系统。 https://access.crunchydata.com/documentation/postgres-operator/latest/releases/4.6.0/
发布了 pgAdmin4 4.30,这是 PostgreSQL 的一个 Web 和原生 GUI 控制中心。 https://www.pgadmin.org/docs/pgadmin4/dev/release_notes_4_30.html
https://archives.postgresql.org/pgsql-jobs/2021-01/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tom Lane 提交
更新了时区数据文件至 tzdata release 2021a。俄罗斯(伏尔加格勒时区)和南苏丹的 DST 法规变更。澳大利亚、巴哈马、伯利兹、百慕大、加纳、以色列、肯尼亚、尼日利亚、巴勒斯坦、塞舌尔和瓦努阿图的历史性修正。特别是,澳大利亚/库里时区已得到修正,使其与澳大利亚/霍巴特时区完全相同。 https://git.postgresql.org/pg/commitdiff/c7edf4ac246b67073563354c2808c78868cbac36
使 storage/standby.h 能够独立编译。自从 commit 0650ff230 以来,该文件一直因引用 typedef TimestampTz 但未包含相应头文件而未能通过 headerscheck/cpluspluscheck 验证。 https://git.postgresql.org/pg/commitdiff/a4b03de589c1df0845e9732da203f505f2eedb6d
文档:改进 pg_proc.protrftypes 的文档。添加一个指向 pg_type 的“引用”链接,就像其他 OID 类型数组一样。稍微润色一下解释。作者:Joel Jacobson,我进行了一些额外编辑。讨论:https://postgr.es/m/d1cc628c-3953-4209-957b-29427acc38c8@www.fastmail.com https://git.postgresql.org/pg/commitdiff/951862eda57e5dc8f78c97b3c30fe2032a5562b8
修复了对 FUNCTION TRANSFORM 子句的 ruleutils 支持中的错误。我偶然发现这个功能因为一个错误的 Assert 而导致核心转储。雪上加霜的是,自 v11 起输出一直格式错误。显然这里需要进行一些回归测试。讨论:https://postgr.es/m/d1cc628c-3953-4209-957b-29427acc38c8@www.fastmail.com https://git.postgresql.org/pg/commitdiff/07d46fceb4254b00e79f3d06419cbae13b0ecb5a
在 Kerberos 测试中,不覆盖调用者的凭据缓存。这个测试脚本存在一个令人尴尬的疏忽,幸运的是它默认不运行。报告和补丁作者:Jacob Champion。讨论:https://postgr.es/m/1fcb175bafef6560f47a8c31229fa7c938486b8d.camel@vmware.com https://git.postgresql.org/pg/commitdiff/881933f194221abcce07fb134ebe8685e5bb58dd
提高 plpgsql 存储过程中重复 CALL 的性能。此补丁本质上是在清理 plpgsql 存储过程的原始实现(尤其是 commit d92bc83c4)遗留的技术债务。该补丁(或者更确切地说,修复其最严重错误的后续补丁)迫使我们在非原子上下文中每次都重新规划 CALL 和 DO 语句。这不是因为任何根本原因,而仅仅是因为使用已保存的计划需要一个 ResourceOwner 来持有计划的引用计数,而我们手头没有合适的 resowner,并且可用的 API 也不支持使用一个。虽然创建 CALL/DO 的“计划”成本不高,但在重复执行时,这些周期会累积起来。因此,此补丁进行了以下 API 更改:* GetCachedPlan/ReleaseCachedPlan 被修改,允许调用者指定用于固定计划的 resowner,而不是强制使用 CurrentResourceOwner。* spi.c 增加了一个“SPI_execute_plan_extended”入口点,允许调用者指定用于固定计划的 resowner。这借鉴了最近添加的 SPI_prepare_extended 的选项结构的思想,希望能够通过添加更多选项而无需进一步破坏 API。它取代了 SPI_execute_plan_with_paramlist(我已将其标记为已弃用)以及 SPI_execute_plan_with_receiver(v14 中新增,我已将其完全移除)。* 我还借此机会移除了 plpgsql 访问 SPI 私有数据结构来将 SPI 计划标记为“no_snapshot”的粗糙 hack。最好将其视为 SPI_prepare_extended 的一个选项。现在,在运行包含任何 CALL 或 DO 命令的非原子存储过程或 DO 块时,plpgsql 会创建一个 ResourceOwner,用于固定 CALL/DO 命令的计划。(在原子上下文中,我们像以前一样使用 CurrentResourceOwner。)完成此操作后,我们可以像往常一样保存 CALL/DO 计划,无论它们是否跨事务边界使用。这似乎能将具有几个简单参数表达式的 trivial 过程的 CALL 速度提高约 2 倍。通过限制创建额外的 ResourceOwner,在无法受益的情况下,几乎没有惩罚。作者:Pavel Stehule,我进行了一些进一步的修改。讨论:https://postgr.es/m/CAFj8pRCLPdDAETvR7Po7gC5y_ibkn_-bOzbeJb39WHms01194Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ee895a655ce4341546facd6f23e3e8f2931b96bf
对 psql 的 helpSQL() 函数进行代码审查。用于识别单词边界的循环可能会访问超出输入字符串末尾。这很可能永远不会导致实际崩溃,但会使 valgrind 不高兴。当输入有两个单词但我们只有一个匹配项时(例如 "\h with select"),尝试不同单词数量的逻辑不起作用。(我们必须“continue” pass 循环,而不是“break”。)nl_count 的计算方式管理得很奇怪,并且在至少两个代码路径中可能最终调用 PageOutput 时 nl_count = 0,导致应由分页器处理的输出未能分页。此外,在 v12 及更高版本中,nl_count 计算尚未更新以考虑添加的 URL。持有命令语法详细信息的 PQExpBuffer 未被释放,导致了会话寿命的内存泄漏。在此期间,改进了一些注释,为变量选择了更具描述性的名称,并修复了另一个变量的数据类型选择不一致问题。根据 bug #16837,作者:Alexander Lakhin。此代码非常旧,因此向所有受支持的分支回溯。作者:Kyotaro Horiguchi 和 Tom Lane。讨论:https://postgr.es/m/16837-479bcd56040c71b3@postgresql.org https://git.postgresql.org/pg/commitdiff/f76a85000bba2f1b1c926cbbe525e47b246215f1
抑制 commit ee895a655 产生的编译器警告。由于一些晦涩的原因,一些 buildfarm 成员现在开始抱怨 plpgsql_call_handler 的“retval”变量可能未初始化就被使用。它似乎并不比该提交之前更不安全,但这些抱怨(绝大多数?)是新的。我相信在声明处初始化该变量足以解决此问题。我还注意到一些编译器警告 setjmp 正在覆盖同一个变量,这或许有点道理。将其标记为 volatile 以消除警告。另外,重新排列逻辑以使 procedure_resowner 只有一个初始化点,希望以此来消除关于它的某些 setjmp-clobber 警告。(将其标记为 volatile 也可以,但其兄弟变量依赖于单次赋值,所以我们坚持使用该方法。)讨论:https://postgr.es/m/E1l4F1z-0000cN-Lx@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/7292fd8f1c781278021407276474d9188845113d
重新考虑最近添加的 SPI 接口。SPI_execute_with_receiver 和 SPI_cursor_parse_open_with_paramlist 是 v14 中的新功能(参见 commit 2f48ede08)。在它们发布之前,让我们修改它们的 API 以遵循 SPI_prepare_extended 等最近建立的实践:将所有可选参数放入一个调用者应预先归零的结构体中。这样做的目的是允许未来添加更多选项,而无需破坏 API 或继续增加新的 SPI 入口点。考虑到这一点,为它们选择稍微更通用的名称:SPI_execute_extended 和 SPI_cursor_parse_open。讨论:https://postgr.es/m/CAFj8pRCLPdDAETvR7Po7gC5y_ibkn_-bOzbeJb39WHms01194Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d5a83d79c9f9b660a6a5a77afafe146d3c8c6f46
文档:改进 UNNEST() 的文档。根据用户问题,明确说明 UNNEST() 以存储顺序返回数组元素;并提供一个示例来阐明多维数组的行为。在此期间,还澄清 SELECT 参考页中关于 WITH ORDINALITY 的描述。这些细节已在 7.2.1.4 中提供,但参考页不应省略细节。回溯到 v13;在旧版本中没有足够的空间容纳表格。讨论:https://postgr.es/m/FF1FB31F-0507-4F18-9559-2DE6E07E3B43@gmail.com https://git.postgresql.org/pg/commitdiff/662affcfe9e816584e3d8602b3b4005236931bbb
使 ecpg 的 rjulmdy() 和 rmdyjul() 与其声明一致。我们在 extern 声明中使用了 "short *mdy",但在实际函数定义中使用了 "short mdy[3]"。根据 C99,这些是等效的,但最近版本的 gcc 已开始发出关于不一致的警告。在警告变得更广泛之前进行清理。回溯,以防有人想使用最新的编译器构建旧的 PG 版本。讨论:https://postgr.es/m/2401575.1611764534@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1b242f42ba1e732b202f35265ab1a1614ce7d859
修复哈希分区修剪中的不对称分区集问题。perform_pruning_combine_step() 没有被告知哈希分区使用的分区索引数量;更令人尴尬的是,get_matching_hash_bounds() 也错了。这些错误在所有分区具有相同模数且没有分区缺失的常见情况下被掩盖。然而,当分区缺失或大小不一时,我们可能会错误地修剪一些需要扫描的分区,从而导致查询结果错误。虽然一个最小占用的修复方法是导出 get_partition_bound_num_indexes 并让错误的函数使用它,但我认为该函数一开始就不应该存在。PartitionBoundInfoData 缺乏对其 indexes[] 数组长度的明确记录,这不是合理的结构设计。也许当它可以始终假定等于 ndatums 时是可以的,但一旦不再如此,就应该做些事情。添加一个显式的“nindexes”字段使得 partition_bounds_equal() 和 partition_bounds_copy() 比以前更简单、更安全、更快,并消除了其他地方对分区索引数量规则的显式知识。此更改还使得 get_hash_partition_greatest_modulus 过时。我将其保留以防外部代码使用它,但核心代码不再使用。根据 bug #16840,作者:Michał Albrycht。回溯到 v11,哈希分区代码是在那时引入的。(在回溯分支中,在 PartitionBoundInfoData 的末尾添加新字段以尽量减少 ABI 风险。)讨论:https://postgr.es/m/16840-571a22976f829ad4@postgresql.org https://git.postgresql.org/pg/commitdiff/1d9351a87c9a9e82c7091aab03d9299982670ce0
消除另一个 gcc 11 警告。根据 buildfarm 和本地实验,最新的 gcc 不认为 reorder_function_arguments() 中的 MemSet 是安全的。通过添加一个显式检查 pronargs 不为负,并将 MemSet 更改为 memset 来消除此警告。(似乎任何一个更改都足以在 -O2 下消除警告,但让我们两者都做以确保安全。) https://git.postgresql.org/pg/commitdiff/1046dbedde2fc3fe55f007ff3255ab65ab98f858
文档:改进 SET/SHOW 的交叉引用。相应的函数 set_config 和 current_setting 大部分没有超链接。稍微澄清一下它们的描述。讨论:https://postgr.es/m/161183356250.4077.687338658090583892@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/f743a2bbd4e511ad58b6ce01f81841e5e1611474
Amit Kapila 提交
David Rowley 提交
Peter Eisentraut 提交
移除重复包含。报告者:Ashutosh Sharma ashu.coek88@gmail.com。讨论:https://postgresql.ac.cn/message-id/flat/CAE9k0PkORqHHGKY54-sFyDpP90yAf%2B05Auc4fs9EAn4J%2BuBeUQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/ecc4b1318c92594abdf9bd2933fb6feaa9d56229
移除不必要的 SELECT INTO 使用。CREATE TABLE AS 在很长一段时间以来都比 SELECT INTO 更受欢迎(ecpg 和 PL/pgSQL 除外)。测试和文档中仍有一些 SELECT INTO 的用法,有些是旧的,有些是较新的。已将其更改为 CREATE TABLE AS。测试中的一些出现情况仍然是专门用于测试 SELECT INTO 解析或类似功能的。讨论:https://postgresql.ac.cn/message-id/flat/96dc0df3-e13a-a85d-d045-d6e2c85218da%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/b034ef9b376dbe712caa076541d6a750f37d85ce
修复拼写错误。 https://git.postgresql.org/pg/commitdiff/2592be8be5aed6448a1e2b386fffd75ad69eb6c5
允许在普通 GRANT 和 REVOKE 语句中使用 GRANTED BY 子句。SQL 标准允许 GRANT 和 REVOKE(特权)语句使用 GRANTED BY 子句,该子句可以指定 CURRENT_USER 或 CURRENT_ROLE。在 PostgreSQL 中,这两者都是默认行为。由于我们已经为 GRANT(角色)语句具备了所有解析支持,我们也可以为特权变体添加基本支持。这使得我们可以完成 SQL 功能 T332。将来,也许还可以做更多有趣的事情。审阅者:Simon Riggs simon@2ndquadrant.com。讨论:https://postgresql.ac.cn/message-id/flat/f2feac44-b4c5-f38f-3699-2851d6a76dc9@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/6aaaa76bb47db11cd6f567eafa3d1ee81ca59556
文档:澄清参考页上 SELECT INTO 的状态。文档和源代码注释都不完全清楚 SELECT INTO 是真的被弃用了(因此理论上最终会被移除),还是只是一个不太推荐的变体。讨论后发现,其他实现也在直接 SQL 中以类似于 PostgreSQL 的方式使用 SELECT INTO,因此为了兼容性,保留它是有意义的。更新文档中的措辞以反映这一点。讨论:https://postgresql.ac.cn/message-id/flat/96dc0df3-e13a-a85d-d045-d6e2c85218da%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/65330622441d7ee08f768c4326825ae903f2595a
向系统目录添加主键和唯一约束。对于具有唯一索引的系统目录,使用 ALTER TABLE ... PRIMARY KEY/UNIQUE USING INDEX 创建主键和唯一约束。这对于查找主键的 GUI 工具可能很有用,并且将来可能允许声明外键,以制作模式图。约束创建语句由 genbki.pl 从 DECLARE_UNIQUE_INDEX 指令自动生成。要指定可用的唯一索引中哪一个是主键,请使用新的 DECLARE_UNIQUE_INDEX_PKEY 指令。通常,按照惯例,如果目录有 OID 列,则将其作为主键。审阅者:Tom Lane tgl@sss.pgh.pa.us。讨论:https://postgresql.ac.cn/message-id/flat/dc5f44d9-5ec1-a596-0251-dadadcdede98@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/dfb75e478cacb33d277432e0df5e2f9a2a2b52d9
Robert Haas 提交
移除 CheckpointLock。到目前为止,我们在执行 checkpoint 或 restartpoint 时都持有此锁,但 2004 年的 commit 076a055acf3c55314de267c62b03191586d79cf6 和 2009 年的 commit 7e48b77b1cebb9a43f9fdd6b17128a0ba36132f9 一起,已经消除了对它的所有需求。在当前代码中,只有一个进程有权尝试 checkpoint:要么是 checkpointer(在正常操作期间),要么是 postmaster(在单用户操作期间)。所以,我们不需要锁。进行此更改的一个可能担忧是,这意味着许多以前由于之前的 LWLockAcquire() 而处于 HOLD_INTERRUPTS() 状态的代码现在将在此状态下运行。这可能意味着 ProcessInterrupts() 会在以前未被调用的地方被调用。然而,这似乎不太可能产生太多影响,因为 checkpointer 没有映射到 die() 的信号,所以不清楚例如 ProcDiePending = true 究竟是如何发生的。ClientConnectionLost 和 recovery conflicts 也是如此。另外,如果存在任何此类问题,我们可能希望修复它们而不是回滚此更改,因为在中断处理被暂停的情况下运行大量代码通常是不好的。补丁作者:我,根据 Amul Sul 的询问。审阅者:Tom Lane 和 Michael Paquier。讨论:http://postgr.es/m/CAAJ_b97XnBBfYeSREDJorFsyoD1sHgqnNuCi=02mNQBUMnA=FA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d18e75664a2fda2e4d5cc433d68e37fc0e9499f2
将 StartupCLOG() 调用移至 ShmemVariableCache 初始化之后。以前,hot_standby=off 的代码路径在恢复结束时执行此操作,而 hot_standby=on 的代码路径在恢复开始时执行此操作。最好只在一个地方执行此操作,因为 (a) 它更简单,(b) StartupCLOG() 是微不足道的,因此尝试推迟工作没有用,并且 (c) 这将使简化一些其他逻辑成为可能。补丁作者:我,审阅者:Heikki Linnakangas。讨论:http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1f113abdf87cd085dee3927960bb4f70442b7250
在 clog_redo() 中,不要设置 XactCtl->shared->latest_page_number。注释不再准确,自 Hot Standby 引入以来一直不完全准确。最初的想法是 StartupCLOG() 要到恢复结束时才会被调用,因此当代码到达这里时,此值将未初始化,但 Hot Standby 只在 hot_standby=off 时才这样做,而 commit 1f113abdf87cd085dee3927960bb4f70442b7250 意味着此值现在总是在重放开始之前初始化。此代码的原始目的是绕过 SimpleLruTruncate() 中的健全性检查,而该检查将不再发生:现在,如果出现问题,该健全性检查可能会在恢复期间触发。这可能是一件好事,因为在当前代码库中,latest_page_number 应该始终是初始化的,因此我们期望健全性检查会通过。如果未能通过,则说明出了问题,并且抱怨它是适当的。补丁作者:我,审阅者:Heikki Linnakangas。讨论:http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0fcc2decd485a61321a3220d8f76cb108b082009
在 TrimCLOG() 中,不要重置 XactCtl->shared->latest_page_number。由于 CLOG 页码没有直接记录在 checkpoint 记录中,我们必须使用 ShmemVariableCache->nextXid 来找出恢复开始时的最新 CLOG 页码。但是,随着恢复的进行,重放 CLOG/EXTEND 记录将更新我们对最新页码的认识,我们应该依赖于此的准确性,而不是根据对 nextXid 的更新认识来重新计算该值。在恢复期间,ShmemVariableCache->nextXid 只是一个近似值,而 CLOG/EXTEND 记录是 SLRU 如何更新的权威表示。commit 0fcc2decd485a61321a3220d8f76cb108b082009 使此简化成为可能,因为在该更改之前,clog_redo() 可能在此处注入了错误值,并且我们希望在进入正常运行之前将其消除。补丁作者:我,审阅者:Heikki Linnakangas。讨论:http://postgr.es/m/CA+TgmoZYig9+AQodhF5sRXuKkJ=RgFDugLr3XX_dz_F-p=TwTg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/69059d3b2f0754c8e661ba479f7121e6631cdf4a
Andres Freund 提交
Fujii Masao 提交
postgres_fdw: 添加丢弃缓存连接的函数。此提交引入了两个新函数 postgres_fdw_disconnect() 和 postgres_fdw_disconnect_all()。前者丢弃到指定远程服务器的缓存连接。后者丢弃所有缓存连接。如果连接在当前事务中使用,则不会关闭,并会发出警告消息。例如,当用户想要显式关闭不再需要的远程服务器连接,然后阻止它们耗尽远程服务器的连接容量时,这些函数很有用。作者:Bharath Rupireddy,由 Fujii Masao 微调。审阅者:Alexey Kondratov、Zhijie Hou、Zhihong Yu、Fujii Masao。讨论:https://postgr.es/m/CALj2ACVvrp5=AVp2PupEm+nAC8S4buqR3fJMmaCoc7ftT0aD2A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/411ae64997dc3a42d19eda6721c581841ce2cb82
postgres_fdw: 稳定 postgres_fdw_disconnect_all() 的回归测试。commit 411ae64997 添加的回归测试导致 buildfarm 失败。原因是测试中警告消息的输出顺序不稳定。为修复此问题,此提交在执行生成这些警告的测试时临时将 client_min_messages 设置为 ERROR。根据 buildfarm 失败情况。讨论:https://postgr.es/m/2147113.1611644754@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6adc5376dca4ef8b7d591c0ee7338cb9ff660216
postgres_fdw: 修复 -DENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS 的测试失败。回归测试创建的角色名称应以 "regress_" 开头,而 commit 411ae64997 中引入的测试没有这样做。根据 buildfarm 成员 longfin。讨论:https://postgr.es/m/73fc5ae4-3c54-1262-4533-f8c547de2e60@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/0c3fc09fe359a6dc46f1870ceccf60ec60396bc9
postgres_fdw: 修复 CLOBBER_CACHE_ALWAYS 的测试。commit 708d165ddb 和 411ae64997 中添加的回归测试在启用 CLOBBER_CACHE_ALWAYS 时导致 buildfarm 失败。此提交稳定了这些测试。postgres_fdw 建立的远程服务器连接的行为取决于是否启用 CLOBBER_CACHE_ALWAYS。如果未启用,则这些连接会被缓存。另一方面,如果启用,当连接在事务块外建立时,它们不会被缓存(即,它们会在建立它们的查询结束时立即关闭)。因此,随后的 postgres_fdw_get_connections() 无法列出这些连接,postgres_fdw_disconnect() 也无法关闭它们(因为它们已关闭)。当连接在事务块内建立时,无论是否启用 CLOBBER_CACHE_ALWAYS,它们都会被缓存。但如果启用,它们会被立即标记为无效,否则不会。这导致随后的 postgres_fdw_get_connections() 根据是否启用 CLOBBER_CACHE_ALWAYS 在“valid”列中返回不同的结果。此提交阻止上述行为差异影响回归测试。根据 trilobite 上的 buildfarm 失败情况。原始补丁作者:Bharath Rupireddy。我(Fujii Masao)从中提取了回归测试修复并对其进行了微调。报告者:Tom Lane。作者:Bharath Rupireddy。审阅者:Fujii Masao。讨论:https://postgr.es/m/2688508.1611865371@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/f77717b2985aa529a185e6988de26b885ca10ddb
Michaël Paquier 提交
修复在释放 prepared statement 时 postgres_fdw 中的内存泄漏。泄漏很小,因此不进行回溯。commit 21734d2 中的疏忽。报告者:Tom Lane。 https://git.postgresql.org/pg/commitdiff/7b4c660466dd8a1d25ca316ac02099a7cf0e5896
重构 tablecmds.c 中的代码以检查和处理表空间移动。tablecmds.c 的两个代码路径(有存储和无存储的表)使用相同的逻辑来检查是否允许将关系移动到新的表空间,以及更新 pg_class.reltablespace 和 pg_class.relfilenode。REINDEX、CLUSTER 和 VACUUM FULL 的潜在 TABLESPACE 子句需要类似的检查,以确保不会以非法方式移动任何内容(无映射关系、共享关系仅在 pg_global 中、不移动其他后端拥有的临时表)。这通过重组 ALTER TABLE 的现有代码来实现,所有这些逻辑都由两个新的例程控制,这些例程可以重用于其他能够跨表空间移动关系的命令,从而限制需要相同保护的代码路径数量。这也移除了一些为 ALTER TABLE 的有存储和无存储表而重复的代码。作者:Alexey Kondratov、Michael Paquier。讨论:https://postgr.es/m/YA+9mAMWYLXJMVPL@paquier.xyz https://git.postgresql.org/pg/commitdiff/4c9c359d38ff1e2de388eedd860785be6a49201c
文档:澄清 TRUNCATE 权限的视图部分。关于权限的页面提到 TRUNCATE 可以应用于视图甚至其他关系类型。这令人困惑,因为此命令只能用于表和分区表。afc4a78 中的疏忽。报告者:Harisai Hari。审阅者:Laurenz Albe。讨论:https://postgr.es/m/161157636877.14625.15340884663716426087@wrigleys.postgresql.org 回溯版本:12 https://git.postgresql.org/pg/commitdiff/32bef758296142ce0fff944c3478d63fdefdaf33
重构 cryptohashfuncs.c 中的 SHA-2 SQL 函数。在编译 SHA-2 哈希时,相同的代码模式重复了四次。此重构的优点是,如果 pg_cryptohash_type 中添加了新值,则会发出编译警告,以便任何在此领域进行添加的人都需要考虑是否需要支持新的 SQL 函数。作者:Sehrope Sarkuni、Michael Paquier。讨论:https://postgr.es/m/YA7DvLRn2xnTgsMc@paquier.xyz https://git.postgresql.org/pg/commitdiff/f854c69a5b36ba7aa85bee9e9590c3e517970156
修复未加载库时 pg_stat_statements_info() 的崩溃。其他代码路径已针对此情况进行保护,并且 _PG_init() 在 pg_stat_statements.c 中对此发出警告。在此期间,我检查了树中的其他扩展,但没有发现任何漏洞。9fbc3f3 中的疏忽。作者:Jaime Casanova。审阅者:Julien Rouhaud。讨论:https://postgr.es/m/CAJKUy5gF4=_=qhJ1VX_tSGFfjKHb9BvzhRYWSApJD=Bfwp2SBw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bca96ddab57c7c64ce442b0f9f35558741c7f8bd
调整 CheckRelationTableSpaceMove() 和 SetRelationTableSpace() 的注释。4c9c359 引入的这两个函数,在将关系移动到新表空间时,过于乐观地认为只需要 ShareUpdateExclusiveLock。AccessExclusiveLock 是必需的,但在特定条件下,如 REINDEX CONCURRENTLY,可以使用 ShareUpdateExclusiveLock,因为对过去事务的等待使得即使在较低级别锁下操作也是安全的。当前代码仅执行前者,因此更新现有注释以反映这一点。一旦引入 REINDEX (TABLESPACE),这些注释将需要额外的刷新以提及它们的新用例。在此期间,修复了一个错误的变量名。根据与 Álvaro Herrera 的讨论。讨论:https://postgr.es/m/20210127140741.GA14174@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/24843297a96d7be16cc3f4b090aacfc6e5e6839e
文档:改进 repslot 统计信息部分的措辞。此文档已在 9868167 中添加,因此无需回溯。作者:Justin Pryzby、Michael Paquier。讨论:https://postgr.es/m/20201222041153.GK30237@telsasoft.com https://git.postgresql.org/pg/commitdiff/2a5862f013647dd185de3e1b496fd4f614d12f0e
Peter Geoghegan 提交
修复 GiST 索引删除断言问题。避免使用空的 deltids 数组调用 heap_index_delete_tuples(),以避免断言失败。此问题可以说是 commit b5f58cf2 中的疏忽,尽管失败的断言本身是由我最近的 commit d168b666 添加的。不回溯,因为在回溯分支中疏忽是无害的。作者:Peter Geoghegan pg@bowt.ie。报告者:Jaime Casanova jcasanov@systemguards.com.ec。讨论:https://postgr.es/m/CAJKUy5jscES84n3puE=sYngyF+zpb4wv8UMtuLnLPv5z=6yyNw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e42b3c3bd6a9c6233ac4c8a2e9b040367ba2f97c
减少 vacuum_cost_page_miss 的默认值。当 commit f425b605 在 2004 年引入基于成本的 vacuum 延迟时,默认值反映了当时的硬件趋势和 PostgreSQL 的某些历史限制。自那时以来,这两个领域都取得了巨大的进步。通过 commit cbccac37,成本限制 GUC 默认值最终变得更能代表当前趋势,该提交将 autovacuum_vacuum_cost_delay 的默认值降低了 10 倍(从 20ms 降至仅 2ms)。相对成本也有所变化。这也应该通过默认值来反映。更具体地说,避免在 VACUUM 中弄脏页面的相对重要性大大增加,这主要是由于主内存容量的扩展以及闪存存储的趋势。在 Postgres 内部,诸如索引 vacuuming 期间的顺序访问(至少在 nbtree 和 GiST 索引中)之类的改进也是促成因素。为了反映所有这些,将 vacuum_cost_page_miss 的默认值减少到 2。由于 vacuum_cost_page_dirty 的默认值仍然是 20,因此默认情况下,弄脏页面比页面丢失的“成本”高 10 倍。作者:Peter Geoghegan pg@bowt.ie。讨论:https://postgr.es/m/CAH2-WzmLPFnkWT8xMjmcsm7YS3+_Qi3iRWAb2+_Bc8UhVyHfuA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e19594c5c059d2e071b67d87ae84f569a52d2e32
移除未使用的 _bt_delitems_delete() 参数。nbtree 删除操作使用的 latestRemovedXid 值由 _bt_delitems_delete() 的调用者确定,因此没有理由传递单独的 heapRel 参数。commit d168b666823 中的疏忽。 https://git.postgresql.org/pg/commitdiff/dc43492e46c7145a476cb8ca6200fc8eefe673ef
Andrew Gierth 推送
Heikki Linnakangas 提交
为每个编码添加特定于 mbverifystr() 的函数。这使得 pg_verify_mbstr() 函数运行更快,因为它允许更高效的特定于编码的实现。此提交中包含的所有实现都非常简单,它们只是调用以前使用的相同的特定于编码的 verifychar 函数,但这已经提供了性能提升,因为逐个字符的紧密循环更简单。审阅者:John Naylor。讨论:https://postgresql.ac.cn/message-id/e7861509-3960-538a-9025-b75a61188e01@iki.fi https://git.postgresql.org/pg/commitdiff/b80e10638e36b9d2f0b39170c613837af2ca2aac
添加 EUC-TW 和 Big5 之间的直接转换例程。以前,EUC-TW 和 Big5 之间的转换是通过将整个输入先转换为 MIC,然后再从 MIC 转换为目标编码来实现的。实现函数以在两者之间直接转换。现在执行此操作的原因是我正在处理一个将更改转换函数签名的补丁,以便如果输入无效,我们将转换尽可能多的内容并返回成功转换的字节数。如果输入无效,这在使用中间格式时是不可能的,因为如果在中间转换 -> 最终转换中发生错误,我们会丢失原始输入中无效字符的位置信息。避免中间步骤也可以使转换更快。审阅者:John Naylor。讨论:https://postgresql.ac.cn/message-id/b9e3167f-f84b-7aa4-5738-be578a4db924%40iki.fi https://git.postgresql.org/pg/commitdiff/6c5576075b0f93f2235ac8a82290fe3b6e82300d
Álvaro Herrera 提交
pgbench: 移除死代码。doConnect() 从不返回处于 CONNECTION_BAD 状态的连接,因此检查它毫无意义。移除执行此操作的代码。这段代码自从 20 年前的 ba708ea3dc84 开始就已经是死代码了。讨论:https://postgr.es/m/20210126195224.GA20361@alvherre.pgsql 审阅者:Tom Lane tgl@sss.pgh.pa.us。 https://git.postgresql.org/pg/commitdiff/6819b9042fe69154ff3fd2337c5028038d3cfab4
移除 BEFORE UPDATE 触发器中的虚假限制。为了保护用户免受不一致行为的侵害,commit 487e9861d0cf "Enable BEFORE row-level triggers for partitioned tables" 试图阻止 BEFORE UPDATE FOR EACH ROW 触发器将行从一个分区移动到另一个分区。然而,事实证明这个限制在两个方面都是错误的:首先,它会错误地触发,阻止有效情况工作,如 bug #16794 所示;其次,它们并不能保护免受任何不当行为的影响,因为 tuple routing 无论如何都会处理。通过移除该限制来修复。我们保留对 BEFORE INSERT FOR EACH ROW 触发器的相同限制。它在那里是有效且有用的。将来,我们可以通过使 tuple reroute 像处理更新一样处理插入来移除它。回溯到 13。作者:Álvaro Herrera alvherre@alvh.no-ip.org。报告者:Phillip Menke pg@pmenke.de。讨论:https://postgr.es/m/16794-350a655580fbb9ae@postgresql.org https://git.postgresql.org/pg/commitdiff/6f5c8a8ec23f8ab00da4d2b77bfc8af2a578c4d3
Thomas Munro 推送
淘汰 pg_standby。pg_standby 在十多年前就很有用,但现在已经过时了。它被提议淘汰了很多次。现在似乎是最终这样做的时候了,因为“waiting restore commands”与提议的恢复预取功能不兼容。讨论:https://postgr.es/m/20201029024412.GP5380%40telsasoft.com 作者:Justin Pryzby pryzby@telsasoft.com。审阅者:Heikki Linnakangas hlinnaka@iki.fi。审阅者:Peter Eisentraut peter.eisentraut@enterprisedb.com。审阅者:Michael Paquier michael@paquier.xyz。审阅者:Fujii Masao masao.fujii@oss.nttdata.com。 https://git.postgresql.org/pg/commitdiff/514b411a2b5226167add9ab139d3a96dbe98035d
移除 waiting restore_command 的文档。继 pg_standby 被移除之后,也移除描述如何沿线编写自己的“waiting restore_command”的文档部分。讨论:https://postgr.es/m/20201029024412.GP5380%40telsasoft.com 审阅者:Michael Paquier michael@paquier.xyz。 https://git.postgresql.org/pg/commitdiff/5c6d184213bb9feac0800eee1a16769bec9e8d58
Alexander Korotkov 提交了
记录 lax 模式下 `.**` jsonpath 访问器的行为。当 `.**` jsonpath 访问器处理数组时,它会同时选择数组本身及其每个元素。使用 lax 模式时,后续的访问器会自动解包数组。因此,数组每个元素的内容可能会被选择两次。尽管这种行为违反直觉,但它是正确的,因为一切都按设计工作。此提交记录了这一点。回溯到 12 版本,jsonpath 语言是在那时引入的。报告者:Thomas Kellerer。Bug:#16828。讨论:https://postgr.es/m/16828-2b0229babfad2d8c%40postgresql.org 讨论:https://postgr.es/m/CAPpHfdtS-nNidT%3DEqZbAYOPcnNOWh_sd6skVdu2CAQUGdvpT8Q%40mail.gmail.com 作者:Alexandex Korotkov,由 Tom Lane 修订。审阅者:Alvaro Herrera、Thomas Kellerer、Tom Lane。回溯版本:12 https://git.postgresql.org/pg/commitdiff/b41645460af563cfd4e4f57f354058cf69ef3b14
修复复杂词素到 tsquery 的解析。当 to_tsquery() 或 websearch_to_tsquery() 遇到包含多个词语相邻位置的复杂词素时,这些词语会与 OP_AND 操作符连接。这会导致意外的结果。例如,websearch_to_tsquery('"pg_class pg"') 和 to_tsquery('pg_class <-> pg') 都生成 '( pg & class ) <-> pg' tsquery。这个 tsquery 要求 'pg' 和 'class' 词语位于同一位置,并且不匹配 to_tsvector('pg_class pg')。这似乎是荒谬的行为,需要修复。此提交使 to_tsquery() 或 websearch_to_tsquery() 使用 OP_PHRASE 连接相邻位置的词语。因此,现在这些词语会正常地与其他 OP_PHRASE 操作符链接。例如,上面的示例现在生成 'pg <-> class <-> pg' tsquery,它匹配 to_tsvector('pg_class pg')。此提交的另一个影响是,复杂词素的词语位置现在需要与 tsvector 匹配,即使没有周围的 OP_PHRASE。这种行为变化通常看起来是一种改进,但使得此提交不可回溯。报告者:Barry Pederson。Bug:#16592。讨论:https://postgr.es/m/16592-70b110ff9731c07d@postgresql.org 讨论:https://postgr.es/m/CAPpHfdv0EzVhf6CWfB1_TTZqXV_2Sn-jSY3zSd7ePH%3D-%2B1V2DQ%40mail.gmail.com 作者:Alexander Korotkov。审阅者:Tom Lane、Neil Chen。 https://git.postgresql.org/pg/commitdiff/0c4f355c6a5fd437f71349f2f3d5d491382572b7
Noah Misch 推送
修复 CREATE INDEX CONCURRENTLY 与已准备事务的并发问题。在一个使用了 CREATE INDEX CONCURRENTLY 并启用了已准备事务的集群中,使用由此创建的索引的查询可能会静默地失败找不到行。通过让它像等待普通事务一样等待已准备事务,来为未来的 CREATE INDEX CONCURRENTLY 修复此问题。这扩展了 VirtualTransactionId 结构域以允许已准备事务。可能需要重新索引以从过去的发生情况中恢复。回溯到 9.5(所有支持的版本)。作者:Andrey Borodin,审阅者(早期版本):Tom Lane 和 Michael Paquier。讨论:https://postgr.es/m/2E712143-97F7-4890-B470-4A35142ABC82@yandex-team.ru https://git.postgresql.org/pg/commitdiff/8a54e12a38d1545d249f1402f66c8cde2837d97c
修复 CREATE PUBLICATION、wal_level=minimal 和新表时的错误。当在当前事务中创建或重写永久关系时,CREATE PUBLICATION 会出现不正确的失败。在另一个具有相同语义意图的位置进行相同的更改;第二个实例没有用户可见的影响。回溯到 v13,commit c6b92041d38512a4176ed76ad06f713d2e6c01a8 破坏了这一点。作者:Kyotaro Horiguchi。讨论:https://postgr.es/m/20210113.160705.2225256954956139776.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/360bd2321b1ad9c47466bc485ee5eb2f4515372e
恢复 wal_level=minimal 和 SET TABLESPACE 时的“snapshot too old”错误。给定一个在当前事务中重写的永久关系,old_snapshot_threshold 机制假设该关系从未经过早期修剪。因此,当重写后跟早期截断时,查询可能会未能报告“snapshot too old”。ALTER TABLE SET TABLESPACE 可能是暴露此错误的唯一重写机制。REINDEX 设置 indcheckxmin,从而避免了该问题。自 old_snapshot_threshold 存在之前,CLUSTER 就已经清除了页面 LSNs,因此 old_snapshot_threshold 从未与其协作。ALTER TABLE ... SET DATA TYPE 使表在所有过去的快照中看起来都是空的,这严格来说更糟。回溯到 v13,commit c6b92041d38512a4176ed76ad06f713d2e6c01a8 破坏了这一点。作者:Kyotaro Horiguchi 和 Noah Misch。讨论:https://postgr.es/m/20210113.160705.2225256954956139776.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/7da83415e5bc01bba0093f34f4f612b70c70b678
Amit Langote 提交了一个补丁的又一次修订,用于延迟设置 ForeignScanState.resultRelInfo,在所有结果关系中设置 ResultRelInfo.ri_PartitionRoot,并延迟初始化结果关系信息。
Takamichi Osumi 提交了一个补丁的又一次修订,以确保归档恢复不会丢失数据。
Amit Langote 提交了一个补丁的又一次修订,用于在分区表上创建外键触发器,并在跨分区更新期间正确强制执行外键。
Pavel Borisov 提交了一个补丁的又一次修订,用于通过新的 CONFIGURATION 指令自动生成 HASH 和 LIST 分区。
Bucoo 提交了一个补丁的又一次修订,用于通过 batch hashagg 和 sort 支持并行 union/distinct/aggregate。
Vigneshwaran C 提交了一个补丁的又一次修订,用于在 CREATE/ALTER SUBSCRIPTION 操作期间识别发布者丢失的发布。
Bertrand Drouvot 提交了一个补丁,向 pg_dump 添加了 --extension 标志,用于转储特定的扩展。
David Cramer 提交了两个补丁的又一次修订,用于在事务失败时引发错误并回滚,而不是静默回滚。
Konstantin Knizhnik 提交了两个补丁的又一次修订,用于使 auto_explain 创建统计信息。
Michaël Paquier 和 Sehrope Sarkuni 交换了补丁,将 sha1 暴露给 SQL。
Takayuki Tsunakawa、Iwata Aya 和 Kirk Jamison 交换了补丁,为 libpq 添加了跟踪。
Masahiro Ikeda 提交了三个补丁的又一次修订,用于添加与写入/同步 WAL 记录相关的统计信息,并使 wal receiver 报告 WAL 统计信息。
Masahiko Sawada 提交了两个补丁的又一次修订,用于在进行堆和索引 vacuum 之前选择 vacuum 策略,如果索引没有增长则跳过 btree bulkdelete,并为防溢出和积极 vacuum 禁用索引清理。
Peter Smith 和 Amit Kapila 交换了补丁,使 tablesync 工作程序能够各自使用多个事务。
Bruce Momjian 提交了四个补丁的又一次修订,以实现密钥管理。
Dilip Kumar 提交了三个补丁的又一次修订,提供了一个新的接口来获取恢复暂停状态。
David Rowley 提交了一个补丁的又一次修订,用于向 TID Range Scans 添加支持,以高效扫描 TID 范围。
Bertrand Drouvot 提交了另一个补丁修订版,用于在备用服务器上实现最小逻辑解码。
Surafel Temesgen 提交了一个补丁的又一次修订,用于实现系统版本化的时间表。
Jim Finnerty 提交了一个补丁的又一次修订,用于实现 64 位 XID。
Amit Langote 提交了一个补丁的又一次修订,用于彻底改造更新如何计算新元组,并修改继承更新和删除的处理方式。
Li Japin 提交了一个补丁,用于修复 ALTER SUBSCRIPTION ... SET PUBLICATION 的文档。
Daniel Gustafsson 发送了另一个补丁修订版,用于在运行的集群中支持校验和的启用/禁用。
Takashi Menjo 提交了一个补丁的又一次修订,使得可以使用 NVRAM 进行 WAL 缓冲区。
Masahiko Sawada 提交了一个补丁的又一次修订,用于实现涉及多个 postgres 远程服务器的事务。
Dean Rasheed 提交了一个补丁的又一次修订,使得可以在表达式上创建和使用扩展统计信息。
Amit Langote 提交了一个补丁的又一次修订,用于导出 get_partition_for_tuple() 并避免对某些 RI 检查使用 SPI。
Denis Laxalde 提交了一个补丁,用于在 pg_upgrade 中将服务器启动时的默认事务设置为只读。
Amit Khandekar 提交了一个补丁的又一次修订,通过对块使用 popcount64() 而不是 XOR 字符值来加速 tsvectors 的两个 gist 索引签名的 XOR 操作,并避免对 pg_popcount32/64() 调用进行函数指针解引用。
Konstantin Knizhnik 提交了一个补丁的又一次修订,用于扩展 auto_explain 扩展以在选择性估计错误的情况下生成扩展统计信息,并在计算连接选择性时考虑扩展统计信息。
Michail Nikolaev 提交了一个补丁的又一次修订,用于在待机状态下添加对索引 LP_DEAD 提示位的完全支持。
Nathan Bossart 提交了一个补丁的又一次修订,用于避免过早将段标记为 ready-for-archival。
Anastasia Lubennikova 提交了一个补丁的又一次修订,旨在修复一个导致 pg_upgrade 因非标准 ACL 而失败的错误。
Paul Guo 提交了一个补丁,通过仅 fsync() 受影响的文件/目录,并使用 copy_file_range() 进行文件复制来加速 pg_rewind。
Kyotaro HORIGUCHI 和 Heikki Linnakangas 交换了补丁,以添加 catcache 过期。
Heikki Linnakangas 和 Daniel Gustafsson 交换了补丁,支持在运行实例中启用/禁用页面校验和。
Mark Rofail 提交了两个补丁的又一次修订,以实现外键数组。
Vigneshwaran C 提交了三个补丁的又一次修订,通过一个新的函数 pg_print_backtrace()(该函数是调用它的实例的一部分)使得能够打印任何 postgres 进程的堆栈跟踪。
Michaël Paquier 和 Daniel Gustafsson 交换了补丁,使得可以使用 NSS 作为 libpq 的 TLS 提供商。
Bharath Rupireddy 提交了两个补丁的又一次修订,以在 slot_store_error_callback 和 conversion_error_callback 中避免目录访问。
Takamichi Osumi 提交了一个补丁,用于记录 wal_level 何时/何地从上层更改为 'minimal',以使旧备份失效或向用户发出警报。
Amul Sul 提交了一个补丁的又一次修订,用于使用全局屏障实现 wal 禁止状态。
Greg Nancarrow 提交了一个补丁的又一次修订,使得可以在 INSERT ... SELECT 中使用并行选择,并在安全的情况下使用并行 INSERT 或 SELECT。
Justin Pryzby 提交了一个补丁的又一次修订,使得可以在分区表上运行 CREATE INDEX CONCURRENTLY。
Andrew Dunstan 提交了两个补丁的修订,以实现 PostgresNodePath,它是 PostgresNode 的一个子类,它在给定 PostgreSQL 安装路径的上下文中运行命令。
David Rowley 提交了一个补丁的又一次修订,用于添加 Result Cache 执行器节点。
Nathan Bossart 提交了两个补丁的又一次修订,为 VACUUM 添加了 PROCESS_TOAST 选项。
Paul Martinez 提交了一个补丁,用于澄清不允许复制连接时出现的错误消息。
Jacob Champion 提交了一个补丁,用于保存角色的原始认证身份以便记录。
Mark Dilger 提交了三个补丁的又一次修订,以实现一个新的 pg_amcheck contrib 扩展。
Hou Zhijie 提交了一个补丁的又一次修订,用于添加一个新 GUC 和相应的表选项 enable_parallel_dml。
Marco Montagna 提交了一个补丁,通过在为 fdw 准备的语句名称前加上随机数来降低名称冲突的可能性。
Peter Eisentraut 提交了 pg_dump 补丁的又一次修订,以修复继承生成列的转储。
Antonin Houska 提交了一个补丁的又一次修订,用于使用撤销日志清理孤立文件。
Dilip Kumar 和 Justin Pryzby 交换了补丁,以实现自定义表压缩方法。
Álvaro Herrera 提交了一个补丁的又一次修订,用于添加 pg_atomic_monotonic_advance_u64,在 xlog.c 中使用原子操作,并添加屏障。
Fabien COELHO 提交了一个补丁的又一次修订,为 pgbench 添加屏障。
Thomas Munro 提交了两个补丁的修订,用于在运行 dsm_detach() 回调时保持中断,并为 ProcSignalBarriers 使用条件变量。
Andrew Dunstan 提交了一个补丁的又一次修订,允许从客户端证书匹配整个 DN。
Thomas Munro 提交了一个补丁,用于在运行 dsm_detach() 回调时保持中断。
Joel Jacobson 提交了一个补丁,用于改进关于系统视图中 OID 列可能为零的文档。
Vigneshwaran C 提交了一个补丁的又一次修订,用于为 CREATE PUBLICATION 添加模式支持。
Tom Lane 提交了一个补丁,用于记录系统目录的外键关系。
Euler Taveira de Oliveira 提交了一个补丁的又一次修订,用于为逻辑复制实现行过滤。