2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 每周新闻 - 2021 年 8 月 1 日

發佈於 2021-08-02,作者 PWN
PWN

PostgreSQL 每周新闻 - 2021 年 8 月 1 日

PostgreSQL 相关新闻

Planet PostgreSQL:https://planet.postgresql.org/

本周 PostgreSQL 周报由 David Fetter 提供。

请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。

已应用补丁

Michaël Paquier 提交

David Rowley 提交

Tom Lane 提交

Dean Rasheed 已推送

  • 允許數值精度(scale)為負或大於精度(precision)。先前,在指定 NUMERIC(precision, scale) 時,scale 必須在 [0, precision] 範圍內,這符合 SQL 規範。此提交將允許的 scale 範圍擴展到 [-1000, 1000],獨立於 precision(precision 的有效範圍仍然是 [1, 1000])。負 scale 暗示在小數點前捨入。例如,一個欄位可能聲明為 scale -3,以四捨五入到最接近的千。請注意,顯示 scale 仍然是非負的,因此在此情況下顯示 scale 為零,並且將顯示小數點前的所有數字。大於 precision 的 scale 支持帶有小數點後零的分數值。藉此機會整理打包、解包和驗證 typmod 整數內容的程式碼,並將其封裝在一組新的內聯函數中。由於 numeric 欄位的 atttypmod 的允許內容已更改,因此增加 catversion。這不是一個需要 re-initdb 的變更,但 typmod 中的負 scale 值會讓舊後端感到困惑。Dean Rasheed,Tom Lane 進行了額外的改進。審閱者:Tom Lane 討論:https://postgr.es/m/CAEZATCWdNLgpKihmURF8nfofP0RFtAKJ7ktY6GcZOPnMfUoRqA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/085f931f52494e1f304e35571924efa6fcdc2b44

  • 修復 numeric_power() 中的邊界情況錯誤和精度損失。這修復了當將數字提升到非常大的次方時出現的幾個相關問題。首先,當將負數提升到非常大的整數次方時,結果應該是明確定義的,但以前的程式碼僅在指數足夠小以通過 power_var_int() 時才能處理。否則,它會嘗試取負數的對數,從而拋出內部錯誤。通過在 power_var() 的通用情況中新增適當的處理來解決此問題,以處理負底數,並在那裡檢查整數次方。接下來,當將絕對值略小於 1 的數字(正數或負數)提升到非常大的次方時,隨著次方的增加,結果應該趨近於零。然而,在某些情況下,對於足夠大的次方,這會導致所有精度丟失,並返回 1 而不是 0。這是由於 local_rscale 的計算方式(用於最終全精度計算):local_rscale = rscale + (int) val - ln_dweight + 8 右側的前兩項旨在提供結果所需的有效數字數量(「val」是估計結果的權重)。然而,這未能考慮 rscale 被限制為最大值 NUMERIC_MAX_DISPLAY_SCALE (1000),並且結果權重可能小於 -1000,導致它們的總和為負,從而導致精度丟失。通過強制計算的有效數字數量為非負數來解決此問題。它可以為零(當結果權重小於 -1000 時),因為 local_rscale 值包含一些額外的數字以確保準確的結果。最後,為 exp_var() 和 power_var() 新增了額外的下溢檢查,以便它們在結果與零無法區分的情況下一律返回零。此程式碼中的一些路徑已經在這種情況下返回零,但其他路徑則拋出了溢出錯誤。Dean Rasheed,由 Yugo Nagata 審閱。討論:http://postgr.es/m/CAEZATCW6Dvq7+3wN3tt5jLj-FyOcUgT5xNoOqce5=6Su0bCR0w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4dd5ce2fd9b9b2134886fee7fe4cb36d1988adb2

Tomáš Vondra 提交了

Álvaro Herrera 提交

Bruce Momjian 已推送

Andrew Dunstan 推送

Fujii Masao 提交

John Naylor 提交了

Daniel Gustafsson 提交

Amit Kapila 提交

