本周人物:https://postgresql.life/post/julien_riou/
pspg 4.5.0 发布,这是一款为 PostgreSQL 设计的分页器。https://github.com/okbob/pspg/releases/tag/4.5.0
pgAdmin4 5.1 发布,这是一个用于 PostgreSQL 的 Web 和本地 GUI 控制中心。https://www.pgadmin.org/docs/pgadmin4/5.1/release_notes_5_1.html
https://archives.postgresql.org/pgsql-jobs/2021-03/
Planet PostgreSQL:https://planet.postgresql.org/
本周的 PostgreSQL 每周新闻由 David Fetter 带给您
请在太平洋标准时间下午 3:00 前(PST8PDT)将新闻和公告发送至 david@fetter.org。
Andrew Dunstan 推送了
不要在 Windows perl 中运行 recover crash_temp_files 测试。这将回滚提交 677271a3a125e294b33b891669f594a2c8cb36ce。“修复 Windows 上的恢复测试” 该测试在 Windows 上挂起,并且补救问题的尝试充其量是脆弱的。因此,我们只是在 Windows perl 上禁用该测试。(Msys perl 似乎完全没有问题)。讨论:https://postgr.es/m/5b748470-7335-5439-e876-6a88c951e1c5@dunslane.net https://git.postgresql.org/pg/commitdiff/ef823873840c9f341239e18633bdb0116d8d2738
允许 PostgresNode 的安装感知实例。目前,PostgresNode 的实例在其调用者的 PATH 中查找其 Postgres 可执行文件。此修改允许实例知道它们应该使用的安装路径,并且该模块适当地调整调用 Postgres 可执行文件的方法的环境。通过将安装路径传递给构造函数来激活此功能:my $node = PostgresNode->get_new_node('mynode', installation_path => '/path/to/installation');这使得许多事情变得更加容易,包括:. 测试第三方模块 . 一起测试不同版本的 postgres . 一起测试不同构建版本的 postgres 讨论:https://postgr.es/m/a94c74f9-6b71-1957-7973-a734ea3cbef1@dunslane.net 审核人:Alvaro Herrera、Michael Paquier、Dagfinn Ilmari Mannsåker https://git.postgresql.org/pg/commitdiff/b34ca595abd697e716ce369ec1b58624bdd1c431
Tom Lane 推送了
使 compression.sql 回归测试独立于默认值。如果安装的 default_toast_compression 设置不是“pglz”,则此测试将在“make installcheck”中失败。使其对这种情况具有鲁棒性。Dilip Kumar 讨论:https://postgr.es/m/CAFiTN-t0w+Rc2U3S+y=7KWcLuOYNB5MfWeGdNa7+pg0UovVdcQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/fd1ac9a548966786cf7978e590be816c55936a50
将 configure 对 LZ4 的支持提升到标准水平。将 pkg_config 的结果直接推送到我们的构建标志中是不行的,原因有几个
这无法维持 CPPFLAGS 和 CFLAGS 之间以及 LDFLAGS 和 LIBS 之间的分离。(我认为 CPPFLAGS 角度是使用 MacPorts 的 liblz4 构建时报告警告消息的原因。) * 如果 pkg_config 发出除 -I/-D/-L/-l 开关之外的任何内容,那么我们很可能不想吸收这些内容。这更有可能破坏构建而不是做任何有用的事情。(即使是 -D 情况也值得怀疑;但是我们正在为 libxml2 执行此操作,所以我保留了它。)此外,跳过执行 AC_CHECK_LIB 探测是不行的,最近在 topminnow 上构建失败证明了这一点;应该在配置时捕获到它。在配置的 libxml2 支持中为这个问题建模修复。似乎有人也忽略了 autoheader 运行。讨论:https://postgr.es/m/20210119190720.GL8560@telsasoft.com https://git.postgresql.org/pg/commitdiff/4d399a6fbeb720b34d33441330910b7d853f703d
修复 ATExecSetCompression() 中的各种愚蠢行为。直接涂写 syscache 条目是不行的。在释放该条目后继续访问该条目也是不行的。还要去掉未使用的局部变量。根据 valgrind 测试。https://git.postgresql.org/pg/commitdiff/ac897c483485d3858ada23ca49650a0f2742a50f
删除 <lz4/lz4.h> 的无用配置探测。这似乎只是从其他一些头文件检查中复制粘贴过来的。但是我们的 C 代码完全没有准备好支持这样的头文件名,因此查找它只是在浪费周期。如果我们确实需要支持它,则需要一些 #ifdefs。(对 codesearch.debian.net 的快速浏览发现了一些引用 lz4/lz4.h 的包;但是它们仅使用该拼写,并且似乎打算引用它们自己的副本,而不是系统级安装的 liblz4。没有证据表明需要这种拼写的独立安装。)讨论:https://postgr.es/m/457962.1616362509@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2c75f8a612b207c7d36e5dc73317dc9ab6fb29d4
主要是在外观上调整与 TOAST 相关的宏。bbe0a81db 的作者并没有完全理解名为 SOMETHING_4B_C 的宏仅用于 postgres.h 中的内部字节序相关详细信息。为打算在其他地方使用的宏选择更易读的名称。稍微重新排列 postgres.h,以阐明这些内部宏和用于更广泛的宏之间的分离。此外,避免使用术语“rawsize”表示真正的解压缩大小;我们已经使用“extsize”表示它,因为“rawsize”通常表示包括标头在内的总 Datum 大小。在将这些含义之一与另一个进行比较的测试中,此选择似乎特别不幸。此补丁包括几个并非纯粹在外观上的更改:请确保对齐压缩方法的移位是无符号的(今天并不关键,但在存在压缩方法 2 时将至关重要),并修复了 VARATT_EXTERNAL_GET_COMPRESSION(现在为 VARATT_EXTERNAL_GET_COMPRESS_METHOD)的损坏定义,其调用者只是偶然地起作用。讨论:https://postgr.es/m/574197.1616428079@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aeb1631ed207cef2d80e20f79eb52c72f03bca7d
短路请求,该请求的切片大于对象的大小。substring(),以及其他可能的调用者,没有注意传递的切片长度不能大于 datum 的真实大小。由于 toast_decompress_datum_slice 的子项将 palloc 请求的切片长度,这可能会浪费内存。此外,对 liblz4 文档的仔细研究表明,它取决于调用者不请求超过正确解压缩数据量的请求;这与使用 liblz4 1.8.3 观察到的错误行为一致。如果切片请求 >= datum 的解压缩大小,则通过切换到正常的完整解压缩代码路径来避免这些问题。Tom Lane 和 Dilip Kumar 讨论:https://postgr.es/m/507597.1616370729@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/063dd37ebc7644e8db6419565b50dca019e69e86
避免在完成堆重写时可能发生的崩溃。end_heap_rewrite 没有注意确保目标关系在 smgr 级别打开,然后才执行其最终的 smgrimmedsync。在正常情况下,这没有问题,因为它会在重写期间较早打开。但是,可以通过在启用 CLOBBER_CACHE_ALWAYS 的情况下重新集群空表来重现崩溃。虽然在 v13 中确切的场景不会崩溃,但我认为这是不相关的规划器更改的偶然结果,并且该问题仍然可以通过其他测试用例访问。此失败的真正直接原因是提交 c6b92041d,该提交将对 heap_sync 的调用(该调用谨慎地打开 smgr)替换为直接调用 smgrimmedsync。因此,将补丁向后移植到 v13。Amul Sul,根据 Neha Sharma 的报告;由我进行外观更改和测试用例。讨论:https://postgr.es/m/CANiYTQsU7yMFpQYnv=BrcRVqK_3U3mtAzAsJCaqtzsDHfsUbdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9d523119fd38fd205cb9c8ea8e7cceeb54355818
进一步修复 psql 的 \connect 命令。Jasen Betts 报告了提交 85c54287a 的另一个意外副作用:使用“\c service=whatever”重新连接没有产生预期的结果。原因是,从 PQconndefaults() 的输出开始,实际上允许环境变量(如 PGPORT)覆盖服务文件中的条目,而正常的优先级顺序相反。根本不使用 PQconndefaults 将需要在 do_connect 的参数设置中引入第三个主要代码路径,所以我真的不想以这种方式修复它。但是,我们可以让逻辑有效地忽略默认值,只需再编写几行代码即可。此补丁不会更改“\c -reuse-previous=on service=whatever”的行为。这与 85c54287a 之前的行为有很大不同,因为将重用更多参数,因此服务条目不可能替换这些参数。但我认为这是(大部分是?)有意的。在任何情况下,由于 libpq 不会报告它从何处获取参数值,因此很难做到不同。根据 Jasen Betts 的 bug #16936。与之前的补丁一样,向后移植到所有受支持的分支。(9.5 不幸的是现在不再受支持,因此不会在此处修复。)讨论:https://postgr.es/m/16936-3f524322a53a29f0@postgresql.org https://git.postgresql.org/pg/commitdiff/ea80138545043c0cfcff8405b15626796f2695fe
Peter Geoghegan 推送了
在同一次 VACUUM 期间回收删除的 nbtree 页面。维护一个简单的元数据数组,记录在 nbtree VACUUM 的当前 btvacuumscan() 调用期间被删除的页面。在 btvacuumscan() 结束时使用此元数据,尝试将新删除的页面放入 FSM 中,而无需进一步延迟。到那时,将任何页面放入 FSM 可能还不太安全(它们可能被认为不可回收),但尝试一下我们没什么损失,却可能获得很多好处。在实践中,当清理较大的索引时,这种情况很有可能成功,因为扫描索引自然需要相当长的时间。此提交不会更改页面回收不变性;它只是在现有设计范围内提高了页面回收的效率。“回收安全”是 nbtree 对 Lanin & Shasha 所谓的“排出技术”的实现的一部分。该设计碰巧使用了事务 ID(它们存储在已删除的页面中),但这本身并没有将回收安全的截止点与 VACUUM 使用的任何基于 XID 的截止点(例如,OldestXmin)对齐。所有重要的是,其他后端是否能够观察到树结构中的各种不一致(它们不能通过向右移动来检测和恢复)。回收安全纯粹是一个维护物理数据结构一致性(或表面一致性)的问题。请注意,运行一个简单的串行测试用例,其中包含一个大的范围 DELETE,然后是一个 VACUUM VERBOSE,可能会显示任何新删除的 nbtree 页面尚不可重用/回收。即使没有一个并发 XID 分配,也预计会如此。这是一个旧的实现限制。在实践中,它不太可能成为使回收仍然不安全的原因,至少对于较大的索引而言,在同一次 VACUUM 期间回收新删除的页面实际上很重要。此提交(以及相关的最近提交 e5d8a999 和 9f3665fb)的一个重要高层目标是使索引 AM 中的昂贵延迟清理操作通常变得罕见。如果索引清理操作经常依赖于下一个 VACUUM 操作来完成当前操作开始的工作,那么索引清理的总体行为就很难预测。这与正在进行的向 vacuumlazy.c 添加机制以在某些情况下跳过索引清理的工作有关。任何使索引清理的实际行为更简单、更线性的东西,也将使 vacuumlazy.c 中的自顶向下建模更加健壮。作者:Peter Geoghegan pg@bowt.ie 审核人:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAH2-Wzk76_P=67iUscb1UN44-gyZL-KgpsXbSxq_bdcMa7Q+wQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9dd963ae2534e9614f0abeccaafbd39f1b93ff8a
nbtree VACUUM:处理有缺陷的操作符类。教会 nbtree VACUUM 在尝试删除页面但未能“重新找到”其子/目标页面的下行链接时,继续执行清理操作。没有充分的理由将其视为不可恢复的错误。但有一个很好的理由不这样做:此时继续执行可以消除 VACUUM 仅因用户定义的操作符类代码的错误行为而无法取得进展的任何疑问。讨论:https://postgr.es/m/CAH2-Wzma5G9CTtMjbrXTwOym+U=aWg-R7=-htySuztgoJLvZXg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5b861baa550a369e04bf67fbe83f3a5a8c742fb4
Michaël Paquier 推送
修复具有 2PC 事务的检查点中的时间线分配。任何被检查点发现仍处于预备状态的事务,其状态数据都从 PREPARE TRANSACTION 生成的 WAL 记录中读取,然后移动到 pg_twophase/ 中的新位置。在读取此类记录时,WAL 读取器使用回调 read_local_xlog_page() 来读取页面,该页面在系统的各个部分之间共享。自 1148e22a 以来,此回调在恢复时读取记录时引入了 ThisTimeLineID 的更新,这在级联 WAL 发送器的上下文中可能很有用。如果在从其记录读取某些 2PC 数据时发生提升,则 ThisTimeLineID 的此更新与检查点程序发生不良的相互作用,因为通过更改 ThisTimeLineID,任何后续 WAL 记录都将写入比提升的更新的时间线。这会导致一致性问题。例如,随后的服务器重启会导致无法找到有效的检查点记录,从而导致 PANIC 等错误。此提交更改了读取 2PC 数据的代码,以便在读取 2PC 记录后重置时间线,以防止干扰检查点程序的静态状态。直接在 read_local_xlog_page() 中执行相同的操作是诱人的。但是,根据导致 1148e22a 的讨论,用户可能会依赖于在恢复时读取 WAL 记录页面时 ThisTimeLineID 的更新,因此更改此回调可能会破坏某些当前正在工作的情况。添加了一个重现此问题的 TAP 测试,该测试依赖于 PITR 来精确触发仍跟踪预备事务的提升。经与 Heikki Linnakangas、Kyotaro Horiguchi、Fujii Masao 和我本人讨论。作者:Soumyadeep Chakraborty、Jimmy Yih、Kevin Yeap 讨论:https://postgr.es/m/CAE-ML+_EjH_fzfq1F3RJ1=XaaNG=-Jz-i3JqkNhXiLAsM3z-Ew@mail.gmail.com 向后移植到:10 https://git.postgresql.org/pg/commitdiff/595b9cba2ab0cdd057e02d3c23f34a8bcfd90a2d
简化具有预期日志文件内容的 kerberos 的 TAP 测试。kerberos 的 TAP 测试依赖于后端生成的日志来检查各种连接场景。为了确保给定的测试不会与先前测试生成的日志内容重叠,测试套件依赖于具有日志收集器和日志文件轮换的逻辑,以确保使用等待阶段生成的日志的唯一性。通过 PostgresNode::issues_sql_like() 以更简单的方式解决了解析预期模式的日志内容的问题,其中日志文件在检查生成的内容之前被截断,后端将其输出发送到由 pg_ctl 给出的日志文件。此提交将 kerberos 测试套件切换为使用这种方法,删除了任何等待阶段并简化了整个逻辑,从而减少了代码。如果测试中发生故障,由于 like(),日志的内容仍然会在故障发生时显示给用户,因此这对调试功能没有影响。我是在审查旨在扩展 kerberos 测试套件以检查多个日志模式而不是一个的另一个补丁集时遇到此问题的。作者:Michael Paquier 审核人:Stephen Frost、Bharath Rupireddy 讨论:https://postgr.es/m/YFXcq2vBTDGQVBNC@paquier.xyz https://git.postgresql.org/pg/commitdiff/11e1577a576fec6307aa0bfcde7333e63f907fa7
修复 Windows 上 2PC 事务和 PITR 的新 TAP 测试。595b9cb 添加的测试忘记了在 Windows 上需要使用特定条目设置 pg_hba.conf(请参阅 PostgresNode::set_replication_conf),否则基本备份将失败。任何需要支持复制的节点都只需要在初始化时传递 allows_streaming。这将更新测试以执行此操作。同时简化一下。每个构建场成员 fairywren。任何运行此测试的 Windows 主机都会失败,并且我也重现了该问题。向后移植到:10 https://git.postgresql.org/pg/commitdiff/992d353a190c551db39bcab2dec0ecf14fbc7a40
修复 Windows 上 WAL 段回收的并发问题。此提交主要是对 aaa3aed 的还原,该提交切换了执行回收 WAL 段的内部重命名的例程,以便在 Windows 上使用 CreateHardLinkA() 加 unlink() 的组合而不是 rename()。正如 Postgres 13 的几位用户报告的那样,这在操作 WAL 段时会导致并发问题,主要表现为以下错误形式:LOG: could not rename file "pg_wal/000000XX000000YY000000ZZ": Permission denied 这会回退到使用单个 rename()(对于 Windows,则为 pgrename())的逻辑。事实证明,当我在测试时,这个问题很难被发现,只在一次存档命令无法完成其工作时遇到过,因此它对环境敏感。此问题的报告者已经能够确认,一旦我们切换回单个 rename(),情况就有所改善。为了检查情况,我向报告者提供了基于 13.2 并还原 aaa3aed 的已修补版本,以测试该错误是否消失,并提供了 13.2 的未修补版本,以测试该错误是否仍然出现(只是为了确保我没有搞砸我的构建过程)。特别感谢 Fujii Masao 指出似乎是罪魁祸首的提交,并感谢所有报告者花时间测试我发送给他们的内容。报告人:Andrus、Guy Burgess、Yaroslav Pashinsky、Thomas Trenz 审核人:Tom Lane、Andres Freund 讨论:https://postgr.es/m/3861ff1e-0923-7838-e826-094cc9bef737@hot.ee 讨论:https://postgr.es/m/16874-c3eecd319e36a2bf@postgresql.org 讨论:https://postgr.es/m/095ccf8d-7f58-d928-427c-b17ace23cae6@burgess.co.nz 讨论:https://postgr.es/m/16927-67c570d968c99567%40postgresql.org 讨论:https://postgr.es/m/YFBcRbnBiPdGZvfW@paquier.xyz 向后移植到:13 https://git.postgresql.org/pg/commitdiff/909b449e00fc2f71e1a38569bbddbb6457d28485
在自动清理的详细日志中添加每个索引的统计信息。一旦完成关系的自动清理,如果达到 log_autovacuum_min_duration(或其关系选项)的阈值,则日志将包含有关此关系状态的更多信息,例如关系 VACUUM 操作的统计信息、WAL 和系统使用情况的内容。此提交添加了有关关系索引统计信息的更多信息,为每个索引生成一行日志。索引统计信息已经计算过了,但尚未在自动清理的上下文中打印。同时,进行了一些重构,以直接在 LVRelStats 中跟踪索引统计信息,从而简化了与并行 VACUUM 相关的一些例程。作者:Masahiko Sawada 审核人:Michael Paquier、Euler Taveira 讨论:https://postgr.es/m/CAD21AoAy6SxHiTivh5yAPJSUE4S=QRPpSZUdafOSz0R+fRcM6Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5aed6a1fc214913de9ac69c1717dc64a2483e16d
稍微修改了自动清理中为索引统计信息生成的日志的措辞。“remain”容易引起混淆,因为它暗示索引文件可以缩小。相反,使用“in total”。根据与 Peter Geoghegan 的讨论。讨论:https://postgr.es/m/CAH2-WzkYgHZzpGOwR14CScJsjaQpvJrEkEfkh_=wGhzLb=yVdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/99dd75fb99baa9188971cf47779ed8d7a5e6eb29
清理代码注释中的术语 "combo CID"。代码注释中,各处对组合 CID 使用了不同的术语,因此统一了术语,与某些 README 中当前使用的术语保持一致。作者:"侯志杰" 讨论:https://postgr.es/m/1d42865c91404f46af4562532fdbea31@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/a1999a01bb56c5f5451116abe61b892b2eec5e49
Noah Misch 推送了代码
使测试能够承受 log_error_verbosity=verbose 的设置。向后移植到 v13,该版本引入了有问题的测试代码。https://git.postgresql.org/pg/commitdiff/e3f4aec027891f794328050e62c9bbbe4ae02811
将类似算法合并到 roles_is_member_of() 中。下一个提交可能会使两到三个算法复杂化,因此借此机会进行整合。没有功能性更改。由 John Naylor 审查。讨论:https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/f687bf61ed4dc75ec074c387f848147da2097e13
添加 "pg_database_owner" 默认角色。该角色的成员资格隐式地由当前数据库的所有者组成。预计在模板数据库中使用。一旦 pg_database_owner 在模板中拥有权限,从该模板实例化的每个数据库的所有者都将行使这些权限。由 John Naylor 审查。讨论:https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a14a0118a1fecf4066e53af52ed0f188607d0c4b
藤井正雄推送了代码
pgbench: 改进 \sleep 命令中的错误处理。此提交改进了 pgbench \sleep 命令,使其能更正确地处理以下三种情况。(1) 当在 \sleep 命令中仅指定一个参数且该参数不是数字时,之前 pgbench 会报告类似“无法识别的时间单位,必须是 us、ms 或 s”的令人困惑的错误消息。此提交修复了此问题,使其报告更合适的错误消息,如“无效的睡眠时间,必须是整数”。(2) 当在 \sleep 命令中指定两个参数且第一个参数不是数字时,之前 pgbench 会将该参数视为睡眠时间 0。在这种情况下不会报告任何错误。此提交修复了此问题,使其在此情况下抛出错误。(3) 当将变量指定为 \sleep 命令中的第一个参数且该变量存储非数字值时,之前 pgbench 会将该参数视为睡眠时间 0。在这种情况下不会报告任何错误。此提交修复了此问题,使其在此情况下抛出错误。作者:Kota Miyake 审查人:Hayato Kuroda、Alvaro Herrera、藤井正雄 讨论:https://postgr.es/m/23b254daf20cec4332a2d9168505dbc9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8c6eda2d1c926be76baa79c28521275323bd26fd
pg_waldump: 修复每个记录统计中的错误。pg_waldump --stats=record 通过记录的 RmgrId 和 xl_info 字段的四个位的组合来标识记录。但是 XACT 记录使用这四个位的第一个位作为可选标志变量,使用随后的三个位作为操作码来标识记录。因此,之前相同类型的 XACT 记录可能具有不同的四位(三个位相同,但第一个位不同),这可能导致 pg_waldump --stats=record 为同一 XACT 记录显示两行每记录统计信息。这是一个错误。此提交更改了 pg_waldump --stats=record,使其仅对 XACT 记录进行不同的处理,即,从 xl_info 中过滤出操作码,并将 RmgrId 和这三个位的组合作为记录的标识符,仅用于 XACT 记录。对于其他记录,仍然使用 xl_info 字段的四个位。向后移植到所有受支持的分支。作者:Kyotaro Horiguchi 审查人:Shinya Kato、藤井正雄 讨论:https://postgr.es/m/2020100913412132258847@highgo.ca https://git.postgresql.org/pg/commitdiff/51893c8463501fc9a38e39cc097773dbdfb9db82
将 WalReceiverWaitStart 等待事件的类型从 Client 更改为 IPC。之前此等待事件的类型为 Client。但是,在报告此等待事件时,walreceiver 进程正在等待启动进程设置流复制的初始数据。它不是在等待连接到用户应用程序或 walsender 的套接字上的任何活动。因此,此提交将 WalReceiverWaitStart 等待事件的类型更改为 IPC。作者:藤井正雄 审查人:Kyotaro Horiguchi 讨论:https://postgr.es/m/cdacc27c-37ff-f1a4-20e2-ce19933abfcc@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/1e3e8b51bda8ddd59984230f876f199c9ce3166a
当 GetNewOidWithIndex() 多次未能找到未使用的 OID 时,进行日志记录。GetNewOidWithIndex() 逐个生成新的 OID,直到找到一个不在关系中的 OID。如果存在非常长的连续现有 OID,则 GetNewOidWithIndex() 需要在循环中迭代多次才能找到未使用的 OID。由于 TOAST 表可以有大量条目,并且可能存在此类长 OID 序列,因此存在需要多次迭代才能找到不在 TOAST 表中的新 OID 的情况。此外,如果所有 (即 2^32) OID 都已使用,则 GetNewOidWithIndex() 将进入类似忙循环的状态,并重复迭代,直到至少一个 OID 被标记为未使用。有一些报告的故障是由 GetNewOidWithIndex() 中大量的迭代引起的。例如,当向表中插入十亿条记录时,所有执行插入操作的后端在某个时刻都因 CPU 使用率 100% 而挂起。之前,没有简单的方法来检测 GetNewOidWithIndex() 多次未能找到未使用的 OID。因此,例如,需要获取挂起后端的 gdb 完整回溯,以便调查该问题。这很不方便,并且在某些生产环境中可能不可用。为了提供一种简便的方法,此提交使 GetNewOidWithIndex() 记录它迭代了超过 GETNEWOID_LOG_THRESHOLD 次数,但尚未在关系中找到未使用的 OID。此提交还使其以指数级增加的间隔重复日志记录,直到其迭代超过 GETNEWOID_LOG_MAX_INTERVAL,并使其最终每隔 GETNEWOID_LOG_MAX_INTERVAL 重复日志记录,除非找到未使用的 OID。使用这些宏变量是为了不使用类似的日志消息填充服务器日志。在 pgsql-hackers 的讨论中,还有另一个想法是通过等待事件报告 GetNewOidWithIndex() 中的大量迭代。但是,由于 GetNewOidWithIndex() 遍历索引以查找未使用的 OID,这将执行 I/O、获取锁等操作,这将覆盖等待事件并在完成后将其重置为空。因此该想法效果不佳,我们没有采用它。作者:Tomohiro Hiramitsu 审查人:Tatsuhito Kasahara、Kyotaro Horiguchi、Tom Lane、藤井正雄 讨论:https://postgr.es/m/16722-93043fb459a41073@postgresql.org https://git.postgresql.org/pg/commitdiff/7fbcee1b2d5f1012c67942126881bd492e95077e
将等待事件 WalrcvExit 重命名为 WalReceiverExit。提交 de829ddf23 添加了等待事件 WalrcvExit。但其名称与其他等待事件(如 WalReceiverMain 或 WalReceiverWaitStart 等)不一致。因此,此提交将 WalrcvExit 重命名为 WalReceiverExit。作者:藤井正雄 审查人:Thomas Munro 讨论:https://postgr.es/m/cced9995-8fa2-7b22-9d91-3f22a2b8c23c@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/84007043fc1b1be68dad5d0a78269347c12094b6
改进恢复期间的连接被拒绝错误消息。之前,当存档恢复或备用服务器启动并达到一致恢复状态但 hot_standby 配置为关闭时,客户端连接时的错误消息为“数据库系统正在启动”,这不必要的令人困惑,也不是很准确。此提交改进了恢复期间连接被拒绝的错误消息,如下所示,以便用户立即知道他们的服务器配置为拒绝这些连接。
如果禁用 hot_standby,则当客户端在存档恢复或备用服务器运行时连接时,会输出错误消息“数据库系统不接受连接”和详细消息“热备用模式已禁用”。- 如果启用 hot_standby,则当客户端在达到一致恢复状态且 postmaster 开始接受只读连接之前连接时,会输出错误消息“数据库系统尚未接受连接”和详细消息“尚未达到一致的恢复状态”。此提交不会更改正常服务器启动和崩溃恢复期间“数据库系统正在启动”的连接被拒绝错误消息。因为它仍然适用于这些情况。作者:James Coleman 审查人:Alvaro Herrera、Andres Freund、David Zhang、Tom Lane、藤井正雄 讨论:https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/df9384492b89aac370ab9d12eb89375aeb38a1d4
修复 WAL 重放 COMMIT_TS_SETTS 记录中的错误。之前,COMMIT_TS_SETTS 记录的 WAL 重放使用参数 write_xlog=true 调用 TransactionTreeSetCommitTsData(),这会生成并写入新的 COMMIT_TS_SETTS 记录。这是不可接受的,因为它是在恢复期间。此提交修复了 COMMIT_TS_SETTS 记录的 WAL 重放,使其使用 write_xlog=false 调用 TransactionTreeSetCommitTsData(),并且在恢复期间不生成新的 WAL。向后移植到所有受支持的分支。报告人:lx zou zoulx1982@163.com 作者:藤井正雄 审查人:Alvaro Herrera 讨论:https://postgr.es/m/16931-620d0f2fdc6108f1@postgresql.org https://git.postgresql.org/pg/commitdiff/438fc4a39c3905b7af88bb848bc5aeb1308a017d
Robert Haas 推送了代码
更多用于可配置 TOAST 压缩的代码清理。删除未使用的宏。修复关于 TOAST 压缩方法是由 OID 还是 char 标识的混淆。Justin Pryzby 讨论:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/226e2be3876d0bda3dc33d16dfa0bed246b7b74f
文档:修复与可配置 TOAST 压缩相关的遗漏。之前,default_toast_compression GUC 没有文档记录,pg_dump 的新 --no-toast-compression 选项也没有文档记录。Justin Pryzby 和 Robert Haas 讨论:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/24f0e395ac5892cd12e8914646fe921fac5ba23d
在 CREATE 或 ALTER TABLE 中对无效的 TOAST 压缩报错。之前的编码将无效的压缩方法名称视为等效于默认值,这当然是不对的。Justin Pryzby 讨论:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/a4d5284a10b5096585f1bbf1bf723954e9d6c2e0
改进 pg_amcheck 的 TAP 测试 003_check.pl。禁用自动清理,因为我们不希望它针对故意损坏的表运行。此外,在损坏表之前,运行 pg_amcheck 并确保它通过。否则,如果我们检查损坏的表时发生意外情况,就不清楚在损坏它们之前是否也会发生这种情况。Mark Dilger 讨论:http://postgr.es/m/AA5506CE-7D2A-42E4-A51D-358635E3722D@enterprisedb.com https://git.postgresql.org/pg/commitdiff/87d90ac61fa113ffc886efcdb391c522c1982991
整理与可配置 TOAST 压缩相关的更多细节。将 default_toast_compression GUC 更改为枚举而不是字符串。之前,该补丁的未提交版本支持使用 CREATE ACCESS METHOD 向正在运行的系统添加新的压缩方法,但该想法在提交之前被放弃了。因此,我们也可以简化 GUC 处理,这会带来改进错误消息的额外好处。在更新文档以反映新的 GUC 类型时,也将其移回列表中的正确位置。我在修改成为提交 24f0e395ac5892cd12e8914646fe921fac5ba23d 时移动了此项,但显然预期的顺序是“字母顺序”,而不是“罗伯特认为好看的顺序”。重新调整内容以避免 access/toast_compression.h 依赖于 utils/guc.h,这样我们最终不会让每个包含它的文件都依赖于一个很大程度上不相关的东西。将一些内联函数移回 C 源文件,部分是为了减少依赖关系,部分只是为了避免混乱。一些非常小的外观修复。原始补丁由 Justin Pryzby 提供,但我进行了大量编辑,并由他和 Tom Lane 进行了反向审查。讨论:http://postgr.es/m/CA+TgmoYp=GT_ztUCeZg2i4hkHAQv8o=-nVJ1-TKWTG1zQOmOpg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e5595de03ec6ce60afde980ae05e9353a1501fdf
修复 TOAST 压缩与表达式索引的交互。之前,尝试压缩一个值以插入表达式索引会导致崩溃。Dilip Kumar,由我进行了一些编辑。Jaime Casanova 报告。讨论:http://postgr.es/m/CAJKUy5gcs0zGOp6JXU2mMVdthYhuQpFk=S3V8DOKT=LZC1L36Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5db1fd7823a1a12e2bdad98abc8e102fd71ffbda
Tomáš Vondra 推送了
将 bsearch_arg 移动到 src/port。到目前为止,bsearch_arg 函数仅在扩展统计代码中使用,因此在该代码中定义。但是我们已经在 src/port 中有了 qsort_arg,所以让我们把它移到它旁边。https://git.postgresql.org/pg/commitdiff/bfa2cee784125047771db2768fcf7f04d8bd6bb4
一次将所有扫描键传递给 BRIN consistent 函数。此提交更改了我们将扫描键传递给 BRIN consistent 函数的方式。现在,我们不是一个接一个地传递它们,而是将给定属性的所有扫描键一次性传递。这使得 consistent 函数变得稍微复杂一些,因为它必须循环遍历键,但它确实允许更精细的操作符类使用多个键来更有效地消除范围。现有的 BRIN 操作符类(minmax、inclusion)实际上并没有从此更改中受益。主要目的是允许未来的操作符类从一次性查看所有键中受益。这确实改变了 BRIN API,因为 consistent 函数的签名发生了变化(一个新的参数,表示扫描键的数量)。所以这会破坏现有的操作符类,并且需要支持不同 PostgreSQL 版本的两种代码变体。我们曾考虑支持两种 consistent 变体,但我们决定不这样做。首先,还有另一个补丁将 NULL 值的处理从操作符类中移出,这意味着操作符类无论如何都需要更新。其次,我们没有意识到任何核心外的 BRIN 操作符类,因此似乎不值得增加额外的复杂性。由于 pg_proc 的更改,增加了 catversion。作者:Tomas Vondra tomas.vondra@postgresql.org 审阅人:Alvaro Herrera alvherre@alvh.no-ip.org 审阅人:Mark Dilger hornschnorter@gmail.com 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:John Naylor john.naylor@enterprisedb.com 审阅人:Nikita Glukhov n.gluhov@postgrespro.ru 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/a1c649d889bdf6e74e9382e1e28574d7071568de
从 BRIN 支持函数中移动 IS [NOT] NULL 处理。IS [NOT] NULL 子句的处理与操作符类无关,并且 minmax 和 inclusion 中的大部分代码都完全相同。因此,改为将代码从支持过程移动到 AM。这简化了代码,尤其是支持过程,因为它们根本不需要关心 NULL 值和标志。这也意味着可以在不调用支持过程的情况下评估 IS [NOT] NULL 子句。作者:Tomas Vondra tomas.vondra@postgresql.org 作者:Nikita Glukhov n.gluhov@postgrespro.ru 审阅人:Nikita Glukhov n.gluhov@postgrespro.ru 审阅人:Mark Dilger hornschnorter@gmail.com 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:Masahiko Sawada masahiko.sawada@enterprisedb.com 审阅人:John Naylor john.naylor@enterprisedb.com 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/72ccf55cb99c6450dfb77f2f8f4a28b5c049ef7a
优化 bringetbitmap 中的分配。bringetbitmap 函数为各种目的分配内存,这可能非常昂贵,具体取决于扫描键的数量。不要单独分配它们,而是分配一个内存位块,并根据需要将其分割成更小的片段 - 所有片段的生命周期都相同,并且可以节省相当多的 CPU 和内存开销。作者:Tomas Vondra tomas.vondra@postgresql.org 审阅人:Alvaro Herrera alvherre@alvh.no-ip.org 审阅人:Mark Dilger hornschnorter@gmail.com 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:Masahiko Sawada masahiko.sawada@enterprisedb.com 审阅人:John Naylor john.naylor@enterprisedb.com 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/8e4b332e88b8339408a3aa8c62bc93d96b67c808
使用统计信息种类的正确拼写。一些错误消息和注释使用了“statistic kind”,而不是正确的“statistics kind”。修复并向后移植到 10,其中引入了扩展统计信息。向后移植:10 https://git.postgresql.org/pg/commitdiff/a5f002ad9a2ddb501148a12281efbaacec6f6397
在引导中将 Typ 从数组转换为列表。与普通数组相比,释放和重新加载列表会更容易、更方便。当允许目录包含复合类型时,这将很有帮助。作者:Justin Pryzby 审阅人:Dean Rasheed、Tomas Vondra 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/e1a5e65703ce884529340819f6268d24f43ef8f7
允许在目录引导中使用复合类型。在目录引导期间解析类型时,如果未找到类型,请尝试重新加载 pg_type 内容。这允许目录包含复合类型,例如其他目录的行类型。作者:Justin Pryzby 审阅人:Dean Rasheed、Tomas Vondra 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/79f6a942bdb958fbd7ef6870d5bf2e3cefb65da5
删除不必要的 pg_amproc BRIN minmax 条目。BRIN minmax 操作符类包括具有不匹配的左右类型的 amproc 条目,但这些条目是不必要的。操作符类只需要跨类型运算符,而不需要跨类型支持过程。在尝试在扩展中定义等效的 BRIN 运算符族时发现。由于 pg_amproc 的更改,增加了 catversion。作者:Tomas Vondra 审阅人:Alvaro Herrera 讨论:https://postgr.es/m/78c357ab-3395-8433-e7b3-b2cfcc9fdc23%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/a68dfa27d42fb7b7611fd1206d2356fc124ed390
支持 BRIN consistent 函数的旧签名。提交 a1c649d889 通过添加新的必需参数更改了 BRIN consistent 函数的签名。将该参数视为可选参数,这将使更改向后不兼容,此想法被拒绝,理由是核心外扩展很少,因此不值得增加代码的复杂性,最好在扩展中处理。但经过进一步考虑,这将相当有问题,因为 pg_upgrade 只是转储目录内容,并且同一版本的扩展需要在两个 PostgreSQL 版本上工作。支持 consistent 函数的两种变体(带有 3 或 4 个参数)使之成为可能。签名不是唯一更改的内容,因为提交 72ccf55cb9 将 IS [NOT] NULL 键的处理从支持过程移开。但此更改是向后兼容的 - 在扩展中处理键是不必要的,但无害。consistent 函数将执行一些不必要的工作,但这应该非常便宜。这也撤消了对现有操作符类(minmax 和 inclusion)的大部分更改,使其再次使用旧签名。这应该使向后移植更简单。由于 pg_amproc 的更改,增加了 catversion。作者:Tomas Vondra tomas.vondra@postgresql.org 作者:Nikita Glukhov n.gluhov@postgrespro.ru 审阅人:Mark Dilger hornschnorter@gmail.com 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:Masahiko Sawada masahiko.sawada@enterprisedb.com 审阅人:John Naylor john.naylor@enterprisedb.com 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/a681e3c107aa97eb554f118935c4d2278892c3dd
BRIN 布隆索引。添加使用布隆过滤器汇总范围的 BRIN 操作符类。使用新的操作符类的索引仅允许等值查询(类似于哈希索引),但这对于 UUID、MAC 地址等不常见的范围查询的数据来说效果很好。这也意味着索引适用于与表中的物理位置没有很好关联甚至完全随机的数据(这是现有 BRIN minmax 操作符类的常见问题)。可以使用通常的布隆过滤器参数指定操作符类参数,即所需的假阳性率和每个页面范围的预期不同值数量。CREATE TABLE t (a int); CREATE INDEX ON t USING brin (a int4_bloom_ops(false_positive_rate = 0.05, n_distinct_per_range = 100)); 操作符类不直接对索引值进行操作,而是首先计算 32 位哈希值,并且布隆过滤器是基于哈希值构建的。但是,冲突不应该是一个大问题,因为页面范围中的不同值数量通常非常小。由于各种目录更改,增加了 catversion。作者:Tomas Vondra tomas.vondra@postgresql.org 审阅人:Alvaro Herrera alvherre@alvh.no-ip.org 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:Sokolov Yura y.sokolov@postgrespro.ru 审阅人:Nico Williams nico@cryptonector.com 审阅人:John Naylor john.naylor@enterprisedb.com 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com 讨论:https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/77b88cd1bb9041a735f24072150cacfa06c699a3
BRIN minmax-multi 索引。添加了类似于现有 minmax 的 BRIN 操作符类,但不是将页面范围汇总为单个 [最小值,最大值] 范围,而是将摘要由多个范围和/或点组成,允许存在间隙。这使得可以更有效地处理与表内的物理位置相关性较差的数据和/或异常值,对于这些数据,常规的 minmax 操作符类往往效果不佳。可以为每个页面范围指定保留的值的数量,可以是一个点或一个区间边界。CREATE TABLE t (a int); CREATE INDEX ON t USING brin (a int4_minmax_multi_ops(values_per_range=16)); 构建摘要时,将值组合成区间,目标是最小化“覆盖范围”(区间长度之和),使用计算两个值之间距离的支持过程。由于各种目录更改,需要升级 catversion。作者:Tomas Vondra tomas.vondra@postgresql.org 审阅人:Alvaro Herrera alvherre@alvh.no-ip.org 审阅人:Alexander Korotkov aekorotkov@gmail.com 审阅人:Sokolov Yura y.sokolov@postgrespro.ru 审阅人:John Naylor john.naylor@enterprisedb.com 讨论:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com 讨论:https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/ab596105b55f1d7fbd5a66b66f65227d210b047d
修复 BRIN minmax-multi 反序列化中的对齐问题。反序列化未能确保正确的对齐,因为它假设可以直接指向序列化的值。然而,序列化忽略了对齐,只复制了重要的字节,以使结果尽可能小。这导致在对未对齐地址敏感的系统(如 sparc)或启用了地址清理器的系统上出现故障。通过复制序列化的数据来确保正确的对齐来修复此问题。同时,修复了在 big endian 机器上的序列化问题,使用了与扩展统计信息相同的 store_att_byval/fetch_att 技巧。讨论:https://postgr.es/0c8c3304-d3dd-5e29-d5ac-b50589a23c8c%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/73b96bad4af8fd113a36e4633dd3312001c115dc
修复系统属性的 ndistinct 估计。当使用扩展统计信息估计组的数量时,代码会丢弃有关系统属性的信息。这导致了奇怪的情况,即 SELECT 1 FROM t GROUP BY ctid; 可能产生比 SELECT 1 FROM t GROUP BY a, b, ctid; 更高的估计值(等于 pg_class.reltuples),其中 (a,b) 上有扩展统计信息。通过保留有关系统属性的信息来修复此问题。回溯到引入扩展统计信息的 10 版本。作者:Tomas Vondra 回溯:10 https://git.postgresql.org/pg/commitdiff/33e52ad9a32929a6d14dfd98a8440d57028f2e3e
缩短 stats_ext 回归测试的持续时间。由于使用了相当大的数据集(有几千行),扩展统计信息的回归测试花费了相当多的时间。到目前为止,这还算可以,但是随着表达式统计信息的测试,持续时间会变得有点过长。因此,缩小一些将用于测试表达式的测试的大小,以控制持续时间。在添加表达式统计信息之前在单独的提交中完成,以明确哪些估计值预计会更改。作者:Tomas Vondra 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/98376c18f12e562421b5c77e619248e8b7aae3c6
表达式上的扩展统计信息。允许在表达式上定义扩展统计信息,而不仅仅是简单的列引用。通过此提交,所有现有的扩展统计信息类型都支持表达式,从而改进了相同类型的估计。一个简单的示例可能如下所示:CREATE TABLE t (a int); CREATE STATISTICS s ON mod(a,10), mod(a,20) FROM t; ANALYZE t; 收集的统计信息对于估计 WHERE 或 GROUP BY 子句中包含这些表达式的查询非常有用:SELECT * FROM t WHERE mod(a,10) = 0 AND mod(a,20) = 0;
SELECT 1 FROM t GROUP BY mod(a,10), mod(a,20); 这引入了一种新的内部统计信息类型“e”(表达式),当统计信息对象定义包含任何表达式时,会自动构建该类型。这表示单表达式统计信息,就像有一个表达式索引一样(但没有索引维护开销)。该统计信息以复合类型的数组形式存储在 pg_statistics_ext_data 中,这得益于 79f6a942bd。CREATE STATISTICS 允许在单个表达式上构建统计信息,在这种情况下,无法指定统计信息类型。一个新的系统视图 pg_stats_ext_exprs 可用于显示表达式统计信息,类似于 pg_stats 和 pg_stats_ext 视图。ALTER TABLE ... ALTER COLUMN ... TYPE 现在以与索引相同的方式处理索引,即它会删除并重新创建统计信息。这意味着所有统计信息都将被重置,并且我们不再尝试至少保留函数依赖关系。这在实践中应该不是一个主要问题,因为函数依赖实际上依赖于每个列的统计信息,而这些统计信息始终会被重置。作者:Tomas Vondra 审阅人:Justin Pryzby, Dean Rasheed, Zhihong Yu 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/a4d75c86bf15220df22de0a92c819ecef9db3849
使用其他排序规则稳定 stats_ext 测试。测试使用了字符串连接来测试表达式上的统计信息,但这使得测试依赖于区域设置,例如,因为 “11” 和 “1X” 的排序取决于排序规则。这会影响估计的行数和实际的行数,从而破坏一些测试。通过将字符串连接替换为 upper() 函数调用来修复此问题,这样文本值仅包含数字。讨论:https://postgr.es/m/b650920b-2767-fbc3-c87a-cb8b5d693cbf%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/2a058e938c73bfb85bbc9fa93dea74788043ca6c
Bruce Momjian 推送了更改
RelationIs*
宏匹配。此宏将在未来集群文件加密补丁中的更多地方使用。讨论:https://postgr.es/m/20210318153134.GH20766@tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/95d77149c53545a74e0c84717cf8f925b8f6d632Amit Kapila 推送了更改
修复 stream_cleanup_files 中的悬空指针引用。我们无法访问从 dynahash 中删除后的条目。作者:Peter Smith 讨论:https://postgr.es/m/CAHut+Ps-pL++f6CJwPx2+vUqXuew=Xt-9Bi-6kCyxn+Fwi2M7w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4b82ed6eca41220e50d4712ab929c20030b30d35
还原 “为 ‘INSERT INTO ... SELECT ...’ 启用并行 SELECT”。为了允许以并行模式插入,此功能必须确保分区层次结构的所有约束、触发器等都是并行安全的,这代价高昂,我们需要找到更好的方法来做到这一点。此外,在某些情况下,我们可以使用现有的缓存信息(如索引、域等)来确定并行安全性。反向时间顺序排列的已还原提交列表:ed62d3737c 文档:更新并行插入 reloption 的描述。c8f78b6161 添加新的 GUC 和 reloption 以启用并行模式的插入。c5be48f092 改进了由 05c8482f7f 添加的 FK 触发器并行安全性检查。e2cda3c20a 修复了由提交 05c8482f7f 引入的 relcache TriggerDesc 字段的使用。e4e87a32cc 修复了提交 05c8482f7f 中的 valgrind 问题。05c8482f7f 为 “INSERT INTO ... SELECT ...” 启用并行 SELECT。讨论:https://postgr.es/m/E1lMiB9-0001c3-SY@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/26acb54a1368bf3706294400abca85b15c9233a6
Peter Eisentraut 推送了更改
添加 bit_count SQL 函数。此函数用于位和 bytea,计算位或字节字符串中的设置位。在内部,我们使用现有的 popcount 功能。对于名称,经过一些讨论,我们最终确定为 bit_count,它在 MySQL、Java 和 Python 中也存在此含义。作者:David Fetter david@fetter.org 讨论:https://postgresql.ac.cn/message-id/flat/20201230105535.GJ13234@fetter.org https://git.postgresql.org/pg/commitdiff/a6715af1e72da289474011be1e2d536f991eda34
pgcrypto:检查 px_cipher_decrypt() 的错误返回。这以前不是问题(任何人都没有报告过),但是在未来的 OpenSSL 版本(3.0.0)中,当禁用/可以禁用旧密码时,这是报告此问题的地方。因此,我们需要在此处捕获错误,否则更高级别的函数将返回垃圾。附近的加密代码已经以类似的方式处理错误。审阅人:Daniel Gustafsson daniel@yesql.se 讨论:https://postgresql.ac.cn/message-id/9e9c431c-0adc-7a6d-9b1a-915de1ba3fe7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/22e1943f13b66df22ea4f8d15836411ba259263a
改进错误消息。使其与附近的其他消息相同。 https://git.postgresql.org/pg/commitdiff/1509c6fc29c07d13c9a590fbd6f37c7576f58ba6
添加 date_bin 函数。与 date_trunc 类似,但允许按任意间隔(而不仅仅是完整单位)进行分箱。作者:John Naylor john.naylor@enterprisedb.com 审阅人:David Fetter david@fetter.org 审阅人:Isaac Morland isaac.morland@gmail.com 审阅人:Tom Lane tgl@sss.pgh.pa.us 审阅人:Artur Zakirov zaartur@gmail.com 讨论:https://postgresql.ac.cn/message-id/flat/CACPNZCt4buQFRgy6DyjuZS-2aPDpccRkrJBmgUfwYc1KiaXYxg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/49ab61f0bdc93984a8d36b602f6f2a15f09ebcc7
修复多余的双分号。报告人:John Naylor john.naylor@enterprisedb.com https://git.postgresql.org/pg/commitdiff/37c99d304dcbf12ab581ff031f394af93b750895
文档:修复拼写错误。报告人:Erik Rijkers er@xs4all.nl https://git.postgresql.org/pg/commitdiff/5173e428928ce890be3e3d809b2d23d5f3c7da2f
重命名解析节点,使其更通用。WHERE 子句将用于逻辑复制中的行过滤。我们已经有一个类似的节点:'WHERE (这里是条件)'。让我们将该节点重命名为一个通用名称,并将其用于行过滤。作者:Euler Taveira euler.taveira@enterprisedb.com 讨论:https://postgresql.ac.cn/message-id/flat/CAHE3wggb715X+mK_DitLXF25B=jE6xyNCH4YOwM860JR7HarGQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/91d1f2d302108f49006eedb8053522236dde77cc
修剪解析器文件中多余的空格。 https://git.postgresql.org/pg/commitdiff/f2c7ce64ae9ba292c1846ae864cef1b8b37af1f3
提高 SQL 代码大小写的一致性。 https://git.postgresql.org/pg/commitdiff/8df2f371141ea267627364cd00e1791054d82d7e
Stephen Frost 推送了代码。
将 checkpoint_completion_target 的默认值更改为 0.9。 常见的建议是,检查点应尽可能分散,前提是避免花费时间过长。此更改将默认值更新为 0.9(从 0.5),以符合该建议。曾经有一些关于可能完全删除该选项的争论,但似乎在某些极端情况下,将其设置得低得多以尝试强制检查点尽快完成可能会减少由于内核刷新导致的性能降低的时间段。普遍的共识是,“分散更多”是首选方法,但是那些需要调整远离该值的人并不常见。复审人:Michael Paquier,Peter Eisentraut,Tom Lane,David Steele,Nathan Bossart 讨论:https://postgr.es/m/20201207175329.GM16415%40tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/bbcc4eb2e08fb6e4535c7f84b2c00f3ad508bb9b
doc: 将 TLS 定义为首字母缩略词。提交 c6763156589 为“TLS”添加了一个首字母缩略词引用,但从未添加定义。作者:Daniel Gustafsson 复审人:Michael Paquier 向后移植到:9.6 讨论:https://postgr.es/m/27109504-82DB-41A8-8E63-C0498314F5B0@yesql.se https://git.postgresql.org/pg/commitdiff/b64654d6c450eb9fb04c6e3456915790510af482
Michael Meskes 推送了代码。
向 ECPG 添加 DECLARE STATEMENT 命令。此命令为 SQL 语句声明一个 SQL 标识符,以便在其他嵌入式 SQL 语句中使用。该标识符链接到连接。作者:Hayato Kuroda kuroda.hayato@fujitsu.com 复审人:Shawn Wang shawn.wang.pg@gmail.com 讨论:https://postgresql.ac.cn/message-id/flat/TY2PR01MB24438A52DB04E71D0E501452F5630@TY2PR01MB2443.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/ad8305a43d1890768a613d3fb586b44f17360f29
需要在循环中向前移动才能到达末尾。 https://git.postgresql.org/pg/commitdiff/65c2ec6f30d9c0878a9ef83e0ec9a53e6b82d9d8
Álvaro Herrera 推送了代码。
删除 StoreSingleInheritance 的重新实现。我在提交 8b08f7d4820f 中引入了这段重复的代码,没有任何充分的理由。删除它,并向后移植到引入它的 11 版本。作者:Álvaro Herrera alvherre@alvh.no-ip.org https://git.postgresql.org/pg/commitdiff/a24ae3d7b9efb3b113c0d53030aa99de0d41b40a
重构 HeapTupleHeader 宏以重用 itemptr.h。原始定义毫无意义地忽略了执行相同操作的现有 ItemPointer 宏。报告人:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210222201557.GA32655@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/4669cacbd4b4b1baa1b7f2ea53d461433a1b6276
让 ALTER TABLE Phase 2 例程管理关系指针。结构 AlteredRelationInfo 获得一个新的 Relation 成员,仅供 Phase 2 (ATRewriteCatalogs) 使用;这允许 ATExecCmd() 子例程在内部打开和关闭关系。未来的提交将使用此功能来实现一个 ALTER TABLE 子命令,该子命令在事务边界之间关闭并重新打开关系。(可以将关系保持在第 2 阶段之后打开,以供第 3 阶段使用,而不必在该点重新打开,但这有一些小的复杂性;这样做似乎并没有什么好处。)作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/cd03c6e94b09ff402cbc3ce8da5587f09f0b5e58
为 AlteredTableInfo->rel 添加注释。之前的提交引入了它,但在代码文档方面非常糟糕,因此添加了一些注释。 https://git.postgresql.org/pg/commitdiff/cc121d5596964f8aac93607e6f14607184558b16
记录在分离分区期间获得的锁。在分离分区时,我们在所有引用我们要从中分离分区的分区表的表上获取 SHARE 锁,但未能记录此事实。我在提交 f56f8f8da6af 中的疏忽。修复。向后移植到 12。作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/20210325180244.GA12738@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/650d623530c884c087c565f1d3b8cd76f8fe2b95
ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY。允许从其分区表中分离分区,而不会阻止并发查询,方法是在两个事务中运行,并且仅需要在分区表中执行 ShareUpdateExclusive。由于它在两个事务中运行,因此不能在事务块中使用。这是使用专用语法的最主要原因:以便用户可以选择在需要时使用原始模式。而且,当存在默认分区时,它不起作用(因为仍然需要在其上获取排他锁,以便更改其分区约束。)如果第二个事务被取消或发生崩溃,则可以使用 ALTER TABLE .. DETACH PARTITION .. FINALIZE,它执行最后的步骤。使其工作的关键技巧是添加列 pg_inherits.inhdetachpending,最初为 false;只能在此命令的第一部分设置为 true。一旦提交了该命令,使用 PartitionDirectory 的并发事务将包括或忽略如此标记的分区:在优化器中,如果该行的快照标记为已提交,则会被忽略;在执行器中,它们始终会被包括在内。因此,并且由于 PartitionDirectory 缓存分区描述符的方式,在分离之前计划的查询将看到分离分区中的行,而在此之后计划的查询将看不到。创建了一个重复分区约束的 CHECK 约束。这可能不是绝对必要的,并且一些用户可能希望稍后将其删除,但是如果将分区重新附加到分区表,则无需重新检查约束。作者:Álvaro Herrera alvherre@alvh.no-ip.org 复审人:Amit Langote amitlangote09@gmail.com 复审人:Justin Pryzby pryzby@telsasoft.com 讨论:https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/71f4c8c6f74ba021e55d35b1128d22fb8c6e1629
Kyotaro HORIGUCHI 发送了另一个补丁的修订版,以使异步副本等待重放的 lsn。
Bharath Rupireddy 发送了一个补丁,以删除 BloomInitPage、GinInitPage 和 SpGistInitPage 中额外的 memset 调用。
Hou Zhijie 发送了另一个补丁的修订版,以避免在 INSERT INTO 引用表时在 RI 触发器中出现 CommandCounterIncrement。
Amul Sul 发送了另一个补丁的修订版,以构建将支持 ALTER SYSTEM READ {ONLY | WRITE} 的基础设施。
Amit Langote 发送了另一个补丁的修订版,以修复 UPDATE ... RETURNING 和在分区之间移动元组之间的不协调。
Greg Nancarrow 发送了另一个补丁的修订版,以启用 INSERT INTO 的并行 INSERT 和/或 SELECT。
Tang 发送了另一个补丁的修订版,以支持 psql 中大写字符输入的查询结果的制表符补全。
Tom Lane 发送了另一个补丁的修订版,以允许根据 SQL 标准将别名直接附加到 JOIN ... USING。
David Oksman 发送了一个补丁来实现 ALTER TABLE ... RENAME COLUMN IF EXISTS。
Andrei Zubkov 发送了两个补丁的修订版,以将语句条目时间戳添加到 pg_stat_statements。
Thomas Munro 发送了另一个补丁的修订版,为 psql 的 \watch 命令添加 PSQL_WATCH_PAGER。
Thomas Munro 发送了另一个补丁的四个修订版,以检测运行查询时掉线的连接。
Fujii Masao 发送了一个补丁,旨在修复一个错误,该错误在关闭时以备用机上断言失败的形式表现出来,方法是使启动进程在退出时调用 ShutdownRecoveryTransactionEnvironment()。
Peter Eisentraut 发送了另一个补丁的修订版,以添加 result_format_auto_binary_types 设置。
Jan Wieck 发送了另一个补丁的三个修订版,以修复 pg_upgrade 以保留 datdba。
Bertrand Drouvot 发送了另一个补丁的四个修订版,以在备用机上实现最小逻辑解码。
Pavel Stěhule 发送了另一个补丁的两个修订版,以实现模式变量。
Marcus Wanner 发送了另一个补丁的两个修订版,以向输出插件的 filter_prepare 回调添加 xid 参数。
Amul Sul 发送了另一个补丁的两个修订版,以添加 RelationGetSmgr() 内联函数。
Peter Smith 和 Amit Kapila 交换了补丁,以添加两阶段事务的逻辑解码。
Euler Taveira de Oliveira 和 Peter Eisentraut 交换了补丁,以添加逻辑复制的行过滤。
Kyotaro HORIGUCHI 发送了另一个补丁的修订版,以将统计信息收集器的临时存储从文件更改为共享内存。
Masahiro Ikeda 和 Fujii Masao 交换了补丁,以使 WAL 接收器报告 WAL 统计信息。
Bruce Momjian 和 Julien Rouhaud 交换了补丁,以在 pg_stat_activity、log_line_prefix 和 verbose explain 中公开 queryid。
Atsushi Torikoshi 发送了另一个补丁的四个修订版,以添加一个函数 pg_get_backend_memory_contexts(),该函数的作用正如其标签所说。
Daniel Gustafsson 发送了另一个补丁的两个修订版,以支持 NSS 作为 libpq TLS 后端。
Michaël Paquier 和 Jeevan Chalke 交换了补丁,以从所有身份验证后端记录身份验证的身份。
Stephen Frost 发送了另一个补丁的修订版,以将 WaitLatch 用于 vacuum/autovacuum 休眠。
Stephen Frost 提交了关于为现已废弃的 recovery.conf 添加文档存根的补丁的另外三个修订版本。
Justin Pryzby 提交了关于向 CREATE TABLE ... LIKE 添加可选的 ACCESS METHOD 的补丁的另一个修订版本。
Takayuki Tsunakawa 提交了关于加速远程分区情况下 COPY FROM 的补丁的另外两个修订版本。
Amit Langote 提交了关于在分区表中创建外键触发器,并使用它在跨分区更新期间正确强制执行外键的补丁的另一个修订版本。
David Rowley 提交了关于添加结果缓存执行器节点的补丁的另外两个修订版本。
李佳品提交了关于实现 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION 的补丁的另一个修订版本。
Tomáš Vondra 提交了一个修复操作符类存储类型的补丁。
Fujii Masao 提交了一个关于将 WalrcvExit wait_event 重命名为 WalReceiverExit 的补丁的另一个修订版本。
Andrey V. Lepikhov 提交了关于实现全局快照的补丁的另一个修订版本。
Atsushi Torikoshi 提交了关于向 pg_stat_statements 添加计划类型的补丁的另外两个修订版本。
Denis Hirn 提交了一个允许在 WITH RECURSIVE 中进行多个递归自引用的补丁。
Masahiro Ikeda 和 Fujii Masao 交换了补丁,使 pgstat 避免在 SIGQUIT 上写入。
Kyotaro HORIGUCHI 提交了关于保护 syscache 免受负缓存条目膨胀的补丁的另一个修订版本。
Hou Zhijie 提交了关于为 eval_const_expressions 添加 nullif 情况的补丁的另一个修订版本。
Mark Dilger 和 Robert Haas 交换了补丁,以添加 pg_amcheck contrib 应用程序。
Daniel Gustafsson 提交了关于重构 SSL 测试工具以允许多个库的补丁的另一个修订版本。
Pavel Stěhule 提交了关于添加例程标签的补丁的另外两个修订版本。
Thomas Munro 提交了关于使所有 SLRU 缓冲区大小可配置的补丁的另外四个修订版本。
Peter Geoghegan 和 Masahiko Sawada 交换了补丁,以集中每个 VACUUM 的状态,将 lazy_scan_heap() 分解为函数,从 vacuumlazy.c 中删除 tupgone 特殊情况,并在某些情况下跳过索引清理。
Kyotaro HORIGUCHI 提交了关于实现就地表持久性更改并添加一个新命令 ALTER TABLE ALL IN TABLESPACE SET LOGGED/UNLOGGED 的补丁的另一个修订版本,以配合它。
Ashutosh Bapat 提交了关于修复使用 TOAST 解码推测性插入时的内存泄漏的补丁的另一个修订版本。
Ekaterina Sokolova 提交了关于为嵌套循环的 explain 添加额外统计信息的补丁的另一个修订版本。
Pavel Borisov 提交了关于实现覆盖 SP-GiST 索引的补丁的另外两个修订版本,即支持 INCLUDE 列。
Marcus Wanner 为输出插件添加了 concurrent_abort 回调。
Joel Jacobson 提交了关于添加视图 pg_permissions 和 pg_ownerships 的补丁的另一个修订版本。
Bharath Rupireddy 提交了关于使向发布中添加表时的错误消息更具信息性和一致性的补丁的另一个修订版本。
Kyotaro HORIGUCHI 提交了另一个修订版本,旨在修复一个表现为 Walsender 可能无法将 wal 发送到末尾的错误。
Jim Finnerty 提交了关于添加 64 位 GUC 功能、使用 XID_FMT 格式化 xids 以及使用 ClogPageNumber 代替 int 来保证类型安全的补丁的另一个修订版本。
Sven Klemm 提交了一个允许 CustomScan 节点指示它们是否支持投影的补丁。
Andrew Dunstan 和 Nikita Glukhov 交换了补丁,以实现 SQL/JSON 的 JSON_TABLE 部分。
Andrew Dunstan 和 Nikita Glukhov 交换了补丁,以实现 SQL/JSON 的函数部分。
Amit Langote 和 Tom Lane 交换了补丁,通过改进更新计算新元组的方式,并修改如何处理继承的更新/删除,使继承树中的更新更好地扩展。
David Steele 提交了关于记录备份标签可能需要在 Windows 上以二进制模式打开的事实的补丁的两个修订版本。
Cai Mengjuan 提交了一个补丁,以便在每次请求 xlog 流式传输时更新 walrcv->flushedUpto。
Andrew Dunstan 提交了关于允许匹配来自客户端证书的整个 DN 的补丁的另一个修订版本。
Masahiro Ikeda 提交了一个补丁,以提高报告 wal 统计信息的性能。
Tomáš Vondra 提交了一个补丁,以在 explain 中显示应用的扩展统计信息。
Noah Misch 提交了关于添加公共模式默认 ACL 的补丁的另一个修订版本。
Lætitia Avrot 提交了关于使使用 pg_dump 仅转储函数的补丁的两个修订版本。
Noah Misch 提交了关于接受稍有填充的页面,用于大于 fillfactor 的元组的补丁的另一个修订版本。
Álvaro Herrera 提交了关于向 libpq 添加跟踪功能的补丁的另外两个修订版本。
Kazutaka Onishi 提交了关于使外表上的 TRUNCATE 工作正常的补丁的另一个修订版本。
Andrew Dunstan 提交了关于实现全局临时表的补丁的另一个修订版本。
Yoan SULTAN 提交了一个补丁,使 pg_stat_statements 能够跟踪最近的语句。
David Rowley 提交了关于从 valgrind 泄漏跟踪获得更好结果的补丁的另一个修订版本。