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 为您带来
请在太平洋标准时间下午 3:00 前的周日将新闻和公告提交至 david@fetter.org。
Tom Lane 推送了
将时区数据文件更新到 tzdata 2021a 版本。俄罗斯(伏尔加格勒时区)和南苏丹的夏令时法律变更。澳大利亚、巴哈马、伯利兹、百慕大、加纳、以色列、肯尼亚、尼日利亚、巴勒斯坦、塞舌尔和瓦努阿图的历史修正。值得注意的是,Australia/Currie 时区已修正到与 Australia/Hobart 完全相同的程度。https://git.postgresql.org/pg/commitdiff/c7edf4ac246b67073563354c2808c78868cbac36
使 storage/standby.h 再次可以独立编译。自提交 0650ff230 以来,此文件由于引用了 typedef TimestampTz 而未包含相应的头文件,因此未通过 headerscheck/cpluspluscheck 验证。https://git.postgresql.org/pg/commitdiff/a4b03de589c1df0845e9732da203f505f2eedb6d
文档:改进 pg_proc.protrftypes 的文档。添加指向 pg_type 的“references”链接,就像我们为其他类型 OID 数组所做的那样。稍微润色一下解释。Joel Jacobson,由我进行额外编辑。讨论:https://postgr.es/m/d1cc628c-3953-4209-957b-29427acc38c8@www.fastmail.com https://git.postgresql.org/pg/commitdiff/951862eda57e5dc8f78c97b3c30fe2032a5562b8
修复函数 TRANSFORM 子句的规则实用程序支持中断的问题。我偶然发现由于错误的断言导致其转储核心。更糟糕的是,自 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 过程的原始实现遗留的技术债务,特别是提交 d92bc83c4。如果我们在非原子上下文中,该补丁(或更准确地说,修复其最严重错误的后续补丁)迫使我们每次都重新规划 CALL 和 DO 语句。这不是出于任何根本原因,而仅仅是因为使用保存的计划需要有一个 ResourceOwner 来保存该计划的引用计数,而我们手头没有合适的资源所有者,如果这样做,可用的 API 也不支持使用。虽然为 CALL/DO 创建“计划”的成本不高,但周期在重复执行中会累积。因此,此补丁进行了以下 API 更改:*
修改 GetCachedPlan/ReleaseCachedPlan 以允许调用者指定使用哪个资源所有者来固定计划,而不是强制使用 CurrentResourceOwner。*
spi.c 获得了一个“SPI_execute_plan_extended”入口点,允许调用者说出使用哪个资源所有者来固定计划。这借鉴了最近添加的 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,该 ResourceOwner 将用于固定 CALL/DO 命令的计划。(在原子上下文中,我们像以前一样只使用 CurrentResourceOwner。)完成此操作后,我们可以像往常一样保存 CALL/DO 计划,无论它们是否跨事务边界使用。对于简单参数表达式的简单过程的 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”。(我们必须“继续”pass 循环,而不是“break”。)计算 nl_count 的逻辑很奇怪,并且在至少两条代码路径中可能会以 nl_count = 0 调用 PageOutput,从而导致无法分页应馈送到寻呼机的输出。此外,在 v12 及更高版本中,nl_count 计算尚未更新以考虑添加 URL。保存命令语法详细信息的 PQExpBuffer 没有被释放,导致会话生命周期的内存泄漏。在这里,改进了一些注释,为变量选择了一个更具描述性的名称,修复了另一个变量的不一致数据类型选择。来自 Alexander Lakhin 的错误 #16837。此代码非常旧,因此回溯到所有受支持的分支。Kyotaro Horiguchi 和 Tom Lane。讨论:https://postgr.es/m/16837-479bcd56040c71b3@postgresql.org https://git.postgresql.org/pg/commitdiff/f76a85000bba2f1b1c926cbbe525e47b246215f1
抑制来自提交 ee895a655 的编译器警告。由于某些晦涩的原因,一些 buildfarm 成员现在生成关于 plpgsql_call_handler 的“retval”变量可能使用未初始化的抱怨。它似乎并不比提交之前更不安全,但这些抱怨是(大多数?)新的。我相信在声明变量时初始化变量足以消除这些抱怨。我还注意到,一些编译器正在警告 setjmp 覆盖同一个变量,这可能更具辩护性。将其标记为 volatile 以消除该警告。此外,重新排列逻辑以使 procedure_resowner 具有单个初始化点,希望消除一些关于它的 setjmp 覆盖警告。(将其标记为 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 中的新功能(参见提交 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 过时。我保留了它,以防任何外部代码使用它,但没有核心代码再使用它。根据 Michał Albrycht 的错误 #16840。回溯补丁到 v11,哈希分区代码就是从那里引入的。(在回溯分支中,将新字段添加到 PartitionBoundInfoData 的末尾,以最小化 ABI 风险。)讨论:https://postgr.es/m/16840-571a22976f829ad4@postgresql.org https://git.postgresql.org/pg/commitdiff/1d9351a87c9a9e82c7091aab03d9299982670ce0
消除另一个 gcc 11 警告。根据构建场和本地实验,最前沿的 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 是真的被弃用(因此理论上注定最终会被删除),还是只是一个不太推荐的变体。经过讨论,看来其他实现也以类似于 PostgreSQL 的方式在直接 SQL 中使用 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。到目前为止,我们在执行检查点或重启点时都持有此锁,但 2004 年的提交 076a055acf3c55314de267c62b03191586d79cf6 和 2009 年的提交 7e48b77b1cebb9a43f9fdd6b17128a0ba36132f9 共同消除了对它的所有需求。在当前代码中,只有一个进程有权尝试检查点:在正常操作期间为检查点进程,或者在单用户操作期间为 postmaster。所以,我们不需要锁。进行此更改的一个可能担忧是,这意味着先前由于之前的 LWLockAcquire() 而使 HOLD_INTERRUPTS() 生效的相当多的代码现在将在没有它的情况下运行。这可能意味着 ProcessInterrupts() 在以前没有调用它的地方被调用。但是,这似乎不太可能做很多事情,因为检查点进程没有任何信号映射到 die(),因此不清楚例如 ProcDiePending = true 如何首先发生。与 ClientConnectionLost 和恢复冲突类似。此外,如果存在任何此类问题,我们可能希望修复它们而不是恢复此更改,因为在暂停中断处理的情况下运行大量代码通常是不好的。由我进行的补丁,根据 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。注释不再准确,并且自从引入热备用以来一直不完全准确。这里的最初想法是,StartupCLOG() 不会在恢复结束之前被调用,因此当达到此代码时,此值将未初始化,但热备用仅在 hot_standby=off 时才使其为真,而提交 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 页码没有直接记录在检查点记录中,我们必须使用 ShmemVariableCache->nextXid 来确定恢复开始时最新的 CLOG 页码。然而,随着恢复的进行,CLOG/EXTEND 记录的重放会更新我们对最新页码的概念,我们应该依赖于该值的准确性,而不是基于更新的 nextXid 概念重新计算该值。无论如何,在恢复期间,ShmemVariableCache->nextXid 只是一个近似值,而 CLOG/EXTEND 记录是对 SLRU 如何更新的权威表示。提交 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() 的回归测试。提交 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_”开头的名称,而提交 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 的测试。当启用 CLOBBER_CACHE_ALWAYS 时,提交 708d165ddb 和 411ae64997 中添加的回归测试导致 buildfarm 失败。此提交稳定了这些测试。由 postgres_fdw 建立的外部服务器连接的行为取决于是否启用 CLOBBER_CACHE_ALWAYS。如果未启用,则会缓存这些连接。另一方面,如果启用,则当在事务块外部建立连接时,不会缓存这些连接(即,它们会在建立它们的查询结束时立即关闭)。因此,后续的 postgres_fdw_get_connections() 无法列出这些连接,并且 postgres_fdw_disconnect() 无法关闭它们(因为它们已经关闭)。当在事务块内部建立连接时,无论是否启用 CLOBBER_CACHE_ALWAYS,都会缓存它们。但是,如果启用,它们会立即标记为无效,否则不会。这会导致后续的 postgres_fdw_get_connections() 在“有效”列中返回不同的结果,具体取决于是否启用 CLOBBER_CACHE_ALWAYS。此提交防止上述行为差异影响回归测试。根据 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 推送
修复 postgres_fdw 中取消分配预处理语句时发生的内存泄漏。泄漏很小,因此不进行向后移植。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
doc:删除 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 是一项要求,但 ShareUpdateExclusiveLock 可以在特定条件下使用,例如 REINDEX CONCURRENTLY,其中对过去事务的等待使操作即使在较低级别的锁下也是安全的。当前的代码仅执行前者,因此更新现有注释以反映这一点。一旦引入 REINDEX (TABLESPACE),这些注释将需要额外的刷新以提及它们的新用例。在此期间,修复不正确的变量名。与Álvaro Herrera 的讨论。讨论:https://postgr.es/m/20210127140741.GA14174@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/24843297a96d7be16cc3f4b090aacfc6e5e6839e
doc:改进 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() 以避免断言失败。此问题可以认为是提交 b5f58cf2 中的疏忽,尽管失败的断言本身是由我最近的提交 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 的默认值。当提交 f425b605 在 2004 年引入基于成本的 vacuum 延迟时,默认值反映了当时的硬件趋势以及 PostgreSQL 中的某些历史限制。自那时以来,这两个领域都取得了巨大的进步。在提交 cbccac37 之后,成本限制 GUC 的默认值最终变得更能代表当前的趋势,该提交将 PostgreSQL 12 的 autovacuum_vacuum_cost_delay 的默认值降低了 10 倍(从 20 毫秒降至仅 2 毫秒)。相对成本也发生了变化。默认值也应考虑这一点。更具体地说,避免在 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 参数。提交 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 触发器中删除虚假限制。为了保护用户免受不一致行为的影响,提交 487e9861d0cf "为分区表启用 BEFORE 行级触发器" 试图阻止 BEFORE UPDATE FOR EACH ROW 触发器将行从一个分区移动到另一个分区。然而,事实证明该限制在两个方面是错误的:首先,它会错误地失败,阻止有效情况的运行,如错误 #16794 中所示;其次,它们不会防止任何不当行为,因为元组路由无论如何都会处理。通过删除该限制来修复。我们对 BEFORE INSERT FOR EACH ROW 触发器保持相同的限制。它在那里是有效且有用的。将来,我们可以通过使元组重路由像处理更新一样处理插入来删除它。回溯到 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 在十多年前很有用,但现在已经过时了。有人多次提出要弃用它。现在似乎是最终完成它的好时机,因为“等待恢复命令”与提议的恢复预取功能不兼容。讨论: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
删除等待 restore_command 的文档。在删除 pg_standby 之后,还删除描述如何按照相同思路编写自己的“等待 restore_command”的文档部分。讨论:https://postgr.es/m/20201029024412.GP5380%40telsasoft.com 审核人:Michael Paquier michael@paquier.xyz https://git.postgresql.org/pg/commitdiff/5c6d184213bb9feac0800eee1a16769bec9e8d58
Alexander Korotkov 推送了
记录松散模式下 .**
jsonpath 访问器的行为。当 .**
jsonpath 访问器处理数组时,它会选择数组及其每个元素。使用松散模式时,后续访问器会自动解包数组。因此,每个数组元素的内容可能会被选择两次。即使此行为违反直觉,它也是正确的,因为一切都按设计工作。此提交记录了它。回溯到引入 jsonpath 语言的 12 版本。报告者:Thomas Kellerer 错误:#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') 匹配。此提交的另一个效果是,即使没有周围的 OP_PHRASE,复杂变形单词位置现在也需要匹配 tsvector。这种行为的更改通常看起来像是一种改进,但使此提交无法回溯。报告者:Barry Pederson 错误:#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,其中提交 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 恢复“快照过旧”。给定在当前事务中重写的永久关系,old_snapshot_threshold 机制假设该关系从未受到过早期修剪的影响。因此,当重写紧随早期截断之后时,查询可能会无法报告“快照过旧”。ALTER TABLE SET TABLESPACE 可能是唯一能够暴露此错误的重写机制。REINDEX 设置 indcheckxmin,从而避免了该问题。自 old_snapshot_threshold 存在之前,CLUSTER 已将页面 LSN 置零,因此 old_snapshot_threshold 从未与它合作。ALTER TABLE ... SET DATA TYPE 使表对每个过去的快照都显得为空,这严格来说更糟。回溯到 v13,其中提交 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 发送了另一个补丁修订版,以支持使用批处理 hashagg 和排序的并行联合/区分/聚合。
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 接收器报告 WAL 统计信息。
Masahiko Sawada 发送了另外两个补丁修订版,以在堆和索引 vacuum 之前选择 vacuum 策略,如果索引没有增长,则跳过 btree bulkdelete,并禁用针对反环绕和激进 vacuum 的索引清理。
Peter Smith 和 Amit Kapila 交换了补丁,以使 tablesync 工作人员每次可以使用多个事务。
Bruce Momjian 发送了另外四个补丁修订版,以实现密钥管理。
Dilip Kumar 发送了另外三个补丁修订版,以提供一个新界面来获取恢复暂停状态。
David Rowley 发送了另一个补丁修订版,以添加 TID 范围扫描以支持高效扫描 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() 而不是异或 char 值来加速 tsvector 的两个 gist 索引签名的异或运算,并避免 pg_popcount32/64() 调用的函数指针解引用。
Konstantin Knizhnik 发送了另一个补丁修订版,以扩展 auto_explain 扩展,以便在选择性估计不佳的情况下生成扩展统计信息,并在计算连接选择性时考虑扩展统计信息。
Michail Nikolaev 发送了另一个补丁修订版,以在备用机上添加对索引 LP_DEAD 提示位的完全支持。
Nathan Bossart 发送了另一个补丁修订版,以避免过早地将段标记为准备好进行归档。
Anastasia Lubennikova 发送了另一个补丁修订版,旨在修复一个以非标准 ACL 导致 pg_upgrade 失败的错误。
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 发送了另一个补丁修订版,以添加结果缓存执行器节点。
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 发送了两个补丁修订版,以使用全局屏障修复 Windows 上的 DROP TABLESPACE,并使用条件变量进行 ProcSignalBarriers。
Andrew Dunstan 发送了另一个补丁修订版,以允许从客户端证书匹配整个 DN。
Thomas Munro 发送了一个补丁,在运行 dsm_detach() 回调时保持中断。
Joel Jacobson 发送了一个补丁,以改进可以在系统视图中为零的 oid 列的文档。
Vigneshwaran C 发送了另一个补丁修订版,以添加 CREATE PUBLICATION 的模式支持。
Tom Lane 发送了一个补丁,用于记录系统目录的外键关系。
Euler Taveira de Oliveira 发送了另一个补丁修订版,以实现逻辑复制的行过滤。