PostgreSQL 每週新聞 - 2021 年 7 月 18 日

發佈於 2021-07-21 由 PWN
PWN

PostgreSQL 每週新聞 - 2021 年 7 月 18 日

本週人物

七月份的 PostgreSQL 工作

https://archives.postgresql.org/pgsql-jobs/2021-07/

PostgreSQL 新聞

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

PostgreSQL 每週新聞由 David Fetter 本週為您帶來

請在太平洋標準時間/太平洋夏令時間星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。

已套用的補丁

Michaël Paquier 推送了

  • pageinspect:改善 32kB 頁面的 page_header()。ld_upper、ld_lower、pd_special 和頁面大小一直使用 smallint 作為返回類型,對於配置為 32kB 頁面大小的版本,這可能導致這些欄位返回負值。將 pageinspect 升級到 1.10。當使用舊版本的擴充程式時,page_header() 能夠在運行時處理這些欄位的正確返回類型,並添加了一些測試來涵蓋這一點。作者:Quan Zongliang 審閱人:Michael Paquier、Bharath Rupireddy 討論:https://postgr.es/m/8b8ec36e-61fe-14f9-005d-07bc85aa4eed@yeah.net https://git.postgresql.org/pg/commitdiff/127404fbe28455d6e8183fa58f3b7aefeba8f909

  • 修正 Windows 的 stat() 針對待刪除檔案的問題。由 bed9075 引入的代碼,用於增強 Windows 上大於 4GB 檔案大小的 stat() 實現,無法正確檢測使用 NtQueryInformationFile() 或 GetFileInformationByHandleEx() 方法的待刪除檔案,正如 Alexander Lakhin 在他自己的自定義 TAP 測試中所證明的那樣。在 ERROR_ACCESS_DENIED (EACCES) 上失敗時,open() 實現中使用的休眠和迴圈方法顯示出更高的穩定性,因此切換到此方法。如果權限問題持續存在的時間遠遠超過使用的 1 秒超時時間,這仍然可能導致問題,但在效能關鍵路徑中應該(希望)永遠不會發生這種情況。儘管如此,為了處理重負載的機器,增加超時時間可能是有意義的。請注意,WIN32 的 open() 現在使用 microsoft_native_stat(),因為在解決併發檔案刪除問題時,它應該與 stat() 類似。我花了一些時間,將此補丁與 genfile.c 中的 SQL 函數結合使用 pgbench 進行測試,並在線程上使用 MSVC 版本運行提供的 TAP 測試,這看起來比以前的方法更穩定。作者:Alexander Lakhin 審閱人:Tom Lane、Michael Paquier、Justin Pryzby 討論:https://postgr.es/m/c3427edf-d7c0-ff57-90f6-b5de3bb62709@gmail.com 向後移植:14 https://git.postgresql.org/pg/commitdiff/54fb8c7ddf152629021cab3ac3596354217b7d81

  • 恢復 "修正 Windows 的 stat() 針對待刪除檔案的問題"。根據 fairywren 報告的關於 MinGW 因缺少 microsoft_native_stat() 而引起的問題,恢復提交 54fb8c7。僅使用 stat() 用於 MSVC 不足以解決待刪除檔案的併發問題。可以在代碼中繪製一些 MINGW64 以在此構建上下文中切換到 stat() 的不同實現,但我不確定是否依靠 MinGW 中的 stat() 實現來解決我們嘗試修復的問題是否足夠。所以這需要更多的研究。討論:https://postgr.es/m/YOvOlfRrIO0yGtgw@paquier.xyz 向後移植:14 https://git.postgresql.org/pg/commitdiff/2c9b46c090e76c62f24563b9be2c34e6b92e9329

  • 正確安裝 fe-auth-sasl.h。SASL 的前端回調的內部結構在 libpq-int.h 中可見,但標頭未被安裝。這將導致使用 libpq 內部結構的應用程式編譯失敗。問題在 9fd8557 中引入。作者:Mikhail Kulagin 審閱人:Jacob Champion 討論:https://postgr.es/m/05ce01d777cb$40f31d60$c2d95820$@postgrespro.ru https://git.postgresql.org/pg/commitdiff/6c9c2831668345122fd0f92280b30f3bbe2dd4e6

  • 刪除 postmaster.c 中不必要的斷言。一個代碼路徑斷言歸檔程式已死,但一個檢查使得不可能發生這種情況。作者:Bharath Rupireddy 討論:https://postgr.es/m/CALj2ACW=CYE1ars+2XyPTEPq0wQvru4c0dPZ=Nrn3EqNBkksvQ@mail.gmail.com 向後移植:14 https://git.postgresql.org/pg/commitdiff/dc2db1eac365b97c9129393acfe11102859f9e23

  • 為 pg_receivewal 的 ZLIB 壓縮添加 TAP 測試。在 pg_receivewal 中,有大量的代碼處理 ZLIB 壓縮,從格式名稱等基礎知識,到開始流位置的計算,當然還有壓縮本身,但沒有自動化的覆蓋。此提交引入了一組有條件的測試(如果構建支援 ZLIB)來涵蓋 ZLIB 壓縮 WAL 段的創建、部分壓縮 WAL 段的處理以及壓縮操作本身。請注意,有一個額外的階段,通過直接使用 gzip 命令來檢查生成檔案的有效性,該命令由 pg_receivewal 的 Makefile 傳遞下來。如果找不到該命令,則會跳過此部分,這很可能在 Windows 上使用 MSVC 發生,除非在測試環境中設置變數 GZIP_PROGRAM。這組測試對於即將推出的補丁將變得方便,這些補丁為 pg_receivewal 使用的壓縮方法添加了更多選項,例如 LZ4,以確保沒有現有的設施被破壞。作者:Georgios Kokolatos 審閱人:Gilles Darold、Michael Paquier 討論:https://postgr.es/m/07BK3Mk5aEOsTwGaY77qBVyf9GjoEzn8TMgHLyPGfEFPIpTEmoQuP2P4c7teesjSg-LPeUafsp1flnPeQYINMSMB_UpggJDoduB5EDYBqaQ=@protonmail.com https://git.postgresql.org/pg/commitdiff/ffc9ddaea33f6dfd3dfa95828a0970fbb617bf8a

  • 修正 pg_receivewal 的 TAP 測試中 gzip 的可移植性問題。gzip 的 OpenBSD 實現僅將以 "Z"、"gz"、"z"、"tgz" 或 "taz" 為後綴的檔案視為有效目標,丟棄其他任何內容,並且如果找到任何無效的檔案,則使用 --test 退出命令並返回錯誤代碼 512。在 ffc9dda 中引入的測試測試了一個以 .gz.partial 為後綴的 WAL 段,足以使測試失敗。就覆蓋範圍而言,僅測試完整段就足夠了,因此通過在此檢查中丟棄 .gz.partial 段來簡化代碼。這應該足以使測試在 OpenBSD 環境中通過。根據 curculio 的報告。討論:https://postgr.es/m/YPAdf9r5aJbDoHoq@paquier.xyz https://git.postgresql.org/pg/commitdiff/0da3c1bc3f7261d5157f5b86ade88e8b379f8686

  • 針對 pg_receivewal,在 Windows 上停用涉及 ZLIB 的測試。正如 buildfarm 成員 bowerbird 所報告,這些測試在 Windows 上不穩定。那裡產生的失敗指向 gzflush() 的問題,該函數無法同步新開啟的檔案與正確開啟的 gzFile。當我自己使用 MSVC 測試這個問題時,我遇到了一個不同的錯誤,其中一個檔案根本無法開啟,因此我相當懷疑在 Windows 上測試這個區域是否是一個好主意,如果這最終會導致隨機的並行失敗。這需要更多的調查,並且讓這個 buildfarm 成員長期處於紅色狀態不是一件好事,所以目前這只是在 Windows 上停用這組測試。討論:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz https://git.postgresql.postgresql.org/pg/commitdiff/6cea447e6a10cd7ef511470e809a894a013e6a18

