PostgreSQL 每週新聞 - 2021 年 3 月 14 日

發布於 2021-03-15,作者:PWN
PWN

PostgreSQL 每週新聞 - 2021 年 3 月 14 日

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

三月份的 PostgreSQL 職缺

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

PostgreSQL 新聞報導

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

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

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

已套用的補丁

Amit Kapila 推送了

Tom Lane 推送了

  • 進一步調整 regex DFA 的記憶體管理。 在 commit 190c79884 之後,Coverity 仍然不滿意,而且在仔細觀察之後,我認為它可能說對了一些東西。 newdfa() 的呼叫者通常會在 v->err 被設定為非零時退出,如果 newdfa() 失敗,它會忠實地執行此操作。 但是,如果 v->err 在我們進入 newdfa() 之前已經是非零的,該怎麼辦? 然後 newdfa() 可能會成功,而呼叫者會立即洩漏其結果。 我不認為這種情況實際上會發生,但謂詞 "呼叫 newdfa() 時 v->err 總是零" 似乎很難完全確定; 有相當多的程式碼可能會出錯。 看起來最好調整呼叫者以直接檢查空結果,而不是依賴 ISERR() 測試。 無論如何,這比以前的編碼稍微便宜一些。 由於缺乏任何實際錯誤的證據,因此沒有反向移植。 https://git.postgresql.org/pg/commitdiff/6c20bdb2a279086777a3595ab00bcf14671fc5a1

  • 驗證 pg_import_system_collations() 的 OID 參數。 "SELECT pg_import_system_collations(0)" 導致斷言失敗。 使用隨機的非零參數 - 或者實際上在非斷言構建中使用零 - 它會愉快地使用垃圾 collnamespace 值來建立 pg_collation 條目。 就我所知,這些都是無害的(除非 OID 碰巧在稍後用於 schema?)。 無論如何,這不是一個安全問題,因為該函數僅供超級使用者使用。 但對於粗心的 DBA 來說,這似乎是一個陷阱,所以讓我們添加一個檢查,以確保給定的 OID 屬於某個 schema。 反向移植到引入此函數的 v10。 https://git.postgresql.org/pg/commitdiff/5c06abb9b97b69513a3998cccf89556e73052e02

  • 正確地將 pg_stat_get_subscription() 標記為返回一個集合 (set)。此函數的初始目錄資料未能設定 proretset 或提供 prorows 估計值。當在 FROM 子句中調用時,它意外地正常運作,因為執行器對此不太挑剔;但規劃器 (planner) 預期該函數不會返回多個 rows,這可能會導致錯誤的計劃。此外,如果在 SELECT 列表中調用該函數,則會失敗。我們無法輕易地回溯修補此錯誤,但幸運的是,在大多數情況下,該錯誤的後果並非非常嚴重。正確處理此事主要是一種未來驗證的措施。討論:https://postgr.es/m/1636062.1615141782@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/fed10d4eec79242688382d03ddca82007160ee6f

  • 如果 FROM 子句中的函數在不應該返回集合時返回了,則發出警告。如果 FROM 子句中的函數嘗試返回集合,但未標記為 proretset,則拋出「函數協定違規 (function protocol violation)」錯誤。儘管目前這些情況可以運作,但我們似乎不希望保證它會繼續運作。此外,不設定 proretset 標誌還有其他負面後果,例如可能導致錯誤的計劃。不進行回溯修補,因為如果存在任何違反此預期的第三方程式碼,人們不會喜歡我們在次要版本中破壞它。討論:https://postgr.es/m/1636062.1615141782@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d4545dc19b8ea670bf62e06d22b0e4e6fcb45153

  • 文件:修復缺少提及程序 (procedure) 的 OUT 參數的問題。commit 2453ea142 中的小疏忽。 https://git.postgresql.org/pg/commitdiff/3ebc6d295705fec37dc8f57a4ece54b370f55f72

  • 文件:改進關於程序的介紹性資訊。通過列出函數和程序之間的主要差異,來闡明「使用者定義程序」中的討論。值得注意的是,這避免了埋沒關於程序能夠進行交易控制 (transaction control) 的資訊。使 CREATE FUNCTION 參考頁面中的反向連結更加突出,並在 CREATE PROCEDURE 中添加一個。根據 Guyren Howe 的抱怨。感謝 David Johnston 的討論。討論:https://postgr.es/m/BYAPR03MB4903C53A8BB7EFF5EA289674A6949@BYAPR03MB4903.namprd03.prod.outlook.com https://git.postgresql.org/pg/commitdiff/227338b00d498d9e1c5705a1ab118585e5d57c87

  • 文件:移除 <foreignphrase> 標籤。我們將 "per se"、"pro forma" 和 "ad hoc" 的一些實例設為斜體,但不是全部。這些詞語在正式英語中很常見,因此它們是否符合外來詞語的標準值得商榷。我們可以嘗試在 <foreignphrase> 的使用上更加一致,但這很難強制執行,因此我們只需移除這些詞語的標籤。看起來唯一值得使用該標籤的是 "voilà"。我們沒有保留該標籤的單一實例,而是將其更改為更標準的詞語。John Naylor 討論:https://postgr.es/m/CAFBsxsHtWs_NsccAVgQ=tTUKkXHpHdkjZXtp_Cd9dGWyBDxfbQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b12436340adf27aa3d334c92579e6662dd3090ce

  • 避免為繼承的 FK 約束建立重複的快取計劃 (cached plans)。當外鍵約束應用於分割表 (partitioned table) 時,每個葉子分割區都會繼承類似的 FK 約束。我們獨立處理所有這些約束,這意味著在大型分割樹中,我們會建立大量的快取 FK 檢查查詢計劃集合。但是,在除了一種情況之外的所有情況下,生成的查詢對於繼承樹的所有成員實際上都是相同的 (因為在大多數情況下,查詢僅提及 FK 關係另一側的最頂層表)。因此,我們可以在所有分割區之間共享單個快取計劃,從而節省記憶體,更不用說建立和維護快取計劃的時間了。Keisuke Kuroda 和 Amit Langote 討論:https://postgr.es/m/cab4b85d-9292-967d-adf2-be0d803c3e23@nttcom.co.jp_1 https://git.postgresql.org/pg/commitdiff/c3ffe34863688115dd7878f118f2a123bafd8a26

  • 重新簡化 pqParseInput3 的子程序中 inStart 的管理。Commit 92785dac2 將一些與 inStart 的推進相關的邏輯從 pqParseInput3 複製到 getRowDescriptions 和 getAnotherTuple 中,因為它希望允許使用者定義的 row processor 回呼函數 (callbacks) 潛在地 longjmp 出庫,並且 inStart 必須在此之前更新,以避免無限循環。我們後來認為該 API 非常脆弱並恢復了它,但我們沒有撤消所有相關的程式碼變更,並且這種混亂持續存在。現在撤消它,以便在 pqParseInput3 的處理中只有一個地方推進 inStart;這將簡化添加更好的追蹤支援。getParamDescriptions 在某種程度上也增加了類似的處理 (不是在 92785dac2 中;我沒有追蹤到具體時間),但它實際上是有錯誤的,因為它對損壞訊息的處理似乎是從缺少已知訊息長度的 v2 邏輯中複製過來的。我們 "goto not_enough_data" 的情況不應簡單地返回 EOF,因為這樣我們就不會消耗訊息,從而可能造成無限循環。這種情況現在代表一個明確損壞的訊息,我們應該將其報告為損壞。儘管沒有看到 getParamDescriptions 陷入循環的現場報告,但回溯修補該修復似乎是合適的。我選擇回溯修補所有這些,以使邏輯在受支援的分支中看起來更相似。討論:https://postgr.es/m/2217283.1615411989@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/51c54bb603098416dc6f9d9d46a3d14861f8fc38

  • 禁止將 identity 欄位 (column) 標記為可為空 (nullable)。GENERATED ALWAYS AS IDENTITY 意味著 NOT NULL,但是如果使用 "GENERATED ALWAYS AS IDENTITY NULL" 覆蓋它,則程式碼未能發出警告。有人可能會認為舊的行為是一個功能,但它是不一致的,因為結果會根據子句的順序而變化,因此它似乎只是一個疏忽。根據 Pavel Boev 的 bug #16913。回溯修補到引入 identity 欄位的 v10。Vik Fearing (我進行了小的調整) 討論:https://postgr.es/m/16913-3b5198410f67d8c6@postgresql.org https://git.postgresql.org/pg/commitdiff/f52c5d6749a61fc4e0908457c58f5069910d53a6

  • 修正 psql \e 在偵測檔案修改時的競爭條件 (race condition)。psql 的編輯指令會檢查修改時間戳記是否變更,來判斷使用者是否已編輯檔案。對於已存在的檔案來說,這可能沒問題,但對於在指令中建立的暫存檔,快速的打字員可能會在 stat(2) 時間戳記的 1 秒精確度內儲存並離開。在 Windows FAT 檔案系統上,精確度更差,為 2 秒,更容易觸發競爭條件。為了修正這個問題,嘗試將暫存檔的修改時間設定為兩秒前。這不太可能失敗,但同樣地,競爭條件本身也不太可能發生,所以忽略任何錯誤。此外,我們不妨也檢查檔案大小以及修改時間。雖然這個錯誤很難觸發,但仍然值得回溯修補,以確保使用者的編輯不會遺失。Laurenz Albe,根據 Jacob Champion 的抱怨;基於 Jacob 和我自己的修正建議。討論:https://postgr.es/m/0ba3f2a658bac6546d9934ab6ba63a805d46a49b.camel@cybertec.at https://git.postgresql.org/pg/commitdiff/48d67fd897918c72e7cdf703d794056b88ed5725

  • pg_amcheck: 繼續嘗試修正測試。修正另一個測試中不可移植的選項順序的範例。24189277f 中的疏忽。Mark Dilger 討論:https://postgr.es/m/C37D28BA-3BA3-4776-B812-17F05F3472D8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/9e294d0f34d6e3e4fecf6f190b48862988934cde

  • 文件:新增關於如何執行 pg_amcheck 迴歸測試的說明。不太容易立即知道要如何讓 "make installcheck" 在這裡運作,因此以與其他地方相同的方式記錄它。https://git.postgresql.org/pg/commitdiff/58f57490facdec78119e5bab84229dbdc1d5ac6a

