本周人物: https://postgresql.life/post/valeria_kaplan/
JDBC 42.2.19 已发布 https://jdbc.postgresql.ac.cn/documentation/changelog.html#version_42.2.19
Pgpool-II 4.2.2, 4.1.6, 4.0.13, 3.7.18 和 3.6.25 发布,这是一个 PostgreSQL 的连接池和语句复制系统。 https://www.pgpool.net/docs/42/en/html/release-4-2-2.html
pgBadger v11.5 发布,这是一个用 Perl 编写的 PostgreSQL 日志分析器和图表工具。 https://github.com/darold/pgbadger/releases
pg_probackup 2.4.10 发布,这是一个用于管理 PostgreSQL 数据库集群备份和恢复的实用程序。 https://github.com/postgrespro/pg_probackup/releases/tag/2.4.10
pgFormatter 5.0 发布,这是一个 SQL 代码格式化/美化工具。 https://github.com/darold/pgFormatter/blob/master/ChangeLog
https://archives.postgresql.org/pgsql-jobs/2021-02/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Thomas Munro 推送
ReadNewTransactionId() -> ReadNextTransactionId()。新名称更好地传达了效果,与类似的函数 ReadNextMultiXactId()、ReadNextFullTransactionId() 更一致,并匹配它读取的变量的名称。报告人:Peter Geoghegan pg@bowt.ie 讨论:https://postgr.es/m/CAH2-WzmVR4SakBXQUdhhPpMf1aYvZCnna5%3DHKa7DAgEmBAg%2B8g%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/c7ecd6af010e2ac8c5530f3985e97f24531bfa5f
在运行 dsm_detach() 回调时保持中断。在清理并行查询或创建并行索引(已创建临时文件)之后,我们可能会被语句超时中断。错误处理路径随后会因为回调已从列表中弹出而无法在再次运行 dsm_detach() 时清理文件。通过在清理代码运行时保持中断来防止此危险。感谢 Heikki Linnakangas 的建议,也感谢 Kyotaro Horiguchi、Masahiko Sawada、Justin Pryzby 和 Tom Lane 对此及早期修复此问题的想法的讨论。向所有支持的版本回溯。报告人:Justin Pryzby pryzby@telsasoft.com 讨论:https://postgr.es/m/20191212180506.GR2082@telsasoft.com https://git.postgresql.org/pg/commitdiff/637668fb1d17ad789e392a40ff09694ff1aabffb
在 pg_test_fsync 中使用 pg_pwrite()。为了与 PostgreSQL 行为保持一致,此测试程序旨在模拟,请使用 pwrite() 而不是 lseek() + write()。还修复了最终的“非同步”测试,该测试为每次写入打开和关闭文件。讨论:https://postgr.es/m/CA%2BhUKGJjjid2BJsvjMALBTduo1ogdx2SPYaTQL3wAy8y2hc4nw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2c8b42b50df6cc5ba6987c400a857d6bbfdf0300
FreeBSD 上的默认 wal_sync_method=fdatasync。FreeBSD 13 增加了 O_DSYNC,通常这会使 wal_sync_method 选择 open_datasync 作为其默认值。这可能并不适用于所有系统,并且在某些情况下性能不如 fdatasync。暂时保留现有的默认行为。与执行相同操作的 commit 576477e73c4(为 Linux 执行)一样,回溯到所有支持的版本。讨论:https://postgr.es/m/CA%2BhUKGLsAMXBQrCxCXoW-JsUYmdOL8ALYvaX%3DCrHqWxm-nWbGA%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/f900a79ecdc1864a6ead72c97c34a41012227eaf
Tom Lane 提交
这主要是为了让在 gdb 中查看“struct subre”结构时,在正则表达式编译过程中不会被大量垃圾字段干扰。在打印调试输出的一些地方之后添加合适的 fflush 调用。顺便纠正一个错误的古老注释:parsebranch() 创建的连接 subre-s 具有 op == '.' 而不是 ','。在弄乱一些正则表达式性能改进时注意到。 https://git.postgresql.org/pg/commitdiff/2dd6733108f2bea07b0a3469e768bd900c0808b3
简化 nodeIncrementalSort.c 中的循环逻辑。switchToPresortedPrefixMode() 中的内层循环可以实现为传统的整数计数器 for() 循环,移除几个冗余的布尔状态变量。旧逻辑是早期开发遗留下来的,但现在的情况是没有任何理由要增加额外的复杂性。此外,注释了 82e0e2930 添加的测试用例,以解释为什么它会命中该提交中修复的边界情况,并添加一个 EXPLAIN 来验证它正在创建一个增量排序计划。像之前的补丁一样,回溯到 v13。James Coleman 和 Tom Lane 讨论:https://postgr.es/m/16846-ae49f51ac379a4cb@postgresql.org https://git.postgresql.org/pg/commitdiff/0e5290312851557ee24e3d6103baf14d6066695c
将 tsginidx.c 的 GIN 索引逻辑完全转换为三元运算。Commit 2f2007fbb 部分实现了这一点,但仍有两个问题。checkcondition_gin 通过设置出带重检标志来处理一些不确定的情况,有些是通过返回 TS_MAYBE,有些是通过两者都做。同时,TS_execute 任意地将 TS_MAYBE 结果转换为 TS_YES。因此,如果 checkcondition_gin 只选择返回 TS_MAYBE,结果将是 TS_YES 而没有重检标志,可能导致错误的查询输出。发生这种情况的情况是,传递给 gin_tsquery_[tri]consistent 的 indexscan 结果中存在 GIN_MAYBE 条目,据我所知,这只有在使用的大小足以导致位图丢失时才会发生。我最初的想法是确保在不确定的情况下总是设置重检标志并返回 TS_MAYBE。但这会走向另一个极端,可能强制重检那些可以证明匹配查询的行(因为即使 TS_execute 稍后发现答案必须是 TS_YES,重检标志仍然会设置)。相反,让我们完全摆脱出带重检标志,并依赖返回 TS_MAYBE。这需要导出 TS_execute 的一个版本,该版本实际上将返回评估的完整三元结果……但我们很可能一开始就应该这样做。不幸的是,似乎无法添加一个回归测试用例来覆盖这一点:导致 GIN 位图丢失所需的数据量比我们希望在测试中花费的时间要长。(我正在考虑是否允许更小的 work_mem 设置来缓解这个问题,但这将是另一个补丁。)根据 Dimitri Nüscheler 的 bug #16865。回溯到有错误提交的 v13。讨论:https://postgr.es/m/16865-4ffdc3e682e6d75b@postgresql.org https://git.postgresql.org/pg/commitdiff/38bb3aef354ca98ff88cb37337995039a3b5135f
对正则表达式代码进行一些小的改进。推送一些预计不会有争议的部分,这些部分是从即将发布的补丁系列中提取出来的,以消除主补丁中不相关的混乱。在 compact() 中,在设置 REG_ASSERT 错误后立即返回;继续循环只会导致下面的断言失败。(问我怎么知道的。)在 parseqatom() 中,移除断言 moresubs() 完成了其工作。当 moresubs 确实完成其工作时,这与该函数最后的断言是冗余的;但当它因 OOM 而失败时,这是一个断言崩溃。我们可以通过在断言前添加 NOERR() 检查来避免崩溃,但减去代码似乎比添加代码更好。(请注意,在几行之外有一个 NOERR 退出,并且在此之间没有其他任何内容需要 moresubs 成功。所以我们实际上不需要额外的错误退出。)这是启用断言的构建中的一个实时错误,但鉴于 moresub 的微小分配中 OOM 的可能性非常低,我认为不值得回溯。另一方面,似乎有必要添加一个断言,即当我们准备好插入到 v->subs[subno] 时,目标仍然是 null,因为这之间存在递归。在 pg_regexec 中,确保在退出时冲洗任何调试输出,并尝试使 MDEBUG 消息更统一和有用。(特别是,确保所有消息都以 subre 的 id 号作为前缀,这样就可以匹配输入和输出报告。)在 test_regex 中添加一些测试用例,以提高前瞻和后顾约束的覆盖率。现在添加这些主要是为了确认这是现有的行为。讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/4e703d67193df0431c0740044d662d1feade73aa
修复 BRE 模式正则表达式解析中的另一个古老错误。在研究正则表达式代码时,我偶然发现 commit afcc8772b2 修复的错误有一个同伴:next() 在基本 RE 模式下解析时,未能返回与“}”标记关联的特定值,用于“{m,n}”量词。同样,这可能导致量词被视为非贪婪,而它在基本模式下永远不应该是。要发生这种情况,在“}”之前的最后一个设置“nextvalue”的字符必须将其设置为零,或者它必须从一开始就偶然为零。例如,可以使用以数字“0”结尾的界限来重复此失败。与之前的补丁一样,全部回溯。 https://git.postgresql.org/pg/commitdiff/b5a66e7353ba65c11c5fc6a79b72213bde8dbe44
在正则表达式引擎中引入“彩虹”弧。一些正则表达式构造,特别是“.”匹配任何字符的元字符,会产生一束并行 NFA 弧,覆盖所有可能的颜色(即字符等价类)。通过用带有特殊颜色代码“RAINBOW”的单个弧替换这些情况,我们可以显著改善处理大型正则表达式的空间和时间需求。这只需要对 pull() 和 push() 等地方进行少量额外的复杂化。pg_reg_getoutarcs() 的调用者现在必须为看到 RAINBOW 弧的可能性做好准备。对于唯一已知的用户 contrib/pg_trgm,这是一个净收益,因为它减少了需要处理的弧的数量,并且处理方式与其他包含太多字符无法单独处理的颜色没有区别。这是补丁系列的一部分,该系列总共将正则表达式引擎在大量真实世界正则表达式语料库上的运行时间减少了大约四倍。补丁作者:我,审阅者:Joel Jacobson 讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/08c0d6ad65f7c161add82ae906efb90dbd7f653d
在正则表达式引擎中识别“匹配所有”NFA。这建立在之前的“彩虹”补丁之上,用于检测将匹配任何字符串的 NFA,尽管可能受到字符串长度的限制。选择此定义是为了匹配诸如 `.*`、`.+` 和 `.{1,100}` 等构造。在优化传递之后识别这样的 NFA 是相当便宜的,因为我们基本上只需要验证所有弧都是 RAINBOW 弧并将步骤数计数到结束状态。(嗯,关于字符串边界条件的伪颜色弧有一些复杂性,但不多。)一旦我们有了这些标记,正则表达式执行器函数 longest()、shortest() 和 matchuntil() 就无需花费每字符的工作来确定给定的子字符串是否满足这样的 NFA;它们只需要检查其长度是否在边界内。由于一些匹配问题需要 O(N) 次调用这些函数,我们将 N 字符字符串的运行时间从 O(N^2) 减少到 O(N)。当然,这对非匹配所有子模式没有帮助,但那些通常有约束条件,使我们能够避免需要 O(N) 子字符串检查。正是不受约束的“匹配所有”情况带来了最多的麻烦。这是补丁系列的一部分,该系列总共将正则表达式引擎在大量真实世界正则表达式语料库上的运行时间减少了大约四倍。补丁作者:我,审阅者:Joel Jacobson 讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/824bf71902db4a2067b8d64583c9d88bb264c44b
修复正则表达式引擎以抑制无用的连接子 RE。parsebranch() 的注释声称它避免了在“subre”树中生成不必要的连接节点,但它遗漏了一些重要的情况。一旦我们确定某个原子是“混乱的”并且不能与当前正则表达式分支的先前原子捆绑在一起,parseqatom() 就会生成两个新的连接节点,一个用于将混乱的原子连接到分支中的后续原子,另一个上层节点用于将分支的先前部分连接到该原子。但这其中一个或两个可能是多余的,如果混乱的原子是分支中的第一个、最后一个或唯一一个。改进代码以抑制这种无用的连接节点,以及表示分支空块的无操作子节点。减少 subre 树节点数量不仅在执行时,而且在编译时都能带来显著的节省,因为每个 subre 节点都有自己的 NFA,必须单独优化。(也许有一天我们会找出如何在多个树节点之间共享优化工作,但这看起来并不容易。)消除上层树节点尤其有用,因为它们往往具有更大的 NFA。这是补丁系列的一部分,该系列总共将正则表达式引擎在大量真实世界正则表达式语料库上的运行时间减少了大约四倍。补丁作者:我,审阅者:Joel Jacobson 讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/cebc1d34e5207c37871708f91be65dd839760b5f
将正则表达式引擎的 subre 树从二进制转换为 N-ary 样式。不是在 subre 结构中有左右子链接,而是有一个子链接加上一个同级链接。现在可以通过追踪同级链来访问树节点的多个子节点。这受益于选择性树节点。具有 N (>1) 分支的正则表达式现在由一个具有 N 个子节点的选择性节点表示,而不是包含 N 个选择性节点以及 N 个子节点的树。虽然旧的表示法在执行时并没有真正带来额外成本,但对于编译来说它相当糟糕,因为每个选择性节点都有自己的 NFA,我们很愚蠢地没有单独优化它。(更糟糕的是,所有这些 NFA 都描述了整个选择性模式,而不仅仅是树结构可能预期的部分。)我们继续要求连接节点有两个子节点。此数据结构现在已准备好支持更多功能,但执行器的逻辑需要仔细重新设计,并且不确定能获得多少好处。这是补丁系列的一部分,该系列总共将正则表达式引擎在大量真实世界正则表达式语料库上的运行时间减少了大约四倍。补丁作者:我,审阅者:Joel Jacobson 讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/581043089472816061a7fd381f40572191dfa48f
避免为捕获括号生成额外的 subre 树节点。以前,每对捕获括号都会产生一个单独的 subre 树节点,其唯一功能是识别我们应该为这个特定的子表达式捕获匹配详细信息。在大多数情况下,我们并不真正需要它,因为我们可以完美地在执行实际匹配工作的子节点上添加“捕获此”注解。与前两个提交一样,这主要的好处是避免为实际没有发挥作用的树节点生成和优化 NFA。选择的数据表示每个 subre 节点只允许一个捕获注解。在合法的(但似乎不太有用)情况下,当有多个捕获括号环绕正则表达式的同一位(即“((xyz))”)时,将子节点包装在 N-1 个捕获节点中,其行为与以前相同。我们可以做得更努力,但我会克制,等待一些证据表明这些情况值得关注。顺便说一句,改进 regex.h 中的注释,说明所有不同的 re_info 位意味着什么。有些非常明显,但有些则不那么明显,所以反向工程一些文档。这是补丁系列的一部分,该系列总共将正则表达式引擎在大量真实世界正则表达式语料库上的运行时间减少了大约四倍。补丁作者:我,审阅者:Joel Jacobson 讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ea1268f6301cc7adce571cc9c5ebe8d9342a2ef4
Michaël Paquier 提交
为 pg_cryptohash_final() 添加结果大小作为参数以进行溢出检查。在其当前设计下,草率地使用 pg_cryptohash_final() 可能导致内存越界写入,因为存储结果摘要的目标缓冲区大小对密码哈希内部来说是未知的,而调用者对此一无所知。此提交向 pg_cryptohash_final() 添加了一个新参数,以允许此类健全性检查,并实现了此类防御措施。SCRAM 的 HMAC 内部可以进一步收紧,但由于一切都基于 SCRAM_KEY_LEN,它具有此代码的特定用途,因此没有必要比必要更复杂化其接口,并且这回到了核心 HMAC 的重构。除此之外,它最大限度地减少了现有 DIGEST_LENGTH 变量的使用,而是依赖 sizeof() 来获取结果大小。在 ossp-uuid 中,这也使代码更具防御性,因为它已经依赖于 dce_uuid_t 至少具有 MD5 摘要的大小。这在哲学上类似于 base64.c 的 cfc40d3 和 hex.c 的 aef8948。报告人:Ranier Vilela 作者:Michael Paquier, Ranier Vilela 审阅者:Kyotaro Horiguchi 讨论:https://postgr.es/m/CAEudQAoqEGmcff3J4sTSV-R_16Monuz-UpJFbf_dnVH=APr02Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b83dcf792869fb4a9270d17c961eab75f51c44e4
为 [ NO ] DEPENDS ON EXTENSION 添加 psql 补全。ALTER INDEX 已经能够处理。这为所有支持此语法的剩余命令添加了 Tab 补全:- ALTER FUNCTION - ALTER PROCEDURE - ALTER ROUTINE
ALTER TRIGGER - ALTER MATERIALIZED VIEW 作者:Ian Lawrence Barwick 讨论:https://postgr.es/m/CAB8KJ=iypYudXuMOAMOP4BpkaYbXxk=a2cdJppX0e9mJXWtuig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e6b8e83b9f012cfbb3a2f96a7d2e74aebd299d4e
修复 --with-ssl 的不一致配置数据。此不一致性在 autoreconf 后出现。报告人:Antonin Houska 审阅者:Tom Lane 讨论:https://postgr.es/m/47255.1613716807@antos https://git.postgresql.org/pg/commitdiff/a899ec1cb23eb3c4a94648f18a9408e5316d32a4
doc:提到 REINDEX 进度报告的 partitions_{done,total} 为 0。REINDEX 最近获得了对分区的支持,因此看到这些字段未设置可能会令人困惑。使用 pg_stat_progress_create_index 中当前可用的一组列,为这些关系生成有用的报告更加复杂,这也触及了 REINDEX DATABASE/SYSTEM/SCHEMA。此提交记录了在 REINDEX 期间不会触及这两个列。报告人:Justin Pryzby 讨论:https://postgr.es/m/20210216064214.GI28165@telsasoft.com https://git.postgresql.org/pg/commitdiff/17661188336c8cbb1783808912096932c57893a3
Amit Kapila 提交
修复 commit ce0fdbfe97 中引入的警告。作者:Amit Kapila 审阅者:Tom Lane 讨论:https://postgr.es/m/1610789.1613170207@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d9b0767becf5f41e4f001d8381e6a89941efa5b2
移除 pgoutput 中不必要的 PrepareWrite。这个问题自该代码(PG-10)首次出现就存在,但在最近的 commit ce0fdbfe97 中暴露出来,当时我们在 tablesync worker 中使用了 origins。问题在于,我们有时会发送 prepare_write ('w') 消息,但实际消息并未发送,而在订阅端,我们总是在 prepare_write 消息之后期望一个消息,这导致了这个错误。我没有回溯此问题,因为在 commit ce0fdbfe97 之前,核心代码无法触发此问题,而且我们迄今为止还没有收到任何投诉。报告人:Erik Rijkers 作者:Amit Kapila 和 Vignesh C 测试者:Erik Rijkers 讨论:https://postgr.es/m/1295168140.139428.1613133237154@webmailclassic.xs4all.nl https://git.postgresql.org/pg/commitdiff/f672df5fdd22dac14c98d0a0bf5bbaa6ab17f8a5
Peter Geoghegan 提交
调整 lazy_scan_heap() 的会计注释。解释 tups_vacuumed 变量会计了哪些特定的 LP_DEAD 行指针。 https://git.postgresql.org/pg/commitdiff/7cde6b13a9b630e2f04d91e2f17dedc2afee21c6
避免 pageinspect 中误解释 GiST 页面。GistPageSetDeleted() 在删除页面时设置 pd_lower,并将页面内容设置为 GISTDeletedPageContents。避免在 pageinspect 中将已删除的 GiST 页面视为常规的带槽页面。commit 756ab291 中的疏忽。作者:Andrey Borodin x4mmm@yandex-team.ru https://git.postgresql.org/pg/commitdiff/fa41cf8f183ac5d702e91da567e9b3375c632081
为 GiST pageinspect 函数添加“LP_DEAD item?”列。这使 gist_page_items() 和 gist_page_items_bytea() 与 nbtree 的 bt_page_items() 函数保持一致。commit 756ab291 的一个小的后续更新,该提交添加了 GiST 函数。作者:Andrey Borodin x4mmm@yandex-team.ru 讨论:https://postgr.es/m/E0794687-7315-4C29-A9C7-EC54D448596D@yandex-team.ru https://git.postgresql.org/pg/commitdiff/9e596b65f430fcb942685b41860b323398a88873
nbtree README:移动 VACUUM 线性扫描部分。在讨论了 VACUUM 的元组删除之后,但在讨论了 VACUUM 的页面删除之前,讨论 VACUUM 的线性扫描。这种进展更加自然。还稍微调整了措辞。似乎没有必要讨论它在 PostgreSQL 8.2 之前的运作方式。 https://git.postgresql.org/pg/commitdiff/128dd901a5c87e11c6a8cbe227a806cdc3afd10d
为 nbtree README 添加关于页面回收的部分。通过添加一个新部分来合并关于 VACUUM 如何将页面放入 FSM 以供回收的讨论,该部分在讨论页面删除之后。这种结构反映了 Lanin & Shasha 的论文明确地将页面回收与页面删除分开了。nbtree 中的页面回收是论文中称为“drain technique”的实现。这种分离对于 nbtree VACUUM 是一个重要概念。搜索者必须检测并从并发页面删除中恢复,但他们永远不必考虑并发页面回收。回收几乎总可以被视为一种低级垃圾回收操作,它异步地释放逻辑树节点所支持的物理空间。几乎所有代码只需要关注逻辑树节点。(请注意,“逻辑树节点”目前在 nbtree 代码中不是一个术语——所有这些都是隐式工作的。)这是为即将发布的补丁做准备,该补丁将教会 nbtree VACUUM 在运行时记住它在本地内存中删除的页面的详细信息。这使得同一个 VACUUM 操作在稍后(当它到达 btvacuumscan() 的末尾时)可以将自己删除的页面放入 FSM。 https://git.postgresql.org/pg/commitdiff/b071a311495bbf42ddf2466a556d033df8f0f5e7
Fujii Masao 提交
在 pg_locks 中显示进程开始等待锁的时间,第二版。此提交向 pg_locks 视图添加了一个新列“waitstart”。此列报告服务器进程开始等待锁的时间(如果未持有锁)。此信息很有用,例如,在检查等待锁的时间长度时,可以通过从 pg_locks 中的“waitstart”减去当前时间来做到这一点,并识别进程正在等待的锁非常长。此功能使用为死锁超时计时器获得的当前时间作为“waitstart”(即,进程开始等待锁的时间)。由于新获取当前时间可能会导致开销,我们重用已获取的时间以避免该开销。请注意,“waitstart”的更新是在不持有锁表分区锁的情况下进行的,以避免额外的锁获取开销。这可能导致“waitstart”在 pg_locks 中在等待开始后很短一段时间内为 NULL,即使“granted”为 false。这在实践中是没问题的,因为我们可以假设用户很可能在等待锁很长时间时查看“waitstart”。此补丁的第一次尝试(commit 3b733fcd04)导致 buildfarm 成员“rorqual”(使用 --disable-atomics --disable-spinlocks 构建)报告回归测试失败。它被 commit 890d2182a2 撤销。失败的原因是为 prepare transaction 末尾创建的虚拟进程条目中的“waitstart”原子变量未初始化。第二次尝试修复了该问题。增加目录版本。作者:Atsushi Torikoshi 审阅者:Ian Lawrence Barwick, Robert Haas, Justin Pryzby, Fujii Masao 讨论:https://postgr.es/m/a96013dc51cdc56b2a2b84fa8a16a993@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/46d6e5f567906389c31c4fb3a2653da1885c18ee
修复 pg_stat_wal_receiver 中的“invalid spinlock number: 0”错误。Commit 2c8dd05d6c 将原子变量 writtenUpto 添加到 walreceiver 的共享内存信息中。它仅在 walreceiver 启动时初始化,但可以随时通过 pg_stat_wal_receiver 视图读取,即在它初始化之前。在用 --disable-atomics 和 --disable-spinlocks 构建的服务器中,读取此未初始化的原子变量可能导致“invalid spinlock number: 0”错误。此提交更改了 writtenUpto,使其在 postmaster 启动时初始化,以避免通过 pg_stat_wal_receiver 读取未初始化的变量并修复错误。此外,此提交将 writtenUpto 的读取移到了保护 walreceiver 共享变量的自旋锁释放之后。这是必要的,以防止在持有另一个自旋锁时,通过原子变量读取获取新的自旋锁,并缩短自旋锁的持续时间。此更改导致 writtenUpto 与受自旋锁保护的其他 walreceiver 共享变量不一致。但这是可以的,因为 writtenUpto 不应用于数据完整性检查。回溯到引入该错误的 v13 版本。作者:Fujii Masao 审阅者:Michael Paquier, Thomas Munro, Andres Freund 讨论:https://postgr.es/m/7ef8708c-5b6b-edd3-2cf2-7783f1c7c175@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/614b7f18b3bda738f352a8732cf749eb5fa56dae
修复 COMMIT AND CHAIN 命令中的错误。此提交修复了 COMMIT AND CHAIN 命令,使其即使在事务提交时定义了保存点,也能立即启动新事务。以前 COMMIT AND CHAIN 命令在这种情况下不会这样做,因为 commit 280a408b48 忘记让 CommitTransactionCommand() 在事务状态为 TBLOCK_SUBCOMMIT 时处理事务链。此提交还添加了 COMMIT AND CHAIN 命令在定义了保存点时的回归测试。回溯到添加事务链的 v12 版本。报告人:Arthur Nascimento 作者:Fujii Masao 审阅者:Arthur Nascimento, Vik Fearing 讨论:https://postgr.es/m/16867-3475744069228158@postgresql.org https://git.postgresql.org/pg/commitdiff/8a55cb5ba9655ffb1cf0a3042aaa6f5eef8c5a85
修复 psql 的 ON_ERROR_ROLLBACK 以处理 COMMIT AND CHAIN。当启用 ON_ERROR_ROLLBACK 时,psql 在执行查询后,如果它处于有效的事务块中且空闲,则会释放临时保存点。但 psql 在执行 RELEASE 或 ROLLBACK 后不会这样做,因为临时保存点在此情况下已被销毁。此提交更改了 psql 的 ON_ERROR_ROLLBACK,使其在执行 COMMIT AND CHAIN 时也不释放临时保存点。在这种情况下不需要释放临时保存点,因为 COMMIT AND CHAIN 也会销毁事务提交中定义的所有保存点。否则 psql 会尝试释放 COMMIT AND CHAIN 已销毁的保存点并导致错误“ERROR: savepoint "pg_psql_temporary_savepoint" does not exist”。回溯到添加事务链的 v12 版本。报告人:Arthur Nascimento 作者:Arthur Nascimento 审阅者:Fujii Masao, Vik Fearing 讨论:https://postgr.es/m/16867-3475744069228158@postgresql.org https://git.postgresql.org/pg/commitdiff/fe06819f105ccea52c12d418c8dbaaaa54377e96
Heikki Linnakangas 提交
Andres Freund 提交
移除 snapbuild.c 中的向后兼容性丑陋代码。在 955a684e040 中,我们修复了初始快照创建中的一个错误。在此过程中,SnapBuild 结构体的几个成员已过时。由于 SnapBuild 被序列化到磁盘,我们无法更改内存布局。不幸的是,我后来忘了删除向后兼容性垃圾代码,但幸运的是 Heikki 刚刚提醒了我。此提交增加了 SNAPBUILD_VERSION,因此会破坏现有的插槽(在主版本中没问题)。作者:Andres Freund 提醒者:Heikki Linnakangas hlinnaka@iki.fi 讨论:https://postgr.es/m/c94be044-818f-15e3-1ad3-7a7ae2dfed0a@iki.fi https://git.postgresql.org/pg/commitdiff/a975ff4980d60f8cbd8d8cbcff70182ea53e787a
修复 dc7420c2c92 中引入的 heap_page_prune() 参数顺序混乱。幸运和不幸的是,传递的值对于所有类型都意味着相同。幸运的是,因为我的困惑没有造成任何伤害,不幸的是,否则编译器可能会发出警告……顺便说一句,同步定义和声明之间的参数名称。报告人:Peter Geoghegan pg@bowt.ie 作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/CAH2-Wz=L=nBoepQdH9b5Qd0nMvepFT2CnT6sjWvvpOXa=K8HVQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8001cb77ee6cb4f32632850d41f00206a86bac3e
Peter Eisentraut 提交
使用 errmsg_internal 进行调试消息。一组不一致的调试级别消息未使用 errmsg_internal(),因此无用地暴露了这些消息以供翻译。修复它们。 https://git.postgresql.org/pg/commitdiff/0e392fcc0d5ab73c81d9284e7dda5acbb7ad6d21
例行使用信息模式表。几个信息模式视图跟踪函数/过程与其使用的对象之间的依赖关系。到目前为止,这些尚未实现,因为 PostgreSQL 不跟踪函数体中使用的对象。但是,正式来说,它们也显示了参数默认表达式中使用的依赖关系,PostgreSQL 支持并跟踪这些。因此,为了完整起见,我们也添加它们。如果将来实现了函数体依赖跟踪,这些视图将自动正确工作。审阅者:Erik Rijkers er@xs4all.nl 讨论:https://postgresql.ac.cn/message-id/flat/ac80fc74-e387-8950-9a31-2560778fc1e3%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/f40c6969d0eddfc6de786006bd1048961a65a0eb
允许指定 CRL 目录。为服务器和客户端添加了另一种指定 CRL 的方法,即散列目录方法。这提供了一种方法,让服务器或 libpq 只加载验证证书所需的 CRL。CRL 目录通过单独的 GUC 变量或连接选项 ssl_crl_dir 和 sslcrldir 来指定,以及现有的 ssl_crl_file 和 sslcrl,因此可以同时使用这两种方法。作者:Kyotaro Horiguchi 讨论:https://postgresql.ac.cn/message-id/flat/20200731.173911.904649928639357911.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/f5465fade90827534fbd0b795d18dc62e56939e9
为 bytea LIKE 运算符添加测试。为以下操作添加了测试覆盖,这些操作之前完全没有被测试过:bytea LIKE bytea (bytealike) bytea NOT LIKE bytea (byteanlike) ESCAPE 子句用于上述操作(like_escape_bytea)也命名 NOT ILIKE text (nameicnlike) 讨论:https://postgresql.ac.cn/message-id/flat/4d13563a-2c8d-fd91-20d5-e71b7a4eaa87%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/eb42110d952f8d1ad4049b8f2491e9dfba75ffed
更新 snowball。更新到 snowball tag v2.1.0。主要变化是新增了亚美尼亚语、塞尔维亚语和意第绪语的词干提取器。 https://git.postgresql.org/pg/commitdiff/678d0e239b67174f349a401ea7dcecabb3c5b137
Magnus Hagander 已推送
Tomáš Vondra 提交了
修复 ExecForeignBatchInsert SGML 文档中的指针类型。报告人:Ian Barwick 讨论:https://postgr.es/m/20200628151002.7x5laxwpgvkyiu3q@development https://git.postgresql.org/pg/commitdiff/c15283ff429bf318f161bf84768795843b22696d
将元组路由调整为仅为插入初始化批处理。分区表的跨分区更新实现为删除后插入。然而,对于外部分区,这会引起问题,因为 FDW 和核心可能在何时启用批处理方面存在分歧。postgres_fdw 仅允许对普通插入(CMD_INSERT)进行批处理,而核心则尝试批处理跨分区更新的插入部分。通过限制核心仅将批处理应用于普通的 CMD_INSERT 查询来解决此问题。可以允许跨分区更新的批处理,但这需要更广泛的更改,因此最好将其留给单独的补丁。作者:Amit Langote 审阅者:Tomas Vondra, Takayuki Tsunakawa 讨论:https://postgr.es/m/20200628151002.7x5laxwpgvkyiu3q@development https://git.postgresql.org/pg/commitdiff/927f453a941061e3d5884bab206581c34784e45b
Justin Pryzby 发送了一个补丁,用于移除 REINDEX (CONCURRENTLY, TABLESPACE ..) 实现中的一些死代码。
Ikeda Masahiro 发送了另一个补丁修订版,用于添加与写入/同步 WAL 记录相关的统计信息,并使 WAL 接收器报告 WAL 统计信息。
Michaël Paquier 发送了另一个补丁修订版,用于重构 HMAC 实现。
Daniel Gustafsson 发送了另一个补丁修订版,用于在运行的集群中支持校验和的启用/禁用。
Tomáš Vondra 发送了另一个补丁修订版,用于实现 BRIN 多范围索引。
Peter Eisentraut 发送了另一个补丁修订版,用于通过增强错误消息“every hash partition modulus must be a factor of the next larger modulus”并提供显示具体数字的详细消息,来改进新的哈希分区边界检查错误消息。
Andrey Borodin 发送了另一个补丁修订版,用于使所有 SLRU 缓冲区大小可配置。
Justin Pryzby 发送了另一个补丁修订版,用于允许在分区表上执行 CREATE INDEX CONCURRENTLY。
Takayuki Tsunakawa 发送了另外两个补丁修订版,用于提高 COPY FROM 到具有远程分区的表的性能,部分是通过向 FDW API 添加和使用 COPY 例程。
Peter Eisentraut 发送了一个补丁,用于为来自客户端的 SSL 连接设置 SNI。
Mark Rofail 和 Joel Jacobson 交换了补丁,以实现外键数组。
Bharath Rupireddy 发送了另外两个补丁修订版,用于实现 ALTER SUBSCRIPTION ... DROP PUBLICATION。
Peter Smith 发送了三个补丁修订版,用于实现两阶段事务的逻辑解码。
Peter Geoghegan 发送了两个补丁修订版,用于为 nbtree 页面删除使用完整的 64 位 XID,回收同一 VACUUM 期间删除的页面,并在 VACUUM VERBOSE 输出中显示“新删除的页面”。
Amit Langote 发送了两个补丁修订版,用于确保在分区表上创建外键触发器,并在跨分区更新期间正确强制执行外键约束。
Greg Nancarrow 和 Amit Langote 交换了补丁,使 INSERT ... SELECT ... 能够并行执行。
Seamus Abshere 和 Amit Langote 交换了补丁,允许在分区表上设置 parallel_workers。
Michaël Paquier 发送了一个补丁,用于为没有存储的关系添加 no_storage、fallback 表 AM。
Tomáš Vondra 和 Matthias van de Meent 交换了补丁,以扩展 COPY 进度报告。
Amit Langote 发送了另一个补丁修订版,用于提高继承树上的更新和删除的扩展性。
Pavel Stěhule 提交了另一个修订版的补丁,以实现模式变量。
Pavel Stěhule 发送了另一个补丁修订版,用于使 pg_dump 可以从文件中读取选项。
Paul Martinez 发送了一个补丁,用于记录 max_replication_slots 在订阅方的影响。
Amit Langote 发送了三个补丁修订版,用于修复元组路由,使其仅为插入初始化批处理。
Andy Fan 发送了两个补丁修订版,引入 RelOptInfo 中的 notnullattrs 字段,以指示当前查询中哪些属性不是 NULL。
Yugo Nagata 发送了另一个补丁修订版,用于实现物化视图的增量维护。
David Rowley 发送了两个补丁修订版,增加了 TID Range Scans 以支持高效扫描 TID 范围。
Kyotaro HORIGUCHI 发送了两个补丁修订版,旨在修复 ALTER TABLE 的某些调用中出现的错误,通过纠正实际允许的关系类型集来修复。
Justin Pryzby 和 Michaël Paquier 交换了补丁,用于实现分区表上 CREATE INDEX 的进度报告。
Amit Kapila 发送了三个补丁修订版,用于在身份验证失败时区分物理和逻辑复制连接。
John Naylor 发送了四个补丁修订版,用于使用 SIMD 指令验证 UTF-8。
Vik Fearing 发送了三个补丁修订版,用于实现 SQL 标准 TRIM_ARRAY,它从数组中删除最后一个元素。
David Rowley 和 Andy Fan 交换了补丁,允许 estimate_num_groups() 返回更多关于估计的细节,允许 simplehash.h 的用户执行直接删除,添加了一个 Result Cache 执行节点,并移除 nodeResultCache.c 中的一些代码重复。
Justin Pryzby 和 Dilip Kumar 交换了补丁,用于添加自定义表压缩方法。
Takashi Menjo 发送了另一个补丁修订版,用于使 WAL 操作可以使用持久内存。
Mark Dilger 发送了另一个补丁修订版,用于添加一个 heapcheck contrib 扩展。
Thomas Munro 发送了两个补丁修订版,用于修复 pg_collation_actual_version() ERROR: cache lookup failed for collation 123 的错误,通过修复处理 collation provider 的方式来修复。
Kyotaro HORIGUCHI 发送了另一个补丁修订版,用于除了 CRL 文件之外,还可以指定 CRL 目录。
Daniel Gustafsson 发送了另一个补丁修订版,用于使 NSS 可以作为 libpq 的 TLS 后端。
Álvaro Herrera 发送了另一个补丁修订版,用于在 libpq 中实现批处理/流水线支持。
Bharath Rupireddy 发送了另一个补丁修订版,用于为多插入和单插入添加表 AM,然后用于 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。
Tomáš Vondra 发送了另一个补丁修订版,用于实现表达式的扩展统计信息。
Hou Zhijie 发送了另一个补丁修订版,添加了一个新的 GUC enable_parallel_dml(布尔值,默认为 false),以及一个新的表选项 parallel_dml_enabled(布尔值,默认为 true)。每个都按其名称含义工作。
Thomas Munro 发送了一个补丁,用于添加 sort_template.h 以创建快速排序函数。
Amit Langote 发送了一个补丁,用于允许在跨分区更新期间批处理插入。
Daniel Gustafsson 发送了一个补丁,禁止 SSL 压缩,理由是它使加密分析攻击更容易被利用。
Peter Eisentraut 发送了另一个补丁修订版,通过添加 LSN_FORMAT_ARGS 宏用于 printf 样式的 LSN 打印,来简化 LSN 的打印。
Konstantin Knizhnik 发送了另一个补丁修订版,用于修复存储过程和 TOAST 数据访问之间的不兼容问题。
Jan Wieck 发送了一个补丁,用于添加一个线协议钩子和一个示例实现 telnet。
Guillaume Lelarge 发送了另一个补丁修订版,向 pg_dump 添加了一个 --extension (-e) 选项,该选项指定要转储的扩展。该选项可以使用 0 次或多次。
Nathan Bossart 发送了另一个补丁修订版,用于避免过早创建 archive status ".ready" 文件,并在崩溃后跟踪已通知可存档的位置。
Nathan Bossart 发送了另一个补丁修订版,用于澄清 RESET ROLE 在“role”按用户、按数据库设置或通过命令行选项设置时的行为文档,并为“role”和“session_authorization”添加配置参数条目。
Paul Guo 发送了另一个补丁修订版,用于通过仅 fsync() 受影响的文件/目录,并使用 copy_file_range() 进行文件复制来加速 pg_rewind。
Michaël Paquier 发送了另一个补丁修订版,用于实现 OpenSSL <= 1.0.2 的缺失锁定函数。
Iwata Aya 发送了另一个补丁修订版,用于为 libpq 添加跟踪。
Andres Freund 发送了另一个补丁修订版,用于使用全局屏障实现 wal prohibit 状态,在 WAL 写入前进行 Error 或 Assert START_CRIT_SECTION,并通过 README 文档化这些对 transam 和 page 的影响。
Georgios Kokolatos 发送了另一个补丁修订版,用于使 dbsize 更加一致。
Denis Smirnov 发送了两个补丁修订版,通过允许可变大小的块,使 analyze AM 更灵活。
Paul Guo 发送了两个补丁修订版,用于在 CTAS 期间冻结元组,这可以避免不必要的 vacuums。
Andy Fan 发送了两个补丁修订版,使一些静态函数 extern 并扩展 ChangeVarNodes,使其能够更改 var->attno,并构建一些隐含的剪枝条件以扩展规划时间分区剪枝和初始化分区剪枝的用例。
Marcus Wanner 发送了两个补丁修订版,用于向输出插件提供空的 prepares。
Ajin Cherian 和 Marcus Wanner 交换了补丁,以在逻辑解码中保留 PREPAREs 与 COMMITs 的顺序。
Andrew Dunstan 发送了另一个补丁修订版,通过让 make 文件和 msvc 构建系统创建一个具有要搜索日志文件位置的已知文件(如果发生错误),来帮助跟踪 cfbot 故障。
Andy Fan 发送了一个补丁,在 RelOptInfo 中引入 notnullattrs 字段以指示当前查询中哪些属性不是 NULL,并为单个 rel 添加了仅限单 rel 的 UniqueKey with EquivalenceClass。
Thomas Munro 发送了一个补丁,根据 Andrew Gierth 的要求,移除 effective_io_concurrency 描述中过时的关于 spindle 的引用。
Bharath Rupireddy 发送了一个补丁,用于一次更新多个进度参数。
Vik Fearing 发送了两个补丁修订版,以根据标准实现 GROUP BY DISTINCT。
Vik Fearing 发送了一个补丁,向 pg_config 添加了 catalog version 以及一个新的 catalog_version guc,可以从 SQL 访问。