PGConf NYC 将于 2021 年 12 月 3-4 日举行。论文征集(CfP)现已开放,赞助机会也同样开放。
Pgpool-II 4.2.4、4.1.8、4.0.15、3.7.20 和 3.6.27 发布,这是一个 PostgreSQL 的连接池和语句复制系统。已发布
pgmoneta 0.4.0 发布,这是一个 PostgreSQL 的备份和恢复系统。已发布
Buildfarm 13.1 软件发布,这是一个 PostgreSQL 项目的持续集成系统。已发布
dbForge Schema Compare 1.2 for PostgreSQL 发布。已发布
pg_timetable 4.0.0 发布,这是一个 PostgreSQL 的作业调度器。https://github.com/cybertec-postgresql/pg_timetable/releases
https://archives.postgresql.org/pgsql-jobs/2021-08/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Amit Kapila 提交
修复 021_twophase.pl 中的测试失败。该测试预期有两个事务对应两个订阅,但它等待只捕获一个订阅的进度。通过允许等待两个订阅来修复。报告者:Michael Paquier,根据 buildfarm 作者:Ajin Cherian 审阅者:Amit Kapila, Vignesh C, Peter Smith 讨论:https://postgr.es/m/CAA4eK1+_0iNQ8Z=KVTjmmAqNX-hyv+1+fnZ-Yx8CVP=uAcekqw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/eaf5321c352478266cebe2aa50ea4c34a8fdd2c7
为逻辑复制中的流式事务添加 prepare API 支持。提交 a8fd13cab0 通过订阅的新选项“two_phase”增加了对内置逻辑复制的预备事务的支持。“two_phase”选项不允许与现有的流式选项一起使用。此提交允许组合“streaming”和“two_phase”订阅选项。它扩展了 pgoutput 插件和订阅端代码,为流式事务添加了 prepare API,该 API 将在 prepare 时应用 spool 文件中累积的更改。作者:Peter Smith 和 Ajin Cherian 审阅者:Vignesh C, Amit Kapila, Greg Nancarrow 测试者:Haiying Tang 讨论:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru 讨论:https://postgr.es/m/CAMGcDxeqEpWj3fTXwqhSwBdXd2RS9jzwWscO-XbeCfso6ts3+Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/63cf61cdeb7b0450dcf3b2f719c553177bac85a2
Etsuro Fujita 推送
修复提交 1ec7fca8592178281cd5cdada0f27a340fb813fc 中的疏忽。我未能考虑到当 ExecAppendAsyncEventWait() 使用 postgres_fdw 通知多个异步就绪节点时,一个前置节点可能会调用 process_pending_request() 来处理后续节点提出的待处理异步请求。在这种情况下,后续节点应从 process_pending_request() 检索的元组中生成一个元组,返回给父 Append 节点。通过 process_pending_request() 检索元组来修复。根据 buildfarm,来自 Michael Paquier。回溯到 v14,与前一个提交相同。感谢 Tom Lane 的测试。讨论:https://postgr.es/m/YQP0UPT8KmPiHTMs%40paquier.xyz https://git.postgresql.org/pg/commitdiff/a8ed9bd59d48c13da50ed2358911721b2baf1de3
postgres_fdw: 修复外表中的生成列问题。postgres_fdw 将远程表中的生成列导入为普通列,在插入外表时导致“ERROR: cannot insert a non-DEFAULT value into column "foo””之类的失败,因为它试图将值插入到生成列中。为了修复,我们假定 postgres_fdw 外表中的生成列定义为代表底层远程表中的生成列,并执行以下操作:* 在插入或更新时,将 DEFAULT 发送到远程服务器,而不是本地服务器计算的生成列值。
Andres Freund 提交
从 AuxiliaryProcessMain() 中移除错放的注释。自 626eb021988 起,该注释不再有意义。由于它实际上并未解释任何内容,因此将其移除。作者:Andres Freund andres@anarazel.de https://git.postgresql.org/pg/commitdiff/8b1de88b7ce9fe0458d3950121a797fd3d988f6c
pgstat: 分离 bgwriter 和 checkpointer 统计信息的报告/获取。自 806a2aee379 将 bgwriter 和 checkpointer 分为两个进程以来,它们一直不相关。由于有几个待处理的补丁(共享内存统计信息、扩展跟踪的 IO/缓冲区统计信息集)因分组而变得有些麻烦,因此将它们分开。单独完成以便于审查。这*不*会改变 pg_stat_bgwriter 的内容,也不会将字段移出 bgwriter/checkpointer 统计信息(这些字段名义上不属于其中任何一个)。但是,pgstat_fetch_global() 已重命名并拆分为 pgstat_fetch_stat_checkpointer() 和 pgstat_fetch_stat_bgwriter()。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1bc8e7b0991c1eae5fa6dc2d29bb2280efb52740
pgbench: 使用流水线时仅在必要时调用 PQconsumeInput()。到目前为止,我们为每个流水线查询都调用 PQconsumeInput(),向操作系统请求更多输入——而操作系统通常没有更多输入,因为所有结果可能已经发送。这会对性能产生明显影响。Alvaro Herrera 审阅了添加 PQisBusy() 检查的想法,但没有审阅此具体补丁。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210720180039.23rivhdft3l4mayn@alap3.anarazel.de 回溯:14,引入了 libpq/pgbench 流水线。 https://git.postgresql.org/pg/commitdiff/87bff68840d542011ed8f60427502fb90fdf2873
进程启动:将 postmaster 的 --forkboot 重命名为 --forkaux。辅助进程使用 --forkboot 启动令人困惑,因为引导模式无法在 postmaster 以下运行。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/50017f77722b8b998ead5ca6fdb0b821fe7a34d2
进程启动:将 BootstrapModeMain 与 AuxiliaryProcessMain 分离。一旦移除了所有 if 语句,两者之间几乎没有共享代码。而且,在 main() 中调用 AuxiliaryProcessMain() 启动辅助进程的事实是令人困惑的。还有更多工作要做,AuxiliaryProcessMain() 应该从 bootstrap.c 中移出,而 BootstrapModeMain() 不应该使用/属于 AuxProcType。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/5aa4a9d2077fa902b4041245805082fec6be0648
进程启动:auxprocess:重新缩进块。保持独立以便于审查,特别是由于 pgindent 坚持重新排版一些注释。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/27f790346621e1db3cc0305e7ae2b2cbfb537aa6
进程启动:将 AuxiliaryProcessMain 移至其自己的文件。在前面的提交之后,auxprocess 代码已与 bootstrap.c 独立 - 因此一个专用文件似乎不那么令人困惑。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/0a692109dcc73178962069addf7478ac89950e4d
进程启动:从 AuxProcType 中移除 bootstrap / checker 模式。两者实际上并未作为辅助进程初始化,因此为它们保留 PGPROC 等没有太大意义。这使得 checker 模式通过在 bootstrap 模式中途退出来实现。这可能值得以后更改,也许如果我们将来将 checker 模式扩展为一个更通用的工具。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/f8dd4ecb0b7fc3420e199021375e622815cd326f
进程启动:集中调用 pgwin32_signal_initialize()。首先,现有位置导致 main() 中出现一些尴尬的代码。其次,新的位置更容易理解。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 审阅者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/07bf37850991c68a7038fb06186bddfd64c72faf
也在 postmaster 中调用 pgwin32_signal_initialize()。这是 07bf3785099 中的一个疏忽。虽然这减少了该提交的简化带来的好处,但我认为它仍然有益。似乎最好在 miscinit.c 中有一个函数来镜像 InitPostmasterChild() / InitStandaloneProcess(),以便更容易地在三种可能的环境中保持初始化同步。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210805214109.lzfk3r3ae37bahmv@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/0de13bbc47d19c95de132cc85c341fdab079c170
进程启动:总是在 BaseInit() 之前调用 Init[Auxiliary]Process()。对于 EXEC_BACKEND,InitProcess()/InitAuxiliaryProcess() 必须在调用 BaseInit() 之前很久就完成,因为 SubPostmasterMain() 需要 LWLocks 才能工作。初始化顺序在不同平台上的差异使得理解系统和添加新子系统的初始化点变得不必要地困难,并且需要大量的重复工作。为了能够更改顺序,BaseInit() 不能再触发 CreateSharedMemoryAndSemaphores()——显然,这需要在调用 InitProcess() 之前完成。在单用户/引导模式下显式创建共享内存似乎更干净。在此更改之后,将 bufmgr 初始化分离到 InitBufferPoolAccess() / InitBufferPoolBackend() 不再有意义,因此后者已被移除。作者:Andres Freund andres@anarazel.de 审阅者:Kyotaro Horiguchi horikyota.ntt@gmail.com 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/b406478b87e2234c0be4ca4105eee3bb466a646b
pgstat:在 BaseInit() 中启动 pgstat 以修复 AV 对 pgstat 的未初始化使用。以前 pgstat_initialize() 在 InitPostgres() 和 AuxiliaryProcessMain() 中被调用。事实证明,至少有一个案例是在调用 pgstat_initialize() 之前报告统计信息的,请参阅 AutoVacWorkerMain() 中有意提前调用的 pgstat_report_autovac()。这对于当前的 pgstat 实现来说不是问题,因为 pgstat_initialize() 只注册一个 shutdown 回调。但是,在我们正在开发的基于共享内存的统计信息实现中,pgstat_initialize() 需要做更多的工作。在 b406478b87e 之后,BaseInit() 是一个中心位置,可以在其中放置普通后端和辅助后端共有的初始化。显然,BaseInit() 在 InitPostgres() 注册 ShutdownPostgres 之前被调用。以前 ShutdownPostgres 是第一个 before_shmem_exit 回调,现在通常是 pgstats。这应该没问题。以前 pgstat_initialize() 在引导模式下没有被调用,但似乎没有必要。现在无条件执行。为了检测此类未来的问题,在几个地方添加了断言,以验证 pgstat 子系统已初始化且尚未关闭。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/ee3f8d3d3aec0d7c961d6b398d31504bb272a450
通过 before_shmem_exit() 完成并行工作进程的关闭。这是向动态共享内存中存储统计信息的步骤。由于动态共享内存段在 before_shmem_exit() 回调处理完毕后,但在 on_shmem_exit() 回调之前被分离,因此在 before_shmem_exit() 回调处理完毕后无法收集任何统计信息。并行工作进程的关闭可能会在 DSM 分离回调期间发出统计信息,例如 SharedFileSet(它会关闭文件,这可能导致 fd.c 发出临时文件统计信息)。因此,并行工作进程的关闭需要在 before_shmem_exit() 回调处理期间完成。有人可能会认为可以通过仔细排序 DSM 段的附加操作来解决这个问题,以便 pgstats 段的附加时间晚于并行查询段。事实证明这行不通,因为统计信息哈希表可能需要增长,这可能导致分配新的段,然后这些段的附加时间会更早。这里有两个代码更改:首先,通过 before_shmem_exit() 调用 ParallelWorkerShutdown()。这本身就是一个好主意,因为其他关闭回调,如 ShutdownPostgres 和 ShutdownAuxiliaryProcess,都是通过 before_* 调用的。其次,显式附加到并行查询 DSM 段,从而确保所有统计信息都在 ParallelWorkerShutdown() 期间发出。这些问题的更简洁的解决方案是存在的,但尚不清楚哪种解决方案是正确的。鉴于共享内存统计信息工作量已经很大……作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 讨论:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/fa91d4c91f28f4819dc54f93adbd413a685e366a
在单用户模式下使用 before_shmem_exit() 调度 ShutdownXLOG()。以前使用 on_shmem_exit()。即将到来的共享内存统计信息补丁使用 DSM 段来存储统计信息,这些统计信息在 shmem_exit() 中的 dsm_backend_shutdown() 调用之后就不能使用了。似乎没有理由通过 on_shmem_exit() 调用 ShutdownXLOG(),因此进行更改。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 讨论:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/a1bb3d5dbe6a66ae73d7805a63b951793b5d55df
pgstat:通过 before_shmem_exit() 调度每个后端 pgstat 的关闭。以前使用 on_shmem_exit()。即将到来的共享内存统计信息补丁使用 DSM 段来存储统计信息,这些统计信息在 shmem_exit() 中的 dsm_backend_shutdown() 调用之后就不能使用了。前面的提交是允许此更改所必需的。此提交已从共享内存统计信息补丁中分离出来,以便更容易地隔离由顺序更改引起的问题,而不是由存储统计信息位置的大量更改引起的问题。作者:Andres Freund andres@anarazel.de 作者:Kyotaro Horiguchi horikyota.ntt@gmail.com 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 讨论:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de 讨论:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/fb2c5028e63589c01fbdf8b031be824766dc7a68
将临时文件清理移至 before_shmem_exit()。正如一些 OSX buildfarm 动物报告的那样,至少存在一个路径,在 AtProcExit_Files() 处理期间存在临时文件。由于临时文件清理会导致 pgstat 报告,ee3f8d3d3ae 中添加的断言导致了失败。这不是 OSX 特有的问题,只是我们运气好,OSX 的时序可靠地触发了这个问题。已知导致此问题的方法是在 perform_base_backup() 期间发生 FATAL 错误,并使用 MANIFEST——在 InitializeBackupManifest() 之后添加 elog(FATAL) 可以可靠地独立重现该问题。问题在于 InitializeBackupManifest() 中创建的临时文件不会通过资源所有者清理来清理,因为 WalSndResourceCleanup() 目前仅用于非 FATAL 错误。这允许到达 AtProcExit_Files() 并存在临时文件,导致断言失败。为了解决这个问题,将临时文件清理移至 before_shmem_exit() 钩子,并添加断言以确保在临时文件管理已初始化/已关闭之前/之后不创建临时文件。最干净的方法似乎是将 fd.c 初始化分为两部分,一部分用于普通文件访问,另一部分用于临时文件访问。目前,在进程退出期间不需要执行其他 fd.c 清理,所以我只是将 AtProcExit_Files() 重命名为 BeforeShmemExit_Files()。或者,我们可以再次遍历文件以检查是否存在临时文件,但添加的断言似乎提供了足够的保护。 ee3f8d3d3ae 中添加的断言可能会产生过多的噪音——在这种情况下,我们将不得不将其降级为 WARNING,至少暂时是这样。此提交不一定是解决此问题的最佳方法,但它应该可以解决 buildfarm 的失败。我们可以稍后修改。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210807190131.2bm24acbebl4wl6i@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/675c945394b36c2db0e8c8c9f6209c131ce3f0a8
Thomas Munro 推送
在崩溃恢复中运行 checkpointer 和 bgwriter。在崩溃恢复期间(--single 模式除外)启动 checkpointer 和 bgwriter,就像我们为复制所做的那样。这在 cdd46c76 提交时由于谨慎而未进行。现在,使这两种情况下的环境尽可能相似似乎是更好的主意。还可能有某些性能优势。审阅者:Robert Haas robertmhaas@gmail.com 审阅者:Aleksander Alekseev aleksander@timescale.com 测试者:Jakub Wartak Jakub.Wartak@tomtom.com 讨论:https://postgr.es/m/CA%2BhUKGJ8NRsqgkZEnsnRc2MFROBV-jCnacbYvtpptK2A9YYp9Q%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/7ff23c6d277d1d90478a51f0dd81414d343f3850
进一步简化 StartupXLOG() 中的一些逻辑。提交 7ff23c6d277d1d90478a51f0dd81414d343f3850 留下了两个相同的案例。将它们折叠。作者:Robert Haas robertmhaas@gmail.com 讨论:https://postgr.es/m/CA%2BhUKGJ8NRsqgkZEnsnRc2MFROBV-jCnacbYvtpptK2A9YYp9Q%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/8f7c8e2bef2bd2587e5d66dd20de15f3db0a6bcb
Tom Lane 提交
文档:对逻辑复制协议文档进行一些小改进。在适当的地方,用后端代码的数据类型名称(例如 XLogRecPtr 或 TimestampTz)注解消息字段数据类型。以前我们只说了“Int64”,信息量不够。还澄清了对对象 OID 的引用,并使用现有约定来表示必须具有固定值的字段的值。Vignesh C,由 Peter Smith 和 Euler Taveira 审阅。讨论:https://postgr.es/m/CALDaNm0+fatx57KFcBopUZWQpH_tz3WKKfm-_eiTwcXui5BnhQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a5cb4f9829fbfd68655543d2d371a18a8eb43b84
添加各种新的 regexp_xxx SQL 函数。此补丁添加了新的函数 regexp_count()、regexp_instr()、regexp_like() 和 regexp_substr(),并扩展了 regexp_replace() 添加了一些新的可选参数。所有这些函数都遵循 Oracle 中使用的定义,尽管由于使用了我们自己的正则表达式引擎,正则表达式语言存在一些细微差别——最值得注意的是,默认的换行匹配行为不同。DB2 等其他数据库中也存在类似的函数。除了简化移植之外,这些函数对于某些任务比我们现有的 regexp_match[es] 函数更容易使用。Gilles Darold,由我大幅修改 讨论:https://postgr.es/m/fc160ee0-c843-b024-29bb-97b5da61971f@darold.net https://git.postgresql.org/pg/commitdiff/6424337073589476303b10f6d7cc74f501b8d9d7
不要省略转换为 typmod -1。将已经是具有特定 typmod 的类型的值强制转换为未指定 typmod 对运行时行为没有影响。但是,它应该改变表达式的暴露类型以匹配。到目前为止,coerce_type_typmod 没有处理这个问题,这会在递归联合等上下文中产生陷阱。例如,如果联合的一侧是 numeric(18,3),但需要 plain numeric 才能匹配另一侧,则没有直接的方法可以表达这一点。这很容易修复,通过插入 RelabelType 来更新表达式的暴露类型。然而,改变这种行为会让人有些紧张,因为它已经存在很长时间了。(我强烈怀疑部分原因是逻辑早于 7.0 中引入 RelabelType。这里阅读 57b30e8e2 的提交日志消息很有趣。)作为折衷,我们将把更改偷偷塞进 14beta3,并在未来三个月内没有抱怨的情况下考虑回溯到稳定分支。讨论:https://postgr.es/m/CABNQVagu3bZGqiTjb31a8D5Od3fUMs7Oh3gmZMQZVHZ=uWWWfQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5c056b0c2519e602c2e98bace5b16d2ecde6454b
真正修复 REFRESH MATERIALIZED VIEW CONCURRENTLY 中的歧义。不是试图选择不会与任何用户定义的 matview 列名冲突的表别名,而是调整查询的语法,使别名仅用于不能被误认为是列名的地方。这主要包括编写"alias.*"而不是简单的“alias”,这增加了人类和机器的可读性。我们确实遇到了"SELECT alias.*"的行为与“SELECT alias”不同的问题,但我们可以使用 hack 规则 utils.c 为 SELECT 列表中的整行变量使用的相同规则:编写"alias.*::compositetype"。既然如此,我们不妨恢复原始别名;它们更容易阅读。与 75d66d10e 相同,回溯到所有受支持的分支。讨论:https://postgr.es/m/2488325.1628261320@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9179a82d7af38112cd0f6e84ab62d0b3592a6e0e
使正则表达式引擎的后向引用相关的编译状态更加健壮。到目前为止,我们通过存储指向关联的 subRE 节点的指针来记住捕获括号子表达式的定义。以前这还可以,因为在解析正则表达式的其余部分时,该 subRE 不再被修改。然而,在提交 ea1268f63 之后,情况不再如此:parseqatom() 的外部调用可以随意修改该 subRE。这似乎仍然有效,因为我们在“准备一个通用的状态骨架”段中塞入子节点的状态与子节点的原始端点在语义上没有真正区别。但这很容易被打破,而且绝对不是以前的工作方式。鉴于此以及前一个提交修复的问题,最好完全摆脱对 subRE 节点的依赖。我们不需要为将来的后向引用存储整个子 subRE,只需要它的开始和结束 NFA 状态;所以我们只存储指向它们的指针。另外,在创建额外的 subRE 来处理立即嵌套的捕获括号的边缘情况下,似乎应该让额外的 subRE 具有与原始子 subRE 相同的开始/结束状态(s/s2 不等于 lp/rp)。我认为从 lp 到 rp 的链接实际上在语义上是错误的,但由于 Spencer 的原始代码就是这样做的,所以我不能完全确定。使用 s/s2 肯定没错。根据 Mark Dilger 的报告。回溯到 v14,问题补丁在此期间进入。讨论:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/cb76fbd7ec87e44b3c53165d68dc2747f7e26a9a
修复正则表达式引擎中的使用后释放问题。提交 cebc1d34e 教会了 parseqatom() 通过去除多余的 subRE 节点来优化仅包含一个“混乱”原子分支的情况。我们实际上应该这样做的是保留为“混乱”子原子构建的 subRE;但为了避免更改 parseqatom 的名义 API,我让它在将字段复制到 parsebranch() 创建的外部 subRE 后删除该节点。似乎当时确实奏效了;但在 ea1268f63 之后变得危险,因为该后续提交允许 parse 的较低调用返回一个也被 v->subs[] 条目指向的 subRE。这意味着我们可能会在 v->subs[] 中出现悬空指针,导致后续的后向引用行为异常,但前提是该 subRE 结构在此期间被重用。因此,损害似乎仅限于像 '((...))...(...\2' 这样的情况。为了修复,我应该做的就是做我以前应该做的,并修改 parseqatom 的 API,使其能够删除调用者而不是被调用者的 subRE。这更安全,因为我们知道该 subRE 尚未完成,因此没有其他地方会指向它。根据 Mark Dilger 的报告。回溯到 v14,问题补丁在此期间进入。讨论:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/cc1868799c8311ed1cc3674df2c5e1374c914deb
重新考虑正则表达式引擎的后向引用相关编译状态。在推送 cb76fbd7e 后不久,我几乎立即感到后悔,发现移除捕获子表达式的 subREs 的数据结构破坏了我为 REG_NOSUB 优化提出的补丁。撤销该数据结构更改。相反,通过不更改捕获子表达式的端点来解决不更改捕获子表达式的端点的问题。我们不需要这样做,因为那一点的目的是确保原子具有与我们将分支连接的外部状态对不同的端点。在括号子表达式的情况下,我们已经创建了合适的端点,因此额外的端点只是无用的开销。这似乎比 Spencer 的原始代码更容易理解,并且通过节省一些状态创建和弧更改,它应该会稍微快一点。(我实际上在 Jacobson 的 Web 语料库上看到了百分之几的改进,但这勉强高于噪声地板,所以我不会太看重这个结果。)另外,修复 ea1268f63 添加的逻辑,以确保 v->subs[subno] 中记录的 subRE 正是 capno == subno 的那个。Spencer 的原始代码记录了捕获节点的子 subRE,这在拥有正确的端点状态方面还可以,但从 cb76fbd7e 开始,捕获 subRE 本身也总是具有这些端点。我认为这种不一致性对于 REG_NOSUB 优化来说是令人困惑的。与以前一样,回溯到 v14。讨论:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/00116dee5ad4c1964777c91e687bb98b1d9f7ea0
文档:移除错误的 <indexterm> 项。显然,在 665c5855e 中复制粘贴的。9.6 的文档工具链抱怨重复的索引条目,尽管我们现代的工具链不抱怨。无论如何,这些 GUC 肯定不是关于这些值默认设置的。 https://git.postgresql.org/pg/commitdiff/cf5ce5aa70d33fc3048ab63c50585b8cc0f11dfd
David Rowley 提交
在 RelOptInfo 中跟踪一个非剪枝分区的 Bitmapset。对于具有大量分区且查询能够剪枝除少量分区之外的所有分区的分区表,在规划器循环遍历 RelOptInfo.part_rels 检查非 NULL RelOptInfos 时花费的时间可能占总规划时间的很大一部分。在这里,我们添加了一个 Bitmapset 来记录非剪枝分区。这使我们能够通过循环遍历 Bitmapset 更有效地跳过已剪枝的分区。这会导致在未剪枝或未剪枝分区很少的情况下,规划时间会略微减慢,但这些情况的规划时间已经很慢,而且与创建大量分区路径等其他任务相比,Bitmapset 循环的开销将是无法衡量的。审阅者:Amit Langote, Zhihong Yu 讨论:https://postgr.es/m/CAApHDvqnPx6JnUuPwaf5ao38zczrAb9mxt9gj4U1EKFfd4AqLA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/475dbd0b718de8ac44da144f934651b959e3b705
在更多情况下允许有序分区扫描。959d00e9d 增加了使用 Append 节点而不是 MergeAppend 的能力,当我们想要执行分区表的扫描并且所需的排序顺序与分区键相同,并且分区表的定义方式使得较早的分区保证只包含比后续分区小的值时。然而,以前对于 LIST 分区表,当存在允许多个 Datums 的分区时,我们不允许这些有序分区扫描。这是一个非常容易的检查,我们可能还可以通过检查是否存在交错分区来做得更好,但当时我们无法了解哪些分区被剪枝了,因此我们仍然可能不允许所有交错分区被剪枝的情况。自从 475dbd0b7 以来,我们现在了解了被剪枝的分区,我们可以在 partitions_are_ordered() 中做得更好。在这里,我们将通过分区修剪的分区传递给 partitions_are_ordered(),对于 LIST 分区,让它检查是否存在与 PartitionBoundInfo 中定义的新的“interleaved_parts”字段相同的活动分区。对于 RANGE 分区,我们可以放宽导致分区无序的代码(如果存在 DEFAULT 分区)。由于我们现在知道哪些分区被剪枝了,partitions_are_ordered() 在 DEFAULT 分区被剪枝时返回 true。审阅者:Amit Langote, Zhihong Yu 讨论:https://postgr.es/m/CAApHDvrdoN_sXU52i=QDXe2k3WAo=EVry29r2+Tq2WYcn2xhEA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/db632fbca392389807ffb9d9b2207157e8e9b3e8
移除未使用的函数声明。check_track_commit_timestamp 似乎被声明了,但在我们的代码库中从未定义过。这很可能是添加提交时间戳的原始补丁开发版本的残留垃圾。让我们删除这个无用的声明。包含 guc.h 似乎也是多余的。作者:Andrey Lepikhov 讨论:https://postgr.es/m/f49aefb5-edbb-633a-af07-3e777023a94d@postgrespro.ru https://git.postgresql.org/pg/commitdiff/75a2d132eaef7d951db894cf3201f85e9a524774
Bruce Momjian 已推送
文档:添加使用 pg_dump 结合 GNU split 和 gzip 的示例。这仅适用于 GNU split,不适用于 BSD split 等其他版本。报告者:jim@jdoherty.net 讨论:https://postgr.es/m/162653459215.701.6323855956817776386@wrigleys.postgresql.org 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/cfbbb8610d17bc6d82f37a446c38b29e2a5258f4
文档:提及继承的 tableoid 可用于分区。以前,分区文档部分没有提到 tableoid。我们只有一个指向“所有正常的继承规则”部分的链接。报告者:michal.palenik@freemap.sk 讨论:https://postgr.es/m/162627031219.693.11508199541771263335@wrigleys.postgresql.org 回溯至:10 https://git.postgresql.org/pg/commitdiff/691272cae96b3c947d3d2d4d8c43c499e72c65a2
pg_upgrade:改进有关扩展升级的文档。之前的措辞不清楚升级扩展所需的步骤,以及如何在 pg_upgrade 后更新它们。报告者:Dave Cramer 讨论:https://postgr.es/m/CADK3HHKawwbOcGwMGnDuAf3-U8YfvTcS8jqDv3UM=niijs3MMA@mail.gmail.com 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/5090d709f172ecd00b16b6e336c8c149a3f3d33d
pg_upgrade:警告需要更新的扩展。还创建一个可用于更新它们的脚本。报告者:Dave Cramer 讨论:https://postgr.es/m/CADK3HHKawwbOcGwMGnDuAf3-U8YfvTcS8jqDv3UM=niijs3MMA@mail.gmail.com 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/e462856a7a559c94bad51507c6b324f337d8254b
interval:溢出到月份时四舍五入值。以前,大于月份的溢出单位被截断为月份。还记录了溢出行为。报告者:Bryn Llewelly 讨论:https://postgr.es/m/BDAE4B56-3337-45A2-AC8A-30593849D6C0@yugabyte.com 回溯至:master https://git.postgresql.org/pg/commitdiff/95ab1e0a9db321dd796344d526457016eada027f
C 注释:修正扩展查询的标题。报告者:Justin Pryzby 讨论:https://postgr.es/m/20210803161345.GZ12533@telsasoft.com 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/9e51cc87fd0ac46b183cb7302a6751d52d3f159a
Peter Geoghegan 提交
Dean Rasheed 已推送
修复 to_char() 使用 'EEEE' 格式时的除零错误。这修复了一个长期存在的 bug,当使用 to_char() 将数字格式化为科学计数法时——如果该值的指数小于 -NUMERIC_MAX_DISPLAY_SCALE-1 (-1001),它会产生除零错误。此错误的原因是 get_str_from_var_sci() 将其输入除以 10^exp,而 10^exp 是使用 power_var_int() 生成的。但是,power_var_int() 中的下溢测试会导致结果精度太小而返回零。这对于 power_var_int() 的另一个调用者 power_var() 来说不是问题,因为 power_var() 将 rscale 限制为 1000,但在 get_str_from_var_sci() 中,指数可以小得多,需要大得多的 rscale。通过引入一个新函数直接计算 10^exp 来修复,没有 rscale 限制。这还允许更有效地计算 10^exp,而无需进行任何数字乘法、除法或舍入。讨论:https://postgr.es/m/CAEZATCWhojfH4whaqgUKBe8D5jNHB8ytzemL-PnRx+KCTyMXmg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/226ec49ffd78c0f246da8fceb3094991dd2302ff
调整 numeric 代码中的整数溢出测试。以前,numeric 代码通过将较大的类型转换为较小的类型,然后测试反向转换是否产生原始值来测试较大的类型是否适合较小的类型。这完全没问题,但它导致 buildfarm 动物 castoroides 上的测试失败,很可能是由于编译器错误。相反,通过与 PG_INT16/32_MIN/MAX 比较来执行这些测试。这与其它地方现有的代码匹配,例如 int84(),后者经过更广泛的测试,因此不太可能出错。同时,添加了覆盖 numeric 到 int8/4/2 转换的回归测试,并将最近添加的测试调整为 434ddfb79a(在 v11 分支上)的风格,以便更容易诊断失败。根据 buildfarm,来自 Tom Lane,由 Tom Lane 审阅。讨论:https://postgr.es/m/2394813.1628179479%40sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2642df9fac09540c761441edd9bdd0a72c62f39c
Fujii Masao 提交
Peter Eisentraut 提交
修正措辞。 https://git.postgresql.org/pg/commitdiff/05e60aece33e84960ef566e4735b2d93c2d791c8
添加缺失的消息标点。 https://git.postgresql.org/pg/commitdiff/ba4eb86ceff4eded5920d36ef82a2096db7ad0c0
改进消息样式。 https://git.postgresql.org/pg/commitdiff/f4f4a649d80fea3ae0214b06e160eb5d46b48a16
pg_amcheck:添加缺失的翻译标记。 https://git.postgresql.org/pg/commitdiff/789d8060f0517d4da0776480d937d8b64d5c5976
pg_amcheck:改进消息样式。 https://git.postgresql.org/pg/commitdiff/80dfbbf1b17a1fb1123401799efdc660ee977051
移除 T_MemoryContext。这是一个抽象节点,不应定义节点标签。讨论:https://postgres.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/256909c6c1679767230d1088f1bfab727dd99e14
将 NestPath 节点更改为包含 JoinPath 节点。这使得所有 JoinPath 派生节点的结构都相同,而与它们是否具有附加字段无关。讨论:https://postgres.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/18fea737b5e47cc677eaf97365c765a47f346763
将 SeqScan 节点更改为包含 Scan 节点。这使得所有 Scan 派生节点的结构都相同,而与它们是否具有附加字段无关。讨论:https://postgres.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/2226b4189bb4ccfcc53917a8695d24e91ff2f950
在 COPY_POINTER_FIELD 中检查大小,而不是让每个调用者执行此操作。讨论:https://postgres.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/c1132aae336c41cf9d316222e525d8d593c2b5d2
移除一些不必要的格式参数中的转换。我们可以直接使用 %zd 或 %zu,无需转换为 int。反之,一些代码在转换为 int 时丢失了信息,而可以直接使用 %d。 https://git.postgresql.org/pg/commitdiff/ae03a7c7391dfc59f14226b7cfd8ef9f3390e56f