pg_statement_rollback v1.2,一个为语句级别添加服务器端事务和回滚功能的扩展,已发布。
https://archives.postgresql.org/pgsql-jobs/2021-06/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tomáš Vondra 提交了
为 CREATE STATISTICS 的 nodes/*funcs.c 添加 transformed 标志。Commit a4d75c86bf 添加了一个新标志,用于跟踪语句是否经过 transformStatsStmt() 处理,但未能将其添加到 nodes/*funcs.c。由于向 copy/equal/out 函数添加了标志,catversion 进行了更新。报告人:Noah Misch 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/d57ecebd128cdf2f4844a2ea4d35ff28d7d69be8
修复 CLOBBER_CACHE_ALWAYS 的 pg_visibility 回归失败。Commit 8e03eb92e9 撤销了过多的代码,重新引入了 39b66a91bd 修复的其中一个问题——在 relcache 失效后,页面可能留有部分空白。报告人:Tom Lane 作者:Masahiko Sawada 讨论:https://postgr.es/m/822752.1623032114@sss.pgh.pa.us 讨论:https://postgr.es/m/CAD21AoA%3D%3Df2VSw3c-Cp_y%3DWLKHMKc1D6s7g3YWsCOvgaYPpJcg%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/d1f0aa7696917213485c03b076b573497a535076
调整 postgres_fdw 中的批处理大小,避免使用过多参数。FE/BE 协议使用 Int16 索引标识参数,这会将每个查询的最大参数数量限制为 65535。随着 postgres_fdw 添加了批处理功能,此限制更容易达到,因为整个批处理本质上是一个查询,从而使此错误更容易出现。失败有点不可预测,因为它还取决于查询中的列数。因此,此补丁不是直接失败,而是调整 batch_size 以不超过最大参数数量。报告人:Hou Zhijie houzj.fnst@cn.fujitsu.com 审阅者:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 讨论:https://postgr.es/m/OS0PR01MB571603973C0AC2874AD6BF2594299%40OS0PR01MB5716.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/cb92703384e2bb3fa0a690e5dbb95ad333c2b44c
优化 FDW 批量插入的 slot 创建。Commit b663a41363 引入了 FDW 的批量插入,但元组 slot 的处理因两个原因而出现问题。首先,每个单独的批次都会重新创建 slot。其次,所有 slot 都引用了相同的元组描述符——对于相对较小的批次这不成问题,但对于大批次,这会在资源所有者代码中触发 O(N^2) 的行为。这两个问题相互制约——为了减少 slot 创建/删除的次数,需要更大的批次。然而,批次越大,资源所有者的成本越高。对于实际的批次大小(100-1000),这不成问题,因为好处(延迟节省)大大超过了资源所有者成本。但对于极大的批次,情况可能更糟,甚至不如非批量模式。通过仅初始化一次元组 slot(并在批次之间重用它们)以及为每个 slot 使用新的元组描述符副本来解决。讨论:https://postgr.es/m/ebbbcc7d-4286-8c28-0272-61b4753af761%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/b676ac443b6a83558d4701b2dd9491c0b37e17c4
Tom Lane 提交
修复 equalfuncs.c 对 FuncCall.funcformat 行为不一致的问题。对 CoercionForm 字段的其他 equalfuncs.c 检查使用 COMPARE_COERCIONFORM_FIELD(使其成为 no-ops),但 commit 40c24bfef 忽略了让 _equalFuncCall 也这样做。修复此问题。仅当 FuncCall.funcformat 没有语义影响,而只是决定 ruleutils.c 的显示格式时,这才是严格正确的。40c24bfef 在解析分析中添加了几个可能破坏该规则的检查;但仔细检查后,它们是多余的,所以只需将其删除。根据 Noah Misch 的报告。讨论:https://postgr.es/m/20210606063331.GC297923@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a65e9f3f1405b786673feec131879843432bf9a6
修复客户端代码中对可能编码错误的字符串的不谨慎处理。字符串末尾附近编码不正确的 multibyte 字符可能导致各种处理循环越过字符串的终止 NUL,结果从没有可检测到的问题到程序崩溃不等,具体取决于内存中的后续内容。这在服务器端不是问题,因为我们小心地在对字符串进行任何有趣的处理之前验证其编码。然而,这种疏忽渗入到客户端代码中,客户端代码不应假定任何人已经验证了其输入的编码。虽然这无疑是一个值得修复的错误,但 PG 安全团队选择不将其视为安全问题,主要原因是任何不受信任的文本都应在将其纳入 SQL 或 psql 命令之前通过 PQescapeLiteral 或类似方法进行清理。(如果应用程序未能这样做,则可以使用相同的方法导致 SQL 注入,后果可能比仅仅客户端程序崩溃严重得多。)这些函数已经根据 CVE-2006-2313 对此类问题进行了防范。为解决此问题,发明了 PQmblenBounded(),它类似于 PQmblen(),但它不会返回超过字符串剩余字节数的字节数。在 HEAD 中,我们可以将其作为一个新的 libpq 函数,就像 PQmblen() 一样。但是,在稳定分支中更改 libpq 的 API 是不明智的,因此在后端分支中,将 PQmblenBounded 定义为宏,在需要它的文件中使用。(请注意,仅仅改变 PQmblen 的行为并不是一个好主意;特别是,它会完全破坏转义函数对这个确切问题的防御。所以我们只想为那些没有更好方法的调用者提供一个版本。)根据 houjingyi 的私人报告。向所有支持的分支进行回溯。 https://git.postgresql.org/pg/commitdiff/42f94f56bf9559f0a3cf5f3ffde50655834694ee
稳定 contrib/seg 回归测试。如果在填充 test_seg 表后立即发生 autovacuum,它将更新统计信息,导致我们优先选择普通索引扫描而不是位图扫描,从而破坏预期输出(以及测试用例的目的)。为解决此问题,只需强制在这里选择位图扫描。自从 commit de1d042f5 以来,这显然是不正确的。尚不清楚为什么我们最近才看到由于它而导致的任何编译场故障;但 prairiedog 在过去一周内在此测试中失败了两次。因此,回溯到 v11(此测试用例在该版本中引入)。 https://git.postgresql.org/pg/commitdiff/d16ebfbff74b30c83a4669a1df318cacfa7e52ca
在 SQL 标准函数体中处理空语句时避免崩溃。gram.y 在组装 routine_body_stmt_list 时应丢弃 NULL 指针(空语句),就像它处理其他语句列表一样。Julien Rouhaud 和 Tom Lane,根据 Noah Misch 的报告。讨论:https://postgr.es/m/20210606044418.GA297923@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/bfeede9fa464ab707eb5ac5704742bf78bd7ac9e
避免在持久化非稳定游标时出现错误行为。PersistHoldablePortal 一直假设它应该存储要持久化的查询的整个输出,这需要重新定位和重新读取输出。如果查询不稳定,这会很麻烦:我们可能会得到不同的行内容,甚至不同数量的行,这会极大地混淆游标状态。如果游标是 NO SCROLL,这很容易解决:只需存储剩余的查询输出,无需任何重定位,并调整 portal 的游标状态以匹配。除了消除语义问题外,这可能比存储整个输出更有效。如果游标是可滚动(scrollable)的,我们能做的有限,但对于易变查询(volatile query)的结果进行滚动已经很不安全了。我们只需更清晰地记录,无法保证从该查询获得正确结果。已经存在禁止将 SCROLL 与 FOR UPDATE/SHARE 一起使用的规定,这是 SELECT 查询产生非稳定结果的一种方式。我们可以设想禁止在查询包含易变函数时使用 SCROLL,但这会很昂贵。此外,这可能会破坏运行良好的应用程序,如果它们具有实际上是稳定的但用户却忽略标记为稳定的函数。因此,我们仅限于记录这种危险。虽然这个问题已经存在一段时间了,但在 v11 中它变得更加严重,v11 引入了持久化 plpgsql 游标(可能是隐式游标)的可能性,即使它们违反了 WITH HOLD 的规则。因此,我选择回溯到 v11,而不是更早的版本。根据 bug #17050,来自 Алексей Булгаков。讨论:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/ba2c6d6cec000f0aeaeda4d56a23a335f6164860
强制 plpgsql 的隐式游标使用 NO SCROLL。对 bug #17050 的进一步思考表明,为 plpgsql FOR-over-query 循环打开的隐式游标使用 CURSOR_OPT_NO_SCROLL 是个好主意。这可以确保,如果有人在循环中提交,PersistHoldablePortal 不会尝试重新定位和重新读取游标。虽然如果查询中出现 FOR UPDATE/SHARE,我们无论如何都会选择 NO_SCROLL,但易变函数还有其他风险;而且,无论如何,花费精力存储我们确信不需要的行是愚蠢的。(同时,改进 exec_run_select 中的注释,该注释对何时可以使用并行模式的理由有些含糊。游标操作对于无名 portal 没有风险。)直到 v11 之前都不是问题,v11 引入了持久化此类游标的可能性。因此,回溯到 v11。根据 bug #17050,来自 Алексей Булгаков。讨论:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/be90098907475f3cfff7dc6d590641b9c2dae081
避免在某些支持 GSS 的环境中 ECPG 测试失败。Buildfarm 成员 hamerkop 一直报告说,connect/test5.pgc 中的两个测试用例显示出与测试期望不同的错误消息,因为自从 commit ffa2e4670 以来,libpq 的连接失败消息暴露了尝试 GSS 加密连接但失败的事实。这本身就是一个相当有趣的信息,我当然不希望责怪信使,但我们需要做些事情来稳定 ECPG 的结果。对于这两个失败案例中的第二个,我们可以添加 gssencmode=disable 选项来防止差异。然而,对于第一个失败案例,这个解决方案存在问题,因为该案例唯一的独特之处在于它测试的是一个完全省略的连接目标;没有地方可以添加该选项而不破坏测试用例的目的。在对其他解决方案进行了各种尝试但发现它们具有不良的副作用后,最可行的方法就是放弃并删除该测试用例。也许我们可以稍后恢复此功能,如果我们能弄清楚为什么 GSS 代码在 hamerkop 的环境中行为不当。感谢 Michael Paquier 对替代方案的探索。讨论:https://postgr.es/m/YLRZH6CWs9N6Pusy@paquier.xyz https://git.postgresql.org/pg/commitdiff/9bb5eecce645dd72853e3ed262bef7bf11cae566
在 LockRows 节点到达末尾时关闭 EvalPlanQual 机制。之前,我们让 EPQ 子执行器保持运行直到 ExecEndLockRows。这会导致它可能持有的任何缓冲区 pin 或其他资源一直持有到 ExecutorEnd,在某些代码路径中意味着它们一直持有到 Portal 关闭。这会引起用户可见的问题,例如阻塞 VACUUM;并且与普通表扫描节点的行为不同,普通表扫描节点在返回 EOF 指示时将释放所有缓冲区 pin。我们可以通过在返回 NULL 之前调用 EvalPlanQualEnd 来使 LockRows 的工作更像其他计划节点。如果节点没有完全运行,我们仍然需要在 ExecEndLockRows 中调用它,但在正常情况下,第二次调用不起作用且成本很小。根据 Yura Sokolov 的报告。原则上这是一个长期存在的错误,但鉴于缺乏其他抱怨以及后果的严重性较低,我选择不回溯。讨论:https://postgr.es/m/4aa370cb91ecf2f9885d98b80ad1109c@postgrespro.ru https://git.postgresql.org/pg/commitdiff/bb4aed46a5aeb00d2f1d8b8160feed339f4eaf12
再次调整 logrep 工作进程的快照处理。事实证明,worker.c 中 TRUNCATE 的代码路径在执行用户定义的代码时也没有谨慎地建立快照,这使得 commit 84f5c2908 添加的检查在触发触发器时失败。我们可以用 Push/PopActiveSnapshot 包裹 truncate 调用,但最好建立一个在整个复制步骤执行过程中都持有快照的策略。为了实现这一点以及可能的未来需求,将之前的 ensure_transaction 调用替换为 begin/end_replication_step 对。根据 Mark Dilger 的报告。回溯到 v11,就像之前的更改一样。讨论:https://postgr.es/m/B4A3AF82-79ED-4F4C-A4E5-CD2622098972@enterprisedb.com https://git.postgresql.org/pg/commitdiff/3a09d75b4f6cabc8331e228b6988dbfcd9afdfbe
重新考虑过程 OUT 参数的处理。Commit 2453ea142 重新定义了 pg_proc.proargtypes 以包含过程的 OUT 参数的类型。虽然这在实现 SQL 规范的 DROP PROCEDURE 行为方面有一些优势,但它在其他许多方面非常糟糕。特别是,由于 pg_proc 的主键是 name + proargtypes,这使得可能存在名称+输入参数相同但输出参数类型不同的多个过程。这将使得不可能仅通过为输出参数编写 NULL(或“?”,或任何其他不带数据类型的表示法)来调用其中一个过程。此外,该更改很可能会给检查 pg_proc 并期望 proargtypes 的传统定义的客户端应用程序带来严重的混淆。因此,将 proargtypes 的定义恢复到以前的状态,并撤销为支持该定义而添加的许多复杂性。为了支持 SQL 规范的 DROP PROCEDURE 行为,当命令的参数列表中没有 argmode 标记时,我们会同时进行查找(即,同时匹配 proargtypes 和 proallargtypes),如果找到唯一匹配则成功。原则上,这可能导致使用仅一种规则不会发生的歧义函数失败。然而,过程名称的重载被认为是一种相当罕见的用法,因此在实践中不应引起太多问题。Postgres 特定代码(如 pg_dump)可以通过指定所有过程参数的 argmodes 来防御任何此类故障的可能性。这还修复了 CALL 语句与命名参数相关的其他几个错误,并稍微改进了文档。由于过程 OUT 参数的表示方式发生了变化,因此强制 catversion 更新。讨论:https://postgr.es/m/3742981.1621533210@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e56bce5d43789cce95d099554ae9593ada92b3b7
修复分区表复制逻辑中的多个崩溃错误。apply_handle_tuple_routing() 在检测并报告所需的更新元组不存在后,仍然尝试更新该元组,导致空指针解引用。logicalrep_partition_open() 未能确保它为分区构建的 LogicalRepPartMapEntry 与分区根目录的入口完全独立,这会在根条目之后被释放或重建时导致问题。与此同时,在发布方,pgoutput_change() 有时会尝试将 execute_attr_map_tuple() 应用于 NULL 元组。第一个错误由 Sergey Bernikov 在 bug #17055 中报告;我在开发此不幸地未经充分测试的代码的一些测试用例时发现了另外两个。第一个问题的诊断和补丁由 Amit Langote 提供;后两个补丁由我提供;新测试用例由我提供。回溯到 v13(此逻辑在该版本中引入)。讨论:https://postgr.es/m/17055-9ba800ec8522668b@postgresql.org https://git.postgresql.org/pg/commitdiff/ab55d742eb7162c22ee60f1e15e07d2a60063c4e
避免使用断言来检查复制协议违规。使用断言来检查传入消息的有效性是一个极差的决定。在调试构建中,损坏或恶意的远程客户端不应轻易地使 logrep 工作进程崩溃。在非调试构建中,后果可能更糟,因为它们根本不会进行此类检查,从而导致不可知的错误行为。因此,将所有可能被错误或乱序的复制消息触发的断言提升为完整的测试和报告。为避免给翻译团队增加负担,我们制定了这样的策略:复制协议违规错误报告不需要翻译。因此,所有新消息都使用 errmsg_internal()。为了保持一致性,一些旧消息也做了类似更改。在此过程中,修复了一些非惯用或完全错误的 hash_search() 用法。其中大多数错误是在“流复制”补丁(commit 464824323)中引入的,但其中一些可以追溯到很久以前。根据需要进行回溯。讨论:https://postgr.es/m/1719083.1623351052@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/fe6a20ce54cbbb6fcfe9f6675d563af836ae799a
确保 pg_filenode_relation(0, 0) 返回 NULL。之前,relfilenode 的零值会导致关于“意外重复”的令人困惑的错误消息。该函数对于其他无效的 relfilenode 值返回 NULL,因此零也应如此处理。这从一开始就是这样,所以回溯到所有支持的分支。Justin Pryzby 讨论:https://postgr.es/m/20210612023324.GT16435@telsasoft.com https://git.postgresql.org/pg/commitdiff/1250aad42520fd5a3db68d6381997b7e1f9bb4aa
恢复等待 postmaster 重启的 TAP 测试的健壮性。几个 TAP 测试使用 poll_query_until() 来等待 postmaster 重启。它们检查一个简单的查询(例如“SELECT 1”)是否成功。然而,在 commit 11e9caff8 之后,这变得有问题,因为我们现在通过 stdin 将该查询馈送给 psql,如果 psql 在读取查询之前退出,我们就有可能因 IPC::Run 抱怨 SIGPIPE 失败。因此,在需要等待连接失败停止的情况下,我们不能使用非空查询。根据 commit c757a3da0 和 6d41dd045 的先例,我们可以在这种情况下将“undef”作为查询传递,以确保 IPC::Run 没有需要写入的内容。但是,然后我们必须声明预期输出为空,这暴露了 poll_query_until 的一个缺陷:如果 psql 完全失败并返回空 stdout,poll_query_until 会将其视为成功!这是因为,与其文档相反,它实际上没有检查 psql 失败,既不查看退出状态也不查看 stderr。为解决此问题,将 poll_query_until 调整为除了 stdout 匹配外,还需要空 stderr。 (我尝试检查退出状态,但似乎 psql 在我们认为是成功的情况下经常会退出(1)。这可能是一个有待将来修复的问题,但它会是一个不可回溯的行为更改。)回溯到 v10。需要此更改的测试用例仅在 v11 及更高版本中存在,但为保持 v10 中 poll_query_until 的行为一致,以防将来回溯另一个类似的测试用例。(9.6 目前不需要此更改,因为在该分支中 poll_query_until 不能被告知接受空 stdout 作为成功的情况。)根据各种编译场故障,主要是在 hoverfly 上。讨论:https://postgr.es/m/CAA4eK1+zM6L4QSA1XMvXY_qqWwdUmqkOS1+hWvL8QcYEBGA1Uw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f452aaf7d4a96cfcecd6c60ccd294ffe7b8ea088
Etsuro Fujita 推送
修复异步感知 Append 节点的重扫描。在不需要运行时剪枝的情况下,使用 classify_matching_subplans() 确定的异步感知 Append 节点的同步和异步子计划在重扫描节点时应被重用,但之前的代码在重扫描节点时重复使用该函数重新确定它们,导致正常构建中出现不正确的结果,并在启用了断言的构建中出现断言失败,因为该函数不假设它在这种情况下被重复调用。按上述方式修复代码。这是我疏忽了 commit 27e1f1456。同时,在 ExecInitAppend() 和 ExecReScanAppend() 中显式初始化异步相关的指针/变量为 NULL/零,以确保安全。(在我们到达后者函数之前,变量将被设置为零,但我们还是这样做。)审阅者:Kyotaro Horiguchi 讨论:https://postgr.es/m/CAPmGK16Q4B2_KY%2BJH7rb7wQbw54AUprp7TMekGTd2T1B62yysQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3baaf28a6da588987b94a05a725894805c3eae9
文档:进一步更新异步执行的文档。添加关于 postgres_fdw 在应用于包含同步子计划的 Append 节点时的异步执行的说明。跟进 commit 27e1f1456。Andrey Lepikhov 和 Etsuro Fujita 讨论:https://postgr.es/m/58fa2aa5-07f5-80b5-59a1-fec8a349fee7%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/eab81953682d5087295afb911c93f36cb1533bd9
Amit Kapila 提交
Michaël Paquier 提交
修复测试 indirect_toast 的可移植性问题。当在默认 TOAST 压缩设置为 LZ4 的服务器上运行时,由于元组处理顺序的一致性问题,此测试将失败。LZ4 导致一个元组被内联存储而不是外部化。由于此测试的目的是检查外部存储数据后的情况,因此坚持使用 pglz 作为使用的压缩算法,以便此测试的所有数据都能按预期存储。分析者:Dilip Kumar 讨论:https://postgr.es/m/YLrDWxJgM8WWMoCg@paquier.xyz https://git.postgresql.org/pg/commitdiff/68a6d8a87006ba727d9662ec84c7a3d9de402df0
重新排序 pg_log_backend_memory_contexts() 中的超级用户检查。此函数的使用仅限于超级用户,并且代码中包含一个硬编码的检查。但是,代码会在检查用户是否为超级用户之前查找 PGPROC 条目以发出内存转储信号,这在已知将返回错误的情况下没有意义。请注意,即使对于未经授权的用户,该代码也会告知用户某个进程是否为 PostgreSQL 进程,但这现在不是这种情况,但这样可以避免获取 ProcArrayLock,而 ProcArrayLock 最有可能最终是不必要的。感谢 Julien Rouhaud 和 Tom Lane 的讨论。讨论:https://postgr.es/m/YLxw1uVGIAP5uMPl@paquier.xyz https://git.postgresql.org/pg/commitdiff/4e47b02834827fa700627290fae02f89a450368c
修复 psql --help=commands 中的不一致之处。psql 的 --help 中对 \dAp、\do 和 \dy 支持的子命令集描述不正确。文档已与代码一致。报告人:inoas,来自 IRC 作者:Matthijs van der Vleuten 审阅者:Neil Chen 讨论:https://postgr.es/m/6a984e24-2171-4039-9050-92d55e7b23fe@www.fastmail.com 回溯到:9.6 https://git.postgresql.org/pg/commitdiff/845cad4d51cb12a34ea012dfe58af5ef490384fc
改进 psql 对订阅和发布选项的制表符补全。以下命令的制表符补全提供的选项列表已过时:- ALTER SUBSCRIPTION - CREATE SUBSCRIPTION - ALTER PUBLICATION - CREATE PUBLICATION 作者:Vignesh C 审阅者:Bharath Rupireddy 讨论:https://postgr.es/m/CALDaNm18oHDFu6SFCHE=ZbiO153Fx7E-L1MG0YyScbaDV--U+A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d08237b5b494f96e72220bcef36a14a642969f16
改进最近添加的 TAP 测试中的日志模式检测。ab55d74 引入了一些测试,其中分区表上的逻辑复制订阅中缺少行,这依赖于查找日志的逻辑,扫描整个文件。此提交使逻辑更精确,通过仅从关键查询运行前的位置扫描日志到检查日志的位置。这将降低未来测试变得更复杂时日志模式重叠的风险。根据与 Tom Lane 的讨论。讨论:https://postgr.es/m/YMP+Gx2S8meYYHW4@paquier.xyz 回溯到:13 https://git.postgresql.org/pg/commitdiff/bfd96b7a3dc26a8384d4185d274573fb6a46b033
简化 getObjectTypeDescription() 中的一些代码。此例程设计为永远不返回空描述或 NULL,即使接受缺失的对象,也会提供描述回退,但它包含了一个它认为可能发生这种情况的代码路径。此例程的所有调用者已经将 NULL 视为不可能,因此稍微更改代码以匹配调用者的假设,并在靠近此例程的调用者附近添加更多注释以概述预期的行为。此代码是 2a10fdc 的新功能,因此无需回溯。讨论:https://postgr.es/m/YMNY6RGPBRCeLmFb@paquier.xyz https://git.postgresql.org/pg/commitdiff/b56b83aa0d6e044cf38d553f7a87f4b84708cac6
忽略 pg_regress.c 中的更多环境变量。这类似于 8279f68 对 TestLib.pm 所做的工作,其中使用 pg_regress 进行临时安装时设置的环境变量可能会导致不必要的失败。根据支持情况,每个稳定分支都会调整重置的变量列表。添加注释以提醒 TestLib.pm 和 pg_regress.c 中的列表最好保持同步。审阅者:Álvaro Herrera 讨论:https://postgr.es/m/YMNR9GYDn+fHlMta@paquier.xyz 回溯到:9.6 https://git.postgresql.org/pg/commitdiff/a9e0b3b08fe38d5e31f03ea96859ff5e413d4a38
Peter Eisentraut 提交
添加 _outTidRangePath()。我们已经为所有路径节点提供了 outNode() 覆盖,但它在添加时被遗漏了。 https://git.postgresql.org/pg/commitdiff/3bb309be7533e153d86390642e8a2d054bbe82c8
libpq:修复 SNI 主机处理。修复 NULL 主机名的处理(可能通过使用 hostaddr)。它之前导致崩溃。此外,我们应该查看 connhost,而不是 pghost,来处理多主机规范。还移除了不必要的 SSL_CTX_free()。报告人:Jacob Champion pchampion@vmware.com 审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgresql.ac.cn/message-id/504c276ab6eee000bb23d571ea9b0ced4250774e.camel@vmware.com https://git.postgresql.org/pg/commitdiff/37e1cce4ddf0be362e3093cee55493aee41bc423
添加一些 const 修饰符。其中一个函数是 PostgreSQL 14 中的新函数;最好从一开始就正确设置。 https://git.postgresql.org/pg/commitdiff/b29fa951ec519bdde153465e2caa6c0b7b3bcfc3
Bruce Momjian 已推送
文档:更新关于 v2 线协议的发布说明。协议 v2 最后一次使用是在 PG 7.3,而不是 7.2。报告人:Tatsuo Ishii 讨论:https://postgr.es/m/20210608.091329.906837606658882674.t-ishii@sraoss.co.jp https://git.postgresql.org/pg/commitdiff/444302ed56273e4c4006a9be319e60fa12a90346
文档:修复 PG 14 relnotes 中的错误缩进。 https://git.postgresql.org/pg/commitdiff/0725913982e5e06895a32a9eeea2c59a13978927
文档:删除 PG 14 relnotes 中多余的右尖括号。报告人:Justin Pryzby https://git.postgresql.org/pg/commitdiff/d120e66fac87f768ea2289d2d923d0ee4262ec0f
Robert Haas 提交
修复新备用服务器无法跟随新主服务器的角点故障。这仅在以下情况下发生:(1) 新备用服务器本地没有 WAL 可用,(2) 新备用服务器从旧时间线开始,(3) 提升发生在备用服务器开始的新 WAL 段中,(4) 新时间线的时间线历史文件可从存档中获取,但 WAL 文件不可(即这是一个竞争条件),(5) 新时间线的 WAL 文件可通过流复制获得,并且 (6) recovery_target_timeline='latest'。Commit ee994272ca50f70b53074f0febaec97e28f83c4e 引入了此逻辑,并且比之前的代码有所改进,但它错误地处理了这种情况。如果 recovery_target_timeline='latest' 且设置了 restore_command,validateRecoveryParameters() 可以将 recoveryTargetTLI 更改为与 receiveTLI 不同。如果之后尝试流复制,expectedTLEs 将使用错误时间线的历史进行初始化。它应该是一个解释如何到达目标时间线的条目列表,但在这种情况下,它最终是一个解释如何到达新备用服务器原始时间线的条目列表,这是不正确的。Dilip Kumar 和 Robert Haas,审阅者:Kyotaro Horiguchi。讨论:http://postgr.es/m/CAFiTN-sE-jr=LB8jQuxeqikd-Ux+jHiXyh4YDiZMPedgQKup0g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caba8f0d43fb679c6f9643456080408a6bc370e8
调整新的测试用例以设置 wal_keep_size。根据 buildfarm 成员 conchuela 和 Kyotaro Horiguchi 的说法,级联备用服务器需要的 WAL 段可能会被太快删除。希望这能阻止这种情况发生。Kyotaro Horiguchi 讨论:http://postgr.es/m/20210610.101240.1270925505780628275.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/4dcb1d087aebc6fc2477ce4458ea82f548e2c1ee
David Rowley 提交
修复 brin_minmax_multi.c 和 mcv.c 中一系列拼写错误。讨论:https://postgr.es/m/CAApHDvrbyJNOPBws4RUhXghZ7+TBjtdO-rznTsqZECuowNorXg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/55ba5973d9144a552661cf1fa4cbd228a3799212
为缩略语使用正确的冠词。我们在文档中积累了“an SQL”和“a SQL”的混杂用法。最好能更一致一些。我查看的最新 SQL 标准似乎更倾向于“an SQL”。这似乎是一个不错的遵循方向,所以我们在这里将所有“a SQL”实例更改为“an SQL”。大多数实例已经正确使用了“an SQL”,所以为了尽量减少变动,使用占主导地位的变体也是有意义的。此外,还有一些其他缩略语需要调整。FSM、SSPI、SRF 等。还修复了一些可读缩略语,以使用“a”而不是“an”。例如,“a SASL”而不是“an SASL”。在这里,我只调整了文档和错误消息。其他许多在源代码注释中仍然存在。翻译提示注释似乎是最大的罪魁祸首。目前更改这些似乎不值得劳动。讨论:https://postgr.es/m/CAApHDvpML27UqFXnrYO1MJddsKVMQoiZisPvsAGhKE_tsKXquw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/04539e73faaaaa1c06c1407671910dceaffdfcd4
Noah Misch 推送
将 PQtraceSetFlags() 重命名为 PQsetTraceFlags()。我们有十几个 PQset*() 函数。PQresultSetInstanceData() 和这个是 libpq 中词序不同的设置器函数。采用多数词序。审阅者:Alvaro Herrera 和 Robert Haas,尽管这个名称选择不是一致的。讨论:https://postgr.es/m/20210605060555.GA216695@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/d0e750c0acaf31f60667b1635311bcef5ab38bbe
更改 struct CreateStatsStmt 中 "transformed" 字段的位置。优先节点/*funcs.c 中的字段顺序,这与 IndexStmt 字段顺序更一致。此字段是 v14 的新功能。讨论:https://postgr.es/m/20210611045546.GA573364@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/13a1ca160dcfc316c9f4005891a312f5a84c5ca2
Álvaro Herrera 提交
修复使旧复制槽失效中的竞争条件。commit c6550776394e 添加的将复制槽标记为无效的代码存在竞争条件,即在 checkpointer 尝试使其无效时,槽可以被删除或提前。重写代码以消除这些竞争。c6550776394e 添加的 ReplicationSlotAcquire 的 API 更改不再需要。为避免在已发布的版本中出现 ABI break,此提交将其保持不变;将在 master 版本中单独进行更改。回溯到 13(此代码首次出现)。报告人:Andres Freund andres@anarazel.de 作者:Andres Freund andres@anarazel.de 作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20210408001037.wfmk6jud36auhfqm@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/96540f80f8334a3f0f4a13f0d42e4565d8fa9eb7
将 ReplicationSlotAcquire API 返回其原始形式。根据 96540f80f833;c6550776394e 引入的笨拙 API 不再需要。作者:Andres Freund andres@anarazel.de 审阅者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20210408020913.zzprrlvqyvlt5cyy@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1632ea43682fcea8836ea245771ae85b9e1bcd38
为流水线 PQsendQuery() 添加 'Portal Close' 消息。Commit acb7e4eb6b1c 为 PQsendQuery 添加了新的实现,使其可以在流水线模式下工作(通过使用扩展查询协议),但它与常规实现使用的 'Q' 消息(简单查询协议)行为不同:新的实现不关闭未命名的 portal。将新代码更改为与旧代码具有相同的行为。报告人:Yura Sokolov y.sokolov@postgrespro.ru 作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/202106072107.d4i55hdscxqj@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/4efcf47053eaf8dd88de2b1a89478df43d37d5c0
在并行 btree 构建中报告排序阶段进度。我们已经在报告它了,但仅在并行工作进程完成后才报告,这明显晚于串行构建的发生时间。通过此更改,我们会在主进程在参与构建(正常情况)时开始自己的排序阶段时进行报告。现在这可能比工作进程开始排序阶段晚一点,但 a) 从工作进程通信实际阶段开始可能很麻烦,并且 b) 排序阶段的开始仍然很模糊,因为排序本身实际上是由 tuplesort.c 在调用 tuplesort_performsort() 之前内部启动的。回溯到 pg12(那里包含了 CREATE INDEX 的进度报告代码)。报告人:Tomas Vondra tomas.vondra@enterprisedb.com 作者:Matthias van de Meent boekewurm+postgres@gmail.com 审阅者:Greg Nancarrow grege4422@gmail.com 审阅者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/1128176d-1eee-55d4-37ca-e63644422adb https://git.postgresql.org/pg/commitdiff/5cc1cd502879d642da799e1fd12619d83d987369
Andres Freund 提交
Andrew Dunstan 推送
修复新恢复测试在 msys 下的使用。Commit caba8f0d43 对 msys 来说不太对,正如许多编译场动物(包括 jacana 和 fairywren)所证明的那样。我们需要在 archive 命令中使用 msys perl,但调用它的方式要让 Windows 能够理解路径。此外,在 copy 脚本内部,我们需要将 Windows 路径转换为 msys 路径。 https://git.postgresql.org/pg/commitdiff/c3652f976b7696a96a9c5606cc2d613af77e2e63
进一步调整 stuck_on_old_timeline 恢复测试。翻译目标目录路径中的路径斜杠。这让旧分支感到困惑,但为了统一性,它应用于所有分支。Perl 完全能够理解带有正斜杠的路径。同时,为了与其他测试的统一性,根据 Tom Lane 的抱怨,恢复之前的 archive_wait 查询。 https://git.postgresql.org/pg/commitdiff/9d97c3408319b43718e4b85bc694697db1af32c6
Ranier Vilela 提交了另一个修订版的补丁,以减少 detoasted 值的开销。
Takamichi Osumi 提交了另外三个修订版的补丁,以记录在同步逻辑解码中可能出现的死锁。
Andrey V. Lepikhov 提交了另一个修订版的补丁,以实现批量 COPY FROM 到外部表。
Hou Zhijie 提交了另一个修订版的补丁,以自适应地缓存分区边界偏移量。
Nathan Bossart 提交了一个补丁,用于预分配 WAL 段。
Tomáš Vondra 提交了两个修订版的补丁,以使逻辑解码能够复制序列。
Justin Pryzby 提交了一个补丁,用于在 ps 显示中显示“syncing data directories”。
Anastasia Lubennikova 提交了另外两个修订版的补丁,用于测试回归测试的回放。
Aleksander Alekseev 和 Michaël Paquier 提交了补丁,以修复 pg_event_trigger_ddl_commands 中的丢弃对象处理。
Dilip Kumar 和 Amit Langote 交换了补丁,以修复投机性中止的解码。
Peter Eisentraut 提交了一个补丁,用于自动生成节点支持函数。
Kyotaro HORIGUCHI 和 Amit Kapila 交换了旨在修复逻辑复制中出现 keepalive 洪水错误的补丁。
Quan Zongliang 提交了一个补丁,用于从 KnownAssignedTransactionIdes 子模块中删除未使用的代码。
Emre Hasegeli 提交了一个补丁,用于在 btree_gist 中支持 bool。
Jacob Champion 提交了一个 PoC 补丁,用于实现带有 OAUTHBEARER 的联合认证/授权。
Jeff Davis 提交了另一个修订版的补丁,用于跟踪最后的恢复 LSN、时间和总计数,这将使得能够从其他节点看到未记录表重置。
Hou Zhijie 提交了一个补丁,用于删除 get_qual_from_partbound 中一个不再使用的函数参数。
Hou Zhijie 提交了另外两个修订版的补丁,以使 INSERT ... SELECT 能够并行执行。
Peter Geoghegan 和 Matthias van de Meent 交换了补丁,以修复 GetOldestNonRemovableTransactionId 中的一个错误。GetOldestNonRemovableTransactionId(rel) 没有返回与 GlobalVisTestFor(rel) 一致的值。现在已更新此项,并添加了一些断言以确保此错误情况不会再次发生。
Peter Smith 和 Ajin Cherian 交换了补丁,以向内置逻辑复制添加对预备事务的支持,为流式事务添加预备 API 支持,并为逻辑复制跳过空事务。
Ajin Cherian 提交了另外三个修订版的补丁,以在 CREATE_REPLICATION_SLOT 命令中添加一个设置两阶段提交的选项,并在 pg_recvlogical 中添加对两阶段解码的支持。
Julien Rouhaud 提交了另外两个修订版的补丁,以添加用于可扩展解析钩子。
Kyotaro HORIGUCHI 和 Fabien COELHO 交换了旨在修复 pgbench 记录零间隔日志条目的错误的补丁。
Alexander Pyhalov 提交了一个补丁,允许将 CASE 表达式推送到外部服务器。
Jeff Davis 提交了另外两个修订版的补丁,以实现 ALTER TABLE ... SET ACCESS METHOD。
Nitin Jadhav 提交了另一个修订版的补丁,用于跟踪启动进度。
Atsushi Torikoshi 提交了另一个修订版的补丁,添加了一个函数,用于记录具有指定进程 ID 的后端当前运行的查询的完整查询字符串及其计划。
Thomas Mannhart 提交了另外两个修订版的补丁,以实现范围合并连接。
Thomas Munro 提交了一个补丁,用于调整 pg_regress 输出以适应新的长测试名称。
Bharath Rupireddy 提交了另外两个修订版的补丁,以重构 parse_subscription_options,并删除 parse_subscription_options 中类似的 ereport 调用。
Tomáš Vondra 提交了另外两个修订版的补丁,以创建描述符副本用于批处理,并为批处理仅初始化一次 slot。
Nathan Bossart 提交了一个补丁,用于添加一个用于检索共享内存大小的 pg_ctl 选项。
John Naylor 提交了另一个修订版的补丁,以重写 pg_utf8_verifystr 以提高速度。
David Rowley 提交了一个补丁,在出现“a SQL”的地方使用“an SQL”。
Alexander Korotkov 提交了四个修订版的补丁,以支持 UNNEST(multirange) 并将 multirange 强制转换为范围数组。
Hayato Kuroda 提交了一个补丁,用于忽略 pgbench 中失败的线程。
Amit Langote 提交了另一个修订版的补丁,以实现多列列表分区。
Jacob Champion 提交了另一个修订版的补丁,为表 AM API 添加了列投影列表。
Bruce Momjian 提交了三个修订版的补丁,以记录某些聚合函数在升级时需要重新创建的事实。
Ranier Vilela 提交了一个补丁,将一些有符号类型更改为无符号。
Pavel Stěhule 提交了另一个修订版的补丁,以实现模式变量。
Thomas Munro 提交了另一个修订版的补丁,为套接字关闭事件添加了 WL_SOCKET_CLOSED,并为 client_connection_check_interval 使用了 WL_SOCKET_CLOSED。
Fabien COELHO 提交了另一个修订版的补丁,为 psql 添加了 SHOW_ALL_RESULTS。
David Rowley 提交了一个补丁,用于清理执行器中的一些聚合代码。
David Rowley 提交了一个补丁,通过使用 pg_nextpower2_32 或 pg_nextpower2_64(视情况而定)替换每次迭代都进行指数级增长的紧密循环,来改进将缓冲区大小加倍的各种位置。
David Rowley 提交了一个补丁,为 ORDER BY / DISTINCT 聚合添加了正确的规划器支持。
Noah Misch 提交了一个补丁,删除了 pg_wait_for_backend_termination()。
Yugo Nagata 和 Fabien COELHO 交换了补丁,以防止 pgbench 因跳过的事务而卡住。
Ranier Vilela 提交了另一个修订版的补丁,以减少 procarray 中未匹配的类型。
Thomas Munro 提交了三个修订版的补丁,以在索引扫描中使用元组级别的 SIREAD 锁,并在可能的情况下跳过 btree 页上的 SIREAD 锁。
Alexander Korotkov 提交了一个补丁,将新文档章节的标题更改为 Range/Multirange Functions and Operators,这样更清晰。
Bharath Rupireddy 提交了一个补丁,以增强 postgres_fdw 的批量插入测试用例。
Tomáš Vondra 提交了一个补丁,以缩短 postgres_fdw 测试的运行时间。
Tomáš Vondra 提交了一个补丁,以处理扩展统计信息中的 Expr op Expr 子句。