Michaël Paquier 推送

  • 移除對 SSL 壓縮的支援。PostgreSQL 從 e3bdb2d 開始已停用壓縮,且文件建議不要使用它。此外,OpenSSL 從 1.1.0 版本開始已停用 SSL 壓縮,並且許多發行版在此之前很久就已停用。最新的 TLS 版本 TLSv1.3 在協定層級禁止壓縮。此提交移除了該功能本身,移除了對 libpq 參數 sslcompression 的支援(為了與現有連線字串的相容性,該參數仍然列出,但只是被忽略),並移除了 pg_stat_ssl 和事實上的 PgBackendSSLStatus 中的對應欄位。請注意,除了移除透過設定啟用壓縮的功能之外,前端和後端都會主動停用壓縮,以避免來自本機設定的覆寫。新增了一個 TAP 測試,用於已棄用的 SSL 參數,以便在回溯相容性後進行檢查。提升目錄版本。作者:Daniel Gustafsson 審閱者:Peter Eisentraut、Magnus Hagander、Michael Paquier 討論:https://postgr.es/m/7E384D48-11C5-441B-9EC3-F7DB1F8518F6@yesql.se https://git.postgresql.org/pg/commitdiff/f9264d1524baa19e4a0528f033681ef16f61b137

  • 在 COPY 中新增對更多進度報告的支援。該指令(TO 或 FROM)、其類型(檔案、管道、程式或回呼),以及 COPY FROM 中 WHERE 子句排除的元組數量,已新增至已提供的進度報告中。"lines_processed" 欄位已重新命名為 "tuples_processed",以便消除 CSV 和 BINARY COPY 中此欄位的含義歧義,並與其他目錄進度視圖更加一致。再次提升目錄版本。作者:Matthias van de Meent 審閱者:Michael Paquier、Justin Pryzby、Bharath Rupireddy、Josef Šimánek、Tomas Vondra 討論:https://postgr.es/m/CAEze2WiOcgdH4aQA8NtZq-4dgvnJzp8PohdeKchPkhMY-jWZXA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9d2d45700928d49212fb7ed140feeaebe3a6014f

  • 將 sslcompression 切換回 libpq 中的一般輸入欄位。根據 buildfarm 成員 crake 的說法,任何包含設定了此選項的 postgres_fdw 伺服器,都將無法正確執行 pg_upgrade,因為該選項在 f9264d1 中變為除錯選項而被隱藏,導致 FDW 伺服器的還原失敗。這將 libpq 中的選項改回可見,但仍處於非活動狀態,以修正此升級問題。討論:https://postgr.es/m/YEbq15JKJwIX+S6m@paquier.xyz https://git.postgresql.org/pg/commitdiff/096bbf7c934a4288c9e48a6ac8e91d8753ac1ccd

  • 還原 libpq 中 SSL 壓縮的變更。這部分還原了 096bbf7 和 9d2d457,取消了 libpq 的變更,因為這可能會導致在多個 Postgres 主要版本中共享單個 libpq 版本的發行版發生中斷,用於連結到該版本的擴充套件和應用程式。請注意,後端在此處未更改,它仍然停用 SSL 壓縮,同時簡化了追蹤 SSL 連線是否已啟用的基礎目錄。根據與 Tom Lane 和 Daniel Gustafsson 的討論。討論:https://postgr.es/m/YEbq15JKJwIX+S6m@paquier.xyz https://git.postgresql.org/pg/commitdiff/0ba71107efeeccde9158f47118f95043afdca0bb

  • 將 tablespace 路徑重新建立從 makefile 移到 pg_regress。將此邏輯移至 pg_regress 修正了並行測試中可能發生的故障,當 pg_upgrade 和主要迴歸測試套件都觸發了 makefile 規則,該規則清理了 src/test/regress 下的 testtablespace/。即使 pg_upgrade 觸發了此規則,它也無需這樣做,因為它使用了不同的 tablespace 路徑。因此,如果 pg_upgrade 觸發了 tablespace 設定的 makefile 規則,而主迴歸測試套件執行了 tablespace 案例,則會失敗。61be85a 是類似的嘗試,但這破壞了迴歸測試需要在 Administrator 帳戶下運行的案例,例如 Appveyor。報告者:Andres Freund、Kyotaro Horiguchi 審閱者:Peter Eisentraut 討論:https://postgr.es/m/20201209012911.uk4d6nxcnkp7ehrx@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/6c788d9f6aadb41d76a72d56149268371a7895ee

  • 為 libpq 中所有連線執行緒設定 libcrypto 回呼。基於對 Jacob 的 OpenSSL 程式碼的分析,將加密雜湊計算遷移到 EVP,使得必須為所有連線執行緒設定 libcrypto 回呼,即使連線沒有使用 SSL。如果不設定回呼,當驗證期間 (例如 MD5 或 SCRAM) 呼叫加密雜湊時,如果加密雜湊計算發生錯誤,可能會導致執行緒不安全。因此,設定 libssl 和 libcrypto 狀態的邏輯被分成兩個部分,兩者都使用相同的鎖定,libcrypto 設定用於 SSL 和非 SSL 連線,而 SSL 連線則根據需要設定任何 libssl 狀態。在本提交之前,只有 SSL 連線會設定必要的 libcrypto 回呼,以確保在使用 libpq 中的多個並發執行緒時 (ENABLE_THREAD_SAFETY) 正確的執行緒鎖定。請注意,這僅適用於 OpenSSL 1.0.2 和 1.0.1 (HEAD 上支援的最舊版本),因為 1.1.0 有自己的內部鎖定,並且已放棄對 CRYPTO_set_locking_callback() 的支援。在使用 OpenSSL 1.0.1 和 1.0.2 的情況下,混合 SSL 和非 SSL 連線執行緒的多達 300 個執行緒的測試,在進行一些微基準測試後沒有顯示任何效能影響。可以使用 pgbench 並搭配 -C 和幾乎空白的腳本 (例如只有一個 \set meta-command) 來強調驗證請求,並且我們已經將其與一些自訂程式混合用於測試。 Reported-by: Jacob Champion Author: Michael Paquier Reviewed-by: Jacob Champion Discussion: https://postgr.es/m/fd3ba610085f1ff54623478cf2f7adf5af193cbb.camel@vmware.com https://git.postgresql.org/pg/commitdiff/2c0cefcd18161549e9e8b103f46c0f65fca84d99

