PostgreSQL 每週新聞 - 2021 年 11 月 21 日

發布於 2021-11-23 由 PWN
PWN

PostgreSQL 每週新聞 - 2021 年 11 月 21 日

Nordic PGDay 2022 將於 2022 年 3 月 22 日在芬蘭赫爾辛基的希爾頓赫爾辛基海灘酒店舉行。CfP 開放至 2021 年 12 月 31 日 此處

PostgreSQL 產品新聞

PGroonga 2.3.4,適用於所有語言的全文本搜尋平台,已發布

Pgpool-II 4.2.6、4.1.9、4.0.16、3.7.21 和 3.6.28,PostgreSQL 的連線池和語句複製系統,已發布 已發布 已發布 已發布 已發布

Ora2Pg 23.0,用於將 Oracle 資料庫遷移到 PostgreSQL 的工具,已發布。https://github.com/darold/ora2pg/blob/master/changelog

BigAnimal,Azure 上的託管 PostgreSQL 資料庫,已發布

pgAdmin4 6.2,PostgreSQL 的 Web 和原生 GUI 控制中心,已發布

11 月的 PostgreSQL 工作

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

PostgreSQL 新聞

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

本週的 PostgreSQL Weekly News 由 David Fetter 帶給您

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

已套用的補丁

Robert Haas 推送了

Amit Kapila 推送了

Álvaro Herrera 推送了

Michaël Paquier 推送了

Peter Eisentraut 推送

Daniel Gustafsson 推送