Heikki Linnakangas 推送了

Peter Eisentraut 推送了

Tom Lane 推送了

Thomas Munro 推送了

David Rowley 推送了

Amit Kapila 推送了

  • 為內建邏輯複製添加對準備好的交易的支援。 為了在準備時將交易流式傳輸到內建邏輯複製中,我們需要執行以下操作:* 修改輸出外掛程式 (pgoutput) 以實作新的雙階段 API 回呼,方法是利用擴展複製協定。 * 修改複製應用工作程序,以透過在準備時重播它們來正確處理雙階段交易。 * 添加一個新的 SUBSCRIPTION 選項 "two_phase",以允許使用者啟用雙階段交易。 我們在初始資料同步完成後啟用 two_phase。 但是,我們必須明確禁用在複製槽建立期間複製雙階段交易,即使外掛程式支援它。 我們不需要複製在此階段累積的變更,而且我們沒有開啟複製連線,因此我們不知道將資料發送到哪裡。 streaming 選項不允許使用這個新的 two_phase 選項。 這可以作為一個單獨的修補程式完成。 我們不允許切換訂閱的 two_phase 選項,因為它可能導致不一致的副本。 出於同樣的原因,我們不允許在訂閱啟用 two_phase 後刷新發布,除非 copy_data 選項為 false。 作者:Peter Smith、Ajin Cherian 和 Amit Kapila 基於 Nikhil Sontakke 和 Stas Kelvich 的先前工作 審閱人:Amit Kapila、Sawada Masahiko、Vignesh C、Dilip Kumar、Takamichi Osumi、Greg Nancarrow 測試人:Haiying Tang 討論:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru 討論:https://postgr.es/m/CAA4eK1+opiV4aFTmWWUF9h_32=HfPOW9vZASHarT0UA5oBrtGw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a8fd13cab0ba815e9925dc9676e6309f699b5f72