Fujii Masao 提交

  • 追蹤寫入和同步 WAL 資料到磁碟所花費的總時間。此提交新增了新的 GUC 參數 track_wal_io_timing。啟用此參數後,XLogWrite 寫入和 issue_xlog_fsync 同步 WAL 資料到磁碟的總時間將在 pg_stat_wal 中進行計數。此資訊可用於檢查 WAL 寫入和同步對效能的影響程度。啟用 track_wal_io_timing 將導致伺服器每次寫入或同步 WAL 時都向作業系統查詢目前時間,這可能會在某些平台上造成顯著的額外負擔。為了避免啟用 track_io_timing 的伺服器中出現此類額外負擔,此提交引入了 track_wal_io_timing 作為與 track_io_timing 分開的參數。請注意,walreceiver 的 WAL 寫入和同步活動尚未被追蹤。此提交還使伺服器追蹤 XLogWrite 寫入和 issue_xlog_fsync 同步 WAL 資料到磁碟的次數,無論 track_wal_io_timing 的設定如何,都在 pg_stat_wal 中進行追蹤。這些計數器可用於計算每個請求的 WAL 寫入和同步時間,例如。 Bump PGSTAT_FILE_FORMAT_ID。 Bump catalog version. Author: Masahiro Ikeda Reviewed-By: Japin Li, Hayato Kuroda, Masahiko Sawada, David Johnston, Fujii Masao Discussion: https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/ff99918c625a84c91e7391db9032112ec8653623

  • 強制在 walwriter 退出時將剩餘的 WAL 統計資訊傳送到統計資訊收集器。在 walwriter 的主迴圈中,只有在自上次傳送到達到 PGSTAT_STAT_INTERVAL 毫秒後,才會傳送 WAL 統計資訊訊息。這對於避免過度負載統計資訊收集器是必要的。但是,這可能會導致最近的 WAL 統計資訊在 walwriter 退出時未傳送。為了確保傳送所有 WAL 統計資訊,此提交使 walwriter 在因關閉請求而退出時,強制將剩餘的 WAL 統計資訊傳送到收集器。請注意,當 walwriter 以非零退出代碼 (例如,FATAL 錯誤) 退出時,這些剩餘的 WAL 統計資訊仍然可能未傳送。這是可以接受的,因為 walwriter 退出會導致伺服器崩潰,隨後的復原會丟棄所有統計資訊。因此,在這種情況下,不需要傳送剩餘的統計資訊。 Author: Masahiro Ikeda Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/33394ee6f2433d3cc7785428a77cc9a813254df7

  • 將關機檢查點期間收集的統計資訊傳送到統計資訊收集器。當請求關機時,檢查點程序會在退出之前執行檢查點或重新啟動點,並更新統計資訊。但是,先前檢查點程序不會將這些統計資訊傳送到統計資訊收集器。關機檢查點和重新啟動點被視為請求的檢查點,而不是計劃的檢查點,因此它們的數量在 pg_stat_bgwriter.checkpoints_req 欄位中計數。 Author: Masahiro Ikeda Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/b82640df0062483431608b7e9e074255f03e6c02

