PostgreSQL 每週新聞 - 2021 年 5 月 2 日

張貼於 2021-05-03,作者:PWN
PWN

PostgreSQL 每週新聞 - 2021 年 5 月 2 日

本週人物:https://postgresql.life/post/corey_huinker/

PostgreSQL 產品新聞

pgstats.dev 上的可觀察性圖表已更新。https://pgstats.dev/

五月份的 PostgreSQL 工作

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

PostgreSQL 新聞

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

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

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

已套用的補丁

Tom Lane 推送了

  • 更新 rewriteTargetListIU() 的註解。此函數在觸發器可更新視圖上 UPDATE 的行為,過去透過類比 preptlist.c 對於一般表格 UPDATE 的行為來合理化。 由於 preptlist.c 自 86dc90056 以來就沒有這樣做,因此該論點不再合理,更不用說有說服力了。 我認為我們仍然需要它以這種方式運作,因此更新註解以解釋原因。https://git.postgresql.org/pg/commitdiff/08a986966524e522914b96e4398a4bebf942b298

  • 文件:記錄 EXTRACT(JULIAN ...),改進 Julian Date 的說明。由於某種原因,extract()/date_part() 的 "julian" 選項從未在手冊中列出。此外,雖然附錄 B 順帶提及我們不符合從 UTC 中午開始的常見天文定義的 Julian date,但對於我們實際的做法有點模糊。澄清這一點,並新增一個範例,示範如何取得所需的天文定義。 這種情況已經存在很久了,所以回溯修補到所有支援的分支。討論:https://postgr.es/m/1197050.1619123213@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/79a5928ebcb726b7061bf265b5c6990e835e8c4f

  • 移除 rewriteTargetListIU 在 UPDATE 中擴展視圖目標清單的功能。提交 2ec993a7c(在視圖上新增觸發器)修改了重寫器,為任何導向視圖的 UPDATE 中,所有實際上未被使用者更新的欄位新增了虛擬條目,如 "SET x = x"。 當時需要它來產生一個完整的 "NEW" 列以傳遞給觸發器。 之後,發現它對一般的可更新視圖造成問題,因此提交 cab5dc5da 將其限制為僅在觸發器可更新視圖中發生。 但在提交 86dc90056 之後,我們根本不需要它了。 nodeModifyTable.c 從為視圖產生的整列變數中填充觸發器 "OLD" 列,然後使用該舊列和 UPDATE 目標清單計算 "NEW" 列。 因此,UPDATE tlist 不需要虛擬條目,就像它不需要一般表格或其他類型的視圖一樣。 (rewriteTargetListIU 的註解表明,我們必須這樣做才能正確擴展規則中的 NEW 參考,但我現在認為這只是 2ec993a7c 中偷懶的註解編輯。 如果在有觸發器之前,我們不需要它用於視圖上的規則,那麼之後我們也不需要它。) 這實際上將 86dc90056 的決定(我們不需要虛擬欄位更新)傳播到視圖案例中。 除了使不同的案例更加一致,從而可能避免未來出現錯誤之外,它還應該節省一些重寫器/規劃器的努力。 討論:https://postgr.es/m/2181213.1619397634@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/04942bffd0aa9bd0d143d99b473342eb9ecee88b

  • 文件:修正關於如何取得真實 Julian Dates 的討論。不知何故,我說服自己旋轉到 UTC-12 是做到這一點的方法,但經過進一步審查,絕對是 UTC+12。討論:https://postgr.es/m/1197050.1619123213@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c93f8f3b8d3bc780892e2bf11192fbdd136fddfe

  • 在伺服器中新增啟發式傳入訊息大小限制。我們收到一份報告,指出由於客戶端錯誤向伺服器傳送垃圾資料而導致令人困惑的伺服器行為:伺服器認為垃圾資料是非常長的訊息長度,並耐心等待永遠不會到來的資料。我們可以透過減少對訊息長度的信任來降低這種風險。 長期以來,libpq 有一條啟發式規則,即它不會相信大的訊息大小字詞,除了預期為(可能)長的少數訊息類型。 這提供了一些針對訊息邊界同步丟失和其他損壞資料案例的防禦。 伺服器做的事情類似,但到目前為止,它只限制了在連線驗證階段收到的訊息長度。 讓我們做與 libpq 相同的事情,並限制所有訊息的允許長度,同時區分預期為長的訊息類型和不預期為長的訊息類型。 我對非長訊息使用 10000 位元組的限制。(libpq 的對應限制是 30000 位元組,但鑑於 FE/BE 協定的不對稱性,沒有充分的理由說明這些數字應該相同。) 實驗表明,這至少是我們實際需要的 10 倍,甚至可能是 100 倍; 但似乎需要充足的日光來避免誤報。 無論如何,我們可以根據 beta 測試結果調整限制。 對於長訊息,設定 MaxAllocSize - 1 的限制,這是我們可以吸收到訊息收集的 StringInfo 緩衝區中的最大值。 這只是為了確保虛假的訊息大小被報告為虛假,而不是令人困惑的關於無法擴大字串緩衝區的抱怨。 同時,確保非主線程式碼路徑(例如 COPY FROM STDIN)與 SocketBackend 一樣偏執,並在相信訊息長度之前驗證訊息類型程式碼。 這提供了額外的保護,防止卡在損壞的輸入上。 討論:https://postgr.es/m/2003757.1619373089@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9626325da5e8e23ff90091bc96535495d350f06e

  • 修正 pg_upgrade 的測試中,針對無法升級類型的一些遺漏之處。Commit 29aeda6e4 等等修正了一些疏忽,這些疏忽涉及未檢查容器類型(如陣列和範圍)中是否包含無法升級的類型。然而,我只查看了 version.c,卻忽略了 check.c 中存在實質上等效的測試。(這些檔案之間的職責劃分不是很明確...)此外,由於 genbki.pl 不保證自動產生的 rowtype OID 在不同版本之間保持不變,我們需要考慮到與系統目錄或檢視表相關的複合類型是無法升級的。儘管有人會以這種方式宣告使用者欄位的可能性很小,但如果他們這樣做了,在另一個 PG 版本中嘗試讀取它可能會因為嵌入在複合 Datums 中的類型 OID 而導致「沒有這樣的 pg_type OID」錯誤。為了支援複合類型和 reg* 類型的情況,擴展了執行搜尋的遞迴查詢,允許任何返回 pg_type OID 欄位的基本查詢,而不是將其限制為僅一個起始類型。和以前一樣,回溯修補到所有受支援的分支。討論:https://postgr.es/m/2798740.1619622555@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/57c081de0afcd01bf47c46f015bf8886b01c2c21

  • 改善一些 pg_upgrade 失敗報告的措辭。在可以刪除欄位時,不要建議刪除整個表格。同時,嘗試使這些訊息的佈局更清晰、更一致。根據 Daniel Gustafsson 的建議。不進行回溯修補,因為我們通常不喜歡在已發布的分支中修改可翻譯的訊息。討論:https://postgr.es/m/2798740.1619622555@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/c9c37ae03fea0c8ad467392ddf03940b61974935

  • 禁止透過 fastpath API 呼叫除了 plain function 以外的任何東西。拒絕 aggregates、window functions 和 procedures。Aggregates 無法工作,但會出現一些晦澀的錯誤訊息。Window functions 會遇到 Assert 或空指標取消引用。Procedures 看起來可以工作,只要你不嘗試進行事務控制,但是 (a) 事務控制是 procedure 的重點,以及 (b) 無法完全確定該路徑中沒有潛藏的錯誤。鑑於對該區域缺乏測試,對於我們支援的內容採取保守態度似乎是最安全的。同時拒絕 proretset functions,因為 fastpath 協議無法支援傳回一個集合。同時移除一個容易觸發的斷言,即給定的 OID 不是 0;後續的查詢可以自行處理這種情況。根據 Theodor-Arsenij Larionov-Trichkin 的報告。回溯修補到所有受支援的分支。(procedure 的角度僅適用於 v11+,當然。)討論:https://postgr.es/m/2039442.1615317309@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2efcd502e56a528f75ec8e88c02a287ad3457d77

  • Doc:更新 libpq 的 PQfn() 文件。明確提及您不能以這種方式呼叫 aggregates、window functions 或 procedures(已經提到無法呼叫 SRFs)。此外,自我們發明協議 3.0 以來,聲稱 PQfn 不支援 NULL 參數或結果的說法一直是謊言。不確定為什麼從未更新此文本,但現在就進行更新。討論:https://postgr.es/m/2039442.1615317309@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/386e64ea5abf346d887c21ea8869317838ba19b5

  • Doc:在 ddl.sgml 中新增自引用外鍵的範例。雖然我們一直允許這種情況,但該文件沒有說明您可以這樣做。討論:https://postgr.es/m/161969805833.690.13680986983883602407@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/e6f9539dc32473793c03cbe95bc099ee0a199c73

