本周人物:https://postgresql.life/post/julien_riou/
为 PostgreSQL 设计的分页器 pspg 4.5.0 发布。 https://github.com/okbob/pspg/releases/tag/4.5.0
pgAdmin4 5.1,一个基于 Web 和原生 GUI 的 PostgreSQL 控制中心,已发布。 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 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 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 回归测试独立于默认设置。此测试在 "make installcheck" 时会失败,如果安装的 default_toast_compression 设置不是 'pglz'。使其能够应对这种情况。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 上最近的构建失败所证明的那样;这本应在配置时被捕获。模型对此问题的修复类似于 configure 的 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
移除无用的
对 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 在执行其最终的 smgrimmedsync 之前,未能确保目标关系在 smgr 级别已打开。在普通情况下这不成问题,因为它之前在重写过程中已打开。但是,通过启用 CLOBBER_ALWAYS 来重新聚类一个空表,可以重现崩溃。尽管在 v13 中确切的场景不会崩溃,但我认为这可能是其他规划器更改的偶然结果,并且问题很可能仍然可以通过其他测试用例触及。这个失败的真正直接原因是提交 c6b92041d,它用对 smgrimmedsync 的直接调用替换了对 heap_sync(它小心地打开 smgr)的调用。因此,回填到 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:处理有 bug 的 opclasses。教会 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 提交
修复 checkpoint 时 2PC 事务的时间线分配。在 checkpoint 时发现仍处于准备状态的任何事务,其状态数据将从 PREPARE TRANSACTION 生成的 WAL 记录中读取,然后再移动到 pg_twophase/ 中的新位置。读取这些记录时,WAL 读取器使用回调 read_local_xlog_page() 读取一个页面,该页面在系统各处共享。自 1148e22a 以来,此回调在恢复期间读取记录时会更新 ThisTimeLineID,这在级联 WAL 发送器的上下文中可能很有用。此 ThisTimeLineID 更新与检查点程序发生不良交互,如果在读取某些 2PC 数据时发生提升,则通过更改 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。此更新会这样做。在此期间简化了事情。根据 buildfarm 成员 fairywren。任何运行此测试的 Windows 主机都会失败,我也重现了这个问题。回填至:10 https://git.postgresql.org/pg/commitdiff/992d353a190c551db39bcab2dec0ecf14fbc7a40
修复 Windows 上 WAL 段回收的并发问题。此提交主要撤销了 aaa3aed,该提交曾切换例程以在 Windows 上使用 CreateHardLinkA() 加上 unlink() 而非 rename() 来重命名回收的 WAL 段。正如许多 Postgres 13 用户报告的那样,这导致了操纵 WAL 段时的并发问题,主要表现为以下错误:LOG:无法重命名文件 "pg_wal/000000XX000000YY000000ZZ":Permission denied。这回退到使用单一 rename()(在 Windows 上是 pgrename())的逻辑。我测试时发现这个问题很难复现,只碰到一次,那是因为 archive_command 未能完成其工作,所以它对环境很敏感。此问题的报告者已确认,当我们切换回单一 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
在 autovacuum 的详细日志中添加每个索引的统计信息。一旦一个关系(relation)的 autovacuum 完成,如果达到 log_autovacuum_min_duration(或其关系选项)的阈值,日志将包含有关该关系状态的更多信息,例如有关关系、WAL 和系统使用的 VACUUM 操作的统计信息。此提交添加了有关关系索引的统计信息的更多内容,每行日志对应一个索引。索引统计信息已经计算出来,但尚未在 autovacuum 上下文中打印。在此期间,进行了一些重构,以便直接在 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
稍微改写 autovacuum 中生成的索引统计日志。使用“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”一词。Combo CIDs 在代码注释中被引用时,在代码的不同地方使用了不同的术语,因此稍微统一一下术语,使其与 README 中使用的术语保持一致。作者:"Hou, Zhijie" 讨论: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
Fujii Masao 提交
pgbench:改进 \sleep 命令的错误处理。此提交改进了 pgbench 的 \sleep 命令,使其能够更正确地处理以下三种情况。(1)当 \sleep 命令只指定了一个参数且它不是数字时,之前 pgbench 会报告一个令人困惑的错误消息,如 "unrecognized time unit, must be us, ms or s"。此提交修复了这一点,从而报告了一个更正确的错误消息,如 "invalid sleep time, must be an integer"。(2)当 \sleep 命令指定了两个参数且第一个参数不是数字时,之前 pgbench 将该参数视为 sleep 时间 0。在这种情况下没有报告错误。此提交修复了这一点,从而在此情况下抛出错误。(3)当一个变量被指定为 \sleep 命令的第一个参数且变量存储了非数字值时,之前 pgbench 将该参数视为 sleep 时间 0。在这种情况下没有报告错误。此提交修复了这一点,从而在此情况下抛出错误。作者:Kota Miyake 审阅者:Hayato Kuroda、Alvaro Herrera、Fujii Masao 讨论:https://postgr.es/m/23b254daf20cec4332a2d9168505dbc9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8c6eda2d1c926be76baa79c28521275323bd26fd
pg_waldump:修复每条记录统计的 bug。pg_waldump --stats=record 通过 RmgrId 和记录的 xl_info 字段的四个比特位组合来标识一条记录。但是 XACT 记录使用这四个比特位中的第一个比特位作为可选标志变量,以及接下来的三个比特位作为操作码来标识一条记录。因此,之前同一类型的 XACT 记录可能具有不同的四个比特位(三个比特位相同,但第一个比特位不同),这可能导致 pg_waldump --stats=record 显示相同 XACT 记录的两次每条记录统计。这是一个 bug。此提交更改了 pg_waldump --stats=record,使其仅以不同的方式处理 XACT 记录,即过滤掉 xl_info 中的操作码,并仅将 RmgrId 和这三个比特位的组合用作 XACT 记录的标识符。对于其他记录,仍然使用 xl_info 字段的四个比特位。回填到所有支持的分支。作者:Kyotaro Horiguchi 审阅者:Shinya Kato、Fujii Masao 讨论:https://postgr.es/m/2020100913412132258847@highgo.ca https://git.postgresql.org/pg/commitdiff/51893c8463501fc9a38e39cc097773dbdfb9db82
将 WalReceiverWaitStart 等待事件的类型从 Client 更改为 IPC。以前此等待事件的类型是 Client。但是,当报告此等待事件时,walreceiver 进程正在等待 startup 进程设置流复制的初始数据。它没有等待连接到用户应用程序或 walsender 的套接字上的任何活动。因此,此提交将 WalReceiverWaitStart 等待事件的类型更改为 IPC。作者:Fujii Masao 审阅者: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 的过程中,需要进行很多次迭代。此外,如果所有 OID(即 2^32)都已被使用,GetNewOidWithIndex() 将进入类似忙循环的状态,并重复迭代,直到至少有一个 OID 被标记为未使用。曾报告过 GetNewOidWithIndex() 中大量迭代引起的一些问题。例如,在向表中插入十亿条记录时,所有执行此插入操作的后端都在某个时刻以 100% 的 CPU 使用率挂起。以前,没有简单的方法来检测 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、Fujii Masao 讨论:https://postgr.es/m/16722-93043fb459a41073@postgresql.org https://git.postgresql.org/pg/commitdiff/7fbcee1b2d5f1012c67942126881bd492e95077e
将 WalrcvExit 重命名为 WalReceiverExit。提交 de829ddf23 添加了等待事件 WalrcvExit。但其名称与其他等待事件(如 WalReceiverMain 或 WalReceiverWaitStart 等)不一致。因此,此提交将 WalrcvExit 重命名为 WalReceiverExit。作者:Fujii Masao 审阅者:Thomas Munro 讨论:https://postgr.es/m/cced9995-8fa2-7b22-9d91-3f22a2b8c23c@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/84007043fc1b1be68dad5d0a78269347c12094b6
改进恢复期间的连接拒绝错误消息。以前,当归档恢复或 standby 启动并达到一致的恢复状态但 hot_standby 配置为 off 时,当客户端连接时,错误消息是 "the database system is starting up"(数据库系统正在启动),这令人不必要地困惑,而且也不太准确。此提交改进了恢复期间的连接拒绝错误消息,如下所示,以便用户立即知道其服务器配置为拒绝这些连接。
如果 hot_standby 被禁用,当客户端在归档恢复或 standby 运行时连接,会输出错误消息 "the database system is not accepting connections"(数据库系统不接受连接)和详细消息 "Hot standby mode is disabled."(热 standby 模式已禁用)。* 如果 hot_standby 被启用,在达到一致的恢复状态并 postmaster 开始接受只读连接之前,当客户端连接时,会输出错误消息 "the database system is not yet accepting connections"(数据库系统尚未接受连接)和详细消息 "Consistent recovery state has not been yet reached."(尚未达到一致的恢复状态)。此提交不会更改正常服务器启动和崩溃恢复期间的连接拒绝错误消息 "the database system is starting up"(数据库系统正在启动)。因为它仍然适用于这些情况。作者:James Coleman 审阅者:Alvaro Herrera、Andres Freund、David Zhang、Tom Lane、Fujii Masao 讨论:https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/df9384492b89aac370ab9d12eb89375aeb38a1d4
修复 WAL 回放 COMMIT_TS_SETTS 记录中的 bug。以前,COMMIT_TS_SETTS 记录的 WAL 回放调用 TransactionTreeSetCommitTsData() 时参数 write_xlog=true,这会生成并写入新的 COMMIT_TS_SETTS 记录。这在恢复期间是不允许的。此提交修复了 COMMIT_TS_SETTS 记录的 WAL 回放,使其调用 TransactionTreeSetCommitTsData() 时参数为 write_xlog=false,并且在恢复期间不生成新的 WAL。回填到所有支持的分支。报告者:lx zou zoulx1982@163.com 作者:Fujii Masao 审阅者: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。禁用 autovacuum,因为我们不希望它在故意损坏的表上运行。另外,在损坏表之前,运行 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 的内容)时移动了它,但显然预期的顺序是“按字母顺序”而不是“Robert 认为看起来不错”。重新安排以避免 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 函数稍微复杂一些,因为它必须遍历键,但这确实允许更复杂的 opclasses 使用多个键来更有效地消除范围。现有的 BRIN opclasses(minmax、inclusion)并没有真正受益于此更改。主要目的是允许未来的 opclasses 从一次性看到所有键中获益。这会改变 BRIN API,因为 consistent 函数的签名发生了变化(增加了一个带有扫描键数量的新参数)。因此,这会破坏现有的 opclasses,并且将需要为不同的 PostgreSQL 版本支持两种代码变体。我们考虑过支持两种 consistent 的变体,但我们决定不这样做。首先,还有另一个补丁将 NULL 值的处理从 opclass 中移出,这意味着 opclasses 无论如何都需要更新。其次,我们不知道有任何“out-of-core”的 BRIN opclasses,所以它似乎不值得增加复杂性。由于 pg_proc 更改,版本号增加。作者: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
将 IS [NOT] NULL 处理从 BRIN 支持函数移出。IS [NOT] NULL 子句的处理独立于 opclass,并且大部分代码在 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
在 bootstrap 中将 Typ 从数组转换为列表。与普通数组相比,释放和重新加载 List 稍微容易和方便一些。当允许目录包含复合类型时,这将很有帮助。作者:Justin Pryzby 审阅者:Dean Rasheed、Tomas Vondra 讨论:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/e1a5e65703ce884529340819f6268d24f43ef8f7
允许在目录 bootstrap 中包含复合类型。在目录 bootstrap 期间解析类型时,尝试重新加载 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 opclasses 包含 amproc 条目,其左右类型不匹配,但这些条目碰巧是不必要的。opclasses 只需要交叉类型的运算符,而不是交叉类型的支持过程。在尝试在扩展中定义等效的 BRIN 运算符族时发现。由于 pg_amproc 更改,版本号增加。作者: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 函数的签名。将参数视为可选参数,这将使更改向后不兼容,但被拒绝的理由是“out-of-core”扩展很少,因此不值得增加代码的复杂性,最好是在扩展中处理。但经过进一步考虑,这可能相当麻烦,因为 pg_upgrade 只是转储目录内容,而同一版本的扩展需要在两个 PostgreSQL 版本上都能工作。支持 consistent 函数的两个变体(带 3 或 4 个参数)使这成为可能。签名不是唯一改变的,因为提交 72ccf55cb9 将 IS [NOT] NULL 键的处理从支持过程移出。但此更改向后兼容 - 在扩展中处理键是不必要的,但无害。consistent 函数会做一些不必要的工作,但应该很便宜。这也将撤销现有 opclasses(minmax 和 inclusion)的大部分更改,使它们再次使用旧签名。这应该使回填更简单。由于 pg_amproc 的更改,版本号增加。作者: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 bloom 索引。添加了一个使用 Bloom 过滤器来汇总范围的 BRIN opclass。使用新 opclasses 的索引只允许等值查询(类似于哈希索引),但这对于 UUID、MAC 地址等不常进行范围查询的数据来说效果很好。这也意味着这些索引可以用于与表中物理位置相关性不强,甚至完全随机的数据(这是现有 BRIN minmax opclasses 的常见问题)。可以通过普通的 Bloom 过滤器参数来指定 opclass 参数,即期望的误报率和每个页面范围的预期不同值数量。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)); opclasses 不直接操作索引值,而是先计算一个 32 位哈希值,然后对哈希值构建 Bloom 过滤器。不过,哈希冲突不应该是一个大问题,因为一个页面范围内不同值的数量通常相当小。由于各种目录更改,版本号增加。作者: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 opclasses,但不同之处在于,它不是将页面范围汇总为单个 [min,max] 范围,而是汇总为多个范围和/或点,允许出现间隙。这使得能够更有效地处理与表中物理位置相关性差和/或离群值的数据,而这些数据是常规 minmax opclasses 倾向于表现不佳的情况。可以指定每个页面范围保留的值的数量,作为单个点或区间边界。CREATE TABLE t (a int); CREATE INDEX ON t USING brin (a int4_minmax_multi_ops(values_per_range=16)); 在构建摘要时,将值组合成区间,目标是最小化“覆盖范围”(区间长度之和),使用计算两个值之间距离的支持过程。由于各种目录更改,版本号增加。作者: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)或启用地址消毒器时出现故障。通过复制序列化数据以确保正确的对齐来修复。同时,使用与扩展统计信息相同的 store_att_byval/fetch_att 技巧,修复了在 big endian 机器上进行序列化时出现的问题。讨论: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; 的估算值(等于 pg_class.reltuples)可能高于 SELECT 1 FROM t GROUP BY a, b, ctid;(在 (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'(表达式),当统计信息对象定义包含任何表达式时会自动构建。这代表了单表达式统计信息,就像有一个表达式索引(但没有索引维护开销)。由于 79f6a942bd,统计信息存储在 pg_statistics_ext_data 中,作为复合类型的数组。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 Doc:更新并行插入 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 函数。此函数用于 bit 和 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,但允许按任意区间进行分 bin,而不是仅按完整单位。作者: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
doc:修复拼写错误。报告者:Erik Rijkers er@xs4all.nl https://git.postgresql.org/pg/commitdiff/5173e428928ce890be3e3d809b2d23d5f3c7da2f
重命名一个解析节点使其更通用。WHERE 子句将用于逻辑复制中的行过滤。我们已经有一个类似的节点:'WHERE (condition here)'。让我们将该节点重命名为一个通用名称,并也用于行过滤。作者: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.5 更新为 0.9,以符合该建议。关于可能完全移除此选项有过一些争论,但似乎可能存在一些极端情况,其中将其设置得低得多以试图强制检查点尽快完成,可能导致因内核刷新而导致的性能降低的时间周期更少。普遍的共识是,“更分散”是首选方法,而那些需要调整该值的人则少得多。审阅者: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 例程管理 relation 指针。Struct AlteredRelationInfo 获得了一个新的 Relation 成员,仅供 Phase 2 (ATRewriteCatalogs) 使用;这允许 ATExecCmd() 的子例程在内部打开和关闭 relation。未来的提交将使用此功能来实现一个 ALTER TABLE 子命令,该子命令会在事务边界关闭并重新打开 relation。(可以将 relation 保持在 Phase 2 之后,供 Phase 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
记录在 partition detach 时获得的锁。在 partition detach 时,我们会在所有引用我们要分离分区的分区表的表上获取一个 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 将会包含或忽略标记为 true 的分区:在优化器中,如果行被标记为已提交给快照,则会被忽略;在执行器中,它们始终被包含。结果是,并且由于 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 提交了一个旨在修复 standby 在关闭时出现 Failed assertion 错误的补丁,方法是让 startup 进程在退出时调用 ShutdownRecoveryTransactionEnvironment()。
Peter Eisentraut 提交了另一个补丁修订版,添加了 result_format_auto_binary_types 设置。
Jan Wieck 提交了三个补丁修订版,用于修复 pg_upgrade 以保留 datdba。
Bertrand Drouvot 提交了四个补丁修订版,实现了在 standby 上的最小化逻辑解码。
Pavel Stěhule 发送了两个额外版本的补丁,用于实现模式变量。
Marcus Wanner 提交了两个补丁修订版,向 output 插件的 filter_prepare 回调添加了一个 xid 参数。
Amul Sul 提交了两个补丁修订版,添加了一个内联函数 RelationGetSmgr()。
Peter Smith 和 Amit Kapila 交换了补丁,以添加两阶段事务的逻辑解码。
Euler Taveira de Oliveira 和 Peter Eisentraut 交换了补丁,为逻辑复制添加了行过滤。
Kyotaro HORIGUCHI 提交了另一个补丁修订版,将 stats collector 的临时存储从文件更改为共享内存。
Masahiro Ikeda 和 Fujii Masao 交换了补丁,使 WAL 接收器报告 WAL 统计信息。
Bruce Momjian 和 Julien Rouhaud 交换了补丁,将 queryid 暴露在 pg_stat_activity、log_line_prefix 和 verbose explain 中。
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 提交了另外两版补丁,用于添加一个 Result Cache 执行器节点。
Li Japin 提交了另一版补丁,用于实现 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION。
Tomáš Vondra 提交了一版补丁,用于修复 opclass 存储类型。
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 特殊情况,并在某些情况下跳过索引 vacuuming。
Kyotaro HORIGUCHI 提交了另一版补丁,用于实现就地表持久性更改,并添加了一个新命令 ALTER TABLE ALL IN TABLESPACE SET LOGGED/UNLOGGED 来配合使用。
Ashutosh Bapat 提交了另一版补丁,用于修复在使用 TOAST 解码推测性插入时的内存泄漏。
Ekaterina Sokolova 提交了另一版补丁,为 Nested Loop 的 explain 添加了额外的统计信息。
Pavel Borisov 提交了另外两版补丁,用于实现覆盖式 SP-GiST 索引,即支持 INCLUDE 列。
Marcus Wanner 为输出插件添加了一个 concurrent_abort 回调。
Joel Jacobson 提交了另一版补丁,用于添加 pg_permissions 和 pg_ownerships 视图。
Bharath Rupireddy 提交了另一版补丁,使在将表添加到发布时的错误消息更加翔实和一致。
Kyotaro HORIGUCHI 提交了另一版意图修复 Walsender 可能无法发送 wal 到末尾的 bug 的补丁。
Jim Finnerty 提交了另一版补丁,用于添加 64 位 GUC 的功能,使用 XID_FMT 来格式化 xid,并使用 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 提交了一版补丁,用于提高 reporting wal stats 的性能。
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 内存泄漏跟踪结果。