發布日期: 2024-02-08
此版本包含來自 16.1 的各種修正。有關主要版本 16 的新功能資訊,請參閱 第 E.3 節。
對於執行 16.X 的人來說,不需要傾印/還原。
但是,已修正一個錯誤,該錯誤可能導致在並發更新期間 GIN 索引損毀。如果您懷疑有此類損毀,請在安裝此更新後重新索引受影響的索引。
此外,如果您從早於 16.1 的版本升級,請參閱 第 E.2 節。
在 REFRESH MATERIALIZED VIEW CONCURRENTLY
內收緊安全性限制(Heikki Linnakangas)
並發更新指令的一個步驟是在安全性限制薄弱的情況下執行的。如果實體化檢視的擁有者說服超級使用者或其他高權限使用者對該檢視執行並發更新,則檢視的擁有者可以控制使用執行 REFRESH
的使用者的權限執行的程式碼。修復事項,以便所有使用者確定的程式碼都如預期般以檢視擁有者的身分執行。
已知此錯誤的唯一利用方式在 PostgreSQL 16.0 和更新版本中不起作用,因此在實務上 v16 可能並未受到影響。
PostgreSQL 專案感謝 Pedro Gallegos 回報此問題。(CVE-2024-0985)
在執行 JIT 內嵌時修正記憶體外洩(Andres Freund、Daniel Gustafsson)
在經過足夠多的 JIT 編譯後,有許多關於後端處理程序遭受記憶體不足狀況的報告。此修正應可解決該問題。
避免產生不正確的分區聯結計畫 (Richard Guo)
涉及側向參考的一些不常見情況可能會產生不正確的計畫。受影響的查詢可能會產生錯誤的答案,或產生奇怪的失敗,例如 “子計畫目標清單中找不到變數”,或執行器崩潰。
修正 PlaceHolderVars 中子查詢輸出表達式的錯誤包裝 (Tom Lane)
當子查詢位於外部聯結下方,且具有側向參考外部聯結範圍之外內容的輸出欄位時,此修正會修正不正確的結果。由於外部聯結的作用,輸出欄位可能不會在應為 NULL 時顯示為 NULL。
修正視窗函數執行條件的錯誤處理 (Richard Guo)
此疏忽可能會導致 “子計畫目標清單中找不到 WindowFunc” 錯誤。
修正 Memoize 計畫的內側唯一性偵測 (Richard Guo)
此錯誤可能會導致 “快取條目已完成” 錯誤。
修正常數折疊欄位選取時 nullingrels 的運算 (Richard Guo)
未執行此操作會導致錯誤,例如 “變數 2/2 的 varnullingrels (b) 錯誤 (預期 (b 3))”。
當 MERGE
導致跨分區更新時,略過不適當的動作 (Dean Rasheed)
在分區表格上執行 MERGE UPDATE
動作時,如果 UPDATE
因變更分區金鑰欄位而變成 DELETE
和 INSERT
,請略過觸發 AFTER UPDATE ROW
觸發器,以及其他更新後動作,例如 RLS 檢查。這些動作通常會失敗,這就是一般 UPDATE
在這種情況下不會執行的動作;MERGE
也不應該執行。
處理跨分區 MERGE
更新中的 BEFORE ROW DELETE
觸發器 (Dean Rasheed)
如果此類觸發器嘗試透過傳回 NULL 來防止更新,MERGE
會發生錯誤或斷言失敗。
防止在 BEFORE ROW UPDATE
觸發器中存取不再固定的緩衝區 (Alexander Lakhin, Tom Lane)
如果正在更新的元組剛剛被另一個會話更新並移至另一頁,則我們會在一個狹窄的視窗中嘗試從新元組版本擷取資料,而不會在其緩衝區上釘選任何資料。原則上,這可能會導致垃圾資料出現在建議的新元組的未更新欄位中。然而,實際上出現問題的機率似乎相當低。
避免在並行雜湊聯結中要求過大的共用記憶體區域(Thomas Munro、Andrei Lepikhov、Alexander Korotkov)
限制值過大,允許在預期的雜湊表大小足夠大的情況下發生「“無效的 DSA 記憶體配置要求大小”」錯誤。
修復在嘗試延伸暫時性表格時發生錯誤時,本地緩衝區狀態的損毀(Tender Wang)
修復在評估具有多個參數的 DISTINCT
聚合時使用錯誤的元組槽(David Rowley)
此錯誤可能會導致錯誤,例如「“類型為記錄的屬性 1 類型錯誤”」。
避免在 heap_update()
和 heap_delete()
中發生斷言失敗,當外來金鑰強制觸發器要更新的元組未通過額外的可見性交叉檢查時(Alexander Lakhin)
此錯誤在非斷言建置中沒有影響。
修復在複雜的繼承樹上執行 ALTER TABLE ADD COLUMN
時可能發生的失敗(Tender Wang)
如果孫子表格會透過多個中間父表格繼承新欄位,則命令會失敗,並顯示「“元組已由自己更新”」。
修復 ALTER TEXT SEARCH CONFIGURATION ... MAPPING
命令中重複的權杖名稱問題(Tender Wang、Michael Paquier)
修復具有重複角色名稱的 DROP ROLE
(Michael Paquier)
之前這會導致「“元組已由自己更新”」失敗。相反,忽略重複。
在 DROP STATISTICS
期間適當鎖定關聯的表格(Tomas Vondra)
如果無法取得鎖定,則如果 DROP
與 ANALYZE
同時執行,可能會導致「“元組同時刪除”」錯誤。
修復 GENERATED
和 DEFAULT
表達式的函數波動檢查(Tom Lane)
這些地方可能會無法偵測到插入波動函數預設參數表達式,或判定多型函數是波動的,儘管它實際上在感興趣的資料類型上是不可變的。這可能會導致不當拒絕或接受 GENERATED
子句,或在 ALTER TABLE ADD COLUMN
中錯誤地套用常數預設值最佳化。
偵測到新的目錄快取條目在取消吐司其欄位時已過時(Tom Lane)
我們會在將目錄元組插入目錄快取中之前,展開其任何離線欄位。這涉及資料庫存取,可能會導致目錄快取條目失效,但新條目尚未在快取中,因此我們會錯過注意到它應該失效。結果會產生競爭情況,其中已過時的快取條目可能會被建立,然後無限期地持續存在。這將導致難以預測的錯誤行為。透過在取消吐司後重新檢查元組的可見性來修復。
修正某些平台上的邊界案例整數溢位偵測錯誤(Dean Rasheed)
計算 0 - INT64_MIN
應導致溢位錯誤,而且在多數平台上確實如此。然而,既沒有內建整數溢位功能也沒有 128 位元整數的平台會無法偵測到溢位,反而會傳回 INT64_MIN
。
在將 interval
加到或減去 timestamp
時偵測儒略日溢位(Tom Lane)
某些應該導致範圍外錯誤的案例反而會產生不正確的結果。
在 interval_mul()
和 interval_div()
中加入更多溢位檢查(Dean Rasheed)
某些應該導致範圍外錯誤的案例反而會產生不正確的結果。
允許中斷 scram_SaltedPassword()
(Bowen Shi)
對於大型 scram_iterations
值,此函式可能需要花費很長的時間來執行。允許透過查詢取消要求來中斷它。
確保在變更 stats_fetch_consistency
之後會捨棄快取統計資料(Shinya Kato)
在某些程式碼路徑中,可能會傳回過期的統計資料。
讓 pg_file_settings
檢視檢查未套用的值對設定的有效性,其中設定具有 backend
或 superuser-backend
的內容(Tom Lane)
檢視中未如預期地標示無效值。由於這些群組中的設定很少,因此這會導致偵測不到。
在將現有索引與新的分割索引進行比對時,也比對校對(Peter Eisentraut)
先前我們可能會接受與分割鍵對應元素具有不同校對的索引,這可能會導致行為不當。
避免在分割索引上使用 REINDEX INDEX
時,如果子索引與之同時刪除,則會發生失敗(Fei Changhong)
修正清理 GIN 索引內部頁面的不完整分割時,鎖定不足的問題(Fei Changhong、Heikki Linnakangas)
程式碼嘗試使用共用鎖定而不是對緩衝區使用獨佔鎖定來執行此操作。如果兩個程序同時嘗試進行清理,這可能會導致索引損毀。
避免在 GIN 索引插入時過早釋放緩衝區固定(Tom Lane)
如果索引根頁面分割與我們自己的插入同時發生,程式碼可能會失敗,並顯示 “緩衝區 NNNN 不屬於資源擁有者”。
避免分割 SP-GiST 索引時發生失敗(Tom Lane)
嘗試使用此類型的索引可能會導致 “找不到此類檔案或目錄” 錯誤。
修正大型物件的所有權測試(Tom Lane)
需要所有權權限的大型物件操作會失敗,並顯示 “無法辨識的類別 ID:2613”,除非由超級使用者執行。
修正大型物件所有權變更報告(Tom Lane)
無操作的 ALTER LARGE OBJECT OWNER
命令(即選擇現有所有者的命令)傳遞錯誤的類別 ID 給 PostAlterHook
,可能會讓使用該掛鉤的任何擴充套件感到困惑。
修正 EXPLAIN (BUFFERS)
中 I/O 定時資料的報告(Michael Paquier)
標記為 “shared/local” 的數字實際上僅指共用緩衝區,因此將該標籤變更為 “shared”。
確保 CREATE DATABASE
的耐用性(Noah Misch)
如果在 CREATE DATABASE
期間或之後不久發生作業系統崩潰,則復原可能會失敗,或者後續連線到新資料庫可能會失敗。如果在該時間範圍內進行基本備份,則在嘗試使用備份時可能會觀察到類似的問題。症狀是資料庫目錄、PG_VERSION
檔案或 pg_filenode.map
檔案遺失或為空。
從備份開始和結束復原時新增更多 LOG
訊息(Andres Freund)
此變更在郵件伺服器記錄檔中提供額外資訊,這可能有助於診斷復原問題。
防止備用伺服器在子交易期間錯誤處理已死的索引元組(Fei Changhong)
未正確設定 startedInRecovery
標記以進行子交易。這只會影響已死的索引元組的處理。它可能會允許子交易中的查詢忽略它應該回傳的索引項目(如果它們已在主伺服器上死亡,但對備用交易而言尚未死亡),或過早將尚未在主伺服器上死亡的索引項目標記為已死亡。目前尚不清楚後者的案例是否有任何嚴重後果,但這並非預期的行為。
修正 walreceiver 程序中的訊號處理(Heikki Linnakangas)
還原一項變更,該變更使 walreceiver 在等待建立複製連線時對 SIGTERM 沒有反應。
修正檢查記錄是否符合 WAL 解碼緩衝區時整數溢位風險(Thomas Munro)
此錯誤似乎只會在 64 位元平台上執行 32 位元 PostgreSQL 建置時才會潛伏。
修正邏輯複製套用工作執行緒、其 tablesync 工作執行緒和嘗試變更訂閱的階段處理程序之間的死結(Shlok Kyal)
死結迴圈的一邊沒有涉及鎖定等待,因此死結未被偵測到,且會持續存在,直到手動介入為止。
確保欄位預設值由 pgoutput 邏輯複製外掛程式正確傳輸(Nikhil Benesch)
ALTER TABLE ADD COLUMN
對於新欄位使用常數預設值,避免重寫現有的組,而是預期讀取程式碼會將正確的預設值插入到缺少該欄位的組中。如果稍後在資料表上啟動複製,pgoutput 會傳輸 NULL,而不是該欄位的正確預設值,導致訂閱者上的複製不正確。
修正邏輯複製的初始同步失敗,原因是資料表沒有欄位(Vignesh C)
此案例產生格式不正確的 COPY
指令。
在使用前重新驗證訂閱的連線字串(Vignesh C)
此舉旨在偵測在沒有密碼的情況下建立訂閱(超級使用者允許這麼做),但隨後訂閱擁有者變更為非超級使用者的案例。
當新用戶端在未回應伺服器的密碼驗證挑戰的情況下斷線時,傳回正確的狀態碼(Liu Lang、Tom Lane)
在某些情況下,我們會將此視為可記錄的錯誤,這並非本意,而且會產生大量日誌垃圾訊息,因為像 psql 這樣的常見用戶端經常這麼做。這也可能會混淆使用 ClientAuthentication_hook
的擴充功能。
修正與 OpenSSL 3.2 的不相容性(Tristan Partin、Bo Andreson)
使用 BIO “app_data” 欄位作為我們的私人儲存,而不是假設可以使用 “data” 欄位。這個錯誤以前不會造成問題,但使用 3.2 時會導致崩潰和關於重複釋放的抱怨。
更加注意 OpenSSL 在發生錯誤時不會設定 errno
(Tom Lane)
如果未設定 errno
,則假設報告的失敗原因是讀取 EOF。這修正了罕見的奇怪錯誤報告案例,例如 “無法接受 SSL 連線:成功”。
修正外來資料包裝器的 ForeignAsyncRequest
函數失敗時檔案描述符外洩(Heikki Linnakangas)
修正 CREATE SUBSCRIPTION
連線字串驗證中的小量記憶體外洩(Jeff Davis)
將檔案相關系統呼叫的 ENOMEM 錯誤報告為 ERRCODE_OUT_OF_MEMORY
,而不是 ERRCODE_INTERNAL_ERROR
(Alexander Kuzmenkov)
在 PL/pgSQL 中,支援 SQL 指令,這些指令是 CREATE FUNCTION
/CREATE PROCEDURE
,並具有 SQL 標準主體(Tom Lane)
以前,此類案例會因函數主體中出現分號而導致解析錯誤而失敗。
修正 libpq 在管道中處理錯誤的方式 (Álvaro Herrera)
如果錯誤是因查詢問題以外的原因而傳回 (例如,如果連線中斷),則管道狀態可能會不同步。這可能會導致呼叫應用程式發生忙碌迴圈。
讓 libpq 的 PQsendFlushRequest()
函式在與其他 PQsend
函式相同的規則下清除用戶端輸出緩衝區 (Jelte Fennema-Nio)
在管道模式中,可能仍需要呼叫 PQflush()
;但此變更移除了一些不一致性。
避免競爭狀態,當 libpq 在兩個不同的執行緒中同時初始化 OpenSSL 支援時 (Willi Mann, Michael Paquier)
修正 GSSAPI 資料傳輸中與時間相關的失敗 (Tom Lane)
在非封鎖模式中使用 GSSAPI 加密時,libpq 有時會失敗,並顯示 “GSSAPI 呼叫者無法重新傳輸所有需要重試的資料”。
變更 initdb,以始終取消 postgresql.conf
條目的註解,這些條目適用於 lc_
參數 (Kyotaro Horiguchi)xxx
initdb 在 v16 之前使用這種方式運作,現在又再次使用。此變更導致 initdb 的 --no-locale
選項無法對 lc_messages
產生預期的效果。
在 pg_dump 中,不要傾印擴充元件成員物件的 RLS 政策或安全性標籤 (Tom Lane, Jacob Champion)
先前,指令會包含在傾印中以設定這些屬性,這其實是不正確的,因為它們應該被視為擴充元件的內部事務。此外,還原使用者可能沒有足夠的權限來設定它們,而且傾印使用者可能沒有足夠的權限來傾印它們 (因為傾印 RLS 政策需要取得其資料表的鎖定)。
在 pg_dump 中,如果其基礎資料表未被傾印,則不要傾印延伸統計物件 (Rian McGuire, Tom Lane)
這符合其他相依物件 (例如索引) 的行為。
在 pg_dump 中的一個程式碼路徑中適當地偵測記憶體不足 (Daniel Gustafsson)
讓 pgbench 腳本以開啟的管線結束時出錯(Anthonin Bonnefoy)
先前,如果 \startpipeline
指令缺少匹配的 \endpipeline
,pgbench 會表現得很奇怪。這看起來像是腳本錯誤,而不是 pgbench 需要妥善處理的情況,所以會擲回錯誤。
在 contrib/bloom
中,修正關於 false_positive_rate
的過度嚴格斷言(Alexander Lakhin)
修正 contrib/intarray
中的崩潰,如果一個元素等於 INT_MAX
的陣列插入到 gist__int_ops
索引中(Alexander Lakhin、Tom Lane)
當 contrib/pageinspect
的 hash_bitmap_info()
函式套用到分區雜湊索引時,回報更好的錯誤(Alexander Lakhin、Michael Paquier)
當 contrib/pgstattuple
的 pgstathashindex()
函式套用到分區雜湊索引時,回報更好的錯誤(Alexander Lakhin)
在 Windows 上,在 pg_ctl 和 pg_regress 中啟動子程序時,取消自動執行選項(Kyotaro Horiguchi)
透過 cmd.exe
啟動子程序時,傳遞 /D
旗標以防止執行註冊表中指定的任何自動執行指令。這可以避免可能令人驚訝的副作用。
將 is_valid_ascii()
從 mb/pg_wchar.h
移到 utils/ascii.h
(Jubilee Young)
此變更避免在 pg_wchar.h
中包含 <simd.h>
,這會對某些第三方程式碼造成問題。
修正 libxml2 版本 2.12.0 及更新版本的編譯失敗(Tom Lane)
修正 Windows 上 WAL_DEBUG
程式碼的編譯失敗(Bharath Rupireddy)
取消 Python 標頭檔的編譯警告(Peter Eisentraut、Tom Lane)
我們偏好的編譯選項會引發關於出現在 Python 標頭檔最新版本的結構的警告。使用 gcc 時,我們可以用指令取消這些警告。
使用 LLVM 18 編譯時避免不建議使用的警告(Thomas Munro)
將時區資料檔更新為 tzdata 版本 2024a,以符合格陵蘭、哈薩克和巴勒斯坦的 DST 法律變更,以及修正南極洲 Casey 和 Vostok 站的資料。同時也修正越南、多倫多和米克隆的歷史資料。
如果您在文件當中看到任何不正確的內容,與您對特定功能的經驗不符,或需要進一步釐清,請使用 此表單 回報文件問題。