發布日期: 2023-11-09
此版本包含來自 16.0 的各種修正。有關主要版本 16 中的新功能資訊,請參閱 區段 E.3。
對於執行 16.X 的人來說,不需要進行傾印/還原。
然而,已發現數個錯誤,可能導致某些類型的索引產生錯誤的搜尋結果或不必要地低效率。建議在安裝此更新後,對可能受影響的索引執行 REINDEX
。請參閱下列第四至第七個變更日誌條目。
修正 DISTINCT
"any"
聚集函數中未知類型參數的處理方式(Tom Lane)
此錯誤導致 text
類型的值在執行階段被詮釋為 unknown
類型的值(也就是以零終止的字串)。這可能會導致在 text
值之後揭露伺服器記憶體。
PostgreSQL 專案感謝 Jingzhou Fu 回報此問題。(CVE-2023-5868)
計算新陣列維度時偵測整數溢位(Tom Lane)
在將新元素指定給超出目前陣列邊界的陣列下標時,在邊緣案例中可能會發生未偵測到的整數溢位。可能會發生可被惡意利用以執行任意程式碼的記憶體踐踏,以及揭露伺服器記憶體。
PostgreSQL 專案感謝 Pedro Gallegos 回報此問題。(CVE-2023-5869)
防止 pg_signal_backend
角色向後台工作程序和自動真空程序發送信號(Noah Misch、Jelte Fennema-Nio)
文件說明 pg_signal_backend
無法向超級使用者擁有的程序發出信號。不過,它能夠向這些後台程序發出信號,因為它們宣告的角色 OID 為零。將其視為表示超級使用者擁有權。就核心代碼而言,取消其中一種程序類型的安全性影響相當小(我們只需再啟動一個),但擴充功能可能會新增更容易受到攻擊的後台工作程序。
同時確保在這些程序中正確設定 is_superuser
參數。目前尚未得知此疏忽的具體安全性後果,但它可能對某些擴充功能產生重大影響。
PostgreSQL 專案感謝 Hemanth Sandrana 和 Mahendrakar Srinivasarao 報告此問題。(CVE-2023-5870)
修正 GiST 索引建置期間遞迴頁面分割時的異常行為(Heikki Linnakangas)
修正頁面下連結位置追蹤不正確的情況,並新增一些邏輯以允許從此類情況中復原,而非靜默地執行錯誤操作。此錯誤可能會導致後續索引搜尋產生不正確的答案。建議在安裝此更新後重新建立所有 GiST 索引。
防止重複 interval
欄位的 btree 索引項目(Noah Misch)
有些 interval
值可以區分,但比較時相等,例如 24:00:00
和 1 day
。這會破壞 btree 重複資料刪除所做的假設,因此 interval
欄位需要從重複資料刪除中排除。此疏忽可能會導致索引僅掃描產生不正確的結果。此外,在更新 amcheck 之後,幾乎所有此類索引都會報告錯誤。使用者應重新建立 interval
欄位上的任何 btree 索引。
在 BRIN datetime_minmax_multi_ops
索引中更合理地處理 date
值(Tomas Vondra)
日期的距離計算是向後的,導致無法正確判斷要合併哪些項目。索引仍會產生正確的結果,但效率遠低於應有的水準。建議重新建立 date
欄位上的 BRIN minmax_multi
索引。
在 BRIN datetime_minmax_multi_ops
索引中更合理地處理大型 timestamp
和 timestamptz
值(Tomas Vondra)
無限值被錯誤地視為與其他值距離為零,而不是距離較大,導致合併哪些條目的決策不佳。此外,有限但非常大的值(接近可表示時間戳範圍的端點)可能會導致內部溢位,再次導致決策不佳。索引仍會產生正確的結果,但效率遠低於應有的水準。如果欄位包含或曾經包含無限值或大型有限值,建議對 timestamp
和 timestamptz
欄位上的 BRIN minmax_multi
索引重新建立索引。
避免 BRIN interval_minmax_multi_ops
索引在極端區間值下計算溢位(Tomas Vondra)
此錯誤可能會導致嘗試將大型區間值插入此類索引時發生意外失敗。
修正具有多個分區鍵的雜湊分區表的分割步驟產生和執行時期分區剪枝(David Rowley)
涉及其中一個分區鍵的 IS NULL
條件的一些情況可能會導致崩潰。
修正 MERGE
期間同時更新的列的不一致重新檢查(Dean Rasheed)
在 READ COMMITTED
模式中,發現其目標列剛被同時交易更新的更新會在更新的列上重新檢查查詢的 WHERE
條件。MERGE
無法確保在此重新檢查期間使用其他已加入表的正確列,這可能會導致關於 MERGE
是否應再次更新新更新的列的不正確決策。
即使父表被約束排除,也能正確識別繼承的 UPDATE
/DELETE
/MERGE
中的目標表(Amit Langote、Tom Lane)
如果最初命名的表格被約束排除,但其繼承的後代並非如此,則第一個未被排除的後代會被識別為主要目標表格。這將導致觸發與該表格相關的語句級別觸發器,而不是最初命名的表格(如應發生)。在 v16 中,相同的疏忽也可能導致 “RTE 中的 perminfoindex 0 無效,relid 為 NNNN” 錯誤。
修正 ScalarArrayOpExpr 子句的 btree 標記/還原處理中的臨界情況(Peter Geoghegan)
在將索引掃描還原到先前標記的位置時,如果掃描已精確地推進到 ScalarArrayOpExpr(即 indexcol = ANY(ARRAY[])
)子句的匹配項尾端,則程式碼可能會遺漏必要的設定步驟。這可能會導致遺漏應已擷取的一些列。
修正 Memoize 執行中的查詢內部記憶體洩漏(Orlov Aleksej、David Rowley)
修正查詢內部記憶體洩漏,當設定傳回函數重複傳回零列時(Tom Lane)
如果將 cursor_to_xmlschema()
套用至非資料傳回入口,則不要崩潰(Boyu Yang)
修正在連續的 pg_logical_slot_get_changes()
呼叫中不當共用來源篩選條件(Hou Zhijie)
此函數的一個呼叫所設定的來源條件會被稍後未指定來源引數的呼叫重複使用。這並非預期。
如果將 pgrowlocks()
套用至分割表格,則擲回預期的錯誤(David Rowley)
先前會提出無關的抱怨 “僅支援堆疊 AM”。
在各種 SQL 函數中更乾淨地處理無效索引(Noah Misch)
如果將 pgstatindex()
、pgstatginindex()
、pgstathashindex()
或 pgstattuple()
套用至無效索引,則報告錯誤。如果將 brin_desummarize_range()
、brin_summarize_new_values()
、brin_summarize_range()
或 gin_clean_pending_list()
套用至無效索引,則除了報告偵錯層級訊息之外,不執行任何動作。以前這些函數會嘗試處理索引,並且可能會以奇怪的方式失敗,具體取決於失敗的 CREATE INDEX
留下了什麼。
避免對 to_tsvector()
輸入長字串時發生記憶體配置失敗 (Tom Lane)
修正 tsvectorrecv()
中建構 tsvector
時的過度配置 (Denis Erokhin)
如果輸入向量包含位置資料,二進位接收函數會在完成的 tsvector
中留下浪費的空間 (大約等於位置資料的大小)。在極端情況下,這可能會導致發出向量時長度低於限制,卻發生 “超過最大總詞素長度” 失敗。無論如何,這都可能會導致浪費磁碟空間。
改善對損毀 PGLZ 壓縮資料的檢查 (Flavien Guedez)
修正 ALTER SUBSCRIPTION
,讓命令中對 run_as_owner
選項的變更實際套用 (Hou Zhijie)
修正批次表格插入到分割表格 (Andres Freund)
不適當的跨分割插入狀態共用可能會導致 COPY FROM
期間失敗,通常會表現為 “無法在檔案 XXXX 中讀取區塊 NNNN:只讀取 8192 位元組中的 0 個” 錯誤。
在 COPY FROM
中,避免評估命令不需要的欄位預設值 (Laurenz Albe)
如果預設值實際上對欄位無效,或者預設值表達式在目前的執行內容中會失敗,這會避免可能的錯誤。例如,這種臨界情況有時會在還原傾印時發生。之前的版本在此情況下不會失敗,因此防止 v16 這樣做。
在 COPY FROM
中,當需要不支援的編碼轉換時,乾淨地失敗 (Tom Lane)
最近的重構意外地移除了此項預期的錯誤檢查,因此會以 “找不到函數 0 的快取” 結束,而不是有用的錯誤訊息。
如果由 EXPLAIN
標示要顯示的參數具有 NULL 啟動時間值,則避免在 EXPLAIN
中崩潰 (Xing Guo, Aleksander Alekseev, Tom Lane)
沒有內建參數符合此描述,但擴充功能可以定義此類參數。
確保在捨棄 ON COMMIT DROP
暫時表格時,我們有快照 (Tom Lane)
如果暫時表格的任何目錄條目具有足夠寬的欄位需要烤麵包 (例如非常複雜的 CHECK
條件),這可以防止可能的錯誤行為。
避免對 system()
剛分叉的子程序中的關閉訊號做出不適當的回應 (Nathan Bossart)
此修正避免了競爭條件,其中由 system()
分岔出的子程序尚未執行預期的子程序,可能會接收並作用於預期給父伺服器程序的訊號。這將導致執行重複的清理動作,而不會有好的結果。
處理前端程序中 pg_control
的撕裂讀取(Thomas Munro)
在某些檔案系統上,當伺服器同時寫入檔案時,讀取 pg_control
可能不是原子動作。這可透過錯誤的 CRC 偵測。在報告錯誤前,重試幾次以查看檔案是否變為有效。
避免相關 SQL 函數中 pg_control
的撕裂讀取(Thomas Munro)
在讀取 pg_control
之前取得適當的鎖定,以確保取得該檔案的一致性檢視。
修正規劃具有 ORDER BY
或 DISTINCT
選項的聚合函數時發生的 “找不到要排序的路徑金鑰項目” 錯誤(David Rowley)
在計算後端活動字串陣列大小時避免整數溢位(Jakub Wartak)
在 64 位元機器上,我們將允許 track_activity_query_size
的值足夠大,以便在乘以允許的連線數時造成 32 位元溢位。實際上配置每個後端本地陣列的程式碼對此很粗心,並錯誤地配置了陣列。
修正簡短顯示 ANALYZE
在繼承的表格上不一致的進度統計資料(Heikki Linnakangas)
當我們更新目前關係欄位時,應將區塊層級計數器重設為零。
修正背景寫入器以報告其對統計資料計數器所做的任何 WAL 寫入(Nazir Bilal Yavuz)
修正 pgstat_report_wal()
中關於強制快取行為的混淆(Ryoga Yoshida、Michael Paquier)
這可能會導致關閉時遺忘有關 WAL I/O 的一些統計資料。
修正暫時表格擴充的統計資料追蹤(Karina Litskevich、Andres Freund)
這些被計為一般表格寫入,而應計為暫時表格寫入。
當啟用 track_io_timing
時,將關係擴充操作所花費的時間包含在寫入時間內(Nazir Bilal Yavuz)
追蹤快取 CALL
陳述式的相依性,並在需要時重新規劃(Tom Lane)
DDL 命令(例如替換已內嵌到 CALL
參數中的函數)可能會產生重新規劃 CALL
的需求,而該 CALL
已由 PL/pgSQL 快取。這並未發生,導致錯誤的行為或奇怪的錯誤,例如 “快取查詢失敗”。
避免在 OpenSSL 連線設定錯誤後發生可能的 pfree-a-NULL-pointer 崩潰(Sergey Shinderuk)
從外部查詢層級檢查 RECORD
類型的 Vars 時,正確追蹤巢狀深度(Richard Guo)
此疏忽可能導致斷言失敗、核心傾印或 “錯誤的 varno” 錯誤。
追蹤 ScalarArrayOpExpr 計畫節點的雜湊函數和否定函數相依性(David Rowley)
在多數情況下,此疏忽是無害的,因為這些函數不太可能在節點的原始運算子仍然存在時消失。
修正 RECORD
類型快取管理中的錯誤處理錯誤(Thomas Munro)
在錯誤的時間點發生記憶體不足錯誤可能會遺留不一致的狀態,導致無限迴圈。
在讀取 WAL 時將記憶體不足的失敗視為致命錯誤(Michael Paquier)
以前這會被視為錯誤資料狀態,導致我們得出已到達 WAL 結束的結論,這是不正確的,可能會導致不一致的 WAL 重播。
修正因嘗試根據錯誤 WAL 記錄長度欄位配置記憶體而導致的可能復原失敗(Thomas Munro、Michael Paquier)
修正當 min_dynamic_shared_memory
設為大於 0 時,在 Windows 上發生的 “無法複製處理” 錯誤(Thomas Munro)
修正 GenericXLogFinish
中的運算順序(Jeff Davis)
此程式碼違反了防範崩潰所需的條件,因為它在標記已變更的緩衝區為髒污之前就寫入 WAL。沒有核心程式碼使用此函數,但擴充功能會使用(例如,contrib/bloom
)。
移除 PL/Python 例外處理中的不正確斷言(Alexander Lakhin)
修正 pg_dump 以傾印訂閱的新 run_as_owner
選項(Philip Warner)
由於此疏忽,訂閱將永遠以 run_as_owner
設為 false
的方式復原,這與其在 v16 之前的版本中的行為並不相同。
修正 pg_restore,以便選擇性復原將包括所選表格的表格層級和欄位層級 ACL(Euler Taveira、Tom Lane)
以前,如果同時存在這兩種類型,則只會復原表格層級 ACL。
新增邏輯至 pg_upgrade 以檢查是否使用 abstime
、reltime
和 tinterval
資料類型(Álvaro Herrera)
這些過時的資料類型已在 PostgreSQL 版本 12 中移除,因此請檢查以確保它們不存在於舊資料庫中,然後才能宣稱可以升級。
避免在 Windows 上的 pgbench 中出現錯誤的 “太多用戶端連線” 錯誤(Noah Misch)
修正 vacuumdb 處理多個 -N
開關的方式(Nathan Bossart、Kuwamura Masaki)
多個 -N
開關應排除多個架構中的表格,但實際上由於產生的查詢建構有誤,因此沒有排除任何內容。
修正 vacuumdb 以在僅分析模式中遵守其 --buffer-usage-limit
選項(Ryoga Yoshida、David Rowley)
在 contrib/amcheck
中,不要將中斷的頁面刪除報告為損毀(Noah Misch)
此修正可防止錯誤的正向報告,例如 “最左目標頁面的第一個子頁面不是其層級的最左邊”、“區塊 NNNN 不是最左邊” 或 “索引 XXXX 中的左連結/右連結配對不一致”。如果 amcheck 在未完成的 btree 索引頁面刪除後且在 VACUUM
清理之前執行,就會出現這些錯誤。
修正 contrib/btree_gin
索引在 interval
欄位上的失敗,這是因為執行使用 <
或 <=
算子的索引掃描(Dean Rasheed)
此類索引掃描無法傳回所有應傳回的項目。
新增對 LLVM 16 和 17 的支援(Thomas Munro、Dmitry Dolgov)
抑制最近 macOS 上的各種建置時間警告(Tom Lane)
Xcode 15(隨 macOS Sonoma 發布)以一種會導致在建置 PostgreSQL 時出現許多重複函式庫警告的方式變更了連結器的行為。這些警告無害,但令人厭煩,因此請避免兩次引用相同的函式庫。此外,移除使用 -multiply_defined suppress
連結器開關,這顯然很長一段時間以來一直都是無效操作,現在會主動抱怨。
在建置 contrib/unaccent
的規則檔案時,如果未提供 --with-python
且未設定變數 PYTHON
,則改用 python
(Japin Li)
從預設時區縮寫清單中移除 PHOT
(鳳凰群島時間)(Tom Lane)
預設清單中出現此縮寫可能會導致最近的 Debian 和 Ubuntu 版本發生故障,因為它們不再預設安裝底層的 tzdb 條目。由於這是為一個總人口約二十幾人的時區所設定的縮寫,因此似乎不太可能有人會錯過它。如果有人錯過,他們可以透過自訂縮寫檔案將其放回去。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表單 回報文件問題。