Amit Kapila 推送

Peter Eisentraut 推送了

Michaël Paquier 推送了

Álvaro Herrera 推送了

Fujii Masao 推送了

  • 不要將 TRUNCATE 中指定的 "ONLY" 選項傳遞給外部資料封裝器。 Commit 8ff1c94649 允許 TRUNCATE 指令截斷外部資料表。 之前,TRUNCATE 指令中關於 "ONLY" 選項的資訊會被傳遞給外部資料封裝器。 然後 postgres_fdw 會建構 TRUNCATE 指令並發送到遠端伺服器,並根據傳遞的資訊在其中包含 "ONLY" 選項。 另一方面,SELECT、UPDATE 或 DELETE 中指定的 "ONLY" 選項在存取或修改遠端資料表時不起作用,即不會傳遞給外部資料封裝器。 因此,僅讓 TRUNCATE 指令將 "ONLY" 選項傳遞給外部資料封裝器是不一致的。 因此,此 commit 變更 TRUNCATE 指令,使其不會將 "ONLY" 選項傳遞給外部資料封裝器,以與其他陳述式保持一致。 此外,此 commit 變更 postgres_fdw,使其始終不會在它建構的 TRUNCATE 指令中包含 "ONLY" 選項。 作者:Fujii Masao 審閱者:Bharath Rupireddy, Kyotaro Horiguchi, Justin Pryzby, Zhihong Yu 討論:https://postgr.es/m/551ed8c1-f531-818b-664a-2cecdab99cd8@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8e9ea08bae93a754d5075b7bc9c0b2bc71958bfd

  • doc: 審閱 "Allow TRUNCATE command to truncate foreign tables"。 文件中的拼寫錯誤、更正和語言改進。 作者:Justin Pryzby, Fujii Masao 審閱者:Bharath Rupireddy, Justin Pryzby, Fujii Masao 討論:https://postgr.es/m/20210411041658.GB14564@telsasoft.com https://git.postgresql.org/pg/commitdiff/0c8f40863acb94963df9fd6a4369eb71efe9a93b