Etsuro Fujita 推送

  • postgres_fdw:修復掛起異步請求的處理。掛起的異步請求由 process_pending_request() 處理,該函數先前不僅處理正在進行的遠端查詢,還執行 ExecForeignScan() 以產生一個元組,以便從遠端查詢的結果異步返回給本地伺服器。但這導致執行查詢時伺服器崩潰,或在執行 EXPLAIN ANALYZE 時導致「InstrStartNode 被連續呼叫兩次」或「InstrEndLoop 在運行節點上被呼叫」的失敗,情況是當其計畫樹包含多個訪問包含多個掃描相同遠端表的相同 initplan/subplan 的異步節點時,如同 Andrey Lepikhov 報告的那樣。原因是,當執行其中一個父異步節點的 initplan/subplan 時,process_pending_request() 中的第二步導致另一個父異步節點的 initplan/subplan 被遞迴執行。為了修復,請將 process_pending_request() 分為兩個步驟,並將第二步推遲到為每個掛起的異步請求呼叫 ForeignAsyncConfigureWait() 之後。此外,在 ExecAppendAsyncEventWait() 中,我們假設 FDW 會在該函數中從 ForeignAsyncConfigureWait() 呼叫時創建的 WaitEventSet 中註冊至少一個等待事件,但允許 FDW 註冊零個等待事件到 WaitEventSet 中;在此情況下,修改 ExecAppendAsyncEventWait() 以僅返回。提交 27e1f1456 的疏忽。向該提交進入的 v14 版本進行向後移植。Andrey Lepikhov 和 Etsuro Fujita 討論:https://postgr.es/m/fe5eaa19-1704-e4a4-76ee-3b9d37ade399@postgrespro.ru https://git.postgresql.org/pg/commitdiff/1ec7fca8592178281cd5cdada0f27a340fb813fc

Heikki Linnakangas 提交

Robert Haas 提交

  • 移除對 ReadCheckpointRecord() 的不必要呼叫。最後的檢查點記錄應該始終是可讀的,否則崩潰會使我們處於無法恢復的境地。因此,此補丁刪除的測試應該總是成功。要使其失敗,要麼是程式碼中存在嚴重的錯誤,要麼是使用者在崩潰恢復期間手動修改 pg_wal。如果是前者,我們應該修復該錯誤。如果是後者,他們應該停止,或者無論如何他們會自行承擔風險。在任何一種情況下,完全檢查而不是 end-of-recovery 記錄似乎都不是一個明確的贏家。此外,很少執行的程式碼路徑特別容易出錯,所以讓我們通過消除這個來簡化。討論:http://postgr.es/m/CA+TgmoYmw==TOJ6EzYb_vcjyS09NkzrVKSyBKUUyo1zBEaJASA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1d919de5eb3fffa7cc9479ed6d2915fb89794459

Jeff Davis 推送

待处理补丁

Bharath Rupireddy 送來了另一份補丁修訂,用於改進 publication 錯誤訊息,區分未記錄表和臨時表的錯誤訊息。

Daniel Gustafsson 发送了另一个版本的补丁,以支持 NSS 作为 libpq TLS 后端。

David Fetter 和 Greg Nancarrow 交換了補丁,以使用更少的指令來查找用於格式化整數的小數長度。

John Naylor 送來了另外兩份補丁修訂,以添加用於驗證 UTF-8 文本的快速路徑。

Justin Pryzby 和 Bharath Rupireddy 交換了補丁,以使在啟動過程中記錄事件成為可能。

Haiying Tang 和 Vigneshwaran C 交換了補丁,為 PUBLICATION 添加了模式級別的粒度。

Nathan Bossart 送來了另外兩份補丁修訂,以澄清 initdb --sync-only 的幫助訊息和文檔。

Amit Langote 发送了另一个版本的补丁,允许在跨分区更新期间批处理插入。

Andrey V. Lepikhov 发送了另一个版本的补丁,用于删除不必要的自连接。

David Rowley 送來了另一份補丁修訂,用於在 postgres_fdw 中為一些遠端 SQL 查詢添加 ORDER BY。

Peter Smith 送來了另一份補丁修訂,用於為邏輯複製添加行過濾。

Daniel Westermann 送來了一個修復拼寫錯誤的補丁。

Amit Langote 送來了一個補丁,用於在 src/backend/executor/nodeModifyTable.c:ExecInsert 中為計畫使用單獨的 tupledesc 結構。

Dagfinn Ilmari Mannsåker 送來了一個補丁,以符合 perlcritic 的要求,禁止在 void 上下文中 Map 和 grep。

Dipesh Pandit 送來了另一份補丁修訂,以減輕 WAL 歸檔器進行目錄掃描導致的性能問題。

Bertrand Drouvot 送來了另一份補丁修訂,以使備用伺服器能夠進行邏輯解碼。

Bharath Rupireddy 送來了另一份補丁修訂,用於為 `{pre, post}_auth_delay` 使用 WaitLatch。

Daniel Gustafsson 和 Jacob Champion 交換了補丁,以重構 sslfiles Makefile 目標。

