发布日期:. 2020-11-12
本次发布包含来自 12.4 的多项修复。 有关 12 主版本新特性的说明,请参见 Section E.23.
禁止在索引表达式和物化视图查询中执行 DECLARE CURSOR ... WITH HOLD 以及触发延迟触发器(Noah Misch) §
这实际上是“安全受限操作”沙箱机制中的一个漏洞。有权创建非临时 SQL 对象的攻击者可以利用此漏洞,以超级用户身份执行任意 SQL 代码。
PostgreSQL 项目感谢 Etienne Stalmans 报告此问题。(CVE-2020-25695)
修复 pg_dump、pg_restore、clusterdb、reindexdb 和 vacuumdb 对复杂连接字符串参数的使用(Tom Lane) § §
pg_dump 和 pg_restore 的 -d 参数,以及其他上述程序的 --maintenance-db 参数,可以是包含多个连接参数的“连接字符串”,而不仅仅是数据库名称。当这些程序需要发起额外连接时,例如进行并行处理或处理多个数据库时,连接字符串会被遗忘,额外连接只会使用基本连接参数(数据库名称、主机、端口和用户名)。如果连接字符串包含其他必要信息,例如非默认的 SSL 或 GSS 参数,这可能导致连接失败。更糟的是,连接可能成功建立,却未按预期加密,或者可能遭受本应由指定连接参数防止的中间人攻击。(CVE-2020-25694)
当 psql 的 \connect 命令复用连接参数时,确保复用先前连接字符串中所有未被覆盖的参数(Tom Lane) §
这可以避免因遗漏相关参数(例如非默认的 SSL 或 GSS 选项)而导致重新连接失败。更糟的情况是,重新连接可能成功,却未按预期加密,或者可能遭受本应由指定连接参数防止的中间人攻击。这与刚才提到的 pg_dump 等程序的问题基本相同,只是 psql 的行为更复杂,因为用户可能有意覆盖某些连接参数。(CVE-2020-25694)
防止 psql 的 \gset 命令修改具有特殊处理方式的变量(Noah Misch) §
不带前缀的 \gset 会覆盖服务器要求其设置的任何变量。因此,被攻陷的服务器可以设置 PROMPT1 等受到特殊处理的变量,从而能够在用户会话中执行任意 shell 代码。
PostgreSQL 项目感谢 Nick Cleaton 报告此问题。(CVE-2020-25696)
防止并发截断 SLRU 日志可能造成的数据丢失(Noah Misch) § §
这一罕见问题会表现为后续出现 “apparent wraparound” 或 “could not access status of transaction” 错误。
确保在检查点期间对 SLRU 目录正确执行 fsync(Thomas Munro) §
这可以防止后续操作系统崩溃时可能发生的数据丢失。
修复对具有 BYPASSRLS 属性的用户执行 ALTER ROLE 的行为(Tom Lane,Stephen Frost) §
只有超级用户才可以修改 BYPASSRLS 属性,但其他 ALTER ROLE 操作(例如修改密码)应该只需通过普通权限检查就可以执行。之前的代码错误地将对此类角色的所有修改都限制为只能由超级用户执行。
确保 ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER 不递归处理子表(Álvaro Herrera) §
以前,ONLY 标志被忽略了。
当目标列已标记为 NOT NULL 时,避免 ALTER TABLE SET NOT NULL 不必要地递归处理分区(Tom Lane) §
这可以避免并行 pg_restore 中潜在的死锁。
修复结合继承使用的 CREATE TABLE LIKE 中对表达式的处理(Tom Lane) § §
如果 CREATE TABLE 命令同时使用 LIKE 和传统继承,来自 LIKE 父表的 CHECK 约束及表达式索引中的列引用往往会被错误编号,导致错误结果或奇怪的错误消息。在具有生成列特性的分支中,GENERATED 表达式也可能出现同样的问题。
禁止对分区表执行 DROP INDEX CONCURRENTLY(Álvaro Herrera,Michael Paquier) §
这种情况本来就会失败,但错误消息令人困惑。
允许对自引用视图成功执行 LOCK TABLE(Tom Lane) §
以前会抛出关于无限递归的错误,但似乎没有必要禁止这种情况。
在 REINDEX CONCURRENTLY 前后保留索引的统计信息(Michael Paquier,Fabrízio de Royes Mello) §
非并发的索引重建一直会保留这些统计信息。
修复 REINDEX CONCURRENTLY 不正确的进度报告(Matthias van de Meent,Michael Paquier) §
确保通过规则或可更新视图更新 GENERATED 列所依赖的列时,生成列也得到更新(Tom Lane) §
此修复还处理了在这些情况下可能未能触发特定列触发器的问题。
将插入或更新的元组路由到正确分区时,重新检查默认分区约束(Amit Langote,Álvaro Herrera) §
这修复了添加分区与插入操作并发进行时的竞争条件。
修复依赖排序规则的分区边界表达式所导致的失败(Tom Lane) §
支持对文本数组进行哈希计算(Peter Eisentraut) §
如果数组元素类型支持排序规则,数组哈希就会失败。尤其是,这使文本数组列无法用作哈希分区的分区键。
修复 to_date() 和 to_timestamp() 将负年份转换为公元前日期时相差一年的错误(Dar Alathar-Yemen,Tom Lane) §
另外,使负年份与显式 “BC” 标记相抵消,得到 AD 年份。
确保 archive_mode 设为 always 时,备库会归档 WAL 时间线历史文件(Grigory Smolkin,Fujii Masao) §
这一疏漏可能导致后续的 PITR 恢复尝试失败。
修复逻辑复制工作进程中的 “cache lookup failed for relation 0” 错误(Tom Lane) §
实际影响很小,因为这种失败不太可能发生;即使发生,工作进程也只会退出并被重启。
防止逻辑复制工作进程发送多余的 ping 请求(Tom Lane) §
在 “smart” 关闭期间,在所有客户端(前台)会话结束之前,不终止后台进程(Tom Lane) §
以前的行为会破坏并行查询处理,因为 postmaster 会终止并行工作进程,并拒绝启动新的并行工作进程。它还会使自动清理停止工作;如果仍存活的客户端会话进行了大量数据变更,就可能造成严重的长期影响。
避免 postmaster 处理信号时递归消耗栈空间(Tom Lane) §
已有观察表明,大量使用并行处理时,过多请求创建并行工作进程的并发信号会导致 postmaster 崩溃。
避免因 SIGQUIT 退出时运行 atexit 处理函数(Kyotaro Horiguchi,Tom Lane) § §
大多数服务器进程早已遵循这一做法,但归档进程被遗漏了。仍在等待客户端启动包的后端也处理有误。
避免错误优化引用看似为常量的分组列的子查询限制条件(Tom Lane) §
如果某个“常量”子查询输出列是仅出现在部分分组集中的分组列,它就并非真正的常量。
修复 GEQO 规划期间考虑逐分区连接时可能发生的崩溃(Tom Lane) §
避免 SQL 函数内联改变可能用于哈希处理的子计划比较表达式的形态时发生失败(Tom Lane) §
构建或重建索引时,容许因并发更新而出现新的 HOT 链(Anastasia Lubennikova,Álvaro Herrera) § §
这一疏漏可能导致 “failed to find parent tuple for heap-only tuple” 错误。
修复索引条件无法满足时并行 B-树索引扫描的失败(James Hunter) §
确保数据插入 BRIN 索引之前,先将其从 TOAST 表示还原(Tomas Vondra) §
索引条目本不应包含指向行外数据的 TOAST 指针,但 BRIN 没有遵守这一要求。这可能导致 “missing chunk number 0 for toast value NNN” 等错误。(如果现有索引出现这种错误,执行 REINDEX 应该就足以修复。)
在 BRIN 索引扫描期间正确处理并发取消汇总(Alexander Lakhin,Álvaro Herrera) §
以前,如果某个页范围恰好在不合适的时刻被取消汇总,索引扫描就可能错误地抛出表示索引损坏的错误。
修复多列 GIN 索引扫描中罕见的 “lost saved point in index” 错误(Tom Lane) §
修复带缓冲的 GiST 索引构建,使其在索引具有包含列时正常工作(Pavel Borisov) §
修复 pg_hba_file_rules 视图中不具可移植性的 getnameinfo() 用法(Tom Lane) §
在 FreeBSD 11 以及可能的其他平台上,此错误会使该视图的 address 和 netmask 列始终为空。
避免启动并行工作进程时 debug_query_string 为 NULL 所导致的崩溃(Noah Misch) §
修复事件触发器监控 ALTER TABLE 操作时的释放后使用隐患(Jehan-Guillaume de Rorthais) §
避免 BEFORE ROW UPDATE 触发器返回具有已删除列或“缺失”列的表中的“旧”行时发生失败(Amit Langote,Tom Lane) § §
这种阻止更新的方法可能导致崩溃、意外的 CHECK 约束失败或不正确的 RETURNING 输出,因为在这些操作中,“缺失”列会被读取为 NULL。(这里所说的“缺失”列,是指通过 ALTER TABLE ADD COLUMN 添加、具有非 NULL 常量默认值的列。)已删除的列也可能造成问题。
修复关于移动聚合数据类型不一致的不正确错误消息(Jeff Janes) §
避免并行工作进程报告很长的错误消息时卡死(Vignesh C) §
避免通过共享内存队列传输很大的数据载荷时发生不必要的失败(Markus Wanner) §
修复 JIT 代码生成中对模板函数属性的不正确处理(Andres Freund) § §
已证实这会在 s390x 上导致崩溃,而且其他平台上很可能也存在其他情况。
修复 RLS 策略相关的关系缓存内存泄漏(Tom Lane) §
修复 index_get_partition() 在边界情况下的内存泄漏(Justin Pryzby) §
修复 SIGHUP 处理判定某个 GUC 变量的新值必须重启才能应用时出现的小量内存泄漏(Tom Lane) §
修复 PL/pgsql 的 CALL 处理中的内存泄漏(Pavel Stehule,Tom Lane) §
使 libpq 支持 .pgpass 文件中任意长度的行(Tom Lane) § §
这主要用于允许将很长的安全令牌用作密码。
在 Windows 版 libpq 中,每个进程只调用一次 WSAStartup(),完全不调用 WSACleanup()(Tom Lane,Alexander Lakhin) §
以前,libpq 在连接开始时调用 WSAStartup(),在连接清理时调用 WSACleanup()。但调用 WSACleanup() 似乎会干扰程序的其他操作;特别是,我们观察到过无法将预期输出写入 stdout 的罕见失败。省略该调用似乎没有不良影响,因此予以省略。(这还消除了程序执行一连串数据库连接时,反复加载和卸载 DLL 所造成的性能问题。)
修复 ecpg 库在 Windows 上的逐线程初始化逻辑(Tom Lane,Alexander Lakhin) §
多线程 ecpg 应用可能因锁定不正确而偶发行为异常。
在 Windows 上,使 psql 以文本模式而非二进制模式读取反引号命令的输出(Tom Lane) §
这可以确保正确处理换行符。
确保 pg_dump 收集扩展配置表的逐列信息(Fabrízio de Royes Mello,Tom Lane) § §
未能这样做会导致指定 --inserts 时崩溃,或在使用 COPY 重载表数据时生成指定不完整(虽然通常正确)的 COPY 命令。
确保并行 pg_restore 以正确顺序处理引用分区表的外键(Álvaro Herrera) §
以前,它可能在所需索引尚未全部就绪时就尝试恢复外键约束,从而导致错误。
修复 contrib/pgcrypto 中潜在的内存泄漏(Michael Paquier) §
在 contrib/pgcrypto 中增加对一种不太可能发生的失败情况的检查(Daniel Gustafsson) §
修复最近添加的 timetz 测试用例,使其在美国未实行夏令时期间也能正常工作(Tom Lane) §
将时区数据文件更新到 tzdata 2020d 版,以反映斐济、摩洛哥、巴勒斯坦、加拿大育空地区、麦夸里岛和凯西站(南极洲)的夏令时法规变更,并修正法国、匈牙利、摩纳哥和巴勒斯坦的历史数据。(Tom Lane) § §
将我们使用的时区库副本同步到 IANA tzcode 2020d 版(Tom Lane) § §
这纳入了上游将 zic 默认输出选项从 “fat” 改为 “slim” 的修改。对我们而言,这只是表面上的变化,因为在 v13 之前的分支中,我们仍然选择 “fat” 模式。此项修改还确保 strftime() 只在失败时才改变 errno。