PG Build 2021 將於 2021 年 11 月 30 日和 12 月 1 日 GMT 時間 09:00-17:00 線上舉行。 詳情。
PostgresDAC 3.11 釋出,這是一個用於 PostgreSQL 的直接訪問元件套件。 http://microolap.com/products/connectivity/postgresdac/download/
JDBC 42.3.1 已釋出。
ODB C++ ORM 版本 2.5.0-b.21 已釋出。
DynamoDB FDW 1.0.0 已釋出。
Babelfish,一個用於 PostgreSQL 的 MS SQL Server 相容層,已釋出。
https://archives.postgresql.org/pgsql-jobs/2021-11/
Planet PostgreSQL:https://planet.postgresql.org/
本週 PostgreSQL 週報由 David Fetter 提供。
請在太平洋標準時間(PST8PDT)週日晚上3:00之前將新聞和公告發送至 david@fetter.org。
Tom Lane 提交
plpgsql:報告變數初始化錯誤的正確行號。以前,我們會指向周圍塊的 BEGIN 關鍵字。如果在 DECLARE 部分初始化了多個變數,這就不夠好了:它可能非常令人困惑且無益。我們確實知道變數宣告從何開始,所以只需要一點點額外的錯誤報告基礎設施即可使用它。討論:https://postgr.es/m/713975.1635530414@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/acb2d7d5d2301f07d5857ee252995e62ce9e7055
當備用程序釋放許多鎖時,避免 O(N^2) 的行為。在重放事務時,該事務在主伺服器上持有許多排他鎖,備用伺服器的啟動程序會在處理鎖列表時花費 O(N^2) 的精力。程式碼寫出來時沒問題,但提交 1cff1b95a 使重複的 list_delete_first() 呼叫變得效率低下,正如其提交訊息中所解釋的。透過正常迭代列表並僅在完成後釋放儲存來修復。 (如果我們想從過程中發生的錯誤中恢復,這可能不夠;但我們不需要。)回溯到 v13,因為 1cff1b95a 就是在那裡引入的。Nathan Bossart 討論:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/6301c3adabd947394682e37c933b0f3f83353b28
文件:改進與 TAP 測試相關的 README 檔案。重新排列 src/test/perl/README,使其第一部分更清晰地說明“如何執行這些測試”,其餘部分說明“如何編寫新測試”。在那裡新增一些關於除錯測試失敗的基本資訊。然後,從描述如何執行 TAP 測試的其他 README 檔案中新增交叉引用。根據 Kevin Burke 的建議,儘管這不是他的原始補丁。討論:https://postgr.es/m/CAKcy5eiSbwiQnmCfnOnDCVC7B8fYyev3E=6pvvECP9pLE-Fcuw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b21415595cace7f3a45cfeb3023359b4b4d56b85
不要試圖一次讀取多 GB 的 pg_stat_statements 檔案。Windows 在讀取超過 INT_MAX 位元組的請求時會失敗,並且其他平臺可能也會有類似問題。讓我們調整此程式碼,使其每次最多讀取 1GB。(沒想到檔案會變得那麼大,但現在有了一個問題報告,所以它會變得那麼大。我們可能應該新增一些機制來限制查詢文字檔案的大小,使其獨立於雜湊表的大小。但這並非此補丁的目標。)根據 Yusuke Egashira 的 bug #17254。它已經這樣一段時間了,所以回溯到所有支援的分支。討論:https://postgr.es/m/17254-a926c89dc03375c2@postgresql.org https://git.postgresql.org/pg/commitdiff/a667b066837849c5e55e0d626f1f7c93e267b8b7
在列表操作中避免其他 O(N^2) 的危險。與 6301c3ada 類似,修復了更多地方,我們在迴圈中使用 list_delete_first() 並因此存在 O(N^2) 的行為風險。目前還不清楚這些位置操作的列表是否會變得足夠長以至於成為真正的問題……但也不能排除它們會變得足夠長,而且修復也很簡單。與之前一樣,回溯到 v13。討論:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/e9d9ba2a4ddc39e331dd8461b511aa59ec0dc8af
避免 SyncPostCheckpoint() 中的 O(N^2) 行為。與提交 6301c3ada 和 e9d9ba2a4 一樣,避免執行重複的 list_delete_first() 操作,因為當有許多檔案等待取消連結時,這會很昂貴。這比這些情況下的更改要大一些。我們必須保持列表狀態對 AbsorbSyncRequests() 的呼叫有效,因此有必要發明一個“已取消”欄位,而不是立即刪除 PendingUnlinkEntry 條目。此外,因為我們可能無法處理所有條目,所以我們需要一個新的列表原語 list_delete_first_n()。list_delete_first_n() 幾乎等同於 list_copy_tail(),但它修改輸入列表而不是建立新副本。我發現其中幾個使用後者的地方可以有效地使用新函式。(可能還有更多,但其他呼叫者看起來可能不應該覆蓋輸入列表。)與之前一樣,回溯到 v13。討論:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/65c6cab1365ac33b11a49a2a193f6b3f9c53e487
文件:更精確地說明關係名稱衝突。在所有這些物件型別的參考頁面中使用“表名必須與其他模式中的任何其他關係(表、序列、索引、檢視、物化檢視或外部表)的名稱不同”等措辭。主要變化是明確提及物化檢視;儘管其中一些頁面根本沒有提及名稱衝突。根據 Daniel Westermann 的建議。討論:https://postgr.es/m/ZR0P278MB0920D0946509233459AF0DEFD2889@ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/af8c580e5cf32bb85dde70083a260c93a1f783eb
文件:清理一些提到了 template1 但未提及 template0 的地方。改進舊文字,這些文字在我們新增 template0 到標準資料庫集時並未更新。根據 P. Luzanov 的建議。討論:https://postgr.es/m/163583775122.675.3700595100340939507@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7d9ec0754afeabb9f336c5220ef415c3ea27a0b6
修復 ExecInitCoerceToDomain() 中的變數生命週期。這撤銷了 1ec7679f1 中的一個錯誤:domainval 和 domainnull 本應跨越迴圈迭代,但它們被錯誤地移到了迴圈內部。其效果只是發出無用的額外 EEOP_MAKE_READONLY 步驟,因此這並不是什麼大事;儘管如此,回溯到引入錯誤的 v13。Ranier Vilela 討論:https://postgr.es/m/CAEudQAqXuhbkaAp-sGH6dR6Nsq7v28_0TPexHOm6FiDYqwQD-w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/01fc6527034a6f70ed44a078af8f636b1ab64947
確保日期時間 (datetime) 和 float8 值的邏輯複製一致性。在 walreceiver 中,將釋出者的相關 GUC(datestyle、intervalstyle、extra_float_digits)設定為與 pg_dump 使用的相同值,原因相同:我們需要輸出的讀取方式與接收者的設定無關。沒有這個,訂閱者就有可能誤解傳輸的值。儘管這顯然是一個 bug 修復,但它並非沒有缺點:將值儲存到其他資料型別(如 text)的訂閱者可能會得到與之前不同的結果,並且可能對此不滿意。鑑於之前沒有抱怨,最好僅在 HEAD 中更改此設定,並將其稱為 v15 中的不相容更改。Japin Li,根據 Sadhuprasad Patro 的報告討論:https://postgr.es/m/CAFF0-CF=D7pc6st-3A9f1JnOt0qmc+BcBPVzD6fLYisKyAjkGA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3d4019da5d026f2c3fe5bd258becf6fbb6b4673
嘗試抑制 hamerkop 上的 SSL 編譯失敗。Buildfarm 成員 hamerkop 最近幾天一直因錯誤而失敗,這些錯誤看起來像是 OpenSSL 的 X509 相關符號尚未匯入 be-secure-openssl.c。原因不明,但讓我們嘗試顯式包含 `
修復 pg_basebackup 的 MSVC 構建。提交 23a1c6578 試圖透過新的變數 BBOBJS 來重構 pg_basebackup/Makefile,但我們的 MSVC 構建系統對此一無所知。根據 buildfarm 的報告。 https://git.postgresql.org/pg/commitdiff/d8bf0a1c1d3429cafb3019f2773e2f3aa68f3b65
第二次嘗試抑制 hamerkop 上的 SSL 編譯失敗。經過進一步調查,問題的原因似乎是我們最近決定開始定義 WIN32_LEAN_AND_MEAN。這導致 `
不允許透過 array_to_tsvector() 建立空詞元 (lexeme)。tsvector 資料型別一直禁止詞元為空。然而,array_to_tsvector() 沒有收到這個訊息,並且允許空字串的陣列元素成為空詞元。這可能導致後續的 dump/restore 失敗,更不用說原始禁止後面可能存在的語義問題了。然而,其他直接將純文字輸入作為詞元值的函式不需要類似的限制,因為它們只將字串與現有的 tsvector 條目進行匹配。特別是,讓 ts_delete() 拒絕空字串將是一個壞主意,因為這是清理可能透過此 bug 進入 tsvector 列的任何錯誤資料的最方便的方法。考慮到這一點,讓我們也移除 tsvector_delete_arr 和 tsvector_setweight_by_filter 中對 NULL 陣列元素的禁止。忽略它們似乎更一致,就像會忽略空字串元素一樣。這是一個 bug 修復,有一個回溯的理由。但總的來說,這似乎不是在次要版本中需要更改的內容。Jean-Christophe Arnu 討論:https://postgr.es/m/CAHZmTm1YVndPgUVRoag2WL0w900XcoiivDDj-gTTYBsG25c65A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/cbe25dcff73a297adbada9dc1d6cad3df18014e9
嘗試修復 MSVC pgcrypto 構建。提交 db7d1a7b0 移除了 Mkvcbuild.pm 對構建 contrib/pgcrypto 的自定義支援,但忽略了通知它該模組現在可以正常構建。至少我猜現在可以正常構建了。但這肯定會導致 bowerbird 失敗,因為它試圖測試一個尚未構建的模組。 https://git.postgresql.org/pg/commitdiff/3c2c391dc9f82fae181508ebcc2f7621ffefd024
文件:新增一些關於 List 函式效能的說明。根據 Andres Freund 的建議。討論:https://postgr.es/m/20211104221248.pgo4h6wvnjl6uvkb@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/27ef132a805c8633ed8bb94ed70be995c681ab1f
contrib/sslinfo 也需要一個修復才能讓 hamerkop 滿意。重新排序 #include 會在這裡帶來一些問題,因為 libpq/libpq-be.h 需要包含 <openssl/ssl.h>。相反,讓我們在所有 #include 之後 #undef 掉不需要的宏。這肯定比其他方法更醜陋,但儘管可能將來會重新排列標頭檔案,它也應該能正常工作。(檢視 openssl 標頭檔案表明 X509_NAME 是我們使用的唯一衝突符號。)順便,刪除 pg_backup_archiver.h 中一個相關的但長期不正確的註釋。討論:https://postgr.es/m/1051867.1635720347@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/568620dfd6912351b4127435eca5309f823abde8
抑制未初始化變數警告。許多 buildfarm 機器都對此發出警告,lapwing 實際上失敗了(因為 -Werror)。據我所知,這是一個誤報,所以只需要將變數初始化為零即可。討論:https://postgr.es/m/YYXJnUxgw9dZKxlX@paquier.xyz https://git.postgresql.org/pg/commitdiff/c3ec4f8fe867807613c08fe16789434ab1a74a15
Michaël Paquier 提交
在 REINDEX CONCURRENTLY 期間保留運算子類引數。舊索引的運算子類引數 Datums 的獲取方式與謂詞和表示式相同,直接從系統目錄中獲取。然後將它們複製到將用於建立新副本的新的 IndexInfo 中。這導致新索引以預設引數重建,而不是使用者預定義的引數。獲得具有正確運算子類引數的新索引的唯一方法是重新從頭開始建立新索引。此問題由 911e702 引入。作者:Michael Paquier 審閱者:Zhihong Yu 討論:https://postgr.es/m/YX0CG/QpLXcPr8HJ@paquier.xyz 回溯到:13 https://git.postgresql.org/pg/commitdiff/add5cf28d48149459466b9aff374d78aebf17482
為 pg_receivewal 新增時間線切換的 TAP 測試。pg_receivewal 能夠跟蹤時間線切換,但這並未經過測試。此測試使用空的歸檔位置,並從槽進行重啟,使其實現比重用現有歸檔目錄稍簡單一些。作者:Ronan Dunklau 審閱者:Kyotaro Horiguchi, Michael Paquier 討論:https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/0f9b9938a0367313fcf6a32fcb7fb5be9e281198
重構 pg_receivewal 的壓縮選項。自 cada1af 起,pg_receivewal 包含了 --compress 選項,允許使用 gzip 壓縮 WAL 段,值為 0(預設)表示不壓縮。此提交引入了一個新選項 --compression-method,其值可以為“none”(預設)和“gzip”,以使事情更具擴充套件性。--compress=0 的情況與此選項層變得模糊,因此我們選擇使 pg_receivewal 在使用“none”且壓縮級別非零時返回錯誤,這意味著 --compress 的授權值現在是 [1,9] 而不是 [0,9]。未指定 --compress 和“gzip”作為壓縮方法,pg_receivewal 會使用 zlib 的預設值(Z_DEFAULT_COMPRESSION)。負責在掃描現有歸檔時查詢流式啟動 LSN 的程式碼被重構並使其更具擴充套件性。同時,在 walmethods.c 中將“compression”重新命名為“compression_level”,以減少與引入壓縮方法混淆,即使 pg_basebackup 使用的 tar 方法不依賴於壓縮方法(至少目前還不是),而僅僅依賴於壓縮級別(實際上,這個區域可以進一步改進)。這是為即將釋出的新增 LZ4 支援到 pg_receivewal 的補丁做準備。作者:Georgios Kokolatos 審閱者:Michael Paquier, Jian Guo, Magnus Hagander, Dilip Kumar 討論:https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/d62bcc8b07f921bad105c7a826702c117ea7be58
修復 pg_receivewal --compression-method 的一些錯誤。選項名稱在一個錯誤訊息中不正確,並且程式碼中使用了短選項 'I',但我們不打算這樣。同時,修復文件以引用“方法”,而不是“級別”。提交 d62bcc8 中的疏忽,我在進一步審查 pg_receivewal 的 LZ4 補丁後檢測到。 https://git.postgresql.org/pg/commitdiff/9588622945754305836555273a6a3be814db315c
為 pg_receivewal 新增 LZ4 壓縮支援。pg_receivewal 獲得了一個新選項 --compression-method=lz4,當代碼使用 --with-lz4 編譯時可用。與 gzip 類似,這提供了使用 LZ4 壓縮歸檔 WAL 段的可能性。此選項與 --compress 不相容。實現使用 LZ4 幀,併兼容簡單的 lz4 命令。與 gzip 類似,使用 --synchronous 可以確保任何資料在當前 .partial 段內重新整理到磁碟,從而儘可能多地檢索 WAL 資料,即使是從未完成的段(這需要將部分檔案填充零直到後端解壓後支援的 WAL 段大小,但這與 gzip 相同)。計算流式啟動 LSN 的程式碼能夠透明地查詢和檢查 LZ4 壓縮的段。與 gzip 不同,gzip 直接將未壓縮的大小儲存在讀取的物件中,LZ4 塊協議預設不儲存未壓縮的資料。there is contentSize,它可以透過 LZ4 幀使用,但這無助於使用包含預設壓縮的“lz4”命令壓縮的段的歸檔,其中此資訊未儲存。因此,此提交採取了最可擴充套件的方法,透過以 64kB 的塊(沒有注意到 8kB、16kB 或 32kB 的實際效能差異,並且操作本身實際上很快)為空輸出緩衝區來解壓縮已歸檔的段以檢查其未壓縮大小。已新增測試以驗證生成的 LZ4 檔案的建立和正確性。後者透過使用環境變數中的“lz4”命令來實現。walmethods.c 中的 tar-based WAL 方法(目前僅由 pg_basebackup 使用)尚不瞭解 LZ4。其程式碼可以擴充套件用於此目的。作者:Georgios Kokolatos 審閱者:Michael Paquier, Jian Guo, Magnus Hagander, Dilip Kumar 討論:https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/babbbb595d2322da095a1e6703171b3f1f2815cb
改進 psql 的 tab 補全功能 for COMMENT。為更多物件型別添加了補全,例如 domain constraints、text search 相關物件或 policies。此外,該區域進行了重組,將 COMMENT 支援的物件列表的順序更改為與文件一致,以便於將來的新增。作者:Ken Kato 審閱者:Fujii Masao, Shinya Kato, Suraj Khamkar, Michael Paquier 討論:https://postgr.es/m/6e0c2f3f657b229bea32d098d118f307@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/a5b336b8b9e04a93e7c8526302504d2e5201eb80
Álvaro Herrera 提交
在 DecodeXLogOp 中處理 XLOG_OVERWRITE_CONTRECORD。未能這樣做將導致邏輯解碼無法處理 WAL 流。透過無操作來處理它。全部回溯。報告人:Petr Jelínek petr.jelinek@enterprisedb.com https://git.postgresql.org/pg/commitdiff/40c516bba864395c77bcfb1bae65ba9562ba8f71
改寫 vacuumdb --analyze-in-stages 的文件說明。讓使用者意識到在具有現有統計資訊的資料庫中使用它可能會導致暫時性問題。作者:Nikolai Berkoff nikolai.berkoff@pm.me 討論:https://postgr.es/m/s-kSljtWXMWgMfGTztPTPcS80R8FHdOrBxDTnrQI6GMZbT7au1A4b0fzaSFtKwCI8nwN0MhgPLfVOTvJ7DwTjkip4P3d0o4VgrMJs4OLN-o=@pm.me https://git.postgresql.org/pg/commitdiff/00a354a13560dc529ac34a303c85c265aaf033b7
記錄 log_startup_progress_interval 的預設值和可變性。審查 9ce346eabf35。作者:Álvaro Herrera alvherre@alvh.no-ip.org 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/202110292123.bnf6axcp27vx@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/e543906e217509ad95c1e341de4e874f027f871b
Pipeline 模式不允許多命令字串。……所以在 libpq 文件的適當位置提及這一點。回溯到 14。報告人:RekGRpth rekgrpth@gmail.com 討論:https://postgr.es/m/17235-53bb38fc5be593dc@postgresql.org https://git.postgresql.org/pg/commitdiff/105c1de0197473dac8ada55dc8cf773d782224cb
文件說明 ALTER TABLE .. TYPE 會移除統計資訊。聯合作者:Nikolai Berkoff nikolai.berkoff@pm.me 討論:https://postgr.es/m/vCc8XnwDmlP4ZnHBQLIVxzD405BiYHVC9qZlhIF7IsfxK0gC9mZ4PUUOH0-3y6kv5p-87-3_ljqT1KvQVAnb8OoWhPU3kcqWn2ZpmxRBCQg=@pm.me https://git.postgresql.org/pg/commitdiff/df80f9da5c6541e744eeb20eaca919c7fc189999
避免在併發 DROP 的罕見情況下崩潰。當要刪除的角色被目錄物件引用,而這些物件又同時被刪除時,在嘗試構造描述物件的字串時可能會導致崩潰。透過忽略其描述返回 NULL 的物件來抑制這種情況。大多數相關的程式碼點已經對此很謹慎了;我們只是遺漏了幾個。這是一箇舊 bug,所以要全部回溯。報告人:Alexander Lakhin exclusion@gmail.com 討論:https://postgr.es/m/17126-21887f04508cb5c8@postgresql.org https://git.postgresql.org/pg/commitdiff/d74b54b3ddf710926a44bf3f9c87c00e6f82d825
Daniel Gustafsson 提交
Amit Kapila 提交
用更本地化的標誌替換 XLOG_INCLUDE_XID 標誌。提交 0bead9af484c 引入了 XLOG_INCLUDE_XID 標誌,以指示 WAL 記錄包含 subXID 到 topXID 的關聯。它稍後使用該標誌標記 CurrentTransactionState,表示 top-xid 已記錄,因此我們不應在當前子事務的下一個 WAL 記錄中再次記錄它。但是,我們可以使用區域性變數來傳遞該資訊。順便,更改相關的函式和變數名稱,使其與程式碼的實際操作保持一致。作者:Dilip Kumar 審閱者:Alvaro Herrera, Amit Kapila 討論:https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b
將 MarkCurrentTransactionIdLoggedIfAny() 移出臨界區。我們在此函式中不修改任何共享狀態,這可能導致任何併發會話出現問題。這將使其看起來與同一結構(TransactionState)的其他更新相似,從而避免將來程式碼閱讀者的混淆。作者:Dilip Kumar 審閱者:Amit Kapila 討論:https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/335397456b7e3f9f619038cb322fbfc9dd649d4f
Fujii Masao 提交
pgbench:改進 pgbench 中的錯誤處理。以前,初始連線和日誌檔案開啟的失敗會導致 pgbench 繼續進行基準測試,報告不完整的測試結果並以狀態 2 退出。當 pgbench 無法按規定啟動時,繼續進行基準測試是沒有意義的。此提交改進了 pgbench,以便在啟動基準測試時發生的早期錯誤(如這些失敗)應使 pgbench 立即以狀態 1 退出。作者:Yugo Nagata 審閱者:Fabien COELHO, Kyotaro Horiguchi, Fujii Masao 討論:https://postgr.es/m/TYCPR01MB5870057375ACA8A73099C649F5349@TYCPR01MB5870.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/cd29be5459f0e138c0f19d49ee588feeda78e3c9
pgbench:修復註釋中的拼寫錯誤。討論:https://postgr.es/m/f9041ec2-46b6-1b41-0e84-9c8a1e2d6bda@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/d8dba4d03068eeee1ea3ffc8e7c7b4fa3e35a7f4
Peter Geoghegan 提交
在並行 VACUUM 中不要忽略索引。提交 b4af70cb 簡化了 VACUUM 管理的狀態,順便對並行 VACUUM 進行了重構。對領導者程序負責的任務的細節感到困惑,導致出現了可能導致並行 VACUUM 完全錯過表索引的子集的程式碼。具體來說,低於 min_parallel_index_scan_size 截止值的索引被忽略了。這些索引應該由領導者(以及任何並行不安全索引)進行 vacuum,但實際上根本沒有被 vacuum。一旦堆元組的堆 TID 被回收用於新的堆元組,受影響的索引很容易出現重複的堆 TID。這具有通用症狀,幾乎可以用於任何涉及索引與其表之間結構不一致的索引損壞。為解決此問題,請確保並行 VACUUM 領導者程序執行所有必需的索引 vacuum 操作,以處理那些恰好低於大小截止值的索引。此外,請記錄並行 VACUUM 的設計,包括這些低於大小截止值的索引。目前尚不清楚有多少使用者可能受到此 bug 的影響。表中至少必須有三個索引才能觸發 bug:一個較小的索引,以及至少另外兩個索引,它們本身超過了大小截止值。僅有一個額外索引的案例不會出現問題,因為並行 VACUUM 成本模型需要表中至少有兩個大於截止值的索引才能應用任何並行處理。另請注意,自動 vacuum 未受影響,因為它從不使用並行處理。基於 Masahiko Sawada 的一個較大補丁的測試用例。非常感謝 Kamigishi Rei 在追蹤此問題上的寶貴幫助。作者:Peter Geoghegan pg@bowt.ie 作者:Masahiko Sawada sawada.mshk@gmail.com 報告人:Kamigishi Rei iijima.yun@koumakan.jp 報告人:Andrew Gierth andrew@tao11.riddles.org.uk 診斷人:Andres Freund andres@anarazel.de Bug:#17245 討論:https://postgr.es/m/17245-ddf06aaf85735f36@postgresql.org 討論:https://postgr.es/m/20211030023740.qbnsl2xaoh2grq3d@alap3.anarazel.de 回溯:14-,其中出現了重構提交。 https://git.postgresql.org/pg/commitdiff/9bacec15b67d1a643915858f054790f36b2b7871
修復並行 amvacuumcleanup 安全 bug。提交 b4af70cb 反轉了 parallel_processing_is_safe() 函式的返回值,但忽略了 amvacuumcleanup 測試。不支援並行清理的索引 AM 受到影響。此 bug 的實際後果並不嚴重。雜湊索引受到影響,但由於 hashvacuumcleanup 僅返回塊數,因此影響不大。作者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAD21AoA-Em+aeVPmBbL_s1V-ghsJQSxYL-i3JP8nTfPiD1wjKw@mail.gmail.com 回溯:14-,其中出現了提交 b4af70cb。 https://git.postgresql.org/pg/commitdiff/c59278a1aa5ef2ee8a6d5d83bd987a7ce5c89e84
將另一箇舊提交新增到 git-blame-ignore-revs。新增另一個歷史性的 pgindent 提交,該提交在初始工作(提交 8e638845)中被遺漏了。 https://git.postgresql.org/pg/commitdiff/581055c32fbb5018431265877754cbd8019bc012
向堆剪除程式碼新增各種斷言。這些斷言記錄(並驗證)我們關於剪除如何影響目標堆頁面現有項的高層假設。例如,其中一個新斷言驗證剪除不會將僅堆元組設定為 LP_DEAD。作者:Peter Geoghegan pg@bowt.ie 審閱者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/CAH2-Wz=vhvBx1GjF+oueHh8YQcHoQYrMi0F0zFMHEr8yc4sCoA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5cd7eb1f1c32e1b95894f28b277b4e4b89add772
新增硬化以捕獲索引中的無效 TID。向堆索引元組刪除路徑新增硬化,以捕獲索引頁面中的 TID,這些 TID 指向索引元組絕不應指向的堆項。這裡試圖捕獲的損壞特別難以檢測,因為它通常涉及“額外的”(損壞的)索引元組,而不是索引中缺少必需的索引元組。例如,來自索引頁面的堆 TID(該頁面指向堆頁面中的 LP_UNUSED 項)很可能被新的檢查之一捕獲。最近修復的並行 VACUUM bug(參見提交 9bacec15)如果該特定檢查在 PostgreSQL 14 中可用,可能會被捕獲。目前不回溯此額外硬化。作者:Peter Geoghegan pg@bowt.ie 審閱者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/CAH2-Wzk-4_raTzawWGaiqNvkpwDXxv3y1AQhQyUeHfkU=tFCeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e7428a99a13f973549aab30c57ec8380ddda1869
更新 vacuumlazy.c 中過時的堆剪除註釋。新增新的註釋,闡明 VACUUM 對堆剪除的期望:剪除絕不能留下仍具有元組儲存的 DEAD 元組。至少自提交 8523492d 以來一直如此,該提交確立了 vacuumlazy.c 不需要直接處理仍具有元組儲存的 DEAD 元組的原則,除了可能透過簡單地重試剪除(以處理併發事務中止引起的罕見角落情況)。順便,更新一些對舊符號名稱的引用,這些引用在快照可伸縮性工作(特別是提交 dc7420c2c9)中被遺漏了。 https://git.postgresql.org/pg/commitdiff/f214960adde6028a39ba3014b1ab2b224faeefed
更新 vacuumlazy.c 中過時的引用。提交 7ab96cf6 中的疏忽。 https://git.postgresql.org/pg/commitdiff/02f9fd129432cab565b2a3cb9f3b3a5000dfe540
Peter Eisentraut 提交
修復不正確的格式佔位符。 https://git.postgresql.org/pg/commitdiff/ef6f047d2c87b91318364341c058dd6b715951b2
pgcrypto:刪除非 OpenSSL 支援。pgcrypto 擁有一些加密演算法的內部實現,作為呼叫 OpenSSL 的替代方案。這些很少使用,因為大多數生產安裝都是用 OpenSSL 構建的。此外,維護並行程式碼路徑會使程式碼更復雜且難以維護。此補丁刪除了這些內部實現。現在,僅當配置了 OpenSSL 支援時,pgcrypto 才會構建。審閱者:Daniel Gustafsson daniel@yesql.se 討論:https://postgres.tw/message-id/flat/0b42f1df-8cba-6a30-77d7-acc241cc88c1%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/db7d1a7b0530e8cbd045744e1c75b0e63fb6916f
Heikki Linnakangas 提交
如果在 lo_export 失敗時修復快照引用洩漏。如果在 lo_export() 無法開啟目標檔案或寫入檔案,它會在頂層事務上下文和資源所有者中洩漏建立的 LargeObjectDesc 及其快照。這基本上是無害的,畢竟這是一個小洩漏,但它會給使用者帶來“Snapshot reference leak”警告。透過使用短暫的記憶體上下文和非資源所有者來修復,對於在單個函式呼叫中開啟和關閉的臨時 LargeObjectDesc。最容易透過在不存在的目錄上使用 lo_export() 來重現洩漏,但原則上其他 lo_* 函式也可能失敗。回溯到所有支援的版本。報告人:Andrew B 審閱者:Alvaro Herrera 討論:https://postgres.tw/message-id/32bf767a-2d65-71c4-f170-122f416bab7e@iki.fi https://git.postgresql.org/pg/commitdiff/6b1b405ebfdce9da47f59d8d4144b1168709fbce
更新預期的替代輸出檔案。先前的提交在 'largeobject' 中添加了一個測試,但忽略了替代的預期輸出檔案 'largeobject_1.source'。根據 buildfarm 動物 'hamerkop' 上的失敗。討論:https://postgres.tw/message-id/DBA08346-9962-4706-92D1-230EE5201C10@yesql.se https://git.postgresql.org/pg/commitdiff/d5ab0681bf1bbf6c0c2cba9a2d55fe8e080597b6
Robert Haas 提交
amcheck:新增額外的 TOAST 指標檢查。擴充套件對 TOAST 屬性的檢查,以在原始大小過大時發出警告。對於壓縮屬性,如果壓縮似乎擴大了屬性或壓縮方法無效,也應發出警告。Mark Dilger,審閱者 Justin Pryzby, Alexander Alekseev, Heikki Linnakangas, Greg Stark 和我。討論:http://postgr.es/m/8E42250D-586A-4A27-B317-8B062C3816A8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/bd807be6935929bdefe74d1258ca08048f0aafa3
引入 'bbsink' 抽象以模組化基礎備份程式碼。基礎備份程式碼多年來積累了大量新功能,但由於沒有真正分離關注點,維護和進一步增強這些程式碼變得越來越困難。例如,瞭解如何使用 libpq 協議將資料傳送到客戶端的程式碼分散在 basebackup.c 的各個部分,而不是集中在一個地方。為了試圖改善這種情況,引入了一個新的 'bbsink' 物件,它充當基礎備份過程中生成的歸檔的接收者,也充當備份清單的接收者。此提交引入了三種類型的 bbsink:'copytblspc' bbsink 透過每個表空間一次 COPY OUT 操作將備份轉發到客戶端,以及一個用於清單的;'progress' bbsink 執行命令進度報告;'throttle' bbsink 執行速率限制。'progress' 和 'throttle' bbsink 型別還將資料轉發到後繼的 bbsink;目前,鏈中的最後一個 bbsink 始終是 'copytblspc' 型別。計劃在未來的提交中新增更多型別的 'bbsink'。此抽象在進度報告的情況下有點洩漏,但仍然比我們以前的更好。補丁由我編寫,由 Andres Freund, Sumanta Mukherjee, Dilip Kumar, Suraj Kharage, Dipesh Pandit, Tushar Ahuja, Mark Dilger 和 Jeevan Ladhe 審閱和測試。討論:https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 討論:https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bef47ff85df18bf4a3a9b13bd2a54820e27f3614
引入 'bbstreamer' 抽象以模組化 pg_basebackup。pg_basebackup 知道如何處理從伺服器獲取的備份的許多事情,例如直接寫出檔案,或先壓縮它們,甚至解析 tar 格式並將修改後的 postgresql.auto.conf 檔案注入伺服器生成的歸檔中。不幸的是,這使得 pg_basebackup.c 成為一個非常大的原始檔,並且也難以進行增強,因為例如,關於伺服器正在向我們傳送“tar”檔案而不是其他型別歸檔的知識分佈在各個地方,而不是集中在一個地方。為了改善這種情況,此提交發明瞭一個新的“bbstreamer”抽象。從伺服器接收的每個歸檔都饋送給一個 bbstreamer,該 bbstreamer 可以選擇處理它或將其傳遞給另一個 bbstreamer。資料塊也可以根據它們是歸檔檔案中檔案的資料負載部分還是歸檔元資料部分被“標記”。因此,例如,如果我們想獲取一個 tar 檔案,修改其中包含的 postgresql.auto.conf 檔案,然後將其 gzip 並寫出,我們可以使用 bbstreamer_tar_parser 來解析從伺服器接收到的 tar 檔案,bbstreamer_recovery_injector 來修改 postgresql.auto.conf 的內容,bbstreamer_tar_archiver 來用新構建的、對於已修改檔案正確的 tar 頭替換前一步修改檔案的 tar 頭,以及 bbstreamer_gzip_writer 來 gzip 並寫出結果資料。只有名稱中包含“tar”的物件才知道 tar 歸檔格式,並且理論上如果我們想使用除“tar”以外的其他格式進行重新歸檔,我們可以這樣做。這些更改確實增加了大量程式碼,但我認為結果更易於維護和擴充套件。pg_basebackup.c 本身縮小了大約三分之一,其中許多以前包含的複雜性都轉移到了新新增的檔案中。補丁由我編寫。作為此部分的大型補丁系列,已由 Andres Freund, Sumanta Mukherjee, Dilip Kumar, Suraj Kharage, Dipesh Pandit, Tushar Ahuja, Mark Dilger, Sergei Kornilov 和 Jeevan Ladhe 在不同時間進行過審閱和測試。討論:https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 討論:https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/23a1c6578c87fca0e361c4f5f9a07df5ae1f9858
在不需要時不要設定 ThisTimeLineID。在 slotfuncs.c 中,pg_replication_slot_advance() 需要確定槽應推進到的 LSN,但這不需要更新 ThisTimeLineID,因為從這裡呼叫的任何程式碼都不依賴於它。如果複製槽是邏輯的,pg_logical_replication_slot_advance 將呼叫 read_local_xlog_page,它確實會使用 ThisTimeLineID,但也會確保其是最新的。如果是物理複製槽,時間線根本不會被使用。在 logicalfuncs.c 中,pg_logical_slot_get_changes_guts() 存在同樣的問題:我們唯一要執行的程式碼是 read_local_xlog_page 或其下游程式碼,後者已經確保設定了正確的值。因此,不要在這裡執行。補丁由我編寫,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 審閱和測試。討論:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caf1f675b88d1aa67ea3fb642e8f38b470cc911e
移除 xlog.c 之外對 ThisTimeLineID 全域性變數的所有使用。所有此類程式碼都以三種方式之一處理此全域性變數。有時,同一函式在同一時間以多種方式使用它。首先,有時它是 xlog.c 或其他地方呼叫的一個或多個函式的隱式引數,並且必須在呼叫這些函式之前設定為適當的值,以免它們出錯。在那些情況下,現在將它顯式傳遞作為引數。其次,有時在恢復結束後用於獲取當前時間線,即正在寫入和重新整理 WAL 的時間線。此類程式碼現在呼叫 GetWALInsertionTimeLine() 或依賴於新增到 GetFlushRecPtr() 的新的輸出引數。第三,有時在恢復期間用於儲存當前重放時間線。這可能會發生變化,因此此類程式碼通常必須在每次使用之前更新該值。它們仍然可以這樣做,但現在必須使用區域性變數。這些更改的淨效應是直接訪問此全域性變數的程式碼量大幅減少。這是好事,因為歷史表明,我們並不總是清楚在任何給定時間點它應該包含哪個時間線 ID,甚至在程式碼的任何給定點是否已經或需要初始化它。補丁由我編寫,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 審閱和測試。討論:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e997a0c642860a96df0151cbeccfecbdf0450d08
將 ThisTimeLineID 從全域性變數更改為區域性變數。StartupXLOG() 仍然將 ThisTimeLineID 作為區域性變數,但 xlog.c 中剩餘的程式碼現在需要透過其他方式獲取相關 TimeLineID。大多數情況下,這意味著現在將它作為函式引數傳遞給許多以前沒有的函式。然而,少數情況需要特殊處理:- 在可能被外部呼叫者呼叫而不知道要指定哪個時間線的函式中,我們從共享記憶體中獲取時間線 ID。在大多數情況下可以使用 XLogCtl->ThisTimeLineID,因為可以假定在呼叫這些函式之前恢復已經完成。在 xlog_redo() 中,我們可以使用 XLogCtl->replayEndTLI。- XLogFileClose() 需要知道開啟的日誌檔案的 TLI。透過一個新的全域性變數 openLogTLI 來實現。雖然有人可能認為這只是用另一個全域性變數替換了一個全域性變數,但新的變數的用途要窄得多,並且只在少數幾個地方被引用。- read_backup_label() 現在返回透過解析 backup_label 檔案獲得的 TLI。以前,可以呼叫 ReadRecord() 來解析檢查點記錄,而 ThisTimeLineID 尚未初始化。現在,時間線會傳遞下去,而我不想傳遞未初始化的變數;這個更改可以避免這種情況。舊程式碼似乎沒有任何實際後果需要我們擔心,但這樣更清晰。- 在 BootstrapXLOG() 中,它只是一個常量。補丁由我編寫,由 Michael Paquier, Amul Sul 和 Álvaro Herrera 審閱和測試。討論:https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4a92a1c3d1c361ffb031ed05bf65b801241d7cdd
刪除由 bd807be6935929bdefe74d1258ca08048f0aafa3 新增的測試。Buildfarm 對此不滿意。不清楚它為什麼不喜歡這些測試,但讓我們在弄清楚之前刪除它們。討論:http://postgr.es/m/462618.1636171009@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ccf289745d3e50360653181dce6a277a1fc79730
Tomáš Vondra 提交了
修復 BRIN minmax multi 中 NaN 值的處理。在計算 float4/float8 值之間的距離時,我們需要更小心地處理 NaN 值,以避免觸發 assert。我們將 NaN 值視為相等(距離為 0.0),並且與所有其他值有無限距離。在沒有 assert 的構建中,這個問題基本無害——範圍可能會以效率較低的順序合併,但索引仍然是正確的。根據 Andreas Seltenreich 的報告。回溯到 14,這是引入這個新的 BRIN opclass 的地方。報告人:Andreas Seltenreich 討論:https://postgr.es/m/87r1bw9ukm.fsf@credativ.de https://git.postgresql.org/pg/commitdiff/d91353f4b21f10417d142e6ac17a0490adae867c
將 mystreamer 變數標記為 PG_USED_FOR_ASSERTS_ONLY。在沒有 assert 的構建中,抑制未使用變數的警告。 https://git.postgresql.org/pg/commitdiff/dafcf887daa472b0a49bee7e07042372bc37cee4
向 btree_gist 新增 bool GiST opclass。將 bool opclass 新增到 btree_gist 擴充套件中,以允許在 bool 列上建立 GiST 索引。GiST 索引僅在單個 bool 列上似乎不太有用,但這允許定義涉及 bool 列的排除約束,例如。作者:Emre Hasegeli 審閱者:Andrey Borodin 討論:https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/57e3c5160b24e61758f817feb7aac152cd695c6f
修復 gist_bool_ops 使用 gbtreekey2。提交 57e3c5160b 添加了一個新的 GiST bool opclass,但它使用了 gbtreekey4 來儲存資料,這留下了兩個未定義的位元組,正如我們的 valgrind 機器 skink 所報告的。還有一些混淆,因為 opclass 在定義中也使用了 gbtreekey8。透過定義一個新的 gbtreekey2 結構,並在所有地方使用它來修復。討論:https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e2fbb883720aa222f61eb9f3affad1c63bac7cbb
Alexander Korotkov 提交了
Andres Freund 提交