Peter Eisentraut 提交

Alexander Korotkov 提交

Thomas Munro 提交

Bruce Momjian 推送了更新

Peter Geoghegan 推送了更新

  • 在 nbtree VACUUM 中,不要考慮新插入的 tuple。移除 nbtree VACUUM 中關於 "stale stats"(過時統計)的整個概念(停止關心涉及已插入 tuple 數量的統計)。同時移除 master 分支上的 vacuum_cleanup_index_scale_factor GUC/參數(儘管僅在 postgres 13 上禁用它們)。vacuum_cleanup_index_scale_factor/stats 介面使得 nbtree AM 部分負責決定何時需要更新 pg_class.reltuples 統計資訊。這似乎與索引 AM API 的精神相悖,因為當不方便時,索引 AM 的批量刪除和清理回呼函數實際上沒有必要提供準確的統計資訊。核心程式碼負責此事。(索引 AM 有權根據自身的考量來執行或不執行某些種類的延遲清理,例如頁面刪除和回收,但這與 pg_class.reltuples/num_index_tuples 無關。)在 commit b07642db 引入 autovacuum_vacuum_insert_threshold 功能之前,此問題相當無害,該功能與 vacuum_cleanup_index_scale_factor 機制產生了不良的交互作用:它使得插入驅動的自動清理執行完整的索引掃描,即使這樣做沒有實際的好處。這與 append-only insert benchmark [1] 的衰退有關。此外,在僅執行清理的 nbtree VACUUM 期間執行完整索引掃描的剩餘情況表明,最終 tuple 計數僅是一個估計值。這樣可以防止 vacuumlazy.c 在這些情況下設定索引的 pg_class.reltuples(現在僅當 vacuumlazy.c 具有用於 nbtree 批量刪除的 TIDs 時才會更新 pg_class)。這可以說是修復了 deduplication 相關的錯誤修復 commit 48e12913 中的一個疏忽。[1] https://smalldatum.blogspot.com/2021/01/insert-benchmark-postgres-is-still.html 作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAD21AoA4WHthN5uU6+WScZ7+J_RcEjmcuH94qcoUPuB42ShXzg@mail.gmail.com 向後移植:13-,加入了 autovacuum_vacuum_insert_threshold 的版本。 https://git.postgresql.org/pg/commitdiff/9f3665fbfc34b963933e51778c7feaa8134ac885

  • VACUUM ANALYZE:始終更新 pg_class.reltuples。vacuumlazy.c 有時無法更新每個索引的 pg_class 條目(以確保 pg_class.reltuples 是最新的),即使 analyze.c 假設 VACUUM ANALYZE 期間必須已經發生這種情況。至少有幾個原因可以解釋這種情況。例如,根據 2006 年 commit e57345975cf 建立的 amvacuumcleanup() 例程的約定,當索引 AM 表明其統計資訊僅是估計值時,vacuumlazy.c 可能無法更新 pg_class。停止假設必須在 VACUUM ANALYZE 中使用準確的統計資訊更新 pg_class -- 在所有情況下,與表關係同時更新索引的 pg_class。這樣,VACUUM ANALYZE 將永遠不會無法保持 pg_class.reltuples 保持相當準確。與舊方法相比,這種方法的唯一缺點是,對於其堆積關係最終具有相同不準確值的索引,它可能會不準確地設定 pg_class.reltuples。這似乎不太糟糕。在任何 VACUUM ANALYZE 期間,我們已經一致地為堆積/表關係調用了兩次 vac_update_relstats()(以更新 pg_class)-- 一次在 vacuumlazy.c 中,一次在 analyze.c 中。現在,我們確保至少調用一次(儘管通常是兩次)每個索引的 vac_update_relstats()。這是對 commit 9f3665fb 的後續工作,該提交處理了 btvacuumcleanup() 中的問題。從技術上講,這修復了一個不相關的問題。在 commit 9f3665fb 之後,btvacuumcleanup() 不再提供準確的 num_index_tuples 值(當在相關的 VACUUM 操作期間沒有 btbulkdelete() 調用時),但是 hashvacuumcleanup() 多年來一直以相同的方式工作。作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAH2-WzknxdComjhqo4SUxVFk_Q1171GJO2ZgHZ1Y6pion6u8rA@mail.gmail.com 向後移植:13-,就像 commit 9f3665fb 一樣。 https://git.postgresql.org/pg/commitdiff/5f8727f5a679452f7bbdd6966a1586934dcaa84f

  • 文件:B-Tree 只有一個額外的參數。commit 9f3665fb 中的疏忽。向後移植:13-,就像 commit 9f3665fb 一樣。 https://git.postgresql.org/pg/commitdiff/3f0daeb02f8dd605f89de9aa2349137c09cc7fb4

  • 加回 vacuum_cleanup_index_scale_factor 參數。Commit 9f3665fb 刪除了 vacuum_cleanup_index_scale_factor 儲存參數。但是,當跨主要版本移動時,這會產生 dump/reload 風險。加回 vacuum_cleanup_index_scale_factor 參數(但不是同名的 GUC),僅僅是為了避免使用 pg_upgrade 等工具時出現問題。該參數保持禁用且未記錄。沒有向後移植到 Postgres 13,因為 vacuum_cleanup_index_scale_factor 僅由 REL_13_STABLE 版本的 master 分支 commit 9f3665fb 首先禁用 -- 該參數在 REL_13_STABLE 上已經是這樣了。討論:https://postgr.es/m/YEm/a3Ko3nKnBuVq@paquier.xyz https://git.postgresql.org/pg/commitdiff/effdd3f3b633e88feaa675377075f02ecc99aee4

  • 在 nbtree VACUUM 期間節省一些週期。避免在僅清理的 nbtree VACUUM 操作中,沒有已刪除但尚未回收的頁面要回收的常見情況下,不必要地呼叫 RelationGetNumberOfBlocks()。這是對 commit e5d8a999 的後續處理,該 commit(除其他事項外)教導「跳過完整掃描」的 nbtree VACUUM 機制,僅在索引中已刪除頁面的絕對數量被認為過多時才觸發完整索引掃描。https://git.postgresql.org/pg/commitdiff/7bb97211a5589265f3f88183ae9353639ab184c6

  • 整合 nbtree VACUUM 元頁面例程。簡化 _bt_vacuum_needs_cleanup() 函式的簽名(現在只需要一個 'rel' 參數),並將其移至 nbtpage.c 中與其同級函式相鄰的位置。我認為 _bt_vacuum_needs_cleanup() 最初位於 nbtree.c 中,是因為 include 依賴性問題。現在這已不再是問題。這是對 commit 9f3665fb 的後續處理。https://git.postgresql.org/pg/commitdiff/02b5940dbea17d07a1dbcba3cbe113cc8b70f228