Andrew Dunstan 推送

  • 改進 PostgresVersion.pm 中的邏輯。 處理 perl 交換比較運算子的運算元順序的情況。 有關詳細資訊,請參閱 perldoc overload:如果(且僅當)兩個運算元已交換時,第三個參數設定為 TRUE。 Perl 可能會這樣做,以確保第一個參數 ($self) 是一個實作了過載運算的物件,符合一般的物件呼叫慣例。 https://git.postgresql.org/pg/commitdiff/fa26eba221a9e837493df47d0255ce615129e9a8

David Rowley 推送

  • 調整平行結果快取計畫的 EXPLAIN 輸出。 在此,我們調整 Result Cache 的 EXPLAIN ANALYZE 輸出,以便我們不顯示任何 Result Cache 統計資訊給對 Result Cache 計畫節點沒有貢獻的平行 worker。 我最初的想法是,即使沒有幫助的 worker 仍然可以顯示他們的 Result Cache 統計資訊。 這樣做的目的是為了我可以編寫一些平行 Result Cache 迴歸測試,以顯示 EXPLAIN ANALYZE 輸出。 然而,我有點太晚才意識到,這樣的測試根本不可能在 buildfarm 上以穩定的方式運行。 了解到這一點後,在 9eacee2e6 提交之前,我已經刪除了所有顯示平行 Result Cache 計畫的 EXPLAIN ANALYZE 輸出的測試,但是,我忘記放回調整 EXPLAIN 輸出以隱藏查詢執行完成之前不夠快而無法提供幫助的平行 worker 的 Result Cache 統計資訊的程式碼。 所有其他節點都以這種方式運作,Result Cache 也應該如此。 此外,隨著此變更,現在似乎可以安全地刪除我添加到迴歸測試中的 SET force_parallel_mode = off。 此外,在 partition_prune 測試中執行一些清理。 我調整了 explain_parallel_append() 函數以清理 Result Cache EXPLAIN ANALYZE 輸出。 然而,由於我實際上沒有包含任何顯示其 EXPLAIN ANALYZE 輸出的平行 Result Cache 測試,因此該程式碼沒有任何作用,可以刪除。 順便一提,將 memPeakKb 的設定移到它使用的範圍內。 回報者:Amit Khandekar 作者:David Rowley, Amit Khandekar 討論:https://postgr.es/m/CAJ3gD9d8SkfY95GpM1zmsOtX2-Ogx5q-WLsf8f0ykEb0hCRK3w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3c80e96dffd4df7f66fffa5f265cbd87becb7ef5

