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

發布於 2021-07-05,作者 PWN
PWN

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

恭喜新的 PostgreSQL 提交者 Daniel Gustafsson 和 John Naylor!

PostgreSQL 產品新聞

pg_dumpbinary 2.4 發布,這是一個用於以二進制格式轉儲 PostgreSQL 資料庫的程式。 https://github.com/lzlabs/pg_dumpbinary/releases/

七月份的 PostgreSQL 職缺

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

PostgreSQL 新聞

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

本週的 PostgreSQL 每週新聞由 David Fetter 帶給您

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

已套用的修補程式

Michaël Paquier 推送了

Thomas Munro 推送了

Amit Kapila 推送了

Peter Eisentraut 推送了

Andrew Dunstan 推送了

Peter Geoghegan 推送了

Tom Lane 推送了

  • 不要在 pgbench 的 random() 函數中依賴 -fwrapv 語意。 而是使用 common/int.h 函數以更符合 C 標準的方式檢查整數溢位。 這是由於最近在 buildfarm 成員 moonjelly 上的失敗,其中開發版本的 gcc 似乎在優化時沒有考慮 -fwrapv 參數。 據推測,這是一個 gcc 錯誤,很快就會修復,但我們最好在此處安裝更乾淨的程式碼,而不是等待。(這並沒有解決我們是否能夠擺脫使用 -fwrapv 的問題。測試表明,這個位置是唯一一個這樣做會產生可見回歸測試失敗的地方,但不幸的是,這證明不了什麼。) 回溯修補至 v12。 common/int.h 函數存在於 v11 中,但該分支沒有在任何客戶端程式碼中使用它們。 我判斷這種情況在現實世界中不夠有趣,即使承擔來自首次使用的微小風險。 Tom Lane 和 Fabien Coelho 討論:https://postgr.es/m/73927.1624815543@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/01697e92a460b10fde43707b29391c8deb69573e

  • 不要在 libpq 的 fe-print.c 中使用 abort(3)。 在記憶體不足時導致核心轉儲似乎非常不友善,並且肯定遠遠超出了一般用途庫的預期行為。 只需列印錯誤訊息(就像我們已經做的那樣)並返回。 這些函數不幸地沒有錯誤返回慣例,但是使用它們的程式碼可能只是在尋找一種快速而骯髒的列印方法,而懶得檢查。 儘管這些函數已半棄用,但回溯修補此問題似乎仍然是合適的。 順便說一句,也回溯修補 b90e6cef1,只是為了減少分支之間的表面差異。 討論:https://postgr.es/m/3122443.1624735363@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6f5d9bce57a7bb29ba61f0bf4fd465a26de9fc28

  • 文件:RELEASE_CHANGES 程序筆記的進一步更新。 提及在建立或停用分支時,適當清單的電子郵件通知的期望。(多年來我一直在非正式地這樣做,但最好將其寫下來。) https://git.postgresql.org/pg/commitdiff/14b2ffaf7ffdd199937e8bcba8b459da5491bcb6

  • 移除 libpq 對 abort(3) 的使用,以處理互斥鎖失敗的情況。 在開發版本中執行 abort() 似乎是可以的,但在通用庫的生產版本中則不然。 但是,執行此操作的函數缺乏將失敗報告回其呼叫者的任何方式。 似乎我們可以忽略生產版本中的失敗,因為 (a) 在程式碼存在 12 年的時間裡,沒有報告過此類失敗,並且 (b) 在 fe-auth.c 操作期間未能強制執行互斥鎖在大多數情況下可能不會引起任何問題。(使用此巨集的 OpenSSL 回呼已過時,因此更不可能引起有趣的問題。) 一個可能更好的答案是打破 pgthreadlock_t 回呼 API 的相容性,但在沒有現場問題報告的情況下,似乎真的不值得費心。 討論:https://postgr.es/m/3131385.1624746109@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aaddf6ba09e25878e792f0d15f725370e19396df

  • 新增一個建置時檢查,以確保 libpq 不會呼叫 exit() 或 abort()。 對於通用庫來說,直接退出或中止似乎不太好。 現在 libpq 自由地使用 src/common/ 中的位元,很容易意外地包含程式碼,這些程式碼會在 OOM 後執行一些不需要的操作,例如呼叫 exit(1) --- 例如 8ec00dc5c。 因此,新增一個簡單的交叉檢查,以確保沒有此類呼叫進入 libpq.so。 交叉檢查取決於 nm(1) 的可用性以及在共享函式庫上工作的能力,這可能並非在所有地方都成立。 但是,如果 nm 失敗,我們可以讓測試靜默地不執行任何操作。 只要檢查在通用平台上有效,就應該足夠了。(按照同樣的邏輯,我沒有擔心在 MSVC 建置中提供等效的測試。) 討論:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/dc227eb82ea8bf6919cd81a182a084589ddce7f3

  • 修正報告雜湊分割區衝突時的錯誤邏輯。 Commit efbfb6424 增加了邏輯,用於精確報告當新的雜湊分割區的模數與現有分割區不相容時,究竟是哪個現有分割區發生衝突。 然而,它誤解了分割區資料結構,在某些情況下會選擇錯誤的分割區,或者因為提取了錯誤的表格 OID 而直接崩潰。 根據 Alexander Lakhin 提出的錯誤 #17076。 由 Amit Langote 修正;我對程式碼註解做了一些進一步的工作。 討論:https://postgr.es/m/17076-89a16ae835d329b9@postgresql.org https://git.postgresql.org/pg/commitdiff/dd2364ced98553e0217bfe8f621cd4b0970db74a

  • 修正 Commit dc227eb82 造成的移植性問題。 放棄在 libpq 中機械式地禁止 abort() 的嘗試。 即使原始碼中沒有這樣的呼叫,我們現在已經看到三種不同的情況,建置工具鏈會靜默地插入這樣的呼叫:gcc 在進行性能分析時會這樣做,某些平台使用它來實現 assert(),而 icc 這樣做沒有明顯的原因。 檢查是否意外使用了 exit() 似乎比檢查 abort() 重要得多,所以我們暫時只檢查 exit()。 此外,過濾掉 __cxa_atexit() 以避免錯誤匹配。 似乎 OpenBSD 會插入對它的呼叫,儘管 libpq 不包含任何 C++ 程式碼。 討論:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e45b0dfa1f1028948decad3abd3b0f6e913a44b0

  • 改進 libpq 不呼叫 exit() 的建置時檢查。 對 Commit dc227eb82 的進一步修正。 根據 Peter Eisentraut 的建議,使用戳記檔 (stamp-file) 來控制檢查的運行時機,避免在 "make all" 期間重複執行。 此外,移除 nm 的 "-g" 參數:它沒有用處,並且某些版本的 nm 認為它與 "-u" 衝突。(感謝 Noah Misch 查明了這個移植性問題。)討論:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2f7bae2f924d8213a76370f825dc15eb0aa79796

  • 為 initdb 新增 --clobber-cache 選項,用於 CCA 測試。 Commit 4656e3d66 將 "#define CLOBBER_CACHE_ALWAYS" 測試機制替換為 GUC,這對於以更有效的方式進行快取覆蓋測試非常有幫助;但實作中存在一個缺口。 在 initdb 執行期間進行快取覆蓋測試的唯一方法是使用 #define 的舊方法,因為無法從外部設定 GUC。 為此目的,透過為 initdb 新增一個參數來改進這一點。(也許有一天我們應該讓 initdb 傳遞任意的 "-c NAME=VALUE" 參數。 引用困難阻止了我現在嘗試這樣做。) 向 v14 回溯修補,4656e3d66 出現在 v14 中。 討論:https://postgr.es/m/1582507.1624227029@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b741f4c3ee67666aa333dbb25bd71906b3474def

  • 不要嘗試在 slot_store_error_callback() 中列印資料類型名稱。 現有的程式碼試圖在已經失敗的事務中進行 syscache 查找,這至少可以說是有問題的。 在考慮了一些替代方案後,最好的解決方案似乎是完全從錯誤訊息中刪除類型名稱。 表格和欄位名稱似乎足以進行本地化。 如果使用者不確定涉及哪些類型,她可以檢查本地和遠端表格定義。 完成此操作後,我們也可以丟棄 LogicalRepTypMap 雜湊表,該雜湊表沒有其他用途。 可以說,LOGICAL_REP_MSG_TYPE 複製訊息現在也已過時; 但我們應該保留它們,以防出現其他用途。(從複製協定中刪除某些東西的複雜性可能會超過任何節省。) Masahiko Sawada 和 Bharath Rupireddy,根據 Andres Freund 的投訴。 回溯修補到 v10,此程式碼源自 v10。 討論:https://postgr.es/m/20210106020229.ne5xnuu6wlondjpe@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/50371df266d4c8f4faaf448cbd789d9697443952

  • 進一步限制 libpq 中無 exit() 測試的範圍。 在 --enable-coverage 建置中完全停用此檢查,因為較新版本的 gcc 也會為此插入 exit() 以及 abort() 呼叫。 此外,在 AIX 和 Solaris 上停用它,因為這些平台傾向於將 libldap 等功能作為靜態程式庫提供,然後將其包含在 libpq 的 shlib 中。 我們不能期望這些程式庫遵守我們的編碼規則。(該平台清單可能需要額外的調整,但我認為這足以讓 buildfarm 滿意。) 根據 Jacob Champion 和 Noah Misch 的報告。 討論:https://postgr.es/m/3128896.1624742969@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/792259591c0fc19c42247fc7668b1064d1e850d4