Robert Haas 推送了

待處理的 Patches

Etsuro Fujita 送出另一個修訂版的 patch,用於在 postgres_fdw 節點上實作非同步 append。

Kyotaro HORIGUCHI 送出一個 patch,使用 wal_level=minimal 執行 011_crash_recovery.pl,並確保已發布的 XID 是持久的。

Ibrar Ahmed 送出另一個 pg_rewind 的修訂版 patch,修正了在伺服器剛被升級時,判斷 TLI 的方式,除了檢查 checkpoint 上的 ThisTimeLineID 之外,還檢查 control file 中的 minRecoveryPointTLI。

Ibrar Ahmed 送出另一個 patch,將 popcount 暴露給 SQL。

Kota Miyake 送出另一個 patch,修正 pgbench 的 \sleep 命令的運作方式,要求它接受一個整數引數。

Michael Banck 送出另一個 patch,新增一個新的 PGC_ADMINSET guc 上下文和 pg_change_role_settings 預設角色。

Andrey Borodin 送出另一個 patch,為 gist_btree 類型新增用於排序 GiST 建立的 Sortsupport。

Pavel Stěhule 送出一個 patch,為類型 record 新增運算子 ? 和 ->>,以及函數 record_keys 和 record_each_text。

Ajin Cherian 送出一個 patch,使 stream_prepare_cb 成為可選的,這允許插件不允許在邏輯複寫中同時啟用 streaming 和 two_phase。

