Database Lab 2.2.1 发布,该工具用于快速克隆大型 PostgreSQL 数据库以构建非生产环境: https://gitlab.com/postgres-ai/database-lab/-/releases
dbMigration .NET v13.4 发布,一款数据库迁移和同步工具。 https://fishcodelib.com/DBMigration.htm
Joe 0.9.0 发布,一个 Slack 聊天机器人,可以帮助后端开发人员和 DBA 解决和优化 PostgreSQL 查询。 https://gitlab.com/postgres-ai/joe/-/releases#0.9.0
pgAdmin4 5.0 发布,一个用于 PostgreSQL 的 Web 和本机 GUI 控制中心。 https://www.pgadmin.org/docs/pgadmin4/5.0/release_notes_5_0.html
pgagroal 1.2.0 发布,一个用于 PostgreSQL 的高性能协议原生连接池。 https://agroal.github.io/pgagroal/release/announcement/2021/02/23/pgagroal-1.2.0.html
本周人物: https://postgresql.life/post/takayuki_tsunakawa/
https://archives.postgresql.org/pgsql-jobs/2021-02/
PostgreSQL 星球: https://planet.postgresql.org/
本周 PostgreSQL 每周新闻由 David Fetter 为您带来
请在太平洋标准时间(PST8PDT)周日下午 3:00 前将新闻和公告提交至 david@fetter.org。
Tom Lane 推送了
修复 trgm_regexp.c 中的无效数组访问。08c0d6ad6 中的一个低级错误:我漏了一个需要防止 RAINBOW 弧颜色的地方。值得注意的是,除了 buildfarm 成员 thorntail 之外,没有任何人注意到无效的数组访问。感谢 Noah Misch 在追踪此问题上的帮助。 https://git.postgresql.org/pg/commitdiff/6ee479abfc27a18c37fe77140d16d3ac31f4ac31
稍微简化正则表达式 DFA 的内存管理。Coverity 抱怨 regexec.c 中的函数可能会泄漏 DFA 存储。这是错误的,但是此逻辑足够令人困惑,以至于 Coverity 无法理解它也不足为奇。重写以使其对人类和机器都更易读。 https://git.postgresql.org/pg/commitdiff/190c79884aae540c92f017701726ed69265e2dab
抑制新正则表达式匹配所有检测代码中的编译器警告。gcc 10 足够聪明,可以注意到控制可以使用深度 < 0 到达此 "hasmatch[depth]" 赋值,但不够聪明地知道这需要一个严重损坏的 NFA 图。将 assert() 更改为普通的运行时测试以使其静音。根据 Andres Freund 的报告。讨论: https://postgr.es/m/20210223173437.b3ywijygsy6q42gq@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/3db05e76f92846d4b54d7de251b0875cf1e23aa4
允许在正则表达式括号内使用补码字符类转义符。现在允许在括号表达式中使用补码类转义符 \D、\S、\W。这样做没有任何语义上的困难,但是先前在此处使用的相当简陋的基于宏展开的实现无法处理。此外,发明“word”作为允许的字符类名称,因此“\w”现在等效于括号外的“\[[:word:]]”,或括号内的“[:word:]”。POSIX 允许这种特定于实现的扩展,并且 bash 等也使用相同的名称。这引发的一个令人惊讶的兼容性问题是,现在不允许使用诸如 `"[\\w-_]"` 之类的构造,因为我们的文档始终表示应该如此:字符类不能是范围的端点。以前,由于 \w 只是 `[:alnum:]_` 的宏,因此将这样的构造读取为 `[[:alnum:]_-_]`,因此只要“-”之后的字符在数值上大于或等于 `"_"`,就可以接受。在此过程中进行了一些实现清理:* 删除 lexnest() 破解,并因此清理 wordchrs() 以不与词法分析器交互。* 修复 colorcomplement() 以使其不随所涉及颜色的数量呈 O(N^2) 的增长。* 去除对 brackpart() 中单字符字符元素名称的 element() 的无用调用。element() 始终将它们映射到字符本身,如果它不这样做,事情会变得非常糟糕 --- "[a]" 是否应该匹配与 "a" 不同的东西?此外,brackpart() 中的快捷方式路径无论如何都没有这样做,这使得它更加不一致。讨论: https://postgr.es/m/2845172.1613674385@sss.pgh.pa.us 讨论: https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2a0af7fe460eb46f9af996075972bf7c2e3f211d
更改正则表达式 \D 和 \W 简写以始终匹配换行符。换行符肯定不是数字或单词字符,因此它应该匹配这些补码字符类是合理的。以前,\D 和 \W 默认情况下是这样工作的,但是在换行符敏感模式('n' 或 'p' 标志)下,它们不匹配换行符。以前之所以强制使用此行为,是因为显式的补码字符类在换行符敏感模式下不匹配换行符;但是,从上一次提交开始,该实现约束不再存在。更改此行为似乎很有用,因为换行符敏感模式的主要实际用途似乎是匹配其他正则表达式引擎(例如 Perl 和 Javascript)的默认行为...并且它们的默认行为是这些匹配换行符。可以通过编写显式的补码字符类来保留旧的行为,即 [^[:digit:]] 或 [^[:word:]]。 (这意味着 \D 和 \W 与这些字符串并不完全等效,但它们无论如何都不是。)讨论: https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7dc13a0f0805a353cea0455ed95701322b39d4dd
文档:删除 src/backend/regex/re_syntax.n。我们没有将此文件作为文档发布,并且它的维护比 func.sgml 中的真实文档更加随意,因此我们将其删除。我认为我将它包含在提交 7bcc6d98f 中的唯一原因是伯克利时代的消息来源在此目录中有一个手册页。讨论: https://postgr.es/m/4099447.1614186542@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/301ed8812e3f8b102b85e1f5a59e95990ed9a868
修复 WITH RECURSIVE 处理中的列表操作错误。makeDependencyGraphWalker 和 checkWellFormedRecursionWalker 认为他们可以在列表被递归调用修改时保持指向列表的第一个 cons 单元的指针。当 cons 单元实际上被单独 palloc 时,这是可以的……但是自从提交 1cff1b95a 以来,它非常不安全,会导致核心转储或错误的 WITH 嵌套错误投诉。在现场,这至少需要一个七层深的 WITH 嵌套才会导致问题,但是启用 DEBUG_LIST_MEMORY_USAGE 可以通过较小的嵌套深度看到该错误。根据 Alexander Lakhin 的错误 #16801。向后移植到 v13。Michael Paquier 和 Tom Lane 讨论: https://postgr.es/m/16801-393c7922143eaa4d@postgresql.org https://git.postgresql.org/pg/commitdiff/80ca8464fe02296c8efefd53746e6d6a3f456d1e
改进正则表达式编译器中的内存管理。此处的先前逻辑为每个状态创建单独的弧池,以便每个状态的出弧都物理存储在其中。也许此选择的驱动因素是试图不在每个弧中包含“from”指针;但是 Spencer 早已放弃了这个想法,现在很难看到它的价值是什么。事实证明,该方法在内存消耗方面是相当灾难性的。首先,此引擎构建的 NFA 平均似乎每个状态有大约 4 个弧,并且大多数状态只有一到两个出弧。因此,为每个状态预分配 10 个出弧已经导致两倍或更多的膨胀。更糟糕的是,NFA 优化阶段会随意移动弧。在一个大型 NFA 中,某些状态将具有数百个出弧,因此在优化阶段的后期,我们有大量状态的弧池有空间容纳数百个弧,即使仅使用了其中的少数弧。我们已经看到真实世界的正则表达式,在这种情况下,此效果将内存需求膨胀了 25 倍甚至更多。因此,为了支持整个 NFA 的单个弧池,而不是总是每次请求 10 个弧,而采用可变大小的分配批处理,从而摆脱了每个状态的弧池。同时,让我们批量分配状态结构,以进一步减少 malloc 流量。这偶然允许以类似于 moveins() 的方式优化 moveouts():在将弧移动到另一个状态时,现在可以仅将同一弧结构重新链接到不同的 outchain 中,而在以前,代码不变性要求我们创建一个物理上新的弧,然后释放旧的弧。这些更改将正则表达式编译器对于平均大小的正则表达式的典型空间消耗减少了大约两倍,对于大型或复杂的正则表达式则减少更多。在一个由真实世界的正则表达式组成的大型测试集中,我们以前有六个案例由于超过 REG_MAX_COMPILE_SPACE 限制(大约 150MB)而导致“正则表达式过于复杂”失败;我们必须将该限制提高到接近 400MB 才能使其使用旧代码工作。现在,这些案例都不需要超过 13MB 即可编译。此外,由于 malloc 流量减少,测试集整体速度快了大约 10%。讨论: https://postgr.es/m/168861.1614298592@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0fc1af174cf7113445e116feb2813405b838a47d
文档:进一步澄清 libpq 对连接字符串 URI 的描述。将摘要分解为命名部分,以使其不那么令人困惑。在应用 SGML 标记方面付出更多努力。对附近的文本进行一些编辑。摘要修订由 Alvaro Herrera 和 Paul Förster 完成,其余是我的错。向后移植到出现多主机连接字符串的 v10。讨论: https://postgr.es/m/6E752D6B-487C-463E-B6E2-C32E7FB007EA@gmail.com https://git.postgresql.org/pg/commitdiff/4e90052c46c7751779ed83627676ed5e74ebe6d4
Thomas Munro 推送了
移除过时的 RAID 磁盘轴引用。提交 b09ff536 在 GUC “effective_io_concurrency” 的 long_desc 字段中留下了一些过时的建议。移除它。向后移植到 13。报告者:Andrew Gierth andrew@tao11.riddles.org.uk 审核者:Julien Rouhaud rjuju123@gmail.com 讨论:https://postgr.es/m/CA%2BhUKGJyyWqFBxL9gEj-qtjBThGjhAOBE8GBnF8MUJOJ3vrfag%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/db8374d804f2dd35a0f934984d1d3686cc71f545
隐藏 pg_collation_actual_version(<错误的 OID>) 的内部错误。对于错误的 OID,不再显示难看的内部“缓存查找失败”消息,而是像其他类似情况一样返回 NULL。报告者:Justin Pryzby pryzby@telsasoft.com 审核者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/0fb0a0503bfc125764c8dba4f515058145dc7f8b
pg_collation_actual_version() -> pg_collation_current_version()。新名称似乎更自然一些。讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8
重构 get_collation_current_version()。对于三个不同的操作系统,代码路径最终使用三种不同的方式排除 C[.xxx] 和 POSIX 的考虑。合并它们。审核者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/beb4480c853a60ec43bd3f1a71252890dd234f10
制表符补全 CREATE COLLATION。审核者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/5bc09a74719dfeb6c4cebb311b81385c508459a8
还原“pg_collation_actual_version() -> pg_collation_current_version()。”。这会还原提交 9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8。名称更改不如预期受欢迎。讨论:https://postgr.es/m/afcfb97e-88a1-a540-db95-6c573b93bc2b%40eisentraut.org https://git.postgresql.org/pg/commitdiff/8556267b2b1b8e1c26037c4c25cf390ee5afb5d9
Michaël Paquier 推送了
尽可能使用 pgstat_progress_update_multi_param()。此提交更改了 REINDEX INDEX 中的一个代码路径和 CREATE INDEX CONCURRENTLY 中的一个代码路径,以使用 pgstat_progress_update_multi_param() 而不是多次调用 pgstat_progress_update_param() 来报告每个操作的进度。这样做的好处是,在不影响所提供的信息量的情况下,可以使进度报告对最终用户更加一致。作者:Bharath Rupireddy 讨论:https://postgr.es/m/CALj2ACV5zW7GxD8D_tyO==bcj6ZktQchEKWKPBOAGKiLhAQo=w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/92942642788c9d73e4c090ee0a77603f7afbc1d7
文档:改进 wal_receiver_status_interval 的描述。此参数的描述以前令人困惑,说值为 0 会完全禁用状态更新。事实并非如此,因为在某些情况下,即使忽略此参数值,也会发送更新。文档已改进,以概述计划的状态消息以及强制发送状态消息时的处理差异。报告者:Dmitriy Kuzmin 作者:Michael Paquier 审核者:Euler Taveira 讨论:https://postgr.es/m/161346024420.3455.1345266601055047937@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/c82d59d64e127a5e743f9cf16537f4c7c120ce7b
修复文档和注释中的一些拼写错误、语法和样式问题。修复文档的部分会向后移植到需要的地方。作者:Justin Pryzby 讨论:https://postgr.es/m/20210210235557.GQ20012@telsasoft.com 向后移植到:9.6 https://git.postgresql.org/pg/commitdiff/bcf2667bf62d72faced64cb60ffbd2e599a0ebe8
文档:提及 pgbench 支持 PGDATABASE。已提及 PGHOST、PGPORT 和 PGUSER,但未提及 PGDATABASE。与 5aaa584 一样,向后移植到
报告者:Christophe Courtois 讨论:https://postgr.es/m/161399398648.21711.15387267201764682579@wrigleys.postgresql.org 向后移植到:12 https://git.postgresql.org/pg/commitdiff/a6f8dc47a0582e37c234c8e916377b46d2b03817
文档:改进压缩日志的 {archive,restore}_command
。文档中提到的使用 gzip 和 gunzip 的命令没有为归档文件添加“.gz”前缀,并且归档文件的路径不一致,这可能会令人困惑。报告者:Philipp Gramzow 审核者:Fujii Masao 讨论:https://postgr.es/m/161397938841.15451.13129264141285167267@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/329784e11849ff691f0157f3b27c50f652bce76a
pgbench:移除现在已死的 CState->ecnt
。ecnt 的最后一次使用是在 12788ae 中。自那以后,它在后端错误发生后会被递增,没有任何目的,因此让我们摆脱它。作者:Kota Miyake 审核者:Álvaro Herrera 讨论:https://postgr.es/m/786c3d9fbe067763d899e78c296f9f0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/943eb478803cc2ed6f0b1f5df6f1b20c9ad6245d
Peter Eisentraut 推送了
改进新的哈希分区边界检查错误消息。对于错误消息“每个哈希分区模数必须是下一个更大模数的因子”,添加一个详细消息,其中显示了特定的数字和现有的分区。同时对代码进行更多注释。审核者:Amit Langote <amitlangote09@gmail.com>
审核者:Heikki Linnakangas <hlinnaka@iki.fi>
讨论:https://postgresql.ac.cn/message-id/flat/bb9d60b4-aadb-607a-1a9d-fdc3434dddcd%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/efbfb642414b61db1567a7a902ace3f307d7564a
简化 LSN 的打印。添加一个宏 LSN_FORMAT_ARGS
,用于 LSN 的 printf 样式的打印。将所有适用的代码转换为使用它。审核者:Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>
审核者:Kyotaro Horiguchi <horikyota.ntt@gmail.com>
审核者:Michael Paquier michael@paquier.xyz 讨论:https://postgresql.ac.cn/message-id/flat/CAExHW5ub5NaTELZ3hJUCE6amuvqAtsSxc7O+uK7y4t9Rrk23cw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f6f284c7ee44264eb3e128e2bf54d9276711d11
消息样式修复。不要引用类型名称占位符。https://git.postgresql.org/pg/commitdiff/8ec8fe0f31712c62b761da9ef6d32214e08340d1
稍微扩展一个测试用例。这将可能有助于后续补丁,确保通知消息是不同的,以便清楚地表明它们以正确的顺序出现。作者:Fabien COELHO coelho@cri.ensmp.fr 讨论:https://postgresql.ac.cn/message-id/alpine.DEB.2.21.1904240654120.3407%40lancre https://git.postgresql.org/pg/commitdiff/b3a9e9897ec702d56602b26a8cdc0950f23b29dc
增强的循环标记值。根据 SQL:202x 草案,在递归查询的 CYCLE 子句中,循环标记值可以是布尔类型,并且可以省略,在这种情况下,它们默认为 TRUE 和 FALSE。审核者:Vik Fearing vik@postgresfriends.org 讨论:https://postgresql.ac.cn/message-id/flat/db80ceee-6f97-9b4a-8ee8-3ba0c58e5be2@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/f4adc41c4f92cc91d507b19e397140c35bb9fd71
藤井正雄推送了
在 postmaster 启动时,在 PGPROC 中初始化原子变量 waitStart。提交 46d6e5f567 在 PGPROC 结构中添加了原子变量 “waitStart”,以存储开始等待获取锁的时间。以前,此变量会在每次启动每个后端时初始化。相反,此提交使 postmaster 在启动时对其进行初始化,以确保该变量在使用之前已初始化。此提交还移动了用于准备事务的 “waitStart” 变量的初始化代码,从 TwoPhaseGetDummyProc() 移至 MarkAsPreparingGuts()。因为 MarkAsPreparingGuts() 是执行此操作的更合适位置,因为它初始化了其他 PGPROC 变量。作者:藤井正雄 审核者:Atsushi Torikoshi 讨论:https://postgr.es/m/1df88660-6f08-cc6e-b7e2-f85296a2bdab@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/f05ed5a5cfa55878baa77a1e39d68cb09793b477
改进 TRUNCATE 的制表符补全。作者:Kota Miyake 审核者:Muhammad Usama 讨论:https://postgr.es/m/f5d30053d00dcafda3280c9e267ecb0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/6b40d9bdbdc9f873868b0ddecacd9a307fc8ee26
Magnus Hagander 推送了
Álvaro Herrera 推送了
修复拼写错误。https://git.postgresql.org/pg/commitdiff/6a03369a71d4a7dc5b8d928aab775ddd28b72494
删除无意义的 HeapTupleHeaderIndicatesMovedPartitions 调用。Pavan Deolasee 最近指出,提交 5db6df0c0117 添加的一些 HeapTupleHeaderIndicatesMovedPartitions 调用是无用的,因为它们是在将 t_self 与 t_ctid 进行比较之后完成的。但是,由于 t_self 永远不能设置为指示元组移动分区的神奇值,因此永远不会成功:如果第一个测试失败(因此我们知道 t_self 等于 t_ctid),则第二个测试也必然会失败。因此,可以删除这些检查而不会造成任何损害。这里没有错误,只是代码可读性问题。报告者:Pavan Deolasee pavan.deolasee@gmail.com 讨论:https://postgr.es/m/20200929164411.GA15497@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/0f5505a8815aa4eb03ca61245a5a51ff9adda2f4
VACUUM:忽略带有 CONCURRENTLY 的索引操作。正如提交 c98763bf51bf 中设想的那样,VACUUM 可以忽略某些正在执行 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 的事务,以计算 Xmin;这是因为我们知道这些事务不会检查任何其他表,并且不会在同一事务中执行任何其他操作。(只能忽略“安全”索引上的操作:那些既不是部分索引也不是表达式索引上的操作)。这在 CIC/RC 可能运行很长时间的情况下非常有用,因为这曾经是并发清理其他表的重大麻烦。审核者:Matthias van de Meent boekewurm+postgres@gmail.com 审核者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/20210115133858.GA18931@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/d9d076222f5b94a85e0e318339cfc44b8f26022d
恢复允许使用 HEAP_XMAX_LOCK_ONLY|HEAP_KEYS_UPDATED 组合。提交 866e24d47db1 添加了一个断言,即 HEAP_XMAX_LOCK_ONLY 和 HEAP_KEYS_UPDATED 不能同时出现,这是基于错误的假设,即后者必然指的是更新而不是元组锁;但这是错误的,因为 SELECT FOR UPDATE 可以使用这种组合,此处添加的 amcheck 测试用例就证明了这一点。移除 Assert(),并修补 amcheck 的 verify_heapam.c,使其在发现这种组合时不会报错。此外,为了更加谨慎起见,更新(所有分支的)README.tuplock,使其对此更加明确。作者:Julien Rouhaud rjuju123@gmail.com 审核人:Mahendra Singh Thalor mahi6run@gmail.com 审核人:Dilip Kumar dilipbalaut@gmail.com 讨论:https://postgr.es/m/20210124061758.GA11756@nol https://git.postgresql.org/pg/commitdiff/8deb6b38dc4c7a7fd4719ee45e4b00d62b27dffe
修复关于 generate_gather_paths 的注释中的混淆。d2d8a229bc58 引入了一个新函数 generate_useful_gather_paths 作为 generate_gather_paths 的替代品,但忘记更新几个引用旧函数的地方。这可能不是 100% 完整(参考 create_ordered_paths),但总比什么都不改好。作者:“侯志杰” houzj.fnst@cn.fujitsu.com 审核人:Tomas Vondra tomas.vondra@enterprisedb.com 讨论:https://postgr.es/m/4ce1d5116fe746a699a6d29858c6a39a@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/5a65eacfdc69ee8c9d3ed92d838bc53628fbb7c6
修复 AfterTriggersTableData.storeslot 中的 use-after-free 错误。AfterTriggerSaveEvent() 错误地在执行跨度内存上下文中分配了槽,而正确的方式是在事务跨度上下文中分配,因为封闭的 AfterTriggersTableData 实例就属于那里。回溯到 12(测试回溯到 11,那里可以正常工作,无需更改代码,并且可以确认该情况之前得到了很好的支持);这个错误似乎是由提交 ff11e7f4b9ae 引入的。报告人:Bertrand Drouvot bdrouvot@amazon.com 作者:Amit Langote amitlangote09@gmail.com 讨论:https://postgr.es/m/39a71864-b120-5a5c-8cc5-c632b6f16761@amazon.com https://git.postgresql.org/pg/commitdiff/25936fd46c97039aad042ae8d46917d38d132fe4
Amit Kapila 推送
更改逻辑复制身份验证失败的错误消息。身份验证失败错误消息没有区分是物理复制还是逻辑复制连接失败,并且在逻辑复制连接的情况下,没有提供导致失败的不完整信息。作者:Paul Martinez 和 Amit Kapila 审核人:Euler Taveira 和 Amit Kapila 讨论:https://postgr.es/m/CACqFVBYahrAi2OPdJfUA3YCvn3QMzzxZdw0ibSJ8wouWeDtiyQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc617a7b1cada2ec5f8b9d45a4312e49fc1766ad
修复 ReorderBufferFinishPrepared 中的疏忽。如果解码提交准备时 ReorderBufferTXN 不存在,那么我们在事务中没有任何内容需要解码。因此,此处不要创建新的 ReorderBufferTXN。这是提交 a271a1b5 中的疏忽。报告人:Markus Wanner 讨论:https://postgr.es/m/dbec82e2-dbd7-95a2-c6b6-e488cbbdf853@bluegap.ch https://git.postgresql.org/pg/commitdiff/ade89ba5f408e6034db7cc8a2c9b7858f5a214c4
修复 ce0fdbfe97 引入的 relcache 引用泄漏。作者:Sawada Masahiko 审核人:Amit Kapila 讨论:https://postgr.es/m/CAD21AoA7ZEfsOXQ9HQqMv3QYGsEm2H5Wk5ic5S=mvzDf-3a3SA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8a4f9522d0c7d197c7eaa62cc72fb1bf9b90f05b
Peter Geoghegan 推送
在删除的 nbtree 页面中使用完整的 64 位 XID。否则,我们可能会通过使删除的页面无限期地不可回收而“泄漏”它们。提交 6655a729 对 GiST 索引中删除的页面做了同样的事情。这项工作被用作这里的起点。停止在 nbtree 元页面中存储指示所有已删除但未回收页面中最旧的 bpto.xact 的 XID。不再需要关心该条件/最旧的 XID。只有在环绕是 _bt_vacuum_needs_cleanup()
必须考虑的事情时,它才有意义。btm_oldest_btpo_xact 元页面字段已被重新利用和重命名。它现在是 btm_last_cleanup_num_delpages,用于记住上次 VACUUM 剩余的未回收删除页面数量(实际上,它的值通常是在上次设置该字段的特定 VACUUM 操作期间 _新删除的_
页面数量的确切值)。存储 btm_last_cleanup_num_delpages 的总体思路是使用它来在 _bt_vacuum_needs_cleanup()
中对未回收的删除页面进行 _一些_
考虑——尽管永远不会太多。我们只需要避免永远在未回收状态下留下过多的删除页面。我们这样做只是为了涵盖某些狭窄的情况,在这些情况下,没有其他因素使 VACUUM 执行完整扫描,但索引仍然在增长(因此实际上错过了回收现有删除页面的机会)。这些元页面更改导致了明显的用户可见的好处:我们不再仅仅由于来自非常大的索引中只有 1 或 2 个已知的删除(但未回收)块的存在,而在 VACUUM 操作期间触发完整的索引扫描。现在重要的是随着时间的推移保持成本和收益之间的平衡。修复了自提交 857f9c36 以来一直存在的问题,该提交添加了“跳过索引的完整扫描”机制(即 _bt_vacuum_needs_cleanup()
逻辑)。btm_last_cleanup_num_heap_tuples 的准确性意外地取决于源值存储的时间。我们现在始终在 btvacuumcleanup() 中存储 btm_last_cleanup_num_heap_tuples。这修复了该问题,因为 IndexVacuumInfo.num_heap_tuples(源字段)应该准确地指示表在 btvacuumcleanup() 中 VACUUM 完成后的状态。无法轻易从此提交中提取可回溯的修复程序。该问题的有针对性的修复程序将在稍后的提交中进行,但这不会在今天发生。我(pgeoghegan)已选择在 vacuum_cleanup_index_scale_factor GUC/param 的文档中删除任何有关删除页面的提及,因为删除(但未回收)页面的存在不再是用户关心的问题。文档中关于 vacuum_cleanup_index_scale_factor 的描述现在似乎无论如何都相当不清楚,并且应该在不久的将来重写。也许届时会重新添加一些关于页面删除的简单提及。由于 nbtree WAL 记录现在使用完整的 XID,因此增加 XLOG_PAGE_MAGIC。作者:Peter Geoghegan pg@bowt.ie 审核人:Masahiko Sawada <sawada.mshk@gmail.com>
讨论:https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX=d5u-tRYhi-F4wnV2uN2zHpMUXw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e5d8a999030418a1b9e53d5f15ccaca7ed674877
VACUUM VERBOSE:计算“新删除的”索引页面。教导 VACUUM VERBOSE 报告由当前 VACUUM 操作删除的页面——这些是新删除的页面。VACUUM VERBOSE 继续报告整个索引中删除的页面总数(此处没有更改)。前者是后者的子集。只有在索引 AM 支持页面删除并且出于性能原因与页面回收分离的情况下,才会出现每种删除索引页面类别之间的区别。这是对提交 e5d8a999 的后续工作,该提交使 nbtree 在删除页面时在页面中存储 64 位 XID(而不是 32 位 XID)。请注意,该提交添加的 btm_last_cleanup_num_delpages 元页面字段通常设置为 pages_newly_deleted。例外情况(它们不相等的情况)似乎都是页面删除和回收的一般实现中的棘手情况。作者:Peter Geoghegan pg@bowt.ie 讨论:https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX%3Dd5u-tRYhi-F4wnV2uN2zHpMUXw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2376361839091b0dcdcc0b77f938b809b5f21646
David Rowley 推送
添加 TID 范围扫描以支持高效扫描 TID 范围。这添加了一个名为 TID 范围扫描的新执行器节点。当在基本关系上发现搜索表 ctid 列范围的 quals 时,查询计划器将为 TID 范围扫描生成路径。这些范围可以在任一端打开。例如,WHERE ctid >= '(10,0)'; 将返回第 10 页及以上的所有元组。为了支持这一点,已向表 AM 添加了两个新的可选回调函数。scan_set_tidrange 用于将扫描范围设置为给定 TID 范围。scan_getnextslot_tidrange 获取给定范围内的下一个元组。对于扫描 TID 范围没有意义的 AM,可以在 TableAmRoutine 中将这些函数设置为 NULL。在这种情况下,查询计划器不会生成 TID 范围扫描路径。作者:Edmund Horner,David Rowley 审核人:David Rowley,Tomas Vondra,Tom Lane,Andres Freund,Zhihong Yu 讨论:https://postgr.es/m/CAMyN-kB-nFTkF=VA_JPwFNo08S0d-Yk0F741S2B7LDmYAi8eyA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bb437f995d47405ecd92cf66df71f7f7e40ed460
添加缺失的 TidRangeScan readfunc。在 bb437f995 中被错误地遗忘 https://git.postgresql.org/pg/commitdiff/977b2c08535f2a82ba7c310c88420cbbca1772e8
Noah Misch 推送
Justin Pryzby 发送了另一个补丁修订版,使 INSERT SELECT 使用 BulkInsertState 和 multi_insert,检查易失默认值以确保不会丢失对它们的任何依赖关系,使 COPY 根据元组的累积大小而不是行长度来刷新 multi-insert 缓冲区,并在计算何时刷新缓冲区时检查元组大小以获得更准确的块大小度量。
侯志杰发送了另一个补丁修订版,以添加一个 GUC 和一个按表选项,都名为 enable_parallel_dml,以控制 DML 是否包含并行执行的选项。
Bharath Rupireddy 发送了另一个补丁修订版,以在 FDW 级别和外部服务器级别添加名为 keep_connections 的 GUC。
Masahiko Sawada 发送了一个补丁,以添加一个检查,根据是否 1% 的所有堆页面具有 LP_DEAD 行指针来确定是否进行索引清理(和堆清理)。
Shenhao Wang 发送了一个补丁,使 --enable-coverage 在没有找到 lcov 的情况下也能成功,因为实际的覆盖率测试可以在没有它的情况下运行。
Jim Mlodgenski 发送了一个补丁,以添加解析器钩子。
Mats Kindahl 发送了一个补丁,用于 TableAccessMethod 的回调,该回调在应该安排表取消链接时调用,并实现堆访问方法的方法。
Justin Pryzby 发送了三个补丁修订版,以便在 typinput 中的错误期间报告文本参数,并在使用二进制参数的错误中执行参数输出。
Daniel Gustafsson 发送了两个补丁的修订版本,使其可以使用 NSS 作为 libpq 的 TLS 后端。
Jan Wieck 发送了另一个补丁的修订版本,使线路协议可插拔,并使用相同的方式通过 telnet 进行响应。
Justin Pryzby 发送了另一个补丁的修订版本,以润色即将发布的版本的文档。
Iwata Aya 和 Álvaro Herrera 交换了补丁,以改进 libpq 的跟踪功能。
Amit Kapila 发送了一个补丁,以更新预准备事务解码的文档和注释,以匹配当前的行为。
Daniel Gustafsson 发送了另一个补丁的修订版本,以检查 pg_upgrade 中目标集群二进制文件的版本。
Mark Rofail 发送了另一个补丁的修订版本,以实现外键数组。
Matthias van de Meent 发送了另一个补丁的修订版本,为 COPY 进度报告添加了进度报告组件,包括一个新的视图 pg_stat_progress_copy,添加了指向进度报告文档的反向链接,并为相同的内容添加了回归测试。
Dilip Kumar 发送了三个补丁的修订版本,以提供一个新的接口来获取恢复暂停状态,pg_get_wal_replay_pause_state,该接口返回恢复暂停的实际状态,即如果未请求暂停则返回“not paused”,如果请求了暂停但恢复尚未暂停则返回“pause requested”,如果恢复实际已暂停则返回“paused”。
KaiGai Kohei 发送了一个补丁,为 contrib/cube 添加二进制输入/输出处理程序。
Georgios Kokolatos 发送了另一个补丁的修订版本,以使 dbsize 更加一致。
Mark Dilger 发送了另一个补丁的修订版本,以添加 pg_amcheck,这是一个命令行界面,用于针对表和索引运行 amcheck 的验证。
John Naylor 发送了两个补丁的修订版本,使其可以使用 SIMD 指令验证 utf-8。
Hayato Kuroda 发送了三个补丁的修订版本,以重构 ECPGconnect 并允许 IPv6 连接。
Amit Langote、Greg Nancarrow 和 Amit Kapila 交换了补丁,使其可以使用多个 worker 执行 INSERT (INTO ... SELECT ...)。
Julien Rouhaud 发送了另一个补丁的修订版本,为 REINDEX 添加一个新的 COLLATION 选项。
John Naylor 发送了两个补丁的修订版本,允许将元组插入到几乎为空的页面中。
Paul Martinez 发送了两个补丁的修订版本,以记录 max_replication_slots 对订阅者端的影响。
Ajin Cherian 和 Amit Kapila 交换了补丁,以避免在重启后重复解码预准备事务,并添加一个选项以在 pg_create_logical_replication_slot 中启用两阶段提交。
Peter Eisentraut 发送了另一个补丁的修订版本,以修复游标灵敏度术语的使用,使其与 SQL 标准中的术语匹配,删除了支持灵敏游标的声明,并为游标添加了一个新的选项 ASENSITIVE,这是默认行为。
Benoit Lobréau 发送了一个补丁,更详细地记录了 archive_command 如何根据发送的信号失败,以及它是否在 pg_stat_archiver 中报告。
Peter Eisentraut 发送了另一个补丁的修订版本,以设置来自客户端的 SSL 连接的 SNI,这允许支持 SNI 的代理路由连接。
Peter Smith 发送了三个补丁的修订版本,以实现两阶段事务的逻辑解码。
Amit Kapila 发送了另一个补丁的修订版本,以更新逻辑复制的文档,包括最近添加的逻辑复制配置设置,并提及表同步工作进程现在使用复制源来跟踪进度。
Thomas Munro 发送了另一个补丁的修订版本,以用条件变量替换缓冲区 I/O 锁。
Amit Langote 发送了另一个补丁的修订版本,通过确保在分区表上创建外键触发器来修复分区行移动的错误行为,并使用相同的方式在跨分区更新期间正确强制执行外键。
Thomas Munro 发送了另一个补丁的修订版本,以防止锁存器向当前未休眠的进程发送信号,对锁存器使用 SIGURG 而不是 SIGUSR1,对 epoll 锁存器使用 signalfd,这通过等待 signalfd 而不是信号处理程序和自管道来减少系统调用和其他开销,并对 kqueue 锁存器使用 EVFILT_SIGNAL。
Michaël Paquier 发送了一个补丁,为 reindexdb 添加一个 --tablespace 选项,以匹配最近为 REINDEX 添加的功能。
Kota Miyake 发送了一个补丁,修复了当同时设置 PGUSER 和 PGPORT 时 pgbench 在错误中报告数据库名称的问题。
Amul Sul 发送了另一个补丁的修订版本,以使用全局屏障实现 wal 禁止状态,在 WAL 写入的 START_CRIT_SECTION 之前出现错误或 Assert,并记录相同的内容。
Justin Pryzby 发送了另一个补丁的修订版本,使其可以在分区表上使用 CREATE INDEX CONCURRENTLY。
Jacob Champion 发送了另一个补丁的修订版本,以保存用户用于日志记录的原始身份验证身份。
Daniel Gustafsson 发送了另一个补丁的修订版本,通过忽略会启用 SSL 压缩的选项来禁止 SSL 压缩。稍后的补丁将完全删除该选项,因为它已被弃用。
Daniel Gustafsson 发送了一个补丁,从 libpq 的 authtype 参数中删除默认值,因为它已被弃用。
Álvaro Herrera 发送了另一个补丁的修订版本,以实现 ALTER TABLE .. DETACH PARTITION CONCURRENTLY。
Dilip Kumar 发送了两个补丁的修订版本,使其可以为表设置压缩类型。
Euler Taveira de Oliveira 发送了另一个补丁的修订版本,以使用 PUBLICATION 的 DDL 中的可选 WHERE 子句来实现逻辑复制的行过滤。
Thomas Munro 发送了另一个补丁的修订版本,为 FeBeWaitSet 位置引入符号名称,并对 walsender.c 使用 FeBeWaitSet。
Thomas Munro 发送了另一个补丁的修订版本,将条件变量用于 ProcSignalBarriers,允许在中断代码中使用条件变量,并使用全局屏障通过强制所有后端关闭该平台上的所有 fd 来修复 Windows 上的 DROP TABLESPACE。
Andrey Borodin 发送了一个补丁,为 FPI 使用不同的压缩方法。
Julien Rouhaud 发送了一个补丁,将 pg_prewarm 和 pg_stat_statements 中显式对齐的使用更改为 CACHELINEALIGN,并将 hash_estimate_size() 中的对齐更新为基于 CACHELINEALIGN 的 ShmemInitHash 实际将消耗的估计值。
Thomas Munro 发送了一个补丁,以删除 Linux < 2.6.27 的 latch.c 解决方法。
Peter Eisentraut 发送了另一个 psql 的补丁的修订版本,该补丁使其默认显示所有查询结果。
Jeff Janes 发送了一个补丁,通过在用户密码不匹配时在 DETAIL 消息中报告,使 SCRAM 的行为与 MD5 的行为相匹配。
Joel Jacobson 发送了一个补丁,以实现 regexp_positions() 函数。
Paul Förster 发送了一个补丁,在 psql 的 --help 输出中提及数据库 URI。
Justin Pryzby 发送了一个补丁,以 ATExec{En,Dis}ableRowSecurity 的风格重构 ATExecForceNoForceRowSecurity,并进行一些进一步的重构。
Justin Pryzby 发送了一个补丁,以实现 ALTER TABLE SET TABLE ACCESS METHOD。