本週人物: https://postgresql.life/post/jan_karremans/
Ora2Pg 21.1 發布,這是一個將 Oracle 資料庫遷移到 PostgreSQL 的工具。 https://github.com/darold/ora2pg/blob/master/changelog
pgtt 2.3 發布,這是一個實現全域臨時表的擴展。 https://github.com/darold/pgtt/releases/tag/v2.3
SB Data Generator 發布,這是一個用於產生和填充測試資料的 GUI 工具。 SB Data Generator
https://archives.postgresql.org/pgsql-jobs/2021-04/
Planet PostgreSQL: https://planet.postgresql.org/
本週 PostgreSQL 每週新聞由 David Fetter 為您帶來
請於太平洋標準時間 (PST8PDT) 星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。
David Rowley 推送了
如果 PathTarget 和 RestrictInfos 包含 volatile 函數,則進行緩存。 這裡的目的是減少 contain_volatile_functions() 的重複工作,方法是在第一次為 PathTargets 和 RestrictInfos 調用 contain_volatile_functions() 時,緩存它們是否包含任何 volatile 函數。 以後對這些節點的任何調用都只使用緩存的值,而無需再次麻煩地遞迴檢查子節點。 感謝 Tom Lane 的想法。 代碼中任何對 PathTarget 或 RestrictInfo 進行更改的位置,如果這些更改可能改變 volatility 檢查的結果,則必須將緩存的值改回 VOLATILITY_UNKNOWN。 contain_volatile_functions() 是唯一負責將緩存值設置為 VOLATILITY_VOLATILE 或 VOLATILITY_NOVOLATILE 的代碼。 一些現有代碼確實受益於這種額外的緩存,但是,此更改主要針對即將發布的修補程式,該修補程式必須在連接搜尋期間檢查 volatility。 在連接搜尋包含多個關係時,在這種情況下重複進行 volatility 檢查可能會變得非常昂貴。 作者:David Rowley 討論:https://postgr.es/m/3795226.1614059027@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/f58b230ed0dba2a3d396794a2ec84541e321d92d
調整每個 worker 並行循序掃描資料結構的設計。 允許在並行循序掃描期間儲存每個 worker 記憶體的資料結構的設計並不理想。 56788d215 中的工作需要額外的資料結構,以允許 worker 記住在並行循序掃描期間已分配給它們進行處理的頁面範圍。 該 commit 向 TableScanDescData 添加了一個 void 指標欄位,以允許 heapam 儲存每個 worker 的分配資訊。 但是,將欄位放在那裡沒有多大意義,因為我們有 AM 特定的結構體來實現該目的,例如 HeapScanDescData。 在這裡,我們從 TableScanDescData 中刪除 void 指標欄位,並為此目的向 HeapScanDescData 添加一個專用欄位。 以前,我們還為所有掃描分配了此並行 worker 資料的記憶體,無論它是否是並行掃描。 對於非並行掃描來說,這只是一種浪費的分配,因此在這裡我們使分配取決於掃描是否為並行。 此外,還添加了先前缺少的 pfree() 以釋放 heap_endscan() 中的每個 worker 資料。 回報者:Andres Freund 審閱者:Andres Freund 討論:https://postgr.es/m/20210317023101.anvejcfotwka6gaa@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/af527705edc3fd0b335264d17e0521c05edc5cca
允許 simplehash.h 的使用者執行直接刪除。 以前,simplehash.h 僅公開了一種使用雜湊表鍵執行雜湊表刪除的方法。 這意味著刪除函數必須執行雜湊查找才能找到要刪除的條目。 在這裡,我們添加了一個新函數,以便 simplehash.h 的使用者可以使用條目指標直接執行雜湊刪除,從而節省雜湊查找。 即將發布的使用 simplehash.h 的修補程式已經執行了雜湊查找,因此已經具有條目指標。 此更改將允許該修補程式中的代碼執行雜湊刪除,而無需 simplehash.h 中的代碼執行額外的雜湊查找。 作者:David Rowley 審閱者:Andres Freund 討論:https://postgr.es/m/CAApHDvqFLXXge153WmPsjke5VGOSt7Ez0yD0c7eBXLfmWxs3Kw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ff53d7b159b93ce9fc884897f9d96b97744781e2
修復 unistr 函數中的編譯器警告。 一些編譯器沒有意識到 elog/ereport ERROR 不會返回。 https://git.postgresql.org/pg/commitdiff/efd9d92bb39c74c2aded64fc08e2d601ce20c39d
允許 estimate_num_groups() 傳回關於估計的更多細節。 在這裡,我們向 estimate_num_groups() 添加了一個新的輸出參數,以允許它將有關估計的其他可能有用資訊通知呼叫者。 新的輸出參數是一個結構體,目前只包含一個帶有一組標誌的欄位。 這樣做是為了避免將標誌作為輸出參數,以便在我們想要傳回不適合儲存在標誌欄位中的更多資訊時,無需在以後更改函數的簽名。 看起來很合理的是,有一天規劃器想要了解有關估計的更多資訊。 例如,估計是從多少個單獨的統計資料集產生的? 如果我們想在產生計劃時同時考慮風險和成本,則規劃器可能想要考慮這一點。 目前,我們只在標誌欄位中設置 1 個標誌。 這表示估計是否回退到在估計的任何部分中使用硬編碼的常量。 如果設置了此選項,呼叫者可能希望更改其行為,這使他們能夠這樣做。 如果呼叫者對獲取有關估計的任何其他資訊沒有興趣,則可以將標誌指標作為 NULL 傳遞。 我們在這裡沒有添加這些標誌的任何實際用法。 一些後續 commit 將使用此功能。 此外,我們也沒有進行任何更改來添加對 clauselist_selectivity() 和 clauselist_selectivity_ext() 的支援。 但是,如果將來需要此功能,那麼添加在此處的相同結構體應該可以用作這些函數的新輸出參數。 作者:David Rowley 討論:https://postgr.es/m/CAApHDvqQqpk=1W-G_ds7A9CsXX3BggWj_7okinzkLVhDubQzjA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ed934d4fa30f0f94e6f7125ad2154e6a58d1c7f7
新增結果快取執行器節點。這裡我們新增一個名為「結果快取」(Result Cache)的新執行器節點類型。規劃器可以在計畫中包含此節點類型,讓執行器快取參數化巢狀迴圈聯結內部(inner side)的結果。 這樣一來,就能為特定參數集合快取元組,以便在節點再次看到相同的參數值時,直接返回快取的元組,而無需重新掃描聯結的內部。 在內部,結果快取使用雜湊表,以便快速找到先前已快取的元組。 對於某些資料集,這可以顯著提高聯結的效能。 使用此新節點類型的最佳情況是聯結問題中,來自聯結內部的很大一部分元組在聯結外部(outer side)沒有聯結夥伴。 在這種情況下,雜湊聯結將不得不雜湊永遠不會被查詢的值,從而使雜湊表膨脹,並可能導致多批次處理。 合併聯結將不得不跳過所有不匹配的列。 如果我們使用帶有結果快取的巢狀迴圈聯結,那麼我們只會快取在聯結外部至少有一個聯結夥伴的元組。 當被查詢的相異值較少,且每個值的查詢次數較多時,使用帶有結果快取的參數化巢狀迴圈的優勢會增加。 此外,雜湊探測來查詢快取的速度可能比雜湊聯結中的雜湊探測快得多,因為結果快取的雜湊表通常比雜湊聯結的雜湊表小得多,這是因為結果快取只快取有用的元組,而不是來自聯結內部的所有元組。 當雜湊聯結的雜湊表不再適合 CPU 的 L3 快取,但結果快取的雜湊表可以時,這種雜湊探測效能的差異會更為顯著。 每次雜湊探測對雜湊桶的表面「隨機」存取,可能會導致大型雜湊表的 L3 快取命中率很差。 較小的雜湊表通常效能更好。 用於快取的雜湊表會限制自身大小,不超過 work_mem * hash_mem_multiplier。 我們為此快取維護一個金鑰的 dlist,當我們新增新的元組並意識到我們已經超過了記憶體預算時,我們會從最近最少使用的快取條目開始逐出,直到我們有足夠的記憶體將新的元組新增到快取為止。 對於參數化巢狀迴圈聯結,我們現在考慮在巢狀迴圈節點及其內部節點之間使用這些結果快取節點之一。 我們根據成本來判斷這是否可能有用,成本主要取決於預期的快取命中率。 估計快取命中率取決於對巢狀迴圈參數有良好的相異值估計。 目前,規劃器只會考慮對參數化巢狀迴圈聯結使用結果快取。 這適用於正常的聯結,也適用於 LATERAL 類型的子查詢聯結。 未來可以使用這個新節點進行其他用途。 例如,快取來自相關子查詢的結果。 但是,由於在外部計畫上取得相異值估計以計算估計的快取命中率存在一些困難,因此這裡沒有這樣做。 目前,我們在規劃外部計畫之前規劃內部計畫,因此沒有好的方法知道結果快取是否有用,因為在生成外部計畫之前,我們無法估計子計畫將被呼叫的次數。 這裡新增的功能是在聯結搜尋期間,新引入對 estimate_num_groups() 傳回值的依賴。 以前,在聯結搜尋期間,我們只需要執行選擇性估計。 透過這次提交,我們需要使用 estimate_num_groups() 來估計結果快取的命中率。 簡單來說,如果我們預期有 10 個相異值,並且我們預期有 1000 個外部列,那麼我們將估計命中率為 99%。 由於與掃描巢狀迴圈聯結內部底層節點相比,快取命中非常便宜,因此這將顯著降低規劃器聯結的成本。 然而,很容易在這裡看到,當 estimate_num_groups() 錯誤地傳回一個遠低於實際相異值數量的數值時,事情會變得糟糕。 如果發生這種情況,可能會導致我們使用帶有結果快取的巢狀迴圈聯結,而不是其他聯結類型,例如合併或雜湊聯結。 我們對相異值的估計過去一直是問題的來源,因此這裡對它們的額外依賴可能會導致規劃器選擇比具有此功能之前更慢的計畫。 當已經聯結了多個表,或者當 WHERE 子句過濾掉一組與我們正在估計相異值數量的表達式相關的值時,相異值的估計也很難準確估計。 目前,我們在查詢規劃期間對結果快取執行的成本計算,確實對相異值估計的準確性寄予了相當多的信任。 當這些估計準確時,我們通常會看到包含結果快取的計畫執行時間更快。 然而,在現實世界中,我們可能會發現我們需要更改成本計算,以減少對相異值估計準確性的信任,或者甚至預設停用此功能。 當我們教導查詢規劃器新的技巧時,總會存在一定的風險,它可能會在錯誤的時間決定使用該新技巧,並導致回歸。 使用者可以透過使用 enable_resultcache GUC 關閉該功能來獲得舊的行為。 目前,預設情況下啟用此功能。 我們是否會為發布維護該設定還有待觀察。 此外,「結果快取」是我在開始編寫修補程式時能想到的這個新節點的最佳名稱。 沒有人似乎強烈不喜歡這個名稱。 有幾個人確實提出了其他名稱,但在關於名稱的簡短討論中,沒有其他名稱似乎佔據主導地位。 讓我們允許 Beta 測試階段看看目前的名稱是否能讓足夠的人滿意。 如果對更好的名稱達成共識,我們可以在發布之前更改它。 請參閱下面的第二個討論連結,以了解關於「結果快取」名稱的討論。 作者:David Rowley 審閱人:Andy Fan、Justin Pryzby、Zhihong Yu 測試人:Konstantin Knizhnik 討論:https://postgr.es/m/CAApHDvrPcQyQdWERGYWx8J%2B2DLUNgXu%2BfOSbQ1UscxrunyXyrQ%40mail.gmail.com 討論:https://postgr.es/m/CAApHDvq=yQXr5kqhRviT2RhNKwToaWr9JAN5t+5_PzhuRJ3wvg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b6002a796dc0bfe721db5eaa54ba9d24fd9fd416
還原 b6002a796。這會移除「新增結果快取執行器節點」。 許多 Buildfarm 動物強調,快取命中和未命中的追蹤似乎出現了一些奇怪的問題。 目前尚不清楚問題是什麼,因為計畫的其他部分表明快取確實正常工作,只是命中和未命中的報告為 0。 現在 Buildfarm 如此崩潰尤其糟糕,因此在更多動物變紅之前還原。 討論:https://postgr.es/m/CAApHDvq_hydhfovm4=izgWs+C5HqEeRScjMbOgbpC-jRAeK3Yw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/28b3e3905c982c42fb10ee800e6f881e9742c89d
新增結果快取執行器節點(版本 2)。 這裡我們新增一個名為「Result Cache」(結果快取)的新執行器節點類型。 規劃器可以在計畫中包含此節點類型,讓執行器快取參數化巢狀迴圈聯結內側的結果。 這樣可以快取參數集合的元組,以便在節點再次看到相同的參數值時,可以直接傳回快取的元組,而無需重新掃描聯結的內側。 在內部,結果快取使用雜湊表,以便快速找到先前已快取的元組。 對於某些資料集,這可以顯著提高聯結的效能。 使用這種新節點類型最好的情況是,聯結問題中聯結內側的大部分元組在聯結外側沒有聯結夥伴。 在這種情況下,雜湊聯結必須雜湊從未被查詢的值,從而使雜湊表膨脹,並可能導致多批次處理。 合併聯結必須跳過所有不匹配的行。 如果我們使用帶有結果快取的巢狀迴圈聯結,那麼我們只會快取在聯結外側至少有一個聯結夥伴的元組。 當查詢的相異值較少,且每個值的查詢次數較多時,使用帶有結果快取的參數化巢狀迴圈的好處就會增加。 此外,雜湊探測查詢快取的速度可能比雜湊聯結中的雜湊探測快得多,因為結果快取的雜湊表通常比雜湊聯結的雜湊表小得多,因為結果快取只快取有用的元組,而不是聯結內側的所有元組。 當雜湊聯結的雜湊表不再適合 CPU 的 L3 快取,但結果快取的雜湊表適合時,雜湊探測效能的這種差異會更明顯。 每次雜湊探測對雜湊桶的明顯「隨機」存取都可能導致大型雜湊表的 L3 快取命中率降低。 較小的雜湊表通常表現更好。 用於快取的雜湊表將自身限制為不超過 work_mem * hash_mem_multiplier 的大小。 我們維護此快取的金鑰 dlist,當我們新增新的元組並意識到我們已超過記憶體預算時,我們將從最近最少使用的快取條目開始逐出快取條目,直到我們有足夠的記憶體將新元組新增到快取中。 對於參數化巢狀迴圈聯結,我們現在考慮在巢狀迴圈節點及其內部節點之間使用其中一個結果快取節點。 我們根據成本來確定何時可能有用,這主要是由預期的快取命中率驅動的。 估計快取命中率取決於對巢狀迴圈參數的良好相異值估計。 目前,規劃器只會考慮對參數化巢狀迴圈聯結使用結果快取。 這適用於普通聯結,也適用於 LATERAL 類型的子查詢聯結。 將來可以使用這種新節點進行其他用途。 例如,快取相關子查詢的結果。 但是,由於在外部計畫上獲得相異值估計以計算估計的快取命中率存在一些困難,因此這裡沒有這樣做。 目前,我們在規劃外部計畫之前先規劃內部計畫,因此沒有好的方法知道結果快取是否有用,因為在生成外部計畫之前,我們無法估計子計畫將被呼叫的次數。 這裡新增的功能是在聯結搜尋期間新引入對 estimate_num_groups() 傳回值的依賴性。 以前,在聯結搜尋期間,我們只需要執行選擇性估計。 透過此提交,我們需要使用 estimate_num_groups() 來估計結果快取的命中率。 簡單來說,如果我們預期有 10 個相異值,並且我們預期有 1000 個外部行,那麼我們將估計命中率為 99%。 由於快取命中與掃描巢狀迴圈聯結內側的基礎節點相比非常便宜,因此這將顯著降低規劃器聯結的成本。 但是,很容易在這裡看到,當 estimate_num_groups() 錯誤地傳回一個遠低於實際相異值數量的數值時,事情會變得糟糕。 如果發生這種情況,可能會導致我們使用帶有結果快取的巢狀迴圈聯結,而不是其他聯結類型,例如合併或雜湊聯結。 眾所周知,我們的相異值估計過去一直是問題的根源,因此在此對它們的額外依賴可能會導致規劃器選擇比具有此功能之前更慢的計畫。 當已經聯結了多個表或 WHERE 子句過濾掉一組與我們正在估計相異值數量的表達式相關的值時,相異值估計也相當難以準確估計。 目前,我們在查詢規劃期間對結果快取執行的成本計算確實對相異值估計的準確性寄予了相當多的信任。 當這些準確時,我們通常應該看到包含結果快取的計畫的執行時間更快。 但是,在現實世界中,我們可能會發現我們需要更改成本計算以減少對相異值估計準確性的信任,或者甚至預設停用此功能。 當我們教查詢規劃器執行新技巧時,總是存在一定的風險,它會在錯誤的時間決定使用該新技巧並導致迴歸。 使用者可以透過使用 enable_resultcache GUC 關閉該功能來獲得舊的行為。 目前,預設情況下已啟用此功能。 我們是否會為該版本保持該設定還有待觀察。 此外,「Result Cache」這個名稱是我在開始編寫修補程式時能想到的這個新節點的最佳名稱。 看起來沒有人強烈不喜歡這個名稱。 有些人確實提出了其他名稱,但在關於名稱的簡短討論中,沒有其他名稱似乎佔據主導地位。 讓我們允許 beta 測試期看看目前的名稱是否讓足夠多的人滿意。 如果對更好的名稱達成共識,我們可以在發布之前更改它。 請參閱下面的第二個討論連結,以了解有關「Result Cache」名稱的討論。 作者:David Rowley 審閱人:Andy Fan、Justin Pryzby、Zhihong Yu、Hou Zhijie 測試人:Konstantin Knizhnik 討論:https://postgr.es/m/CAApHDvrPcQyQdWERGYWx8J%2B2DLUNgXu%2BfOSbQ1UscxrunyXyrQ%40mail.gmail.com 討論:https://postgr.es/m/CAApHDvq=yQXr5kqhRviT2RhNKwToaWr9JAN5t+5_PzhuRJ3wvg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9eacee2e62d89cab7b004f97c206c4fba4f1d745
嘗試修復不穩定的結果快取迴歸測試。 force_parallel_mode = regress 導致的問題比我想像的還要多。 似乎領導者和單個工作者都可以參與執行。 我錯誤地認為只有工作者進程才會做任何工作。 由於不確定這兩個進程中的哪一個有機會處理計畫,因此禁用這些測試的 force_parallel_mode 似乎更好。 至少這樣做似乎比僅更改為 EXPLAIN 而不是 EXPLAIN ANALYZE 更好。 此外,我忽略了一個事實,即結果快取下子計畫的執行次數會根據快取逐出而執行不同的次數。 32 位機器將使用更少的記憶體,並從快取中逐出更少的元組。 這導致子節點在 32 位機器上執行的次數更少。 讓我們將每個節點中的迴圈數都清空。 https://git.postgresql.org/pg/commitdiff/a4fac4ffe8f8d543a10ac7debf1157e34963ece3
移除 Result Cache 程式碼中無用的 Asserts。測試一個無符號變數是否 >= 0 毫無意義。在啟用 Assert 的版本中,remove_cache_entry() 中可能有足夠的程式碼來驗證快取記憶體記帳是否正確。即使這些 Asserts 檢查的是有符號變數上的 >= 0,它們也沒有增加多少額外的覆蓋率。Reported-by: Andres Freund Discussion: https://postgr.es/m/20210402204734.6mo3nfacnljlicgn@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1267d9862fc6a4f8cdc0ca38d1988b61f39da585
Peter Geoghegan 推送了
Peter Eisentraut 推送了
重置 strings 測試中的 standard_conforming_strings。在進行一些與 standard_conforming_strings 行為相關的測試後,該值未重置為預設值。因此,該檔案中的其餘測試皆以非預設設定執行,這影響了某些測試的結果。為了清晰起見,重置該值並再次以預設設定執行其餘測試。https://git.postgresql.org/pg/commitdiff/ebedd0c78fc51c293abe56e99a18c67af14da0c9
新增 unistr 函數。這允許解碼包含 Unicode 逸出序列的字串。它類似於 Unicode 逸出字串,但提供了一些更大的彈性。Author: Pavel Stehule pavel.stehule@gmail.com Reviewed-by: Asif Rehman asifr.rehman@gmail.com Discussion: https://postgres.tw/message-id/flat/CAFj8pRA5GnKT+gDVwbVRH2ep451H_myBt+NTz8RkYUARE9+qOQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f37fec837ce8bf7af408ba66d32099e5a0182402
稍微清理 date_part 測試。一些針對 timestamp 和 timestamptz 的測試位於 date.sql 測試檔案中。將它們移動到它們適當的檔案中,或者刪除已經存在於那裡的測試案例。https://git.postgresql.org/pg/commitdiff/efcc7572f532ea564fedc6359c2df43045ee7908
為 timestamp 和 timestamptz 類型新增上限邊界測試。現有的迴歸測試僅測試了 timestamp 和 timestamptz 類型支援範圍的下限邊界,因為「上限邊界在整數和浮點時間戳記之間有所不同,因此沒有檢查」。由於這已經過時,因此為上限邊界新增類似的測試。https://git.postgresql.org/pg/commitdiff/bc9f1afdebc98b490d0a00468d75e8e4d080afb0
為 timestamp 範圍上限附近 epoch 的 date_part 新增測試。這練習了 date_part('epoch', timestamp[tz]) 實現中的一個特殊案例,該案例以前未經過測試。https://git.postgresql.org/pg/commitdiff/6131ffc43ff3d2f566e93f017e56a09e4e717318
doc: 從 unistr 範例中移除西里爾字母。目前 PDF 建置不支援,所以我們省略它。https://git.postgresql.org/pg/commitdiff/287d2a97c1de07486e4525c8ad06258f04bd6268
新增 errhint_plural() 函數並加以使用。類似於現有的 errmsg_plural() 和 errdetail_plural()。一些 errhint() 呼叫尚未收到適當的複數處理。https://git.postgresql.org/pg/commitdiff/91c5a8caaa61055959aa5fb68a00e5f690e39a34
將 p_names 欄位新增至 ParseNamespaceItem。ParseNamespaceItem 有一個固定的假設,即 p_rte->eref 描述了 nsitem 公開的表和欄別名。這通過在 nsitem 中創建一個單獨的 p_names 欄位來放寬這一點。這主要是為 JOIN USING 別名的補丁做準備,但它在常見程式碼路徑中節省了一個間接引用,因此它本身可能是一個勝利。Author: Tom Lane tgl@sss.pgh.pa.us Discussion: https://postgres.tw/message-id/785329.1616455091@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/66392d396508c91c2ec07a61568bf96acb663ad8
允許將別名附加到 JOIN ... USING。這允許像這樣的事情:SELECT ... FROM t1 JOIN t2 USING (a, b, c) AS x,其中 x 具有欄 a、b、c,並且與常規別名不同,它不會隱藏正在聯接的表 t1 和 t2 的範圍變數。根據 SQL:2016 功能 F404 "常用欄名稱的範圍變數"。Reviewed-by: Vik Fearing vik.fearing@2ndquadrant.com Reviewed-by: Tom Lane tgl@sss.pgh.pa.us Discussion: https://postgres.tw/message-id/flat/454638cf-d563-ab76-a585-2564428062af@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/055fee7eb4dcc78e58672aef146334275e1cc40d
使 extract(timetz) 測試更有趣一點。使用具有非零分鐘的時區偏移量,使 timezone_minute 測試有意義。https://git.postgresql.org/pg/commitdiff/e2639a767bfa1afebaf1877515a1187feb393443
修復內部 extract(timezone_minute) 公式。通過時間的推移的各種重構,extract(timezone_minute from time with time zone) 和 extract(timezone_minute from timestamp with time zone) 的實現最終使用了兩個不同但同樣無意義的公式,因為它們可以互換使用 SECS_PER_MINUTE 和 MINS_PER_HOUR。由於這兩者當然都是相同的數字,因此公式確實有效,但為了提高可讀性,請將它們修復為在語義上正確。https://git.postgresql.org/pg/commitdiff/91e7c903291116bd081abe7d4a058d40a2a06e16
在 eval_const_expressions 中新增 NullIfExpr 的支援。Author: Hou Zhijie houzj.fnst@cn.fujitsu.com Discussion: https://postgres.tw/message-id/flat/7ea5ce773bbc4eea9ff1a381acd3b102@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/9c5f67fd6256246b2a788a8feb1d42b79dcd0448
Andrew Dunstan 推送了
允許匹配客戶端證書的 DN 以進行身份驗證。目前,我們僅識別證書主體的 Common Name (CN) 以與使用者名稱進行匹配。因此,具有主體 '/OU=eng/CN=fred' 和 '/OU=sales/CN=fred' 的證書將具有相同的連線權限。此修補程式提供了一個選項,可以匹配整個 Distinguished Name (DN),而不僅僅是 CN。在使用客戶端證書身份的任何 hba 行上,都有一個選項 'clientname',它可以具有 'DN' 或 'CN' 的值。預設值為 'CN',即當前程式。DN 與 RFC2253 格式化的 DN 匹配,看起來像 'CN=fred,OU=eng'。此功能最好與 ident 映射結合使用。Discussion: https://postgr.es/m/92e70110-9273-d93c-5913-0bccb6562740@dunslane.net Reviewed-By: Michael Paquier, Daniel Gustafsson, Jacob Champion https://git.postgresql.org/pg/commitdiff/6d7a6feac48b1970c4cd127ee65d4c487acbb5e9
修復 6d7a6feac4 中的錯字。來自 Daniel Gustafsson 的抱怨 https://git.postgresql.org/pg/commitdiff/1877c9ac3acc05cc787dd6392d073202f8c8ee21
Álvaro Herrera 推送了
psql: 在列印之前呼叫 clearerr()。我們從未在輸出流上執行 clearerr(),這會導致在看到 EOF 後,每個結果後都會列印一條訊息:could not print result table: Success。此訊息是由 commit b03436994bcc(在 pg13 時代)新增的;在此之前,從未檢查過錯誤指示符。因此僅向後移植到那裡,即使實際錯誤(即:從未清除錯誤指示符的事實)更早。https://git.postgresql.org/pg/commitdiff/8d645a116ef6e04bfb03e259149b8e163dbdf50c
改善 PQtrace() 輸出格式。將 PQtrace 輸出格式從其古老(且大多無用)的位元組層級輸出格式轉換為邏輯訊息層級輸出,使其更易於使用。此實作允許透過查看協定文件來編寫列印程式碼(實際上就是這樣做的),這讓人更有信心文件、追蹤程式碼和實際程式碼三者之間確實匹配。作者:岩田 彩 (Aya Iwata) iwata.aya@fujitsu.com 審閱者:綱川 貴之 (Takayuki Tsunakawa) tsunakawa.takay@fujitsu.com 審閱者:Kirk Jamison k.jamison@fujitsu.com 審閱者:堀口 京太郎 (Kyotaro Horiguchi) horikyota.ntt@gmail.com 審閱者:Tom Lane tgl@sss.pgh.pa.us 審閱者:黒田 隼人 (Hayato Kuroda) kuroda.hayato@fujitsu.com 審閱者:"Nagaura, Ryohei" nagaura.ryohei@jp.fujitsu.com 審閱者:Ryo Matsumura matsumura.ryo@fujitsu.com 審閱者:Greg Nancarrow gregn4422@gmail.com 審閱者:Jim Doty jdoty@pivotal.io 審閱者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/71E660EB361DF14299875B198D4CE5423DE3FBA4@g01jpexmbkw25 https://git.postgresql.org/pg/commitdiff/198b3716dba68544b55cb97bd120738a86d5df2d
libpq_pipeline:新增 PQtrace() 支援和測試。最近由 commit acb7e4eb6b1c 引入的 libpq_pipeline 程式非常適合測試 PQtrace() 功能,因此讓我們開始使用它。作者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/20210327192812.GA25115@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/7bebd0d00998a28449d83376f4bcdeec65d5eea6
修正一些 libpq_pipeline 測試問題。測試 pipeline_abort 未檢查它是否在某種模式下取得預期的列,現在讓它這樣做。這並不能解決實際問題(還不清楚是什麼),但至少它應該使問題更明顯,而不是僅僅在追蹤輸出中顯示為差異。同時,修正測試中的其他不完善之處:* 我在 like() 中顛倒了結果與預期的順序。* 來自 -t 的輸出追蹤被放置在日誌目錄中,這意味著 buildfarm 腳本會無用地捕獲它們。將它們放在一個單獨的目錄 tmp_check/traces 中,以避免混亂 buildfarm 結果。* 測試 pipelined_insert 使用了過大的列計數。稍微減少它,並新增一個填充列,使每次插入稍微大一點,同時仍然保持足夠的量,以便填充緩衝區並且我們必須切換模式。https://git.postgresql.org/pg/commitdiff/db973ffb3ca43e65a0bf15175a35184a53bf977d
在 libpq_pipeline 中停用 force_parallel_mode。一些具有 force_parallel_mode=regress 的 buildfarm 動物未能通過此測試,因為錯誤的報告速度比成功的列更快。藉此機會將 lc_messages 的 SET 移出追蹤區段,因為它不是很有趣。診斷者:Tom Lane tgl@sss.pgh.pa.us 討論:https://postgr.es/m/3304521.1617221724@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a6d3dea8e5e0c8a0df2f95d66b6c3903a4354ca0
在建立連線時,將 conn->Pfdebug 初始化為 NULL。未能這樣做可能會導致崩潰,我懷疑這就是 buildfarm 成員報告神秘故障的原因。這是一個古老的錯誤,但我不會回溯修補,因為顯然沒有人在乎舊版本中的 PQtrace。討論:https://postgr.es/m/3333908.1617227066@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aba24b51cc1b045a9810458b4bb15fee2c182948
從 PQtrace() 中移除 setvbuf() 呼叫。它在那裡放錯位置了——它不是 libpq 的輸出流,不能以這種方式調整。特別是,POSIX 說它必須在檔案上的任何其他操作之前呼叫,因此如果流先前被呼叫應用程式使用,可能會發生不好的事情。為了安全起見,將 setvbuf() 放入 libpq_pipeline。此外,將 libpq_pipeline.c 中的 fopen(..., "w+") 減少到僅 fopen(..., "w")。目前尚不清楚這是否解決了任何問題,但我們在任何地方都沒有使用 w+。根據 Tom Lane 的抱怨。討論:https://postgr.es/m/3337422.1617229905@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6ec578e60101c3c02533f99715945a0400fb3286
libpq_pipeline:必須 strdup(optarg) 以避免崩潰。我忘記在處理 argv[] 時 strdup()。顯然,許多平台向使用者隱藏了這個錯誤,但在那些沒有隱藏錯誤的平台上,您可能會遇到程式崩潰。修復。根據 buildfarm 成員 drongo 的說法,它是所有 buildfarm 中唯一在這裡表現出問題的一個。同時,將 "numrows" 處理移出行特殊情況,並使其成為 getopt 的 -r。(類似的事情可以對 'conninfo' 進行,但目前程式的使用不值得花時間在這上面——我們沒有在其他地方以如此簡單的方式使用 conninfo。)討論:https://postgr.es/m/20210401124850.GA19247@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/dde1a35aee6266dc8105717275335c46cd2b3650
修復 libpq_pipeline 中 setvbuf() 引起的崩潰。Windows 不喜歡 setvbuf(..., _IOLBF)
,如果您使用它,它會崩潰,這一直是導致 libpq_pipeline 失敗的原因 ... 以及我們自己的 port.h。我們自己的 port.h 早就知道了這一點:它提供了 PG_IOLBF,在該平台上定義為 _IONBF
。遵循它的建議。同時,擺脫一個錯誤的位元移位,該位元移位使用了錯誤大小的常數。用 LL 裝飾常數以進行修復。同時,移除一個毫無意義的加法,它只會混淆事情。所有這些都是由 Tom Lane 診斷的。討論:https://postgr.es/m/3458958.1617302154@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/a68a894f0198aaeffa81b3027f135adcdaa8abf6
Etsuro Fujita 推送
更新過時的註解。向所有支援的分支進行回溯修補。作者:Etsuro Fujita 討論:https://postgr.es/m/CAPmGK17DwzaSf%2BB71dhL2apXdtG-OmD6u2AL9Cq2ZmAR0%2BzapQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc2797ebb14bae663da1ee7845774dd98716c0d0
新增對非同步執行的支援。這實作了非同步執行,它並行執行非並行感知 Append 的多個部分,而不是串列執行,以便在可能的情況下提高效能。目前,唯一可以並行執行的節點類型是 ForeignScan,它是這種 Append 的直接子節點。如果此類 ForeignScan 存取不同遠端伺服器上的資料,這將並行執行這些 ForeignScan,並重疊要同時執行的遠端操作,因此它將提高效能,尤其是在操作涉及耗時的操作時,例如遠端聯結和遠端聚合。我們將來可能會將此功能擴展到其他節點類型,例如聯結或 ForeignScan 上的聚合。這也新增了對 postgres_fdw 的支援,該支援由表級/伺服器級選項 "async_capable" 啟用。預設值為 false。Robert Haas、堀口京太郎、Thomas Munro 和我自己。此 commit 主要基於 Robert Haas 提出的補丁,但也使用了堀口京太郎提出的補丁和 Thomas Munro 提出的補丁中的內容。由堀口京太郎、Konstantin Knizhnik、Andrey Lepikhov、Movead Li、Thomas Munro、Justin Pryzby 等人審閱。討論:https://postgr.es/m/CA%2BTgmoaXQEt4tZ03FtQhnzeDEMzBck%2BLrni0UWHVVgOTnA6C1w%40mail.gmail.com 討論:https://postgr.es/m/CA%2BhUKGLBRyu0rHrDCMC4%3DRn3252gogyp1SjOgG8SEKKZv%3DFwfQ%40mail.gmail.com 討論:https://postgr.es/m/20200228.170650.667613673625155850.horikyota.ntt%40gmail.com https://git.postgresql.org/pg/commitdiff/27e1f14563cf982f1f4d71e21ef247866662a052
Amit Kapila 推送
為輸出外掛程式的 filter_prepare 回呼函式新增 xid 參數。連同 gid,這提供了一種不同的方式來識別事務。以某種方式使用 xid 準備事務的使用者可以使用它來過濾準備事務。之後的 COMMIT PREPARED 或 ROLLBACK PREPARED 命令會攜帶這兩個識別符,讓輸出外掛程式可以選擇使用哪個。作者:Markus Wanner 審閱人:Vignesh C, Amit Kapila 討論:https://postgr.es/m/ee280000-7355-c4dc-e47b-2436e7be959c@enterprisedb.com https://git.postgresql.org/pg/commitdiff/f64ea6dc5c8ccaec9a3d3d39695ca261febb6883
文件:對於 tablesync 插槽使用一致的術語。在文件中的某些地方,我們將其稱為 tablesync 插槽,而在其他地方則稱為資料表同步插槽。為了保持一致性,我們在所有地方都將其稱為資料表同步插槽。作者:Peter Smith 審閱人:Amit Kapila 討論:https://postgr.es/m/CAHut+PvzYNKCeZ=kKBDkh3dw-r=2D3fk=nNc9SXSW=CZGk69xg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9f45631766bd0c51a74102770737ba3b0561977e
移除 postgres_fdw 測試中多餘的分號。作者:Suraj Kharage 審閱人:Bharath Rupireddy, Vignesh C 討論:https://postgr.es/m/CAF1DzPWRfxUeH-wShz7P_pK5Tx6M_nEK+TkS8gn5ngvg07Q5=g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/13cb5bd84657ed49021fe6fc4ce46601c315c9a5
確保在偵測到解碼期間發生並行中止後,發送 prepare。在解碼準備好的事務時,有可能透過 ROLLBACK PREPARED 命令並行中止。在這種情況下,我們會跳過所有變更,並在 WAL 中找到相同變更時直接發送 Rollback Prepared。但是,下游不知道此類事務的 GID。因此,即使偵測到並行中止,也請確保發送 prepare。作者:Ajin Cherian 審閱人:Markus Wanner, Amit Kapila 討論:https://postgr.es/m/f82133c6-6055-b400-7922-97dae9f2b50b@enterprisedb.com https://git.postgresql.org/pg/commitdiff/4778826532a62fd6e4d3fdeef9532c943604c730
Tom Lane 推送
進一步調整 pg_dump 對 default_toast_compression 的處理方式。如 bbe0a81db 中所提交的,來自 pre-v14 伺服器的 pg_dump 實際上表現得好像您說了 --no-toast-compression。我認為正確的做法是讓它表現得好像 default_toast_compression 設定為 "pglz",以便保留資料表的 toast 壓縮行為。如果您想要其他行為,可以隨時使用該開關。討論:https://postgr.es/m/1112852.1616609702@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/54bb91c30e3964fd81059e6b02e377cc9dd2d64c
移除 ExecARDeleteTriggers/ExecARUpdateTriggers 中的小效率低下。在研究 nodeModifyTable.c 時,我偶然注意到,雖然它對 ExecBRTriggers 和 ExecIRTriggers 的呼叫受到測試保護,以查看是否有任何相關的觸發程序要觸發,但它對 ExecARTriggers 的呼叫沒有受到保護;後面的函式會自行執行等效的測試。考慮到涉及的更複雜的條件,這似乎是合理的,但不合理的是,ExecAR 函式在沒有工作要做時並不謹慎地不做任何工作。ExecARInsertTriggers 做對了,但其他兩個函式都會強制建立一個查詢可能不需要的插槽。ExecARUpdateTriggers 還在該插槽上執行了通常無用的 ExecClearTuple()。這在實際工作負載中可能非常微小,但節省的週期就是賺到的週期。https://git.postgresql.org/pg/commitdiff/65158f497a7d7523ad438b2034d01a560fafe6bd
重新設計並執行 UPDATE 和 DELETE。此修補程式進行了兩組密切相關的變更: 1. 對於 UPDATE,ModifyTable 節點的子計畫現在僅傳遞已變更欄位的新值(即查詢的 SET 子句中計算的表達式)以及列識別資訊,例如 CTID。ModifyTable 必須重新提取原始元組,以合併任何未變更欄位的舊值。這樣做的核心優點是,變更的欄位在繼承或分割的目標關係的所有表中都是一致的,而其他欄位可能不是。次要優點是,當 UPDATE 涉及聯結時,需要通過計畫樹傳遞的資料更少。當然,缺點是需要額外提取每個要更新的元組。但是,在上下文中,這似乎幾乎是免費的;即使是最壞情況的測試也表明它對總查詢成本的增加不超過幾個百分點。在某個時候,將重新提取與 ModifyTable 必須執行的元組存取結合起來以標記舊元組為已死亡可能很有趣;但這需要大量的重構,而且似乎不會帶來太多的好處,因此此修補程式沒有嘗試這樣做。 2. 對於繼承的 UPDATE/DELETE,我們現在不是為每個目標關係產生一個單獨的子計畫,而是產生一個與 SELECT 計畫完全相同的單個子計畫,然後將 ModifyTable 放在其之上。為了讓 ModifyTable 知道給定的輸入列指的是哪個目標關係,一個 tableoid 垃圾欄位被添加到列識別資訊中。這消除了 inheritance_planner() 中可怕的 hack,從而消除了在有許多無法修剪的目標關係的情況下 O(N^2) 的計畫成本和記憶體消耗。第 2 點當然需要第 1 點,以便子計畫返回的非垃圾欄位具有統一的定義。但是,如果我們想保持在分割層次結構中同時擁有普通表和外部表的能力,我們就不能堅持要求列識別垃圾欄位具有統一的定義。由於讓每個子表都有自己的列識別欄位無法很好地擴展,因此此修補程式包含將相似的列識別欄位合併到子計畫結果的一個欄位中的規定。特別是,我們可以通過假裝它們是 RECORD 類型,將通常用作 FDW 列識別的整列 Vars 合併到一個欄位中。(即使實際的複合 Datums 用表的 rowtype OID 標記,也沒關係。) 可以做更多的工作來減少此修補程式中的殘餘效率低下,但現在看來是可以提交的。 FDW 作者應注意以下幾個 API 變更: * AddForeignUpdateTargets() 的參數列表已更改,並且它必須用於將垃圾欄位添加到查詢的方法也已更改。呼叫 add_row_identity_var() 而不是直接操作分析樹。您可能還想重新考慮您正在添加的內容。 * PlanDirectModify() 現在必須更加努力地找到 ForeignScan 計畫節點;如果外部表是分割層次結構的一部分,則 ForeignScan 可能不是 ModifyTable 的直接子節點。有關範例程式碼,請參閱 postgres_fdw。 * 要檢查關係是否為目標關係,僅將其 relid 與 root->parse->resultRelation 進行比較已不再足夠。相反,請根據 all_result_relids 或 leaf_result_relids 進行檢查(視情況而定)。 Amit Langote 和 Tom Lane 討論: https://postgr.es/m/CA+HiwqHpHdqdDn48yCEhynnniahH78rwcrv1rEX65-fsZGBOLQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/86dc90056dfdbd9d1b891718d2e5614e3e432f35
改善一些與複製相關的錯誤訊息的樣式。將遠端端的錯誤訊息放入主要錯誤字串中,而不是將其降級到 errdetail()。雖然如果遠端傳送給我們一個非常長的錯誤訊息,這最終可能會很尷尬,但它似乎更符合我們的訊息樣式指南,並且在 errdetail 可能被刪除的情況下更有幫助。 Peter Smith 討論: https://postgr.es/m/CAHut+Ps-Qv2yQceCwobQDP0aJOkfDzRFrOaR6+2Op2K=WHGeWg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6197db5340b8154adce1c6d07f6d3325547429c1
抑制 libpq_pipeline.c 中的編譯器警告。某些編譯器似乎擔心 recv_step 可能不是任何已定義的枚舉值。以不同於我在 9fb9691a8 中的方式來消除有關未初始化的 cmdtag 的警告。 https://git.postgresql.org/pg/commitdiff/522d1a89f8d7ed45681988c60bd0a687332a4023
不要過早地將值塞入 short int 中。自 a4d75c86b 以來,某些建置場成員一直在警告說,如果 attnum 是 AttrNumber,則 Assert(attnum <= MaxAttrNumber) 是無用的。我不確定從點陣圖中出來的值實際上可能超過 MaxAttrNumber 有多大可能性,但我們似乎早在 7300a6995 就認為這是可能的。將中間變數恢復為 int,以便我們具有與以前相同的溢位保護。 https://git.postgresql.org/pg/commitdiff/c545e9524dcfcfce25c370f584b31562e8d7a4b7
在非 assert 建置中消除編譯器警告。根據建置場。 https://git.postgresql.org/pg/commitdiff/8998e3cafa23632790787b8cc726998e84067259
修正 pqTraceFormatTimestamp 中的可移植性和安全性問題。消除 time_t 和 pg_time_t 之間的混淆;gettimeofday() 和 localtime() 都不處理後者。libpq 實際上根本不應該使用 <pgtime.h>。使用 snprintf 而不是 sprintf,以確保我們不會溢出提供的緩衝區。(不太可能,但讓我們保持安全。)根據建置場。 https://git.postgresql.org/pg/commitdiff/f1be740a991406d7885047beb971e1ff5dbe8b71
修正 isprint() 的不可移植使用。我們必須將 <ctype.h> 函式的參數轉換為 unsigned char,以避免 char 為有符號數時出現問題。說到這一點,考慮到這是一個 <ctype.h> 函式,我們沒有看到更多關於未包含該標頭的抱怨是相當令人驚訝的。根據建置場。 https://git.postgresql.org/pg/commitdiff/9e20406dd847d0f8c1cbd803786c6d0ad33bcbdd
修正 pg_restore 程式碼中錯誤設計的封存檔案格式偵測。儘管明確的註解指出 ReadHead() 和 _discoverArchiveFormat()
中重複的程式碼片段需要同步,但它們並不同步:後者沒有費心套用前者的任何健全性檢查。我們沒有注意到這一點,部分原因是這些檢查在我們通常測試的場景中都不會失敗,部分原因是如果兩個片段都執行,則會掩蓋該疏忽,但在需要自動偵測不可搜尋 stdin 來源的格式的情況下除外。然而,在滿足所有這些要求的情況下(例如,嘗試從不可搜尋的 stdin 讀取比支援的版本更新的封存格式),pg_restore 會遺漏套用版本檢查,並可能導致核心傾印或以其他方式錯誤執行。無論如何,整件事都很愚蠢,因為除了驗證檔案是否以 "PGDMP" 開頭的一行程式碼之外,似乎沒有太多理由複製邏輯。似乎有一個未記錄的假設,即多個主要格式(主要到需要單獨的讀取器模組)仍然會共享自訂格式標頭的前六個欄位。這似乎不太可能,因此讓我們透過直接刪除 _discoverArchiveFormat()
中的重複邏輯來修正它。此外,擺脫成功自動偵測後嘗試尋找回到檔案開頭的無意義嘗試。這會浪費週期,並且意味著我們有四種行為要驗證,而不是兩種。根據 Sergey Koposov 提出的錯誤 #16951。這個問題已經存在幾十年了,所以回溯修補到所有支援的版本。討論:https://postgr.es/m/16951-a4dd68cf0de23048@postgresql.org https://git.postgresql.org/pg/commitdiff/ec03f2df17a8ba5b431b34dd924e020a0be729f6
重新思考 SP-GiST 中傳值葉節點資料的處理方式。SP-GiST 中現有的慣例是,任何傳值資料類型都以 Datum 表示法儲存,也就是說,即使 typlen 小於 sizeof(Datum),其寬度也是 sizeof(Datum)。對於內部(上層)tuple 中的前綴資料和節點標籤資料來說,這還可以,或者至少現在更改它已經太晚了。但對於葉節點資料來說,這是有問題的,因為我們更希望這些資料以 Postgres 的標準 on-disk 表示法儲存,以便我們可以輕鬆地擴展葉節點 tuple 以攜帶額外的「included」欄位。但是,我相信我們可以直接更改它。這將是一個不可接受的 on-disk 格式中斷,但有兩個很大的緩解因素:1. 似乎不太可能有任何 SP-GiST opclass 使用傳值葉節點資料類型。當然,核心中的任何一個都沒有,codesearch.debian.net 也沒有聽說過任何一個。鑑於 SP-GiST 的用途,很難想像葉節點層級的值既小又固定寬度的用例。(舉例來說,如果您想使用只有一個位元組的葉節點層級來索引文字值,那麼每個文字字串都必須用每個前一個位元組的一層內部 tuple 來表示,這將在空間上極度浪費且存取速度慢。您總是希望使用盡可能少的內部 tuple 層級,將盡可能多的內容留在葉節點值中。)2. 即使您有這樣的索引,此變更也只會在大端機器上破壞事物。在小端機器上,Datum 格式的高位位元組現在只會顯示為對齊填充空間。因此,變更程式碼以通常的 on-disk 格式儲存傳值葉節點資料。內部 tuple 資料不受影響。這是從一個較大的 patch 中提取的,該 patch 旨在新增對「included」欄位的支援。我將其單獨提交,以便在我們的 commit 記錄中具有可見性。Pavel Borisov 和 Tom Lane,由 Andrey Borodin 審閱 討論:https://postgr.es/m/CALT9ZEFi-vMp4faht9f9Junb1nO3NOSjhpxTmbm1UGLMsLqiEQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1ebdec8c03294e55a9fdb6e676a9e8de680231cc
在 Windows 上,也去除錯誤訊息中報告的檔案名稱。Commit dd136052b 建立了一項策略,即錯誤訊息 FILE 項目應僅包含報告來源檔案的基本名稱,以實現統一和簡潔。我們現在觀察到一些 Windows 編譯器在 FILE 字串中使用反斜線,因此也應在反斜線處截斷。預計這將修復新 libpq_pipeline 測試模組結果中的一些平台差異。討論:https://postgr.es/m/3650140.1617372290@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/53aafdb9ff6a561c7dea0f428a7c168f2b7e0f16
改善 psql 在編輯器退出且未儲存時的行為。編輯先前的查詢緩衝區時,如果編輯器退出且未修改臨時檔案,則清除查詢緩衝區,而不是重新載入(並可能重新執行)先前的查詢緩衝區。這降低了意外重新執行您不想執行的內容的可能性。同樣,在 "\e file" 中,如果檔案實際上沒有被修改,則不要將其載入到查詢緩衝區中。並且在 "\ef" 和 "\ev" 中,如果沒有進行任何變更,則清除查詢緩衝區,而不是將函數或檢視定義載入到其中。我們未能調用編輯器或編輯器傳回非零狀態的情況,將被視為檔案未修改的情況。Laurenz Albe,由 Jacob Champion 審閱 討論:https://postgr.es/m/0ba3f2a658bac6546d9934ab6ba63a805d46a49b.camel@cybertec.at https://git.postgresql.org/pg/commitdiff/55873a00e3c3349664e7215077dca74ccea08b4d
修正 SP-GiST 中屬性類型和葉節點儲存類型之間的混淆。根據文件,傳遞給 opclass config 函數的 attType(以及核心程式碼所依賴的)是正在建立索引的堆積資料行或表達式的類型。但實際上傳遞的是索引資料行儲存的類型。對於使用者定義的 SP-GiST opclass 來說,這沒有任何區別,因為我們不允許使用 CREATE OPCLASS 的 STORAGE 子句,因此這兩種類型將是相同的。但是不允許這樣做是很愚蠢的,因為內建的 poly_ops opclass 的 opckeytype 與 opcintype 的值不同,而且如果您想進行有損儲存,那麼這些類型必須確實不同。(因此,進行有損儲存的使用者定義的 opclass 必須謊報索引中的類型。)因此,刪除此限制,並確保在相關的地方使用輸入資料行的類型,而不是 opckeytype。由於與現有使用者定義的 opclass 的回溯相容性,我們不能完全堅持指定的 leafType 與 STORAGE 子句匹配;而是添加一個 amvalidate() 警告,如果它們不匹配。同時修復了一些錯誤,這些錯誤只會在 attType 與 attLeafType 不同時嘗試傳回索引條目時才會顯現。這些錯誤沒有被報告並不令人驚訝,因為這種差異的唯一常見原因是將葉節點值進行有損儲存,導致僅索引掃描變得不可能。添加一個 src/test/modules 模組來練習 attType 與 attLeafType 不同但支援僅索引掃描的情況。討論:https://postgr.es/m/3728741.1617381471@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ac9099fc1dd460bffaafec19272159dd7bc86f5b
Stephen Frost 推送了
使用 WaitLatch 進行 vacuum/autovacuum 的睡眠。在 vacuum_delay_point() 中,不再使用 pg_usleep(),而是使用 WaitLatch。這樣做的好處是,如果 postmaster 在我們上次決定在 vacuum 期間睡眠後被終止,我們會知道。Reviewed-by: Thomas Munro Discussion: https://postgr.es/m/CAFh8B=kcdk8k-Y21RfXPu5dX=bgPqJ8TC3p_qxR_ygdBS=JN5w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4753ef37e0eda4ba0af614022d18fcbc5a946cc9
為已過時和重新命名的函數和設定新增文件章節。新的附錄將有關重新命名或移除的設定、命令等資訊分組到文件中一個不易被注意的部分。每個子章節中都保留了原始的 id 元素,以確保為 HTML 文件生成相同的文件名。這樣可以防止網頁上的 /current/ 連結失效,並允許網路文件使用者從舊版本頁面追蹤到新版本中變更的資訊。在此變更之前,指向重新命名章節(例如 recovery.conf 文件)的 /current/ 連結只會傳回 404。同樣,如果有人搜尋 recovery.conf,他們會找到 pg11 文件,但不會有 /12/ 或 /current/ 連結,因此他們無法輕易地找出它在 pg12 中已被移除,以及如何調整。還新增了索引條目,以便使用者在知道舊名稱但不知道我們將其更改為哪個名稱時,可以追蹤到相關資訊。因此,試圖找出如何在 PostgreSQL 12+ 中設定 standby_mode 或 pg_resetxlog 的使用者現在更有機會找到這些資訊。Craig Ringer 和 Stephen Frost Reviewed-by: Euler Taveira Discussion: https://postgr.es/m/CAGRY4nzPNOyYQ_1-pWYToUVqQ0ThqP5jdURnJMZPm539fdizOg%40mail.gmail.com Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/3b0c647bbfc52894d979976f1e6d60e40649bba7
將預設角色重新命名為預定義角色。術語「預設角色」不太恰當,因為這些角色在安裝後無法修改或移除,因此將它們重新命名為「預定義角色」,並在新增的「已過時附錄」中新增一個條目,以幫助當前版本的使用者找到新的文件。Bruce Momjian 和 Stephen Frost Discussion: https://postgr.es/m/157742545062.1149.11052653770497832538%40wrigleys.postgresql.org and https://postgres.tw/message-id/20201120211304.GG16415@tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/c9c41c7a337d3e2deb0b2a193e9ecfb865d8f52b
Bruce Momjian 推送了
在訊息中,對 -1 使用單數名詞,就像我們對 +1 所做的那樣。這會輸出 "-1 year",而不是 "-1 years"。Reported-by: neverov.max@gmail.com Bug: 16939 Discussion: https://postgr.es/m/16939-cceeb03fb72736ee@postgresql.org https://git.postgresql.org/pg/commitdiff/5da9868ed983f95cc1cff80dcd81252a513774f8
調整 dblink 迴歸測試的預期輸出,以適應 commit 5da9868ed9。看起來 -1/單數輸出用於 dblink 迴歸測試中。Reported-by: Álvaro Herrera Discussion: https://postgr.es/m/20210330231506.GA10666@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/9ee7d533dacf8594057ced2d016250f09056c284
doc: 提及可以跳過中間的主要版本。同時提及您應該閱讀中間主要版本的更新說明。此變更也已應用於網站。Discussion: https://postgr.es/m/20210330144949.GA8259@momjian.us Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/2bda93f813919b58225f5a0e282e10b98d7633d4
在 /ecpg/pgtypeslib 中使用巨集 MONTHS_PER_YEAR 而不是 '12'。所有其他地方都已適當地使用 MONTHS_PER_YEAR。Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/84bc2b17523ef485f102be7f00f7affb88f00f18
Michaël Paquier 推送了
在 pg_dump 中新增對 --extension 的支援。指定此選項後,只有符合給定模式的擴充功能才會包含在傾印中。與 --table 和 --schema 類似,當使用 --strict-names 時,需要完全匹配。同樣,與其他兩個選項一樣,這個新選項不保證已傾印了依賴物件,因此在乾淨的資料庫上還原可能會失敗。測試已新增到 test_pg_dump/ 中,在多組正面和負面案例之後進行檢查,無論擴充功能的內容是否已新增到產生的傾印中。Author: Guillaume Lelarge Reviewed-by: David Fetter, Tom Lane, Michael Paquier, Asif Rehman, Julien Rouhaud Discussion: https://postgr.es/m/CAECtzeXOt4cnMU5+XMZzxBPJ_wu76pNy6HZKPRBL-j7yj1E4+g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6568cef26e0f40c25ae54b8e20aad8d1410a854b
修正 parsenodes.h 中的註解。CreateStmt->inhRelations 是一個 RangeVars 列表,但註解不正確。Author: Julien Rouhaud Discussion: https://postgr.es/m/20210330123015.yzekhz5sweqbgxdr@nol https://git.postgresql.org/pg/commitdiff/7ef64e7e72a65f191fc2f7d4bbe220f53dd8d5de
將一些客戶端特定的常式從 SSLServer 移至 PostgresNode。 test_connect_ok() 和 test_connect_fails() 一直都是 SSL 測試的一部分,並且檢查與後端的連線是否應該成功,以及如果連線失敗,libpq 放棄的特定錯誤模式會進行健全性檢查。這在兩個方面基本上是錯誤的。首先,SSLServer.pm 主要用於設定和變更 PostgresNode 的 SSL 設定,與客戶端實際上沒有任何關係。其次,在 b34ca595 的情況下,情況變得更糟,其中 SSL 測試會透過使用一個 psql 指令來完成,該指令可能與設定的節點來自不同的安裝。此提交將這些客戶端常式移至 PostgresNode,使 SSLServer 的重構更容易,使其更能感知 SSL 實現。這也可以被 ldap、kerberos 和身份驗證測試套件重複使用以進行連線檢查,並且後續的修補程式應該擴展這些介面以匹配後端日誌模式。作者:Michael Paquier 審閱者:Andrew Dunstan, Daniel Gustafsson, Álvaro Herrera 討論:https://postgr.es/m/YGLKNBf9zyh6+WSt@paquier.xyz https://git.postgresql.org/pg/commitdiff/0d1a33438d3a88938264e12e94c22818307d2f4d
文件:闡明在各個部分中使用 ACCESS EXCLUSIVE 鎖。文件的某些部分使用“exclusive lock”來描述在給定操作期間取得 ACCESS EXCLUSIVE 鎖。這可能會讓讀者感到困惑,因為 ACCESS SHARE 在使用 EXCLUSIVE 鎖時是允許的,但這與文件中描述的那些部分的情況不同。作者:Greg Rychlewski 討論:https://postgr.es/m/CAKemG7VptD=7fNWckFMsMVZL_zzvgDO6v2yVmQ+ZiBfc_06kCQ@mail.gmail.com 回溯修補:9.6 https://git.postgresql.org/pg/commitdiff/ffd3391ea94165fbb5adc9534894c62d41138505
提高 reloptions.sql 中使用 vacuum_truncate 的測試的穩定性。此測試一直使用簡單的 VACUUM 和 pg_relation_size() 來檢查關係是否被物理截斷,但忘記了某些並行活動(如檢查點緩衝區寫入)可能導致跳過某些頁面的事實。第二個啟用 vacuum_truncate 的測試可能會失敗,看到一個非空的關係。第一個測試不會失敗,但可能會完成測試與目標行為不同的行為。這兩個測試都獲得了 FREEZE 選項,以使 vacuum 更具侵略性並防止頁面跳過。這與 c2dc1a7 中修復的問題類似。作者:Arseny Sher 審閱者:Masahiko Sawada 討論:https://postgr.es/m/87tuotr2hh.fsf@ars-thinkpad 回溯修補:12 https://git.postgresql.org/pg/commitdiff/fe246d1c111d43fd60a1b0afff25ed09b7ae11eb
文件:闡明如何使用非獨佔備份產生備份檔案。目前描述如何寫入 backup_label 和 tablespace_map 檔案的說明令人困惑。例如,在 Windows 上以文字模式開啟檔案並複製貼上檔案內容將導致恢復失敗,因為產生了額外的 CRLF 字元。文件沒有清楚地說明這一點,並且根據討論,這不被視為受支援的方案。此提交稍微擴展了文件,以提及可能需要在寫入其資料之前以二進位模式開啟檔案。回報者:Wang Shenhao 作者:David Steele 審閱者:Andrew Dunstan, Magnus Hagander 討論:https://postgr.es/m/8373f61426074f2cb6be92e02f838389@G08CNEXMBPEKD06.g08.fujitsu.local 回溯修補:9.6 https://git.postgresql.org/pg/commitdiff/6fb66c268df2de1112cac3cf0a6cf0a8b96ceaf0
重構 HMAC 實現。與 cryptohash 實現類似,這會將現有的 HMAC 程式碼重構為一組單一的 API,這些 API 可以與 PostgreSQL 建置的任何加密函式庫(目前僅限 OpenSSL)搭配使用。如果沒有此類函式庫,則可以使用後備實現。這些新的 API 的設計與現有的 cryptohash 層類似,因此這裡沒有真正的新設計,具有圍繞緩衝區邊界檢查和記憶體處理的相同邏輯。HMAC 依賴於 cryptohashes,因此 cryptohash{_openssl}.c
支援的所有 cryptohash 類型都可以與 HMAC 一起使用。此重構主要對 SCRAM 有利,SCRAM 包括其自己的 HMAC with SHA256 實現,即使 PostgreSQL 建置時支援現有的加密函式庫,也不會依賴它們。此程式碼已在 Windows 和 Linux 上經過測試,無論有無 OpenSSL,在 HEAD 上從 1.1.1 到 1.0.1 支援的所有版本中都是如此。我還使用一些範例結果、我自己的自訂擴充以及使用客戶端和後端的 SCRAM 在不同主要版本之間進行交叉檢查,來檢查這些實現是否正常工作。作者:Michael Paquier 審閱者:Bruce Momjian 討論:https://postgr.es/m/X9m0nkEJEzIPXjeZ@paquier.xyz https://git.postgresql.org/pg/commitdiff/e6bdfd9700ebfc7df811c97c2fc46d7e94e329a2
在 SSL TAP 測試中使用更詳細的錯誤匹配模式。src/test/ssl/ 的 TAP 測試一直在使用相當通用的匹配模式來檢查一些失敗場景,例如「SSL error」或僅僅是「FATAL」。這些是在 081bfc1 中引入的。這些訊息本身並沒有錯,但是當處理整合新的 SSL 函式庫時,很難知道這些錯誤是否合法,並且現有的場景可能會以不正確的方式失敗。此提交透過新增 OpenSSL 產生的資訊,使所有這些訊息更詳細。幸運的是,相同的錯誤訊息用於 HEAD 上支援的所有版本(在從 1.0.1 到 1.1.1 執行測試後檢查),因此變更非常簡單。回報者:Jacob Champion, Álvaro Herrera 討論:https://postgr.es/m/YGU3AxQh0zBMMW8m@paquier.xyz https://git.postgresql.org/pg/commitdiff/8d3a4c3eae5367fba60ab77c159814defba784fe
Noah Misch 推送
Joe Conway 推送
修正 has_column_privilege 函式的邊角案例。根據註解,當將無效或已刪除的欄位 oid 傳遞給 has_column_privilege() 時,意圖一直是傳回 NULL。但是,當呼叫者具有表層級權限時,由於首先檢查了表權限,因此從未發現無效/遺失的欄位。透過引入 pg_attribute_acl(check|mask) 和 pg_class_acl(check|mask) 的擴充版本來修正此問題,這些版本採用一個新引數 is_missing。當 is_missing 為 NULL 時,保留舊行為。但是,當 is_missing 由呼叫者傳遞時,不會針對已刪除或遺失的欄位/關係拋出 ERROR,並且 is_missing 會翻轉為 true。反過來,這允許 has_column_privilege 首先檢查欄位權限,從而提供所需的語意。由於這是一個使用者可見的行為變更,且之前沒有投訴,而且修復有點侵入性,因此沒有回溯修補。作者:Joe Conway 審閱者:Tom Lane 回報者:Ian Barwick 討論:https://postgr.es/m/flat/9b5f4311-157b-4164-7fe7-077b4fe8ed84%40joeconway.com https://git.postgresql.org/pg/commitdiff/b12bd4869b5e64b742a69ca07915e2f77f85a9ae
釐清 RESET ROLE 的文件說明。命令列選項或先前的 "ALTER (ROLE|DATABASE) ... SET ROLE ..." 命令可能會更改工作階段的預設角色值。如果存在其中一種情況,RESET ROLE 會將目前使用者識別符號變更為預設角色,而不是工作階段使用者識別符號。修正文件以反映此事實。回溯修補到所有支援的版本。作者:Nathan Bossart 審閱者:Laurenz Albe, David G. Johnston, Joe Conway 報告者:Nathan Bossart 討論:https://postgr.es/m/flat/925134DB-8212-4F60-8AB1-B1231D750CB4%40amazon.com Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/174edbe9f9c1538ab3347474e96d176223591cd1
Heikki Linnakangas 已推送
新增 'noError' 參數到編碼轉換函式。使用 'noError' 參數,您可以嘗試轉換緩衝區,而無需事先知道字元邊界。現在函式需要傳回成功轉換的輸入位元組數。如果您使用 CREATE CONVERSION 建立了自訂編碼轉換,這是一個不相容的回溯變更。這會對 pg_upgrade 新增檢查,如果存在任何使用者定義的編碼轉換,則拒絕升級。自訂轉換非常罕見,據我所知,沒有常用的擴充功能使用該功能。沒有其他物件可以依賴轉換,因此如果您確實有一個,您可以在升級之前相當容易地將其刪除,並在升級後使用更新的版本重新建立它。為內建編碼轉換新增迴歸測試。這沒有涵蓋所有轉換,但它涵蓋了 conv.c 中用於實作轉換的所有內部函式。審閱者:John Naylor 討論:https://postgres.tw/message-id/e7861509-3960-538a-9025-b75a61188e01%40iki.fi https://git.postgresql.org/pg/commitdiff/ea1b99a6619cd9dcfd46b82ac0d926b0b80e0ae9
以較大的區塊執行 COPY FROM 編碼轉換/驗證。這透過減少對轉換/驗證函式的呼叫次數,並讓它處理更大的輸入,從而提供較小的效能提升。此外,重新組織輸入管道使得更容易平行化輸入解析:在輸入已轉換為資料庫編碼後,尋找換行符號的下一個階段可以平行完成,因為在我們支援作為伺服器編碼的編碼中,多位元組字元中不能有任何「嵌入」的換行符號。這在一個邊角案例中變更了行為:如果用戶端和伺服器編碼是相同的單一位元組編碼(例如 latin1),則先前不會檢查輸入中是否存在零位元組('\0')。包含零位元組的任何欄位都將在零處截斷。但是如果需要編碼轉換,轉換常式會在零上拋出錯誤。在此提交之後,始終會檢查輸入中是否存在零。審閱者:John Naylor 討論:https://postgres.tw/message-id/e7861509-3960-538a-9025-b75a61188e01%40iki.fi https://git.postgresql.org/pg/commitdiff/f82de5c46bdf8cd65812a7b04c9509c218e1545d
Robert Haas 已推送
HeapTupleSatisfies*
的檢查順序,以避免得出錯誤的結論。Mark Dilger 和 Robert Haas 討論:http://postgr.es/m/CA+Tgmob6sii0yTvULYJ0Vq4w6ZBmj7zUhddL3b+SKDi9z9NA7Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3b6c1259f9ca8e21860aaf24ec6735a8e5598ea0Fujii Masao 已推送
修正註解中的錯字。作者:Masahiko Sawada 討論:https://postgr.es/m/CAD21AoA1YL7t0nzVSEySx6zOaE7xO3r0jyu8hkitGL2_XbaMxQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/98e5bd103f887326e381c509c2fbe879ba3ea2f3
修正 pgstat_report_replslot() 以使用其引數的正確資料類型。pgstat_report_replslot() 的呼叫者將 int64 值傳遞給函式。此外,該函式將這些值儲存在 PgStat_MsgReplSlot 結構的 PgStat_Counter(即 int64)欄位中。但是,先前該函式使用「int」作為這些值的某些引數的資料類型,這可能會導致值的溢位。為避免此風險,此提交修正 pgstat_report_replslot() 以使用 PgStat_Counter 類型作為引數。由於它們是統計計數器,因此使用用於計數器的資料類型 PgStat_Counter,而不是 int64。報告者:Vignesh C 作者:Vignesh C 審閱者:Jeevan Ladhe, Fujii Masao 討論:https://postgr.es/m/CALDaNm080OpG=ZwOb0i8EyChH5SyHAMFWJCKaKTXmrfvJLbgaA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/96bdb7e19de80a0c9521c5696455bca2a685c919
postgres_fdw:新增選項以控制是否保持連線開啟。此提交新增了一個新選項 keep_connections,用於控制 postgres_fdw 是否保持與外部伺服器的連線開啟,以便後續查詢可以重複使用它們。此選項只能為外部伺服器指定。預設為 on。如果設定為 off,則在交易結束時將丟棄與外部伺服器的所有連線。當未來的查詢使用外部表格需要時,將重新建立關閉的連線。此選項很有用,例如,當使用者想要防止連線佔用外部伺服器的連線容量時。作者:Bharath Rupireddy 審閱者:Alexey Kondratov, Vignesh C, Fujii Masao 討論:https://postgr.es/m/CALj2ACVvrp5=AVp2PupEm+nAC8S4buqR3fJMmaCoc7ftT0aD2A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b1be3074ac719ce8073fba35d4c8b52fb4ddd0c3
pg_checksums:修正進度報告。pg_checksums 使用兩個計數器,總大小和目前大小,來計算進度。先前,pg_checksums 報告的進度在結束時無法達到 100%。此問題的原因是每個檔案中僅排除新頁面的頁面大小被計為目前大小,而每個檔案的大小被計為總大小。也就是說,所有新頁面的總大小可以報告為總大小和目前大小之間的差值。此提交透過使 pg_checksums 將每個檔案中的所有頁面(包括新頁面)的大小計為目前大小來修正此問題。回溯修補到 v12,其中將進度報告新增到 pg_checksums。報告者:Shinya Kato 作者:Shinya Kato 審閱者:Fujii Masao 討論:https://postgr.es/m/TYAPR01MB289656B1ACA0A5E7CAD07BE3C47A9@TYAPR01MB2896.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/2eb1fc8b1ae8b974007e85636fc7336a9b5d7222
Thomas Munro 已推送
Andres Freund 推送
將與 wait event 相關的程式碼從 pgstat.[ch] 分割到 wait_event.[ch]。與 wait event 相關的程式碼與 pgstat.[ch] 程式碼的其餘部分無關,具有相當大的規模,並且會定期變更。將其放入自己的檔案集中。由於似乎沒有一個很好的現有目錄用於此類程式碼,因此新增 src/backend/utils/activity。審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/a333476b925134f6185037eaff3424c07a9f466f
不要依賴 pgstat.h 間接包含 storage/ 標頭檔。 即將到來的修補程式可能會移除 (現在間接的) proc.h 包含 (進而包含其他標頭檔),而且讓修改後的檔案直接包含其相依性會更乾淨... 討論:https://postgr.es/m/20210402194458.2vu324hkk2djq6ce@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1d9c5d0ce2dcac05850401cf266a9df10a68de49
將後端狀態和進度相關的功能從 pgstat.c 中分離出來。 後端狀態 (支援 pg_stat_activity) 和命令進度 (支援 pg_stat_progress*
) 相關的程式碼在很大程度上獨立於 pgstat.[ch] 的其餘部分 (支援像 pg_stat_all_tables 這樣會隨著時間累積資料的檢視)。 另請參閱 a333476b925。 此 commit 沒有重新命名函式名稱,以區分與 pgstat 的其餘部分的區別 - 這將更具侵入性,並且沒有明顯的好處。 如果我們決定在某個時候執行這樣的重新命名,最好與移動程式碼分開執行。 Robert 的審閱是針對早期版本。審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210316195440.twxmlov24rr2nxrg@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/e1025044cd4e7f33f7304aed54d5778b8a82cd5d
提高 wait event 報告的效率,移除 proc.h 依賴性。 到目前為止,pgstat_report_wait_start() 和 pgstat_report_wait_end() 需要兩個條件分支。 一個用於檢查 MyProc 是否為 NULL,另一個用於檢查是否設定了 pgstat_track_activities。 由於 wait event 在相對輕量級的操作周圍使用,並且是內聯的(降低分支預測器的有效性),因此這不是很好。 對於 MyProc 的依賴性還有第二個缺點:低階子系統(例如 storage/file/fd.c)報告 wait event,但在架構上,最好讓它們不依賴於像 proc.h(定義 PGPROC)這樣的進程間子系統。 在此變更之後,包含 pgstat.h(或顯然它的子元件,如 backend_status.h、wait_event.h 等)不再引入與 IPC 相關的標頭檔。 這些目標(效率和抽象)是透過讓 pgstat_report_wait_start/end() 不與 MyProc 互動,而是與新的 my_wait_event_info 變數互動來實現的。 在後端啟動時,它指向一個本機變數,從而無需檢查 MyProc 是否為 NULL。 在進程初始化期間,my_wait_event_info 會重新導向到 MyProc->wait_event_info。 在關閉時,此操作會反轉。 因為 wait event 報告現在不需要知道 wait event 的儲存位置,所以它不再需要知道 PGPROC。 現在提交此工作的主要動機是,從 pgstat.h 中移除 (間接) pgproc.h 包含,簡化了將統計資訊報告移動到共用記憶體的修補程式(仍然有機會進入 14)。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210402194458.2vu324hkk2djq6ce@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/225a22b19ed2960acc8e9c0b7ae53e0e5b0eac87
Tomáš Vondra 推送
修正 interval 類型的 BRIN minmax-multi 距離。 interval 類型的距離計算將月份視為 31 天,這與 interval 比較器(使用 30 天)不一致。 因此,當 (a<b)
時,可能會得到負距離 (b-a),從而觸發 assert。 透過採用與 interval_cmp_value 相同的邏輯來修正。 回報者:Jaime Casanova 討論:https://postgr.es/m/CAJKUy5jKH0Xhneau2mNftNPtTy-BVgQfXc8zQkEvRvBHfeUThQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2b10e0e3c2ca14d732521479123e5d5e2094e143
修正 timetz 類型的 BRIN minmax-multi 距離。 距離計算忽略了時區,因此即使 (b > a)
,(b-a) 的結果也可能為負數。 透過考慮時區差異來修正。 回報者:Jaime Casanova 討論:https://postgr.es/m/CAJKUy5jLZFLCxyxfT%3DMfK5mtPfSzHA1rVLowR-j4RRsFVvKm7A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/7262f2421a1e099a631356f7b80ad198e34e2a8a
修正 inet 類型的 BRIN minmax-multi 距離。 距離計算忽略了遮罩,這與 inet 比較器不同,這導致在某些情況下距離為負數。 透過在 brin_minmax_multi_distance_inet 中應用遮罩來修正。 我曾考慮過直接呼叫 inetmi() 來計算 delta,但這也沒有考慮遮罩。 審閱者:Zhihong Yu 討論:https://postgr.es/m/1a0a7b9d-9bda-e3a2-7fa4-88f15042a051%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/e1fbe1181c86247eaf8b4b142b81361ce4efcc66
修正 BRIN minmax-multi 呼叫中的參數順序。 BRIN minmax-multi 一致性函式錯誤地假設它可以查找運算子,然後交換引數以取得換向器。 例如,<(a,b) 將作為 <(b,a) 呼叫以取得 >(a,b)。 當引數是相同類型時,這會起作用,但使用跨類型 opclass 時,這會失敗。 例如,我們無法交換 <(float4,float8) 引數。 透過以正確的順序傳遞引數來修正。 討論:https://postgr.es/m/CAJKUy5jLZFLCxyxfT%3DMfK5mtPfSzHA1rVLowR-j4RRsFVvKm7A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/1dad2a5ea3d14dd205603c31cc94ec088183ab2a
新增 minmax-multi macaddr8 類型的迴歸測試。 BRIN minmax-multi opclass 的迴歸測試測試了幾乎所有支援的資料類型,但 macaddr8 除外。 因此,這會新增它。 https://git.postgresql.org/pg/commitdiff/4908684ddab35135869efa2af6b49c4d67c422f9
修正 brin_minmax_multi_union 中的錯誤。在呼叫 sort_expanded_ranges() 時,我們需要記住回傳值,因為該函式會排序並刪除重複的範圍。因此,範圍的數量可能會減少。brin_minmax_multi_union 未能做到這一點,導致由於偽造範圍(minval/maxval 相等但未標記為壓縮)而發生崩潰。回報者:Jaime Casanova 討論:https://postgr.es/m/20210404052550.GA4376%40ahch-to https://git.postgresql.org/pg/commitdiff/d9c5b9a9eeb9e3061ae139e0e564ce5358c94001
James Hilliard 送出另一個 patch 修訂版,以修正對 OSX 的 preadv/pwritev 支援的偵測。
Mark Rofail 送出另一個 patch 修訂版,以實作外鍵陣列。
Tomáš Vondra 送出一個 patch,使用新的子命令 ANALYZE (MERGE) 合併來自子關係的統計資訊。
Zeng Wenjing 送出另一個 patch 修訂版,以實作全域臨時表。
Marcus Wanner 送出另外四個 patch 修訂版,以將 xid 引數新增到輸出外掛程式的 filter_prepare 回呼函數。
Euler Taveira de Oliveira 送出另一個 patch 修訂版,以新增由邏輯複製的 WHERE 子句指定的列篩選。
Peter Smith 送出另一個 patch 修訂版,以將對預備交易的支援新增到內建邏輯複製。
Arne Roland 送出另外兩個 patch 修訂版,以使 ALTER TRIGGER ... RENAME TO 在分割表上工作。
Tang 送出一個 patch,以更新 nbtsearch.c 的著作權年份。
Paul Guo 送出另一個 patch 修訂版,以支援從具有表空間的備份進行節點初始化、修正待命節點上建立資料庫記錄的重播,以及修正資料庫建立/刪除 wal 描述。
Masahiro Ikeda 送出另外兩個 patch 修訂版,以加速 WAL 統計資訊的報告。
Daniil Zakhlystov 送出另外兩個 patch 修訂版,以新增 zlib 和 zstd 串流壓縮,並實作 libpq 壓縮。
Atsushi Torikoshi 和 Fujii Masao 交換了 patch 以取得任意後端進程的記憶體環境。
John Naylor 送出兩個 patch 修訂版,以記錄最近新增的 date_bin() 函式。
Dean Rasheed 和 Fabien COELHO 交換了 patch 以將虛擬隨機排列函式新增到 pgbench。
Isaac Moreland 送出一個 patch,以新增 abs(interval) 函式和相關的 @ 運算符。
Kyotaro HORIGUCHI 送出一個 patch,以使 box 類型的描述更清晰。
Vigneshwaran C 送出另一個 patch 修訂版,如果預備交易鎖定了系統表/使用者目錄表,則使其失敗。
Douglas Hirn 送出另一個 patch 修訂版,以允許在 WITH RECURSIVE 中使用多個線性遞迴自我引用。
Sait Talha Nisanci 送出一個 patch,旨在修正一個表現為 record_type_typmod_compare 崩潰的錯誤。
Tomáš Vondra 送出一個 patch,使用擴展統計資訊來改進聯結估計。
Stephen Frost 送出另一個 patch 修訂版,將預設角色重新命名為預定義角色。
Vigneshwaran C 送出三個 patch 修訂版,以處理覆寫複寫槽統計資訊的問題,並將總交易次數和總交易位元組數新增到複寫統計資訊。
Peter Geoghegan 送出另外兩個 patch 修訂版,以簡化 VACUUM 管理的狀態、重構 lazy_scan_heap()、從 vacuumlazy.c 中刪除 tupgone 特殊情況、在 VACUUM 期間截斷行指標陣列,並在某些情況下繞過索引清理。
Peter Geoghegan 和 Matthias van de Meent 交換了 patch,以在頁面具有尾隨未使用的 ItemIds 時截斷頁面的行指標陣列,並在 PageRepairFragmentation 中覆蓋可用頁面空間。
Tang 送出另一個 patch 修訂版,以支援 psql 中大寫字元輸入的查詢結果的 tab 補全。
Fujii Masao 送出另一個 patch 修訂版,以修正 walreciever 中的斷言失敗。
John Naylor 送出另一個 patch 修訂版,以使用兩個更快的實作取代 pg_utf8_verifystr():一個用於使用 SSE-4.1 指令集的 Intel-ish 處理器,另一個使用客製化的後備函式,而不是依賴 pg_utf8_verifychar() 和 pg_utf8_isvalid() 的函式。
Peter Eisentraut 送出另一個 patch 修訂版,以將 EXTRACT 的回傳類型更改為 numeric。
Stephen Frost 送出一個 patch,以新增 pg_read_all_data 和 pg_write_all_data 角色。
Thomas Munro 送出一個 patch,以在 OpenBSD 上使用 POSIX_NAMED_SEMAPHORES。
Fujii Masao 和 Bharath Rupireddy 交換了 patch 以新增 postgres_fdw 伺服器級別選項 keep_connections,以不快取連線。
Heikki Linnakangas 送出一個 patch,透過強制前瞻來簡化 COPY FROM 剖析。
Daniel Gustafsson 送出另外兩個 patch 修訂版,以支援 NSS 作為 libpq TLS 後端。
Yuzuko Hosoya 和 Álvaro Herrera 交換了 patch 以修正在分割表上的自動清理。
Bharath Rupireddy 送出一個 patch,當分割表的持久性變更時發出警告。
Amit Langote 送出另一個 patch 修訂版,以也在分割表中建立外鍵觸發器,並使用相同的觸發器在跨分割區更新期間正確強制執行外鍵。
Euler Taveira de Oliveira 送出另一個 patch 修訂版,以重構 parse_output_parameters 函式,以使用封裝所有 pgoutput 選項的 struct PGOutputData,而不是使用多個參數,並使用相同的程式碼將邏輯解碼訊息支援新增到 pgoutput。
Peter Eisentraut 送出另一個 patch 修訂版,以實作 SQL 標準函式主體。
Justin Pryzby 送出另一個 patch 修訂版,以實作分割表的 CLUSTER。
Amit Langote 送出另外兩個 patch 修訂版,以匯出 get_partition_for_tuple(),並使用相同的程式碼來避免將 SPI 用於某些 RI 檢查。
Julien Rouhaud 送出另外三個 patch 修訂版,將 pg_stat_statements 查詢混亂移至核心,並使用相同的程式碼在 pg_stat_activity、log_line_prefix 和 verbose explain 中公開 queryid。
Joel Jacobson 送出一個 patch 以新增 MotD 函式。
Bharath Rupireddy 送出另一個 patch 修訂版,以實作 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION ...
Erik Rijkers 送出另一個 patch 修訂版,以修正一個舊的令人困惑的 JSON 範例。
Kazutaka Onishi 送出另外六個 patch 修訂版,以實作外部表的 TRUNCATE。
Thomas Munro 送出另一個 patch 修訂版,以新增用於 SLRUs 的緩衝區對應表,並使所有 SLRU 緩衝區大小可配置。
Takamichi Osumi 送出另外兩個 patch 修訂版,以保護封存復原不會遺漏資料。這會停用伺服器,使其在封存復原期間偵測到使用 wal_level=minimal 產生的 WAL 時啟動。無論 EnableHotStandby 的值如何,都應該這樣做,因為我們不認為會發生經歷 wal_level=minimal 期間的情況。此 patch 的動機是保護使用者最終獲得可能在待命模式下遺漏資料的複本,並使伺服器在復原模式下遺漏資料。
Amit Langote 送出另一個 patch 修訂版,以延遲設定 ForeignScanState.resultRelInfo,並延遲初始化結果關係資訊。
Justin Pryzby 送出一個 patch,以使 track_activity_query_size 成為 STATS_COLLECTOR 類別、確保 log_autovacuum_min_duration 是 LOGGING_WHAT、使 track_commit_timestamp 成為 REPLICATION_SENDING,並將 force_parallel_mode 更改為 DEVELOPER GUC,並將其從範例配置中移除。
Pavel Stěhule 提交了 schema 變數實作的另一個修訂版本。
Anton Voloshin 提交了一個修正 collationcmds.c 中錯字的 patch。
Zhihong Yu 提交了一個從 AttrDefaultFetch 中移除未使用的變數的 patch。
Amit Langote 提交了允許在跨分割區更新期間批次處理插入的另一個修訂版本。
Anton Voloshin 提交了一個在 icu_convert_case() 中使用 repalloc() 而非 palloc() 的 patch,因為有問題的結構可能已經被 palloc() 分配過。
Tom Lane 提交了一個修正一些 adbin 不一致性的 patch。