Noah Misch 推送了

Álvaro Herrera 推送了

Alexander Korotkov 推送了

Fujii Masao 推送了

David Rowley 推送了

  • 改善了多個使緩衝區大小翻倍的位置。有幾個地方正在執行一個緊密的迴圈,以確定大於或

    = 所需記憶體的第一個 2 的冪數。我們可以改用 pg_nextpower2_32 或 pg_nextpower2_64,而不是使用迴圈。當我們需要一個等於或大於給定數量的 2 的冪時,我們只需將該數量傳遞給 nextpower2 函數。當我們需要一個大於該數量的 2 的冪時,我們只需傳遞該數量 + 1。此外,在 tsearch 中,有幾個位置在簡單的 "if" 可以完成時執行了一個 while 迴圈。在這兩個位置都只添加了 1 個項目,因此迴圈只能迭代一次。將迴圈更改為 if 語句使程式碼稍微更最佳化,因為條件檢查一次而不是兩次。還有相當多的剩餘位置以以下形式增加緩衝區的大小:while (reqsize >= buflen) { buflen *= 2; buf = repalloc(buf, buflen); } 此 commit 未觸及這些位置。repalloc 將針對大於 MaxAllocSize 的大小產生錯誤。將這些位置更改為使用 pg_nextpower2_32 將消除引發該錯誤的可能性。從程式碼中不清楚大小是否會變得那麼大,因此謹慎起見。討論:https://postgr.es/m/CAApHDvp=tns7RL4PH0ZR0M+M-YFLquK7218x=0B_zO+DbOma+w@mail.gmail.com 審閱者:Zhihong Yu https://git.postgresql.org/pg/commitdiff/3788c66788e9f8c6904c6fe903724c1f44812c4d

  • 清除執行器中的一些聚合程式碼。在這裡,我們更改了呼叫 build_pertrans_for_aggref() 的程式碼,以便該函數不再需要特殊處理它是否正在處理 aggtransfn 或 aggcombinefn。這允許我們重複使用 build_aggregate_transfn_expr() 函數,並完全擺脫 build_aggregate_combinefn_expr()。build_pertrans_for_aggref() 中所有特殊情況程式碼都已移至呼叫函數。這節省了 nodeAgg.c 中大約十二行程式碼和 parse_agg.c 中更多的幾十行程式碼。此外,重新命名 nodeAgg.c 中的幾個變數,以更清楚地表明我們正在使用 aggtransfn 或 aggcombinefn。一些舊名稱會讓你相信我們一直在使用 aggtransfn。討論:https://postgr.es/m/CAApHDvptMQ9FmF0D67zC_w88yVnoNVR2+kkOQGUrCmdxWxLULQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/63b1af94375cc2be06a5d6a932db24cd8e9f45e9

  • Doc: 提及 VACUUM 無法利用超過 1GB 的 RAM。記錄將 maintenance_work_mem 設定為超過 1GB 的值對 VACUUM 沒有影響。回報者:Martín Marqués 作者:Laurenz Albe 討論:https://postgr.es/m/CABeG9LsZ2ozUMcqtqWu_-GiFKB17ih3p8wBHXcpfnHqhCnsc7A%40mail.gmail.com 回溯修補到:9.6,最舊的支援版本 https://git.postgresql.org/pg/commitdiff/ec34040af104a1d25233eccd5715863ace6cbb10