Ibrar Ahmed 送出另一個 patch,在規劃時評估表達式,適用於另外兩種情況。

Joel Jacobson 送出另外四個修訂版的 patch,新增視圖 pg_permissions 和 pg_ownerships,這大大簡化了建立這些東西的查詢。

Ibrar Ahmed 送出另一個 patch,實作系統版本的時間表。

Tomáš Vondra 送出另外兩個修訂版的 patch,實作 BRIN 多範圍索引。

Tomáš Vondra 和 Stephen Frost 交換了 patch,透過在啟用 track_io_timing 時包含 I/O 計時,來改善 auto-vacuum 和 auto-analyze 的記錄。此外,對於 auto-analyze,新增讀取速率和 dirty 速率,類似於歷史上為 auto-vacuum 記錄這些資訊的方式。

Masahiro Ikeda 和 Fujii Masao 交換了 patch,在關閉時為 walwriter 和 checkpointer 發送統計資訊。

Dilip Kumar 和 Justin Pryzby 交換了 patch,為表實作自訂壓縮方法。

Bharath Rupireddy 送出另一個 patch,實作 EXPLAIN [ANALYZE] REFRESH MATERIALIZED VIEW。

Greg Nancarrow 和 Hou Zhijie 交換了 patch,實作並行 INSERT (INTO ... SELECT ...)。

