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
添加已转换标志。提交 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
修复 pg_visibility 回归失败,使用 CLOBBER_CACHE_ALWAYS。提交 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。随着批处理添加到 postges_fdw 中,更容易达到此限制,因为整个批处理本质上是单个查询,这使得更容易遇到此错误。这些失败有点不可预测,因为它还取决于查询中的列数。因此,此补丁调整 batch_size 以不超过最大参数数量,而不是直接失败。报告者:侯志杰 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 批量插入的槽位创建。提交 b663a41363 为 FDW 引入了批量插入,但元组槽位的处理被证明存在两个问题。首先,每次批处理都会重新创建槽位。其次,所有槽位都引用相同的元组描述符 - 对于较小的批处理,这不是问题,但对于较大的批处理,这会触发资源所有者代码中的 O(N^2) 行为。这两个问题相互影响 - 为了减少创建/删除槽位的次数,需要更大的批处理。但是,批处理越大,资源所有者的开销就越大。对于实际的批处理大小(100 - 1000),这不会是一个大问题,因为好处(延迟节省)大大超过了资源所有者的成本。但是,对于非常大的批处理,情况可能会更糟,甚至可能比非批处理模式更差。通过仅初始化一次元组槽位(并在批处理之间重用它们)并为每个槽位使用新的元组描述符副本,来修复此问题。讨论:https://postgr.es/m/ebbbcc7d-4286-8c28-0272-61b4753af761%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/b676ac443b6a83558d4701b2dd9491c0b37e17c4
Tom Lane 推送了
修复 FuncCall.funcformat 的 equalfuncs.c 行为不一致。其他 equalfuncs.c 对 CoercionForm 字段的检查使用 COMPARE_COERCIONFORM_FIELD
(使其成为空操作),但提交 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
修复客户端代码中可能编码错误的字符串的不谨慎处理。字符串末尾附近不正确编码的多字节字符可能会导致各种处理循环运行超过字符串的终止 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 立即出现,它将更新统计信息,使其偏好于普通索引扫描而不是位图扫描,从而破坏了预期输出(以及测试用例的目的)。为了修复此问题,只需强制在此处选择位图扫描即可。自从提交 de1d042f5 以来,这显然是错误的。目前尚不清楚为什么我们最近才看到任何由于它导致的 buildfarm 失败;但是在过去一周中,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,则很容易解决此问题:只需存储剩余的查询输出,无需任何倒带,并调整门户的游标状态以匹配。除了消除语义问题外,这可能比存储整个输出有效得多。如果游标是可滚动的,我们无能为力,但滚动易失性查询的结果已经相当不安全。我们只能更清楚地说明,不能保证从该结果中获得正确的结果。已经禁止将 SCROLL 与 FOR UPDATE/SHARE 一起使用,这是 SELECT 查询获得不稳定结果的一种方式。我们可以想象,当查询包含易失性函数时禁止 SCROLL,但这将需要大量的强制执行开销。此外,如果用户的函数实际上是稳定的但用户忽略了标记它们,则可能会破坏正常工作的应用程序。因此,请记录此风险。虽然此问题以某种形式存在了很长时间,但在 v11 中变得更糟,v11 引入了持久化 plpgsql 游标(可能是隐式游标)的可能性,即使它们违反了可以标记为 WITH HOLD 的规则。因此,我选择回溯到 v11 而不再进一步。根据 Алексей Булгаков 提出的错误 #17050。讨论:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/ba2c6d6cec000f0aeaeda4d56a23a335f6164860
强制为 plpgsql 的隐式游标设置 NO SCROLL。对错误 #17050 的进一步思考表明,对于 plpgsql FOR-over-query 循环打开的隐式游标,使用 CURSOR_OPT_NO_SCROLL 是一个好主意。这确保了,如果有人在循环内提交,PersistHoldablePortal 将不会尝试倒带并重新读取游标。虽然如果 FOR UPDATE/SHARE 出现在查询中,我们无论如何都会选择 NO_SCROLL,但易失性函数还会带来其他风险;无论如何,花费精力存储我们确定不需要的行是很愚蠢的。(在此处,改进 exec_run_select 中的注释,该注释对于我们何时可以使用并行模式的原因有些困惑。游标操作对于无名门户来说不是风险。)直到 v11,这都不是问题,v11 引入了持久化此类游标的可能性。因此,回溯到 v11。根据 Алексей Булгаков 提出的错误 #17050。讨论:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/be90098907475f3cfff7dc6d590641b9c2dae081
避免在某些支持 GSS 的环境中出现 ECPG 测试失败。Buildfarm 成员 hamerkop 报告说,connect/test5.pgc 中的两个测试用例显示了与测试预期不同的错误消息,因为自从提交 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。这会导致它可能持有的任何缓冲区锁或其他资源一直保持到 ExecutorEnd,在某些代码路径中,这意味着它们会被保持到 Portal 关闭。这可能会导致用户可见的问题,例如阻塞 VACUUM;而且它不像普通的表扫描节点的行为,普通的表扫描节点会在返回 EOF 指示之前释放所有缓冲区锁。通过在返回 NULL 之前调用 EvalPlanQualEnd,我们可以使 LockRows 的工作方式更像其他计划节点。我们仍然需要在 ExecEndLockRows 中调用它,以防节点没有运行到完成,但在正常情况下,第二次调用不会执行任何操作,并且成本很小。根据 Yura Sokolov 的报告。原则上,这是一个长期存在的错误,但考虑到没有其他投诉以及后果的严重程度较低,我选择不进行反向移植。讨论:https://postgr.es/m/4aa370cb91ecf2f9885d98b80ad1109c@postgrespro.ru https://git.postgresql.org/pg/commitdiff/bb4aed46a5aeb00d2f1d8b8160feed339f4eaf12
进一步调整 logrep 工作进程的快照处理。事实证明,worker.c 中用于 TRUNCATE 的代码路径在执行用户定义代码时也疏于建立快照,从而导致当在该上下文中触发触发器时,提交 84f5c2908 添加的检查失败。我们可以只在 truncate 调用周围包裹 Push/PopActiveSnapshot,但是建立一个在整个复制步骤执行过程中都保持快照的策略似乎更好。为了帮助实现这一点以及未来可能的需求,请将之前的 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 参数的处理。提交 2453ea142 重新定义了 pg_proc.proargtypes,仅针对过程包括 OUT 参数的类型。虽然这对于实现 DROP PROCEDURE 的 SQL 规范行为有一些优点,但从其他许多角度来看,这是相当灾难性的。值得注意的是,由于 pg_proc 的主键是 name + proargtypes,这使得可以拥有多个具有相同名称 + 输入参数和不同输出参数类型的过程。这将使得无法通过仅为输出参数编写 NULL(或“?”或任何其他无数据类型表示法)来调用其中任何一个过程。此更改似乎也可能给检查 pg_proc 并期望 proargtypes 的传统定义的客户端应用程序造成严重的混乱。因此,将 proargtypes 的定义恢复为原来的样子,并撤消一些为支持此定义而添加的复杂性。为了支持 DROP PROCEDURE 的 SQL 规范行为,当命令的参数列表中没有 argmode 标记时,我们以两种方式执行查找(即,与 proargtypes 和 proallargtypes 进行匹配),如果只获得一个唯一的匹配,则表示成功。原则上,这可能会导致当仅使用两条规则中的一条时不会发生的模糊函数失败。然而,过程名称的重载被认为是一种相当罕见的用法,因此这在实践中应该不会引起太多问题。诸如 pg_dump 之类的 PostgreSQL 特定代码可以通过小心地为所有过程参数指定 argmodes 来防止任何此类失败的可能性。这也修复了 CALL 语句中使用命名参数的几个其他错误,并稍微改进了文档。强制 catversion 增加,因为具有 OUT 参数的过程的表示形式发生了变化。讨论: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,该逻辑是在 v13 中引入的。讨论:https://postgr.es/m/17055-9ba800ec8522668b@postgresql.org https://git.postgresql.org/pg/commitdiff/ab55d742eb7162c22ee60f1e15e07d2a60063c4e
不要使用 Assert 来检查复制协议的违规行为。使用 Assert 来检查传入消息的有效性是一个非常糟糕的决定。在调试版本中,不应让一个损坏的或恶意的远程客户端如此容易地使 logrep 工作进程崩溃。在非调试版本中,后果可能更糟,非调试版本根本不会进行此类检查,从而导致谁也不知道会发生什么错误行为。因此,将每个可能由错误或乱序复制消息触发的 Assert 提升为一个完整的 test-and-ereport。为了避免臃肿翻译团队必须处理的消息集,制定一项策略,即复制协议违规错误报告不需要翻译。因此,这里的所有新消息都使用 errmsg_internal()。出于一致性,一些旧消息也进行了类似的更改。在此过程中,修复了一些不符合习惯的或完全错误的 hash_search() 用法。这些错误中的大多数都是随着“流式复制”补丁(提交 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”)是否成功。然而,在提交 11e9caff8 之后,这变得有问题,因为现在我们将上述查询通过 stdin 提供给 psql,如果 psql 在读取查询之前退出,我们可能会面临 IPC::Run 抱怨 SIGPIPE 失败的风险。因此,在我们需要等待连接失败停止发生的情况下,我们不能使用非空查询。根据提交 c757a3da0 和 6d41dd045 的先例,我们可以在这种情况下传递“undef”作为查询,以确保 IPC::Run 没有要写入的内容。然而,那么我们必须说预期的输出为空,这暴露了 poll_query_until 中的一个缺陷:如果 psql 完全失败并返回空的 stdout,poll_query_until 将将其视为成功!那是因为,与它的文档相反,它没有实际检查 psql 是否失败,既没有查看退出状态,也没有查看 stderr。为了解决这个问题,请调整 poll_query_until 以坚持空的 stderr 以及 stdout 匹配。(我尝试过检查退出状态,但似乎 psql 通常在我们需要认为是成功的情况下会退出(1)。这可能是将来需要修复的事情,但它将是一个不可反向移植的行为更改。)反向移植到 v10。需要此更改的测试用例仅存在于 v11 中,但为了以防万一将来我们反向移植另一个此类测试用例,在 v10 中保持 poll_query_until 的行为相同似乎是明智的。(9.6 当前不需要此更改,因为在该分支中,无法告知 poll_query_until 接受空的 stdout 作为成功案例。)根据各种 buildfarm 失败,主要是在 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 节点的同步和异步子计划在重新扫描节点时应重新使用,但之前的代码在每次重新扫描节点时都重复使用该函数重新确定它们,从而导致在正常构建中出现不正确的结果,并在启用 Assert 的构建中出现 Assert 失败,因为该函数不假定它在这种情况被重复调用。按照上述方法修复代码。我在提交 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 节点时也进行异步执行。对提交 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 中的可移植性问题。当在服务器上使用默认的 default_toast_compression 设置为 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 中的不一致性。\dAp、\do 和 \dy 支持的子命令集在 psql 的 --help 中描述不正确。文档已经与代码一致。报告人: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 对订阅和发布选项的 Tab 键补全。以下命令的 Tab 键补全提供的选项列表已过时:- 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 推送
doc:更新关于 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
docs:修复 PG 14 发行说明中不正确的缩进。https://git.postgresql.org/pg/commitdiff/0725913982e5e06895a32a9eeea2c59a13978927
doc:删除 PG 14 发行说明中多余的右尖括号。报告人: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'。提交 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”的位置。解决 nodes/*funcs.c 中的字段顺序的冲突,有利于后者,后者与 IndexStmt 字段顺序更好地对齐。此字段是 v14 中的新增字段。讨论:https://postgr.es/m/20210611045546.GA573364@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/13a1ca160dcfc316c9f4005891a312f5a84c5ca2
Álvaro Herrera 推送
修复使过时复制槽失效中的竞争条件。添加到 commit c6550776394e 中以标记复制槽无效的代码存在竞争条件,即槽可能在检查点尝试使其失效的同时被删除或提前。重写代码以关闭这些竞争。c6550776394e 添加的对 ReplicationSlotAcquire 的 API 的更改不再必要。为了避免在已发布的分支中出现 ABI 中断,此提交保持不变;它将在单独的仅限主分支的提交中更改。向后移植到 13,此代码首次出现在 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() 中添加“门户关闭”消息。提交 acb7e4eb6b1c 为 PQsendQuery 添加了一个新的实现,使其可以在流水线模式下工作(通过使用扩展查询协议),但它的行为与常规实现使用的“Q”消息(在简单查询协议中)不同:新的实现不会关闭未命名的门户。更改新代码使其具有与旧代码相同的行为。报告人: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
在并行 B 树构建中报告排序阶段进度。我们已经报告了它,但仅在并行工作进程完成后才报告,这明显比串行构建中发生的时间晚得多。通过此更改,当领导者参与构建时(正常情况)开始自己的排序阶段时,我们会报告它。现在,这可能比工作进程开始排序阶段的时间稍晚,但是 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 gregn4422@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 下使用的新恢复测试。提交 caba8f0d43 对 msys 来说并不完全正确,正如包括 jacana 和 fairywren 在内的几个构建农场动物所证明的那样。我们需要在存档命令中使用 msys perl,但以 Windows 可以理解路径的方式调用它。此外,在复制脚本内部,我们需要将 Windows 路径转换为 msys 路径。 https://git.postgresql.org/pg/commitdiff/c3652f976b7696a96a9c5606cc2d613af77e2e63
进一步调整 stuck_on_old_timeline 恢复测试。转换目标目录路径上的路径斜杠。这让旧分支感到困惑,但为了统一性,已应用于所有分支。Perl 完全能够理解带有正斜杠的路径。顺便说一句,为了与其他测试保持一致,恢复以前的 archive_wait 查询,根据 Tom Lane 的抱怨。 https://git.postgresql.org/pg/commitdiff/9d97c3408319b43718e4b85bc694697db1af32c6
Ranier Vilela 发送了另一个补丁修订版,以减少取消烘烤值时的开销。
Takamichi Osumi 发送了另外三个补丁修订版,以记录同步逻辑解码中可能出现的死锁。
Andrey V. Lepikhov 发送了另一个补丁修订版,以实现批量 COPY FROM 到外部表。
Hou Zhijie 发送了另一个补丁修订版,以自适应地缓存分区边界偏移量。
Nathan Bossart 发送了一个补丁,以预先分配 WAL 段。
Tomáš Vondra 发送了两个补丁修订版,以使逻辑解码能够复制序列。
Justin Pryzby 发送了一个补丁,以在 ps 显示中显示“正在同步数据目录”。
Anastasia Lubennikova 发送了另外两个补丁修订版,以测试回归测试的重放。
Aleksander Alekseev 和 Michaël Paquier 调整了补丁,以修复 pg_event_trigger_ddl_commands 中的删除对象处理。
Dilip Kumar 和 Amit Langote 调整了补丁,以修复推测性中止的解码。
Peter Eisentraut 发送了一个补丁,以自动生成节点支持函数。
Kyotaro HORIGUCHI 和 Amit Kapila 调整了补丁,旨在修复在逻辑复制中表现为保持活动泛滥的错误。
Quan Zongliang 发送了一个补丁,以从 KnownAssignedTransactionIdes 子模块中删除未使用的代码。
Emre Hasegeli 发送了一个补丁,以支持 btree_gist 中的布尔值。
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 记录 0 间隔日志条目的错误。
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 发送了另外两个补丁修订版,以创建用于批处理的描述符副本,并仅为批处理初始化一次槽。
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,并将 WL_SOCKET_CLOSED 用于 client_connection_check_interval。
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 发送了一个补丁,将新的文档章节标题更改为“范围/多范围函数和运算符”,这更加清晰。
Bharath Rupireddy 发送了一个补丁,以增强 postgres_fdw 的批量插入测试用例。
Tomáš Vondra 发送了一个补丁,以缩短 postgres_fdw 测试的运行时。
Tomáš Vondra 发送了一个补丁,以处理扩展统计中的 Expr op Expr 子句。