Bruce Momjian 送來了四份補丁修訂,以修復 interval 算術處理中的一些問題。

Peter Smith 送來了另外兩份補丁修訂,以添加流式事務的 prepare API 支持。

Pavel Stěhule 送來了另一份補丁修訂,為 pg_dump 添加了 `--options-file` 選項和支持的機制。

Pavel Stěhule 送來了另一份補丁修訂,為 pg_dump 添加了過濾功能。

Pavel Stěhule 送來了另一份補丁修訂,以在 plpgsql 調試 API 中返回變數內容的文本值。

Michaël Paquier 送來了一個補丁,記錄 CREATE SEQUENCE 中的 RESTART,同時描述其行為與 START 一致。

Daniel Gustafsson 送來了另一份補丁修訂,以在 post-copy errmsg 中輸出命名空間。

Melanie Plageman 送來了一個補丁,用於 AIO bitmapheapscan 的 pgsr。

Yugo Nagata 送來了另一份補丁修訂,用於 pgbench,以防止其不必要地中止。

Amit Langote 送來了另一份補丁修訂,用於重構查詢關係權限檢查,將權限檢查信息從 range table 條目移動到名為 RelPermissionInfo 的新節點類型,從而避免了多次搜索 range tables。

Ronan Dunklau 送來了一個補丁,添加了 READ_REPLICATION_SLOT 命令,該命令將在物理複製連接的上下文中被使用,並在 pg_receivewal 中使用它來獲得更好的 start_lsn 估計值。

Daniil Zakhlystov 送來了一個補丁,添加了 zlib 和 zstd 流式壓縮,並在實現 libpq 壓縮時使用它們。

Hayato Kuroda 送來了一個補丁,將本地 pid 添加到 fallback_application_name。

Masahiko Sawada 送來了另外兩份補丁修訂,以在應用邏輯複製更改時添加 errcontext,添加 pg_stat_logical_replication_error 統計視圖,並向 ALTER SUBSCRIPTION 添加 skip_xid 選項。

Yura Sokolov 送來了一個補丁,向 bdbench 添加了 integerset2 實現,旨在改善惰性 vacuum 的死元組存儲。

RGU 送來了一個補丁,用於收集子問題頂層 scan/join rel 的部分路徑。

Dean Rasheed 送來了一個補丁,以避免 to_char 中出現不正確的除以零錯誤。

Prabhat Sahu 送來了一個補丁,為 prohibit_wal 添加了一個 TAP 測試。

John Naylor 送來了另一份補丁修訂,用於加速常見類型的元組排序。

Daniel Gustafsson 送來了另一份補丁修訂,以修復 pg_basebackup 和 pg_dump 中的 sscanf 限制,並修復了 TOC 文件錯誤消息打印中的一個錯誤,該錯誤表現為有時未能包含發生錯誤的文件名。

Tomáš Vondra 送來了另一份補丁修訂,以向邏輯複製添加序列操作。

Melanie Plageman 送來了另一份補丁修訂,以修復並行哈希連接批處理清理中的競態條件,澄清並行哈希連接階段的命名,並使全連接和右外連接能夠使用並行哈希。

Hou Zhijie 送來了一個補丁,移除了 maybe_send_schema 中未使用的參數。

David Rowley 和 Tomáš Vondra 交換了補丁,以使用生成上下文來加速 tuplesorts。

Álvaro Herrera 送來了另一份補丁修訂,以避免過早創建 archive status ".ready" 文件。

Heikki Linnakangas 送來了三份補丁修訂,以在 StartupXLOG() 中移動程式碼,將 xlog.c 分割為 xlog.c 和 xlogrecovery.c,並將應用一個 WAL 記錄的程式碼移至一個子程序。

Ajin Cherian 送來了一個補丁,通過更改測試以等待兩個訂閱都趕上後再檢查準備好的事務計數,從而修復了 021_twophase tap 測試中可能的失敗。

Gilles Darold 送來了另一份補丁修訂,添加了 regexp_count、regexp_instr 和 regexp_like 函數,並向 regexp_replace 和 regexp_substr 添加了新參數,以便指定位置和出現次數。

Tomáš Vondra 送來了另一份補丁修訂,以提高 slab 分配器的性能。

David Rowley 送來了另一份補丁修訂,用於在 RelOptInfo 中追蹤未剪除的分區,並在更多情況下允許有序分區掃描。

Vigneshwaran C 送來了另一份補丁修訂,在邏輯複製消息格式文檔中包含實際使用的數據類型。