Heikki Linnakangas 推送了

Bruce Momjian 推送了

待處理的補丁

Anna Akenteva 送出了另一個修訂版的補丁,用於在 CLUSTER/VACUUM FULL 期間寫入可見性地圖。

Julien Rouhaud 送出了另一個修訂版的補丁,用於公開 get_query_def()。

Arne Roland 送出了另一個修訂版的補丁,用於重新命名分割資料表的觸發器。

Peter Eisentraut 送出了一個補丁,用於移除多餘的初始化。

Andrew Dunstan 送出了一個補丁,用於清理 PostgresNode.pm。

Masahiko Sawada 送出了一個補丁,用於新增 ALTER SUBSCRIPTION SET SKIP TRANSACTION,將錯誤上下文新增到應用邏輯複製變更的錯誤中,並新增 pg_stat_logical_replication_error 統計視圖。

Bharath Rupireddy、Amit Kapila 和 Álvaro Herrera 交換了補丁,以重構函數 parse_subscription_options。不要在 parse_subscription_options 函數簽名中使用多個參數,而是使用結構 SubOpts 來封裝所有訂閱選項及其值。這對於未來需要新增訂閱中的其他選項的工作很有用。此外,使用位圖來傳遞支援的選項並檢索指定的選項。

Jeff Davis 送出了一個補丁,用於新增一個 synchronous_replication_interrupt GUC。