Magnus Hagander 推送了

John Naylor 推送了

Dean Rasheed 推送了

Alexander Korotkov 推送了更新

Daniel Gustafsson 推送了更新

Álvaro Herrera 推送了更新

待處理的修補程式

David Rowley 發送了另一個修訂版的修補程式,以追蹤新增到 RelOptInfo 結構的 Bitmapset 中的未修剪分割區,並允許在更多情況下進行排序的分割區掃描。

Hayato Kuroda 發送了另一個修訂版的修補程式,以修復 ECPG 中的 DEALLOCATE 和 DESCRIBE。

David Rowley 發送了另一個修訂版的修補程式,以加速在事務中存取多個關係之後的事務完成。

侯志傑發送了另一個修訂版的修補程式,使其可以在寫入的內容中使用並行操作。

Rahila Syed 發送了另兩個修訂版的修補程式,使其可以按欄位篩選邏輯複製。

Álvaro Herrera 發送了一個修補程式,旨在修復一個錯誤,該錯誤表現為插入到分割區中時,未更新分割區檢查。

Jeevan Ladhe 發送了兩個修訂版的修補程式,以在錯誤訊息中指定 pg_upgrade 中哪些資料庫發生了錯誤。

Magnus Hagander 發送了另一個修訂版的修補程式,以新增對 PROXY 協定的支援。

Bharath Rupireddy 發送了一個修補程式,以使用 WaitLatch 作為 {pre, post}_auth_delay,而不是 pg_usleep。

Vigneshwaran C 發送了三個修訂版的修補程式,以將架構層級的粒度新增到 PUBLICATION。

John Naylor 發送了四個修訂版的修補程式,以加速驗證 UTF-8。

David Rowley 發送了四個修訂版的修補程式,以新增對 ORDER BY / DISTINCT 聚合的適當計畫器支援。

Ronan Dunklau、David Rowley 和 Ranier Vilela 交流了補丁,以便在 ExecSort 中使用最佳化的單一資料元組排序 (single-datum tuplesort)。

