本周人物: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/
PostgreSQL 星球:https://planet.postgresql.org/
本周的 PostgreSQL 每周新闻由 David Fetter 为您带来
请在太平洋标准时间下午 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 差。现在让我们保留现有的默认行为。与提交 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() 创建的连接子正则表达式的 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 索引逻辑转换为完全三元操作。提交 2f2007fbb 部分完成了此操作,但仍有两个剩余的缺陷。checkcondition_gin 通过设置带外重新检查标志来处理一些不确定的情况,一些通过返回 TS_MAYBE,还有一些通过同时执行这两项操作。同时,TS_execute 任意地将 TS_MAYBE 结果转换为 TS_YES。因此,如果 checkcondition_gin 选择仅返回 TS_MAYBE,则结果将是 TS_YES,没有重新检查标志,这可能会导致错误的查询输出。如果传递给 gin_tsquery_[tri]consistent 的索引扫描结果中有 GIN_MAYBE 条目,则可能会发生这种情况,据我所知,只有当用于累积索引扫描结果的 tidbitmap 变得足够大而导致有损时才会发生这种情况。我最初的想法是通过确保我们在不确定的情况下始终设置重新检查标志以及返回 TS_MAYBE 来解决此问题。但这会朝另一个方向错误,可能会强制重新检查可以证明与查询匹配的行(因为即使 TS_execute 稍后发现答案必须是 TS_YES,重新检查标志仍然会设置)。相反,让我们完全删除带外重新检查标志,并依靠返回 TS_MAYBE。这需要导出一个 TS_execute 版本,它实际上会返回评估的完整三元结果... 但我们可能应该从一开始就这样做。不幸的是,添加涵盖此内容的回归测试用例似乎不切实际:导致 GIN 位图变得有损所需的数据量会导致运行时间比我们认为希望在测试中花费的时间长。(我正在考虑允许较小的 work_mem 设置来改善这种情况,但这将是另一个补丁的问题。)根据来自 Dimitri Nüscheler 的错误 #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] 目标仍然为空,因为两者之间存在递归。在 pg_regexec 中,确保我们在退出时刷新所有调试输出,并尝试使 MDEBUG 消息更加统一和有用。(特别是,确保所有消息都以子正则表达式的 ID 号为前缀,这样就可以匹配入口和退出报告。)在 test_regex 中添加一些测试用例以提高前瞻和后顾约束的覆盖率。现在添加这些主要是为了确定这确实是现有的行为。讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/4e703d67193df0431c0740044d662d1feade73aa
修复基本 RE 模式正则表达式解析中的另一个古老错误。在研究正则表达式代码时,我碰巧注意到在提交 afcc8772e 中修复的错误有一个同级:在基本 RE 模式下解析时,next() 未返回与“{m,n}”量词的“}”标记关联的特定值。同样,这可能会导致将量词视为非贪婪,这在基本模式下永远不应该发生。要发生这种情况,“}”之前的最后一个设置“nextvalue”的字符必须将其设置为零,或者它必须从一开始就意外地为零。例如,以数字“0”结尾的边界可以重复触发失败。与之前的补丁一样,一直反向移植。https://git.postgresql.org/pg/commitdiff/b5a66e7353ba65c11c5fc6a79b72213bde8dbe44
在正则表达式引擎中引入“彩虹”弧。一些正则表达式构造,尤其是“.”匹配任意字符的元字符,会产生一束平行的 NFA 弧,覆盖所有可能的颜色(即字符等价类)。通过将这些情况替换为带有特殊颜色代码“彩虹”的单个弧,我们可以显著提高处理大型正则表达式所需的空间和时间。这只需要在 pull() 和 push() 等位置进行少量额外的复杂化处理。pg_reg_getoutarcs() 的调用者现在必须准备好看到一个彩虹弧。对于唯一已知的用户 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 相当廉价,因为我们基本上只需要验证所有弧都是彩虹弧,并计算到结束状态的步数。(好吧,对于字符串边界条件的伪颜色弧,有一些复杂性,但不多。)一旦我们有了这些标记,正则表达式执行器函数 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
修复正则表达式引擎以抑制无用的连接子正则表达式。parsebranch() 的注释声称它避免在“子正则表达式”树中生成不必要的连接节点,但它遗漏了一些重要的情况。一旦我们确定给定的原子是“混乱的”,并且不能与当前正则表达式分支的前一个原子(或多个原子)捆绑在一起,parseqatom() 总是会生成两个新的连接节点,一个将混乱的原子连接到分支中的后续内容,另一个是上层节点,用于将分支的前一部分连接到该节点。但是,如果混乱的原子是分支中的第一个、最后一个或唯一一个原子,则其中一个或两个节点可能是多余的。改进代码以抑制此类无用的连接节点,以及表示分支空块的无操作子节点。减少子正则表达式树节点的数量不仅在执行期间提供了显着的节省,而且在编译期间也提供了显着的节省,因为每个子正则表达式节点都有其自己的 NFA,必须单独优化。(也许有一天我们会弄清楚如何跨多个树节点共享优化工作,但这看起来并不容易。)消除上层树节点尤其有用,因为它们往往具有更大的 NFA。这是一个补丁系列的一部分,该系列总共将大型真实世界正则表达式语料库的正则表达式引擎运行时减少了大约四倍。补丁由我编写,由 Joel Jacobson 审核。讨论:https://postgr.es/m/1340281.1613018383@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/cebc1d34e5207c37871708f91be65dd839760b5f
将正则表达式引擎的子正则表达式树从二叉样式转换为 N 元样式。子正则表达式结构中不再有左右子链接,而是只有一个子链接加上一个兄弟链接。现在通过追踪兄弟链到达树节点的多个子节点。此功能的受益者是交替树节点。具有 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
避免为捕获括号生成额外的子正则表达式树节点。以前,每对捕获括号都会产生一个单独的子正则表达式树节点,其唯一功能是识别我们应该捕获此特定子表达式的匹配详细信息。在大多数情况下,我们并不真的需要这样做,因为我们可以很好地在执行实际匹配工作的子节点上放置一个“捕获此项”注释。与前面两次提交一样,此操作的主要价值在于避免为实际上没有发挥作用的树节点生成和优化 NFA。选择的数据表示形式每个子正则表达式节点只允许一个捕获注释。在符合规范但看起来不是很常见的、在正则表达式的同一位周围有多个捕获括号的情况(例如“((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() 可能会导致内存中出现越界写入,因为存储结果摘要的目标缓冲区的大小对于 cryptohash 内部是未知的,而调用者对此一无所知。此提交向 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 已经能够处理它。这为支持此语法的其余命令添加了制表符补全:- 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 的不一致配置数据。在自动重新配置后会出现这种不一致。报告人: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 推送了此更改。
修复提交 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) 就存在,但最近的提交 ce0fdbfe97 暴露了它,该提交中我们在 tablesync 工作器中使用 origin。问题在于,我们有时会发送 prepare_write ('w') 消息,但随后实际消息却没有发送,而在订阅端,我们总是期望在 prepare_write 消息之后收到一条消息,这导致了这个 bug。我没有进行回溯修复,因为在提交 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 页面视为常规的槽页面。这是提交 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() 函数保持一致。这是对添加了 GiST 函数的提交 756ab291 的一个小小的后续改进。作者: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 中的页面回收是该论文中所谓的“排水技术”的实现。这种解耦对于 nbtree VACUUM 来说是一个重要概念。搜索器必须检测并从并发页面删除中恢复,但它们永远不必考虑并发页面回收。回收几乎总是可以被认为是一种低级的垃圾回收操作,它异步释放支持逻辑树节点的物理空间。几乎所有代码只需要关心逻辑树节点。(请注意,“逻辑树节点”目前在 nbtree 代码中不是一个术语——所有这些都是隐式工作的。)这是为即将到来的一个补丁做准备,该补丁将教会 nbtree VACUUM 记住它在运行时删除的页面的详细信息,这些信息保存在本地内存中。这使得同一个 VACUUM 操作可以在稍后到达 btvacuumscan() 的末尾时,考虑将其自身删除的页面放置在 FSM 中。https://git.postgresql.org/pg/commitdiff/b071a311495bbf42ddf2466a556d033df8f0f5e7
藤井正雄推送
在 pg_locks 中显示进程开始等待锁的时间,版本 2。此提交向 pg_locks 视图添加了新列 "waitstart"。如果锁未被持有,则此列报告服务器进程开始等待锁的时间。例如,通过从当前时间减去 pg_locks 中的 "waitstart" 来检查等待锁的时间长度,并识别进程等待时间很长的锁,此信息非常有用。此功能使用为死锁超时计时器获取的当前时间作为 "waitstart"(即,此进程开始等待锁的时间)。由于新获取当前时间可能会导致开销,我们重用已经获取的时间以避免该开销。请注意,在不持有锁表的 partition 锁的情况下更新 "waitstart",以避免因额外的锁获取而产生的开销。这可能会导致在等待开始后的一小段时间内,即使 "granted" 为 false,pg_locks 中的 "waitstart" 也变为 NULL。这在实践中是可以接受的,因为我们可以假设用户可能会在等待锁很长时间时查看 "waitstart"。此补丁的第一次尝试(提交 3b733fcd04)导致 buildfarm 成员 "rorqual"(使用 --disable-atomics --disable-spinlocks 构建)报告回归测试失败。它被提交 890d2182a2 回滚。此失败的原因是,在准备事务结束时创建的虚拟进程条目中,"waitstart" 的原子变量未初始化。第二次尝试修复了这个问题。版本目录更新。作者:鸟越 淳 审核者:Ian Lawrence Barwick、Robert Haas、Justin Pryzby、藤井正雄 讨论:https://postgr.es/m/a96013dc51cdc56b2a2b84fa8a16a993@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/46d6e5f567906389c31c4fb3a2653da1885c18ee
修复 pg_stat_wal_receiver 中的 "invalid spinlock number: 0" 错误。提交 2c8dd05d6c 将 atomic 变量 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 不应用于数据完整性检查。回溯修复到提交 2c8dd05d6c 引入此 bug 的 v13。作者:藤井正雄 审核者: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 命令中的 bug。此提交修复了 COMMIT AND CHAIN 命令,使其即使在要提交的事务中定义了保存点,也立即启动新事务。之前,COMMIT AND CHAIN 命令在这种情况下不会这样做,因为提交 280a408b48 忘记了在事务状态为 TBLOCK_SUBCOMMIT 时使 CommitTransactionCommand() 处理事务链接。此外,此提交还添加了在定义保存点时针对 COMMIT AND CHAIN 命令的回归测试。回溯修复到添加事务链接的 v12。报告者:Arthur Nascimento 作者:藤井正雄 审核者: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 审核者:藤井正雄、Vik Fearing 讨论:https://postgr.es/m/16867-3475744069228158@postgresql.org https://git.postgresql.org/pg/commitdiff/fe06819f105ccea52c12d418c8dbaaaa54377e96
Heikki Linnakangas 推送
Andres Freund 推送
移除 snapbuild.c 中的向后兼容的冗余代码。在 955a684e040 中,我们修复了初始快照创建中的一个 bug。在此过程中,struct 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) 以及 name 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 标签 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 ..) 实现中的一些死代码。
Masahiro Ikeda 提交了另一个补丁修订版,以添加与写入/同步 WAL 记录相关的统计信息,并使 WAL 接收器报告 WAL 统计信息。
Michaël Paquier 提交了另一个补丁修订版,以重构 HMAC 实现。
Daniel Gustafsson 提交了另一个补丁修订版,以支持在运行中的集群中启用/禁用校验和。
Tomáš Vondra 提交了另一个补丁修订版,以实现 BRIN 多范围索引。
Peter Eisentraut 提交了另一个补丁修订版,通过增强错误消息“每个哈希分区模数必须是下一个较大模数的因子”并显示所涉及的特定数字的详细消息,来改进新的哈希分区边界检查错误消息。
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 提交了另外两个补丁修订版,以使用完整的 64 位 XID 进行 nbtree 页面删除,回收在同一 VACUUM 期间删除的页面,并在 VACUUM VERBOSE 输出中显示“新删除的页面”。
Amit Langote 提交了另外两个补丁修订版,以确保在外部分区表上创建外键触发器,并在跨分区更新期间正确强制执行外键约束。
Greg Nancarrow 和 Amit Langote 交换了补丁,使并行执行 INSERT ... SELECT ... 成为可能。
Seamus Abshere 和 Amit Langote 交换了补丁,以允许在分区表上设置 parallel_workers。
Michaël Paquier 提交了一个补丁,用于为没有存储的关系添加 no_storage、回退表 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 范围扫描,以支持对 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 的用户执行直接删除,添加结果缓存执行程序节点,并删除 nodeResultCache.c 中的一些代码重复。
Justin Pryzby 和 Dilip Kumar 交换了补丁,以添加自定义表压缩方法。
Takashi Menjo 提交了另一个补丁修订版,以使可以使用持久内存进行 WAL 操作。
Mark Dilger 提交了另一个补丁修订版,以添加 heapcheck contrib 扩展。
Thomas Munro 提交了另外两个补丁修订版,通过修复排序规则提供程序的处理方式,来修复表现为 pg_collation_actual_version() ERROR 的错误:排序规则 123 的缓存查找失败。
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 (boolean default false) 和新的表选项 parallel_dml_enabled (boolean default true)。每个都按它们所说的执行。
Thomas Munro 提交了一个补丁,用于添加 sort_template.h 以制作快速排序函数。
Amit Langote 提交了一个补丁,以允许在跨分区更新期间进行插入批处理。
Daniel Gustafsson 提交了一个补丁,以禁止使用 SSL 压缩,理由是它使密码分析攻击更容易发起。
Peter Eisentraut 提交了另一个补丁修订版,通过添加 LSN_FORMAT_ARGS 宏用于 LSN 的 printf 样式打印,来简化 LSN 的打印。
Konstantin Knizhnik 提交了另一个补丁修订版,以修复存储过程和对 TOAST 数据的访问之间的不协调问题。
Jan Wieck 提交了一个补丁,用于添加有线协议挂钩和示例实现 telnet。
Guillaume Lelarge 提交了另一个补丁修订版,以向 pg_dump 添加 --extension (-e) 选项,该选项指定要转储的扩展。可以使用 0 次或多次。
Nathan Bossart 提交了另一个补丁修订版,以避免过早创建存档状态“.ready”文件,并通过崩溃跟踪已通知的准备好存档位置。
Nathan Bossart 发送了补丁的另一个修订版本,以阐明当“role”设置为每个用户、每个数据库或通过命令行选项设置时的 RESET 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 禁止状态,在 WAL 写入的 START_CRIT_SECTION 之前进行错误或断言,并通过 README 文档记录这些对 transam 和页面的影响。
Georgios Kokolatos 发送了补丁的另一个修订版本,使 dbsize 更加一致。
Denis Smirnov 发送了补丁的另外两个修订版本,通过允许可变大小的块来使分析 AM 更加灵活。
Paul Guo 发送了补丁的两个修订版本,以在 CTAS 期间冻结元组,这可以避免不必要的 vacuum 操作。
Andy Fan 发送了补丁的另外两个修订版本,将一些静态函数设为 extern,并扩展 ChangeVarNodes,使其可以更改 var->attno,并构建一些隐含的修剪限定词,以扩展计划时分区修剪和初始化分区修剪的用例。
Marcus Wanner 发送了补丁的两个修订版本,以将空准备(prepares)呈现给输出插件。
Ajin Cherian 和 Marcus Wanner 交换了补丁,以在逻辑解码中保留 PREPARE 与 COMMIT 的顺序。
Andrew Dunstan 发送了补丁的另一个修订版本,通过让 make 文件和 msvc 构建系统创建一个众所周知的文件,其中包含如果发生错误要搜索的日志文件位置,来帮助跟踪 cfbot 失败。
Andy Fan 发送了一个补丁,以在 RelOptInfo 中引入 notnullattrs 字段,以指示当前查询中哪些属性不为空,并添加具有 EquivalenceClass 的 UniqueKey,仅针对单个 rel。
Thomas Munro 根据 Andrew Gierth 的建议发送了一个补丁,以删除 effective_io_concurrency 描述中对 spindles 的过时引用。
Bharath Rupireddy 发送了一个补丁,以一次更新多个进度参数。
Vik Fearing 发送了补丁的两个修订版本,以根据标准实现 GROUP BY DISTINCT。
Vik Fearing 发送了一个补丁,向 pg_config 添加目录版本,以及一个新的 catalog_version guc,可以从 SQL 访问。