Daniel Gustafsson 送出了兩個修訂版的補丁,用於修復 pg_basebackup 和 pg_dump 中 sscanf 的限制,並修復 TOC 檔案錯誤訊息列印中的錯誤,方法是取消隱藏變數名稱。

Dean Rasheed 送出了三個修訂版的補丁,旨在修復一個表現為 NUMERICs 乘法中的溢位的錯誤。

Michaël Paquier 送出了另一個修訂版的補丁,用於新增 wal_compression=zstd。

Magnus Hagander 又送出了兩個修訂版的補丁,用於新增 PROXY 協定支援。

Peter Eisentraut 送出了另一個修訂版的補丁,用於讓 psql 顯示多個結果集,而不是靜默地丟棄除了第一個之外的所有結果集,並使其可以從程序返回動態結果集。

Ranier Vilela 送出了一個補丁,用於防止在 src/backend/executor/nodeAgg.c 中選擇無效的分割區數量。

Aleksey Kondratov 送出了一個補丁,用於允許將 restore_command 作為 pg_rewind 的命令列選項提供。

David Christensen 送出了一個補丁,用於擴展大小的可能單位,並重構 pg_size_pretty 和 pg_size_bytes 以允許支援單位擴展。

Andrey V. Lepikhov 送出了一個補丁,用於向 pg_regress 新增 '--ignore-errors' 選項。

Jacob Champion 送出了另一個修訂版的補丁,用於重構 sslfiles Makefile 目標。

Josef Šimánek 送出了兩個修訂版的補丁,用於防止 BRIN 索引更新阻止 HOT 更新。

Michaël Paquier 送出了另一個修訂版的補丁,用於在已經設定校驗和的情況下加速 pg_checksums。

Anastasia Lubennikova 和 Yura Sokolov 交換了補丁,以通過新的掛鉤 smgr_hook、smgr_init_hook 和 smgr_shutdown_hook 使 smgr API 可擴展。

John Naylor 和 Heikki Linnakangas 交換了補丁,以重寫 pg_utf8_verifystr() 以提高速度。

Dean Rasheed 送出了一個補丁,使 numeric x^y 適用於負數 x。

Georgios Kokolatos 送出了一個補丁,教導 pg_receivewal 使用 lz4 壓縮。

Dean Rasheed 送出了兩個修訂版的補丁,以放寬對數值刻度的約束,例如允許 NUMERIC(3,-3),它將值四捨五入到最接近的千位數並保持高達 999000 的值,或者 NUMERIC(3,6),它可以保持高達 0.000999 的“微”量。

Thomas Munro 和 John Naylor 交換了補丁,以加速常見類型的元組排序。

Masahiko Sawada 送出了另一個修訂版的補丁,使其可以擁有涉及多個 postgres 外部伺服器的事務。

Andrey V. Lepikhov 送出了一個補丁,用於在初始執行階段選擇異步附加子計劃。

Takashi Menjo 送出了另一個修訂版的補丁,用於將 WAL 段檔案映射到 PMEM 上作為 WAL 緩衝區。

Yugo Nagata 又送出了兩個修訂版的補丁,用於修復 pgbench 中的 conn_duration。

Simon Riggs 送出了一個補丁,用於增強 PITR 中的 getRecordTimestamp() 以包含包含時間的所有記錄類型,新增對檢查點、恢復結束和準備好的 xact 記錄類型的處理,並允許 recovery_target_use_origin_time = off (預設) | on 選項。

Vigneshwaran C 送出了另一個修訂版的補丁,以確保錯誤訊息包含冗餘選項錯誤的提示訊息。

Vigneshwaran C 送出了另一個修訂版的補丁,用於在 CREATE/ALTER SUBSCRIPTION 期間識別發布者的遺漏發布。

Álvaro Herrera 送出了一個補丁,用於闡明 Perl 的 system() 失敗時的錯誤訊息。