Bruce Momjian 推送

待處理的 Patches

Bharath Rupireddy 發送了一個 patch,將 BLCKSZ 而不是 pageSize 傳遞給 gistinitpage,使其與 BloomInitPage、brin_page_init 和 SpGistInitPage 對齊。

Yugo Nagata 發送了兩個更多版本的 patch,以實作增量視圖維護。

Peter Eisentraut 發送了另一個版本的 patch,以修復具有產生欄位的 ALTER TABLE / INHERIT。

Tang 發送了另一個版本的 patch,以支援 psql 中大寫字元輸入的查詢結果的 tab 補全。

Tom Lane 發送了一個 patch,以移除 rewriter 中完成的一些無用工作。

Andrey V. Lepikhov 發送了一個 patch,以避免在不掃描外部分割區時進行不必要的工作。

Masahiro Ikeda 發送了另一個版本的 patch,以加速報告 wal 統計資訊,而無需引入新變數,並將 XXXUsage 的資料類型從 long 變更為 int64。

Michaël Paquier 發送了一個 patch,以在 pg_stat_activity 中追蹤已驗證的身分,因為現在已有用於記錄目的的功能。

Mark Dilger 和 Robert Haas 交換了 patch,以修改 toast 並測試 pg_amcheck 並修改 toast 損壞測試的預期輸出。

Vigneshwaran C 和 Bharath Rupireddy 交換了 patch,以增強錯誤訊息,以包含冗餘選項錯誤的提示訊息。

Ajin Cherian 發送了另一個版本的 patch,以跳過邏輯複製的空交易。

Bharath Rupireddy 發送了一個 patch,以檢查重複選項並在 CREATE COLLATION 指令中發生錯誤。

Andrey V. Lepikhov 發送了另一個版本的 patch,以修復執行器和異步附加節點之間的不協調。

Andres Freund 發送了一個 patch,以修復 REFRESH MATERIALIZED VIEW 的效能下降問題。

David Fetter 和 Aleksander Alekseev 交換了 patch,以確保 ALTER TABLE ... VALIDATE CONSTRAINT ... 的 tab 補全僅使用尚未有效的約束。

Joel Jacobson 和 Michaël Paquier 交換了 patch,以確保 pg_identify_object_as_address() 支援 pg_event_trigger oids。

