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 项目的持续集成系统,已发布
适用于 PostgreSQL 的 dbForge Schema Compare 1.2 已发布
pg_timetable 4.0.0 发布,这是 PostgreSQL 的作业调度器。https://github.com/cybertec-postgresql/pg_timetable/releases
https://archives.postgresql.org/pgsql-jobs/2021-08/
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
添加对逻辑复制中流式事务的准备 API 支持。提交 a8fd13cab0 通过订阅的新选项“two_phase”为内置逻辑复制添加了对已准备事务的支持。“two_phase”选项不允许与现有的流式选项一起使用。此提交允许组合“streaming”和“two_phase”订阅选项。它扩展了 pgoutput 插件和订阅者端代码,为流式事务添加 prepare API,这将应用在准备时累积在 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 节点。修复。根据 Michael Paquier 通过 buildfarm 提出的问题。与之前的提交一样,向后移植到 v14。感谢 Tom Lane 的测试。讨论:https://postgr.es/m/YQP0UPT8KmPiHTMs%40paquier.xyz https://git.postgresql.org/pg/commitdiff/a8ed9bd59d48c13da50ed2358911721b2baf1de3
postgres_fdw:修复外表中的生成列问题。postgres_fdw 将远程表中的生成列作为普通列导入,并在插入外表时导致诸如“错误:无法将非 DEFAULT 值插入列“foo””之类的失败,因为它试图将值插入到生成列中。为了修复此问题,我们执行以下操作,假设 postgres_fdw 外表中的生成列的定义使其表示底层远程表中的生成列:* 在插入或更新时,向外服务器发送生成列的 DEFAULT,而不是在本地服务器上计算的生成列值。
Andres Freund 推送
从 AuxiliaryProcessMain() 中删除位置错误的注释。自至少 626eb021988 以来,该注释不再有意义。因为它实际上没有解释任何内容,所以只需将其删除。作者:Andres Freund andres@anarazel.de https://git.postgresql.org/pg/commitdiff/8b1de88b7ce9fe0458d3950121a797fd3d988f6c
pgstat:拆分后台写入器和检查点器的统计信息报告/获取。自从后台写入器和检查点器在 806a2aee379 中被拆分为两个进程以来,这些统计信息就不相关了。由于有几个待处理的补丁(共享内存统计信息、扩展跟踪的 IO/缓冲区统计信息集)因分组而变得更加麻烦,因此将它们拆分。单独完成是为了使审查更容易。这不会更改 pg_stat_bgwriter 的内容,也不会将字段移出后台写入器/检查点器统计信息,这些字段可能不属于这两者中的任何一个。但是,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。鉴于引导模式无法在 postmaster 下运行,因此辅助进程使用 --forkboot 启动是令人困惑的。作者: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 中删除引导/检查器模式。两者实际上都没有作为辅助进程初始化,因此为它们保留 PGPROC 等实际上没有意义。这将保持检查器模式通过在引导模式中途退出实现。如果我们将检查器模式扩展为更通用的工具,那么在某个时候可能值得更改。作者: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 中的一个疏忽。虽然它确实减少了由于该提交而带来的简化的好处,但对我来说,它仍然看起来像是胜利。为 postmaster 在 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,我们需要在调用 BaseInit() 之前调用 InitProcess()/InitAuxiliaryProcess(),因为 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() 只是注册了一个关闭回调。但是在我们正在努力实现的基于共享内存的统计信息实现中,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 构建农场动物报告的那样,至少存在一个路径,其中临时文件在 AtProcExit_Files() 处理期间存在。由于临时文件清理会导致 pgstat 报告,因此在 ee3f8d3d3ae 中添加的断言会导致失败。这不是一个特定于 OSX 的问题,我们只是很幸运地发现 OSX 上的时序可靠地触发了该问题。已知导致这种情况的方法是在使用 MANIFEST 的 perform_base_backup() 期间发生 FATAL 错误 - 在 InitializeBackupManifest() 之后添加 elog(FATAL) 可以可靠地单独重现该问题。问题在于在 InitializeBackupManifest() 中创建的临时文件不会通过资源所有者清理来清理,因为 WalSndResourceCleanup() 目前仅用于非 FATAL 错误。这使得可以到达 AtProcExit_Files(),其中存在临时文件,从而导致断言失败。为了解决这个问题,将临时文件清理移至 before_shmem_exit() 挂钩,并添加断言以确保在临时文件管理初始化/关闭之前/之后不会创建任何临时文件。最干净的方法似乎是将 fd.c 初始化分为两个部分,一个用于普通文件访问,另一个用于临时文件访问。目前,在进程退出期间无需执行进一步的 fd.c 清理,因此我只是将 AtProcExit_Files() 重命名为 BeforeShmemExit_Files()。或者,我们可以再次遍历文件以检查是否存在任何临时文件,但是添加的断言似乎提供了足够的保护来防止这种情况。事实证明,在 ee3f8d3d3ae 中添加的断言可能会导致太多的噪音 - 在这种情况下,我们至少必须暂时将它们降级为 WARNING。此提交不一定是解决此问题的最佳方法,但它应该可以解决构建农场失败的问题。我们稍后可以修改。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210807190131.2bm24acbebl4wl6i@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/675c945394b36c2db0e8c8c9f6209c131ce3f0a8
Thomas Munro 推送了
在崩溃恢复中运行检查点程序和后台写入程序。在崩溃恢复期间启动检查点程序和后台写入程序(在 --single 模式下除外),就像我们对复制所做的那样。这在提交 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),但它需要是普通的 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 中的歧义。与其尝试选择不会与任何可能的用户定义物化视图列名冲突的表别名,不如调整查询的语法,使别名仅在不会被误认为是列名的地方使用。这主要包括编写 "alias.*"
而不仅仅是“alias”,这为人和机器都增加了清晰度。我们确实存在 "SELECT alias.*"
的行为与“SELECT alias”不同的问题,但是我们可以使用 ruleutils.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。这更安全,因为我们知道该 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 优化的补丁。恢复该数据结构更改。相反,通过不更改端点来解决有关不更改捕获 subRE 的端点的问题。我们不需要这样做,因为该位的目的是确保原子具有与我们将分支连接之间的外部状态对不同的端点。我们已经在带括号的子表达式的情况下创建了合适的状态,因此额外的状态只是无用的开销。这似乎比 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 RelOptInfo 所花费的时间可能占总计划时间的很大一部分。这里我们添加一个 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 的功能。但是,以前当有任何允许多个 Datums 的分区时,我们不允许对 LIST 分区表进行这些有序分区扫描。这是一个非常廉价的检查,如果存在交错的分区,我们可能会做得更好,但是在当时我们无法看到哪些分区被修剪,因此我们仍然可能不允许所有交错分区都被修剪的情况。自 475dbd0b7 以来,我们现在了解了修剪的分区,因此我们可以在 partitions_are_ordered() 中做得更好。在这里,我们将哪些分区在分区修剪后幸存下来传递给 partitions_are_ordered(),并且对于 LIST 分区,检查是否存在也存在于 PartitionBoundInfo 中定义的新 “interleaved_parts” 字段中的任何活动分区。对于 RANGE 分区,我们可以放松代码,如果存在 DEFAULT 分区,该代码会导致分区无序。由于我们现在知道哪些分区被修剪,因此当 DEFAULT 分区被修剪时,partitions_are_ordered() 现在返回 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 推送
修复使用 'EEEE' 格式的 to_char() 中的除零错误。这修复了一个长期存在的错误,当使用 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() 来说,这不是问题,因为它将 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
调整数值代码中的整数溢出测试。以前,数值代码通过将较大类型的整数值强制转换为较小类型,然后测试反向转换是否产生原始值来测试该值是否适合较小类型。这完全没问题,只是它在 buildfarm 动物 castoroides 上引起了测试失败,这很可能是由于编译器错误造成的。相反,通过与 PG_INT16/32_MIN/MAX 进行比较来执行这些测试。这与 int84() 等其他地方的现有代码相匹配,后者经过了更广泛的测试,因此不太可能出错。同时,添加涵盖数值到 int8/4/2 转换的回归测试,并将最近添加的测试调整为 434ddfb79a(在 v11 分支上)的样式,以便更容易诊断失败。通过 Tom Lane 的 buildfarm,由 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://postgresql.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/256909c6c1679767230d1088f1bfab727dd99e14
将 NestPath 节点更改为包含 JoinPath 节点。这使得所有 JoinPath 派生节点的结构相同,而与其是否具有附加字段无关。讨论:https://postgresql.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/18fea737b5e47cc677eaf97365c765a47f346763
将 SeqScan 节点更改为包含 Scan 节点。这使得所有 Scan 派生节点的结构相同,而与其是否具有附加字段无关。讨论:https://postgresql.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/2226b4189bb4ccfcc53917a8695d24e91ff2f950
在 COPY_POINTER_FIELD 中检查大小,而不是让每个调用者都这样做。讨论:https://postgresql.ac.cn/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/c1132aae336c41cf9d316222e525d8d593c2b5d2
删除格式参数中一些不必要的强制类型转换。我们可以直接使用 %zd 或 %zu,无需强制转换为 int。相反,一些代码在可以使用 %d 时却强制转换成 int。https://git.postgresql.org/pg/commitdiff/ae03a7c7391dfc59f14226b7cfd8ef9f3390e56f