Antonin Houska 送出了另一個修訂版的補丁,用於使用 undo logs 清理孤立檔案。

Jacob Champion 送出了另一個修訂版的補丁,用於將通用的 SASL 框架從 SCRAM 代碼中拉出來。

David Rowley 送出了一個補丁,用於記錄非修剪分割區的 Bitmapset。

Fabien COELHO 又送出了三個修訂版的補丁,用於修復 pgbench 記錄中的一個錯誤,該錯誤是由於最近對時間邏輯的一些變更引起的。

David Christensen 和 Fabien COELHO 交換了補丁,以向 pgbench 新增 multiconnect 選項。

Bharath Rupireddy 又送出了兩個修訂版的補丁,以收緊 postgres_fdw 中 batch_size、fetch_size 選項,防止其出現非數值。

Rahila Syed 送出了一個補丁,用於向邏輯複製新增欄位過濾。

Mark Dilger 又送出了兩個修訂版的補丁,用於為每個管理邏輯複製、主機安全性操作、網路安全性操作和資料庫操作新增預設角色,並允許非超級使用者使用 SET 和 ALTER SYSTEM SET。

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

Amit Langote 送出了一個補丁,用於顯式追蹤關係的 RT 索引以檢查權限。

Richard Guo 又送出了兩個修訂版的補丁,用於將每個 rel 用作反聯接的外部和內部。

Vigneshwaran C 送出了另一個修訂版的補丁,用於新增 PUBLICATION 的架構層級支援。

Paul A Jungwirth 又送出了三個修訂版的補丁,用於實作 SQL 標準應用程式時間。

Gurjeet Singh 送出了一個補丁,用於新增頂層事務 ID 的自動通知。

David Rowley 送出了一個補丁,允許一些視窗函數提前完成執行。

Greg Smith 送出了一個補丁,用於改進 INSERT 工作負載、FK 索引和填充項領域中的一些 pgbench 工作負載。

Euler Taveira de Oliveira 送出了另一個修訂版的補丁,用於新增與 SSL/TLS 相關的縮寫 MITM 和 SNI,並將 SSL 的用法更改為更現代和通用的 SSL/TLS。

Kyotaro HORIGUCHI 送出了兩個修訂版的補丁,用於修復一個錯誤,該錯誤表現為 ECPG 預編譯 CREATE AS EXECUTE 到一個無法編譯的 C 語句,方法是避免接觸解析樹結構並使用 ExecuteStmt.type 來通知返回的字串是語句名稱還是完整語句。

Euler Taveira de Oliveira 和 Peter Smith 交換了補丁,以實作邏輯複製的列過濾。

Ranier Vilela 送出了一個補丁,用於修復 src/backend/utils/mmgr/freepage.c 中未初始化變數的存取。

Fabien COELHO 送出了 rand48 替換為更佳 PRNG 的 patch 的第五版修訂版。

Haotian Wu 送出了另一個修訂版的 patch,以在 pg_dump/restore 中新增 --drop-cascade 選項。

Pavel Stěhule 送出了另一個修訂版的 patch,以實作 schema 變數。

Hayato Kuroda 送出了另一個修訂版的 patch,以修正 ECPG 中 DECLARE STATEMENT、DEALLOCATE 和 DESCRIBE 中的錯誤。

Justin Pryzby 送出了另一個修訂版的 patch,使 pg_ls_* 顯示目錄和共享檔案集。

Fabien COELHO 送出了另一個修訂版的 patch,將 psql 的 echo 程式碼分解出來。

Vigneshwaran C 送出了一個 patch,藉由為 schema 變更新增回呼,以確保邏輯複製關聯在 schema 變更時獲得所需的快取失效。

Tom Lane 送出了 conversion_error_calls 中避免目錄存取的 patch 的另外兩個修訂版。

Tom Lane 送出了另一個修訂版的 patch,以移除 64k rangetable 限制。

Andy Fan 送出了一個 patch,為 RelOptInfo 新增 not null attrs。

Peter Eisentraut 送出了一個 patch,為了與 OpenSSL 3.0 相容,使用了 EVP_EncryptFinal_ex() 和 EVP_DecryptFinal_ex()。

Gilles Darold 送出了另一個修訂版的 patch,以在 XactCommand 層級新增 hooks。

Zhihong Yu 送出了一個 patch,以移除 check_safe_enum_use 中對進行中交易的多餘檢查。

Tatsuo Ishii 送出了另一個修訂版的 patch,以在 pgbench 中使用 COPY FREEZE。

David Rowley 送出了一個 patch,以更好地記錄附加和移除分割區時的鎖定行為。