Tom Lane 推送

  • 修正 INSERT/SELECT 中 SQL 標準函數參數的顯示問題。如果 SQL 標準函數體包含 INSERT ... SELECT 語句,則 SELECT 中引用的任何函數參數始終以 $N 樣式列印,而不是使用參數名稱(如果有的話)。雖然這並非嚴格錯誤,但這並非預期,並且與在任何其他類型的語句中列印這些參數的方式不一致。原因是從 get_insert_query_def 遞迴調用到 get_query_def 時,忽略了傳遞 context->namespaces 列表,而是傳遞了常數 NIL。這是一個非常古老的疏忽,但 AFAICT 在 commit e717a9a18 增加了一個包含函數參數的最外層命名空間之前,它沒有任何明顯的後果。我們不允許 INSERT ... SELECT 作為子查詢,除非在頂層 WITH 子句中,在這種情況下,它不能包含任何可能需要訪問上層命名空間的外部引用。所以雖然這可以說是一個錯誤,但我認為在 v14 之前沒有必要更改它。順便說一句,強化了 e717a9a18 添加到 get_parameter 的代碼,使其在 PARAM_EXTERN Param 出現在意外位置時不會崩潰。根據 Erki Eessaar 的報告。代碼由我修正,回歸測試案例由 Masahiko Sawada 提供。討論:https://postgr.es/m/AM9PR01MB8268347BED344848555167FAFE949@AM9PR01MB8268.eurprd01.prod.exchangelabs.com https://git.postgresql.org/pg/commitdiff/a8d8445a7b2f80f6d0bfe97b19f90bd2cbef8759

  • 更穩健地處理 pg_dump 和 pg_basebackup 中的 close() 失敗。 Coverity 抱怨說,在 gzclose 失敗後應用 get_gz_error(就像我們在 pg_basebackup 中的一個地方所做的那樣)是不安全的。我認為這是正確的:這種調用很可能正在接觸已釋放的記憶體。將其更改為檢查 errno,就像我們對其他 gzclose 調用所做的那樣。此外,請注意在任何 gzclose() 調用之前立即將 errno 初始化為零,因為我們關心錯誤狀態。(有些調用我們不關心,因為我們已經在之前的某個步驟中失敗了。)這確保了如果 gzclose() 以一種不設置 errno 的方式失敗,我們不會得到一個具有誤導性的無關錯誤代碼。我們可以在這方面更加努力,但在我看來,所有這些情況基本上都不可能發生,除非我們誤用 zlib,因此不值得額外增加符號混亂。此外,修正了幾個根本沒有檢查關閉時錯誤的地方,大多數情況下都與關閉或 gzclose 本身相去甚遠;還有一個地方確實檢查了,但懶得報告 errno。向下移植到 v12。這些錯誤比這更早,但由於 v12 中發生的前端日誌記錄 API 更改以及前端代碼在那之前無法依賴 %m 的事實,該補丁需要進行大量修訂才能在較舊的分支中工作。鑑於缺乏相關的現場投訴,這似乎不值得付出努力。我修復的補丁;感謝 Michael Paquier 的審閱。討論:https://postgr.es/m/1343113.1636489231@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/3cac2c8caaefc642332e6994ce80032cc7d4cfdf

  • 清理 pg_basebackup 的 walmethods.c 中的錯誤處理。這裡的錯誤處理一團糟,這是由於一個根本性的錯誤設計(依賴 errno 來保持其值比安全假設的時間長得多)以及大量的粗心大意,無論是注意到錯誤還是報告正確的 errno。此外,最近添加的 LZ4 壓縮完全破壞了事情,因為 liblz4 不使用 errno 來報告錯誤。為了改善這種情況,請將錯誤狀態保存在 DirectoryMethodData 或 TarMethodData 結構中,並添加一個字串欄位,以便我們可以處理不設定 errno 的情況。(tar 方法已經有一個這個版本,但由於所有這些情況都使用常數錯誤字串,因此可以更有效率地完成。)使 dir 和 tar 方法以基本相同的方式處理錯誤,它們以前沒有這樣做。這需要在許多地方將 errno 複製到狀態結構中,這有點乏味,但它的優點是可以擺脫一些臨時代碼來保存和還原 errno ... 更不用說它修正了其他一些應該保存/還原 errno 但忽略了這樣做的地方。順便說一句,修正了一些毫無意義的靜態緩衝區,使其成為普通的局部變數。關於如何準確處理 fsync() 中的錯誤仍然存在一個問題,但這似乎是另一個補丁的材料。雖然 LZ4 問題是新的,但所有其餘的都是對舊錯誤的修復,因此向下移植到引入 walmethods.c 的 v10。我修復的補丁;感謝 Michael Paquier 的審閱。討論:https://postgr.es/m/1343113.1636489231@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/248c3a937dd018a72095f407cff727c9f08db0c1

  • 為 starts_with() 增加一個 planner 支援函數。這填補了 planner 對 starts_with() 和等效的 ^@ 運算符支援的一些空白:* 諸如 "textcol ^@ constant" 之類的條件現在可以使用常規的 btree 索引,而不僅僅是 SP-GiST 索引,只要索引的排序規則是 C。(這與 "textcol LIKE 'foo%'" 的工作方式相同。)* "starts_with(textcol, constant)" 可以像 "textcol ^@ constant" 一樣進行優化。* 固定前綴 LIKE 和 regex 模式現在在另一個方面更像 starts_with():如果您將一個應用於 SPGiST 索引的列,您將獲得使用 ^@ 的索引條件,而不是使用 >= 和 < 的兩個索引條件。根據 Shay Rojansky 的投訴。我修復的補丁;感謝 Nathan Bossart 的審閱。討論:https://postgr.es/m/232599.1633800229@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a148f8bc04b9980f019ea0d4b89311cf0bdc22b7

  • 提供一個可被 ^C 中斷的 simple_prompt() 變體。到目前為止,您無法透過輸入 control-C (或其他本地版本的 SIGINT) 來脫離 psql 的 \password 指令。這對使用者來說相當不友善,所以改進它。為此,我們必須修改 pg_get_line.c 提供的函數;但我們不想搞亂 psql 的 SIGINT 處理器設定,所以提供一個 API,讓該處理器能夠觸發取消。這依賴於一個假設,即從 fgets() 中 longjmp() 跳出不會造成太大的損害。雖然這顯然有點不穩定,但我們在主要輸入迴圈中一直有同樣的假設,並且很少有問題報告。psql 還有其他 simple_prompt() 呼叫可以同樣地進行改進;目前,只需處理 \password。Nathan Bossart,我的小調整。討論:https://postgr.es/m/747443.1635536754@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/5f1148224bd78bcf3bf7d916b8fe85dd820c52c6

  • 編譯位元碼時使用適當的 -Wno-warning 參數。我們使用 "clang" 編譯用於 LLVM 行內展開的位元碼檔案。這可能與建置的主要 C 編譯器不同,因此它需要自己的一組編譯器旗標。為了簡化配置,我們懶得將任何 -W 參數添加到該旗標集中;因為主建置會向我們顯示任何警告,所以沒有什麼必要。但是,如果我們不想看到不需要的警告,我們仍然必須添加通常與 clang 一起使用的任何 -Wno-warning 參數。在提交 9ff47ea41 之前,這個通知逃脫了注意,該提交試圖添加 -Wno-compound-token-split-by-macro;使用不匹配的 CC 和 CLANG 的 buildfarm 動物仍然顯示這些警告。我不確定為什麼我們從未看到任何缺少 -Wno-unused-command-line-argument 的影響(也許這僅由 -Wall 啟用?)。clang 目前不支援 -Wno-format-truncation 或 -Wno-stringop-truncation,儘管為了面向未來和一致性,我包含了這些測試。回溯修補到 v11,我們開始建置位元碼檔案的地方。討論:https://postgr.es/m/2921539.1637254619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/276517a96484f9e39a7a1095ab39fa76ef1ee8cc

  • 允許 psql 的其他 simple_prompt() 使用方式被 ^C 中斷。這填補了 5f1148224 未完成的工作。現在可以取消 \prompt,並且在 \connect 期間發出的密碼提示也可以取消。(我們不需要對啟動期間發出的密碼提示做任何事情,因為我們在那時還沒有捕獲 SIGINT。)Nathan Bossart 討論:https://postgr.es/m/747443.1635536754@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/46d665bc26ce57b5afecbc218c8fc3c6848211d8

  • 修正 SP-GiST 掃描初始化邏輯,以用於二進位相容的情況。Commit ac9099fc1 重新排列了 spgGetCache() 中的邏輯,該邏輯決定索引的 attType(標稱輸入資料類型)和 leafType(儲存在葉索引元組中的實際類型)。事實證明,這打破了以下情況:(a)實際輸入資料類型與標稱類型不同,(b)opclass 的 config 函數將 leafType 保留為預設值,並且(c)opclass 沒有 "compress" 函數。(b) 導致我們將實際輸入資料類型指定為 leafType,然後由於它不是 attType,我們抱怨需要 "compress" 函數。對於非多態 opclass,條件 (a) 出現在二進位相容的情況中,例如使用 SP-GiST text_ops 用於 varchar 欄位,或在域上使用任何 opclass,覆蓋其標稱輸入類型。為了修復,當索引的宣告欄位類型與 attType 不同但二進位相容時,將 attType 用於 leafType。僅在預設的 leafType 情況下執行此操作,以避免覆蓋 opclass 進行的任何明確選擇。每個來自 Ilya Anfimov 的錯誤 #17294。回溯修補到 v14。討論:https://postgr.es/m/17294-8f6c7962ce877edc@postgresql.org https://git.postgresql.org/pg/commitdiff/f4e7ae2b8a67ad6801726553a024a3306716ef80

  • 文件:更新一些與最低 Test::More 版本相關的事項。Commit 405f32fc4 中的疏忽。此外,新增一個關於讓 Test::More 0.98 在最近的 Linux 平台上通過其迴歸測試的提示(從慘痛的經驗中發現)。 https://git.postgresql.org/pg/commitdiff/92e70796e91e2f9086fad0156e0e91513e54a66b

  • pg_receivewal, pg_recvlogical: 允許取消初始密碼提示。以前,當這些程式提示輸入密碼時,不可能透過 control-C 終止它們。我們可以很容易地為它們的初始密碼提示修復這個問題,方法是將 SIGINT 處理器的設定從剛好在它們的初始 GetConnection() 呼叫之前移動到之後。這個修復程式不允許從稍後的重新提示中脫離,但這些應該非常罕見,因為使用者的密碼或伺服器的身份驗證設定必須在此期間發生了更改。我們考慮應用類似於 commit 46d665bc2 的修復程式,但這似乎比值得的要複雜。此外,這種方式是可以回溯修補的,而後者則不是。這個錯誤行為存在於所有支援的版本中,因此回溯修補到所有版本。Tom Lane 和 Nathan Bossart 討論:https://postgr.es/m/747443.1635536754@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/282b6d00abf5cebece6f94c796a4ed807a0176db

Andres Freund 推送

Andrew Dunstan 推送