Ibrar Ahmed 和 Kazutaka Onishi 交換了 patch,在外部表上實作 TRUNCATE。

Peter Smith 和 Ajin Cherian 交換了 patch,實作兩階段交易的邏輯解碼。

Tatsuo Ishii 送出兩個 patch,使其可以在 pgbench 中使用 COPY FREEZE。

Peter Smith 送出一個 patch,讓 tablesync worker 有機會查看是否可以立即退出(因為它已經趕上),而無需先處理訊息才能發現這一點。

Yugo Nagata 送出另一個 patch,實作增量具體化視圖。

Arseny Sher 送出一個 patch,增加用於僅索引掃描的 vm 快取。

Peter Eisentraut 送出另一個 patch,新增對使用符合 SQL 標準且可移植到其他實作的功能主體,編寫語言 SQL 的 CREATE FUNCTION 和 CREATE PROCEDURE 陳述式的支援。

Heikki Linnakangas 送出另一個 patch,為了安全和清晰起見,移動了一些 ResourceOwnerEnlarge() 呼叫,使 resowners 更容易擴展,並在可用時使用 64 位元的 murmur hash 以加快速度。

Tomáš Vondra 送出另一個 patch,透過新的 GUC remove_temp_files_after_crash 控制崩潰後移除暫存檔。

Jacob Champion 送出另外兩個修訂版的 patch,將客戶端的 DN 儲存在 port->peer_dn 中,並使用它從所有 auth 後端記錄已驗證的身分。

Joel Jacobson 送出另一個 patch,實作 regexp_positions。

Justin Pryzby 送出一個 patch,使 pg_dump 在 getBlobs 中使用游標,以減輕數百萬個大型物件時的巨大記憶體使用。

Tomáš Vondra 送出另一個 patch,使 GROUP BY 更有效率。

Erica Zhang 送出兩個修訂版的 patch,為 contrib 下的 pg_stat_statements 相容性驗證新增一些測試。

Matthias van de Meent 送出三個修訂版的 patch,當頁面的行指標陣列具有尾隨的未使用 ItemId 時,會截斷該陣列。 這將允許重複使用實際上是空閒空間的空間來儲存資料以及新的行指標,而不是僅將其保留給行指標。 另一個好處是,HasFreeLinePointers hint-bit 優化現在不會提示陣列末尾的空閒行指標,稍微提高了空閒行位置的特異性;並避免我們需要搜尋到陣列末尾,如果所有其他條目都已填滿。

Magnus Hagander 送出另一個 patch,新增 PROXY 協定支援。

Floris Van Nee 送出另一個 patch,允許將元組插入到幾乎為空的頁面中。

Marcus Wanner 送出一個 patch,為輸出插件的 filter_prepare 回呼新增一個 xid 引數。

Kyotaro HORIGUCHI 和 Fujii Masao 交換了 patch,將 stats collector 使用的暫存儲存從檔案變更為共享記憶體。

Amul Sul 和 Ibrar Ahmed 交換了 patch,放入一些機制,使其可以實作 ALTER SYSTEM READ {ONLY|WRITE}。

Masahiko Sawada 送出另一個 patch,使 autovacuum 記錄更具資訊性。

Bharath Rupireddy 送出另一個 patch,為 multi- 和 single insert 新增新的表 AM,並將相同的用於 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。

Yuzuko Hosoya 送出另一個 patch,使用 DISCARD ALL 釋放參考完整性的 SPI 計劃。

John Naylor 送出一個 patch,以擺脫文件中的 <foreignphrase> 標籤。

John Naylor 送出一個 patch,使 popcount xor 在緩衝區層級嘗試間接定址。

Masahiko Sawada 送出一個 patch,從 vacuumlazy.c 中移除不需要的 bsearch。

Craig Ringer 送出另一個 patch,將目標 LWLock* 和 tranche ID 傳遞給 LWLock tracepoint,新增到 LWLock 常式中的 tracepoint,並在啟動時為後端類型和 postmaster pid 新增 SDT tracepoint。

Bharath Rupireddy 送出兩個修訂版的 patch,使 check_publication_add_relation 中的錯誤訊息更具資訊性且一致。

Iwata Aya、Álvaro Herrera 和 Tom Lane 交換了 patch,為 libpq 新增追蹤功能。