Masahiro Ikeda 送出了兩個修訂版本的補丁,以修正 heap_prune_chain() 中的一些錯誤註解。

Alexander Lakhin 送出了另一個修訂版本的補丁,旨在修復一個在 Win32 上表現為花費更多時間在「delete pending」中的錯誤。

Tom Lane 送出了另一個修訂版本的補丁,以減少 pending inval 訊息的記憶體消耗。

Peter Smith 送出了一個補丁,以避免不必要地呼叫 PGserverVersion。

Craig Ringer 送出了一個補丁,教導 pgflex.pl 和 pgbision.pl 讀取 buildenv.pl 以取得工具名稱,並在 config.pl 中支援額外的前置處理器定義。

Maxim Orlov 送出了另一個修訂版本的補丁,以修復平行 worker 的 failed assertion 和核心轉儲 (core dump)。

Tom Lane 送出了另一個修訂版本的補丁,旨在修復一個在不同 DB 定序 (collation) 的資料表上使用 merge join,並透過 postgres_fdw 時發生的錯誤。

Peter Smith 和 Euler Taveira de Oliveira 交流了補丁,以新增邏輯複製的列篩選功能。

Ian Barwick 送出了一個補丁,以文件化 pg_encoding_to_char() 和 pg_char_to_encoding()。

Fabien COELHO 送出了另一個修訂版本的補丁,將 psql 的 echo 程式碼提取出來。

Heikki Linnakangas 送出了另一個修訂版本的補丁,以重構 LogicalTapeSet/LogicalTape 介面,使其不再需要預先知道將建立多少磁帶,並將多相合併演算法替換為簡單的平衡 k 路合併。

Heikki Linnakangas 送出了另一個修訂版本的補丁,為了安全性和清晰度移動了一些 ResourceOwnerEnlarge() 呼叫,使 resowners 更容易擴展,並最佳化了其中使用的雜湊函數。

Daniil Zakhlystov 送出了另一個修訂版本的補丁,以一般性地新增 zlib 和 zstd 串流壓縮,然後使用此基礎架構將其新增到 libpq。

Zhihong Yu 送出了兩個修訂版本的補丁,以 pfree() 一個 palloc() 字符串。

Ajin Cherian 送出了另一個修訂版本的補丁,以跳過邏輯複製的空交易。

Kyotaro HORIGUCHI 送出了另一個修訂版本的補丁,以嚴格檢查命令列和環境變數中的數值參數,並記錄這些變更對 PGCTLTIMEOUT 的影響。

Hou Zhijie 送出了一個補丁,以避免在 pg_dump 中重複呼叫 PQfnumber。

Gilles Darold 又送出了兩個修訂版本的補丁,允許透過 xact 註冊的回呼 (callback) 在任何命令開始時執行使用者定義的程式碼。

Peter Smith 送出了另一個修訂版本的補丁,以新增對串流交易的 prepare API 支援。

Huailing Liu 送出了一個補丁,以移除令人困惑的 SI inval。

Kyotaro HORIGUCHI 送出了另一個修訂版本的補丁,以從 XLogReadRecord 中移除 read_page 回呼。

Heikki Linnakangas 送出了另一個修訂版本的補丁,以新增 GIN 的 amcheck。

enis Hirn 送出了另一個修訂版本的補丁,以允許通用資料表表達式 (common table expressions) 中存在多個線性遞迴的自我引用。

Haiying Tang 送出了一個補丁,以收緊 psql tab-completes 的幫助輸出。

Vigneshwaran C 送出了另一個修訂版本的補丁,以在 CREATE/ALTER SUBSCRIPTION 期間識別 publisher 中遺失的 publication。

Arne Roland 送出了另一個修訂版本的補丁,以遞迴方式重新命名分割資料表上的觸發程序 (trigger)。

Andrey V. Lepikhov 送出了另一個修訂版本的補丁,教導最佳化器考慮非分割資料表與分割資料表的每個分割區進行 partitionwise join,並禁止使用非對稱機制來連接兩個分割(或附加)關係,因為這可能會在 NestLoop 路徑的重新參數化期間導致 CPU 和記憶體的巨大消耗。