Vigneshwaran C、Masahiko Sawada 和 Amit Kapila 交換了 patch,以修復 'total_bytes' 的 slot 統計資訊的計算,這可能會多次計算,方法是使用針對交易解碼的變更大小來計算它。

Hou Zhijie 發送了另一個版本的 patch,以實作 { CREATE | ALTER } TABLE ... PARALLEL DML { UNSAFE | RESTRICTED | SAFE };

Kyotaro HORIGUCHI 發送了另一個版本的 patch,以修復一些可疑的錯誤訊息和註解。

David Christensen 發送了另一個版本的 patch,以擴展 pg_size_bytes 中支援的單位,以涵蓋所有單位。

Tom Lane 發送了一個 patch,旨在透過檢查複合型別的使用情況來修復一個錯誤,該錯誤表現為 pg_upgrade 無法檢測到不受支援的陣列和範圍。

Hou Zhijie 發送了另一個版本的 patch,以修復一些平行安全檢查。

Peter Geoghegan 發送了一個 patch,旨在透過在 lazy_scan_heap 中將 all_visible_according_to_vm 設定為 false 來修復一個錯誤,該錯誤表現為在運行邏輯複製時 lazy_scan_heap() 中報告的 "FailedAssertion"。

Amul Sul 發送了一個 patch,以在 EXPLAIN 中隱藏內部臨時 schema 名稱,並變更相同項目的資料表描述。

Peter Smith 發送了另一個版本的 patch,以將對預備交易的支援添加到內建的邏輯複製中,並添加對流式交易的預備 API 支援。

Vaibhav Dalvi 發送了一個 patch,以移除 pg_upgrade 的 function quote_identifier 中不需要的後置遞增。

Richard Yen 發送了三個版本的 patch,以使 pg_filedump 可以讀取 pg_filenode.map。

Vigneshwaran C 送出一個修補程式,將 xid 包含在從磁碟還原重新排序緩衝區變更中。

Álvaro Herrera 送出另一個修訂版的修補程式,以修正一個錯誤,該錯誤表現為 InvalidateObsoleteReplicationSlots() 中的競爭條件。

Peter Eisentraut 送出另一個修訂版的修補程式,以防止 lwlock dtrace 探針執行不必要的工作。

Álvaro Herrera 送出另一個修訂版的修補程式,以從 transformCreateStmt 中移除一個多餘的變數。

Thomas Munro 送出一個修補程式,為 socket shutdown 事件新增 WL_SOCKET_CLOSED,並將 WL_SOCKET_CLOSED 用於 client_connection_check_interval。

Amit Kapila 送出一個修補程式,透過涵蓋檢測 ERRCODE_TRANSACTION_ROLLBACK 無法涵蓋的案例,來加強解碼期間的並行中止檢查。

Andres Freund 送出一個修補程式,以協助即將推出的 WAL 預取修補程式正常運作。

David Rowley 送出另一個修訂版的修補程式,在 SMgr 中使用 simplehash.h 雜湊表。

Justin Pryzby 送出另一個修訂版的修補程式,新增允許從 v9.5-v13 升級到 v14dev 所需的變更,新增更多允許升級測試所需的變更,新增一個測試來執行二進制兼容性,並將 pg_upgrade 的權宜之計移至 SQL 腳本。

Julien Rouhaud 送出一個修補程式,為可擴展的語法解析新增一個掛鉤 (hook)。

Tom Lane 送出兩個修訂版的修補程式,以修正由新的 match-all 程式碼引起的 regex 效能衰退。

Vigneshwaran C 送出另外兩個修訂版的修補程式,以識別在 CREATE/ALTER SUBSCRIPTION 期間 publisher 遺失的發布 (publications)。

Alexander Korotkov 送出四個修訂版的修補程式,使 websearch_to_tsquery() 將引號中的文字解析為單一 token。

Noah Misch 送出另一個修訂版的修補程式,以傾印 public schema 的所有權和安全標籤,並傾印 COMMENT ON SCHEMA public。