David Rowley 提交了 PathTarget 和 RestrictInfo 揮發性的快取修補程式的另外兩個修訂版本,允許 estimate_num_groups() 回傳更多關於估算的細節,允許 simplehash.h 的使用者執行直接刪除,新增一個 Result Cache 執行器節點,並移除 nodeResultCache.c 中的程式碼重複。

Nathan Bossart 和 Laurenz Albe 交換了文件 ALTER ROLE ... SET ROLE 的修補程式。

Mark Dilger 和 Robert Haas 交換了修補程式以新增前端工具程式 pg_amcheck。

Peter Geoghegan 提交了另一個修訂版本的修補程式,用於回收在相同 VACUUM 期間刪除的頁面。

Thomas Munro 提交了另一個修訂版本的修補程式,用於在共享記憶體中追蹤關聯大小,為 smgrnblocks() 提供無鎖定的快速路徑,並將 fifo 更新為 lru 以清除有效的快取。

Thomas Munro 提交了一個修補程式,透過使用 pg_procno 而非掃描 ProcArray 並追蹤啟動程序,使 ProcSendSignal() 更有效率。

Hou Zhijie 提交了另一個修訂版本的修補程式,用於在執行 REFERENCES 表格的 INSERT INTO 時,避免 RI 觸發器中的 CommandCounterIncrement。

Álvaro Herrera 提交了另一個修訂版本的修補程式,用於實作 ALTER TABLE ... DETACH PARTITION CONCURRENTLY。

Álvaro Herrera 提交了另兩個修訂版本的修補程式,用於實作 libpq 的批次/管線支援。

Fabien COELHO 和 Dean Rasheed 交換了修補程式,以將虛擬隨機置換函數新增至 pgbench。

Bruce Momjian 提交了另一個修訂版本的修補程式,用於新增金鑰管理。

Takayuki Tsunakawa 提交了另一個修訂版本的修補程式,以加速 COPY FROM 到具有外部分割區的表格。

Hao Wu 提交了一個修補程式,旨在修復在節點升級後 HotStandbyActive() 回傳 true 的錯誤。

Takayuki Tsunakawa 提交了兩個修訂版本的修補程式,用於修復在計算要失效的緩衝區數量時的溢位。

Andrey Borodin 提交了另一個修訂版本的修補程式,使所有 SLRU 緩衝區大小都可配置。

Tom Lane 提交了兩個修訂版本的修補程式,用於清理 PL/pgsql 中變數使用的文件。

Thomas Munro 提交了另一個修訂版本的修補程式,用於在崩潰恢復中執行檢查點和 bgworker,在崩潰恢復後記錄緩衝區統計資訊,並使其可以不等待恢復結束檢查點。

Justin Pryzby 提交了另兩個修訂版本的修補程式,允許為 wal_compression 使用替代的壓縮方法。

Mark Rofail 和 Justin Pryzby 交換了修補程式以實作外部鍵陣列。

Pavel Stěhule 提交了另一個修訂版本的修補程式,用於實作結構描述變數。

Michaël Paquier 和 Soumyadeep Chakraborty 交換了修補程式以修復 PITR 和 2PC 之間的不協調。

Pavel Stěhule 提交了另兩個修訂版本的修補程式,以將 #routine_label pragma 新增至 PL/pgsql。

Thomas Munro 提交了一個修補程式,用於將 bsearch 和 unique 範本新增至 sort_template.h,為一些常見的純量類型提供排序/搜尋專業化,在明顯的位置使用 qsort_oid() 及其相關函數,為 ItemPtrData 提供專業化的排序/搜尋常式,在各個地方使用 qsort_itemptr() 及其相關函數,透過使用基於 48 位元整數(可以透過減法比較,避免分支)的“編碼”格式,專業化 HeapTuple 排序常式以供 ANALYZE 使用,專業化 tidbitmap.c 中的頁面表格排序常式,專業化 nbtree 程式碼中的一些排序/搜尋常式,並專業化 multixact.c 使用的排序常式。

Julien Rouhaud 提交了另一個修訂版本的修補程式,用於將 pg_stat_statements 查詢攪亂移動到核心,在 pg_stat_activity 和 log_line_prefix 中公開 queryid,並在 verbose explain 中公開查詢識別符。

Dmitry Dolgov 提交了另一個修訂版本的修補程式,用於引入跳過掃描。

Julien Rouhaud 提交了另一個修訂版本的修補程式,用於為 REINDEX 命令新增新的 OUTDATED 過濾機制,並為 reindexdb 新增相應的 --outdated 選項。

Alexander Lakhin 提交了一個修補程式,用於在 pgwin32_open 中使用 microsoft_native_stat。

Thomas Munro 提交了另兩個修訂版本的修補程式,用於在 Linux 上為 SyncDataDirectory() 選擇性地使用 syncfs()。