Bharath Rupireddy 送出了另一個修訂版本的補丁,以消除使用「non-negative」的錯誤訊息的歧義。

Magnus Hagander 送出了一個補丁,用其 git 修訂版本標記 tarball。

Andrey V. Lepikhov 送出了另一個修訂版本的補丁,如果可以證明可以使用掃描替換 join,則移除關係到自身 (relation to itself) 的內部 join。

Ryohei Takahashi 送出了兩個修訂版本的補丁,以加速 COMMIT PREPARED。

Mark Dilger 送出了一個補丁,以停止忽略檔案關閉時的失敗。

Justin Pryzby 又送出了兩個修訂版本的補丁,以新增新的 metacommands \dn+ 來顯示每個 schema 的大小,並新增 \dA+ 來顯示 AM。

Aleksander Alekseev 送出了另一個修訂版本的補丁,以重構 procarray。

Yugo Nagata 送出了另一個修訂版本的補丁,以修復表現為 pgbench 錯誤和序列化/死鎖重試的錯誤。

Justin Pryzby 送出了另一個修訂版本的補丁,以支援 ALTER TABLE ... ACCESS METHOD,並允許指定分割資料表的存取方法 (access methods) 由分割區繼承。

Dilip Kumar 在 src/backend/replication/basebackup_gzip.c 中新增了一個遺失的 bbsink_forward_end_archive(sink)。

Kyotaro HORIGUCHI 送出了一個補丁,以修復 char-mapping 表格中的一些重複錯字。

Bertrand Drouvot 送出了另一個修訂版本的補丁,以在 standby 上實作最小邏輯解碼 (minimal logical decoding)。

Li Japin 和 Amit Kapila 交流了補丁,以禁止將複製槽 (replication slot) 名稱設定為空字串。

Ranier Vilela 送出了一個補丁,以取消 shadow 一些變數,並減少現代編譯器發出的 -Wsign-compare 警告。

Vigneshwaran C 送出了另一個修訂版本的補丁,以包含邏輯複製訊息描述中使用的實際資料類型。

James Coleman 送出了另一個修訂版本的補丁,以允許帶有 LIMIT/OFFSET 的平行 LATERAL 子查詢。

Dinesh Chemuduru 送出了一個補丁,以將新的診斷工具 PG_PARSE_SQL_STATEMENT 和 PG_PARSE_SQL_STATEMENT_POSITION 新增到 PL/pgsql。

Andrew Dunstan 又送出了三個修訂版本的補丁,以清理 PostgresNode.pm。

Álvaro Herrera 和 Ranier Vilela 交流了補丁,以從 slot.c 中移除一個毫無意義的 strlen。

Kyotaro HORIGUCHI 又送出了兩個修訂版本的補丁,使 FPI_FOR_HINT 遵循標準的 FPI 發射策略 (emitting policy)。

Yugo Nagata 送出了一個補丁,旨在修復一個在腳本開始時準備命令而不是在第一次執行命令時準備命令時表現為 bug 的錯誤。

Soumyadeep Chakraborty 送出了另一個修訂版本的補丁,透過使用 pgprocno 引用目標程序,從而避免掃描 ProcArray 並追蹤啟動程序,從而使 ProcSendSignal() 更有效率。

Yugo Nagata 和 Ranier Vilela 交流了補丁,旨在修復一個表現為 WAL 頁面標頭損壞永遠不會被報告的錯誤。

Atsushi Torikoshi 送出了一個補丁,以記錄執行 pg_import_system_collations() 的必要超級使用者權限。

Peter Smith 送出了一個補丁,以防止使用 strcpy 到 gid 緩衝區時可能發生的緩衝區溢位。

鳥越 淳 (Atsushi Torikoshi) 送出了另一個修補程式版本,該修補程式會新增一個函式,以記錄完整查詢字串及其在後端上針對指定程序 ID 正在執行的查詢計畫。