pg_statement_rollback v1.2,一個擴充套件,增加了伺服器端事務,可以在語句級別回滾,已發布。
https://archives.postgresql.org/pgsql-jobs/2021-06/
Planet PostgreSQL: https://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 為您帶來
請在太平洋標準時間下午 3:00 之前(週日)將新聞和公告提交至 david@fetter.org。
Tomáš Vondra 推送了
為 CREATE STATISTICS 在 nodes/*funcs.c
中新增 transformed 標誌。Commit a4d75c86bf 新增了一個新的標誌,用於追蹤語句是否由 transformStatsStmt() 處理,但未能將此標誌新增到 nodes/*funcs.c
。由於將標誌新增到複製/相等/輸出函數,Catversion 增加。報告者:Noah Misch 討論:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/d57ecebd128cdf2f4844a2ea4d35ff28d7d69be8
修正使用 CLOBBER_CACHE_ALWAYS 時的 pg_visibility 回歸失敗。Commit 8e03eb92e9 還原了過多的程式碼,重新引入了 39b66a91bd 修復的問題之一 - 在 relcache 失效後,頁面可能部分為空。報告者:Tom Lane 作者:Masahiko Sawada 討論:https://postgr.es/m/822752.1623032114@sss.pgh.pa.us 討論:https://postgr.es/m/CAD21AoA%3D%3Df2VSw3c-Cp_y%3DWLKHMKc1D6s7g3YWsCOvgaYPpJcg%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/d1f0aa7696917213485c03b076b573497a535076
調整 postgres_fdw 中的批次大小,以避免使用過多的參數。FE/BE 協議使用 Int16 索引來識別參數,這將每個查詢的最大參數數量限制為 65535。由於批次處理已新增到 postges_fdw 中,因此更容易達到此限制,因為整個批次本質上是一個單一查詢,因此更容易發生此錯誤。失敗有點不可預測,因為它還取決於查詢中的列數。因此,這個補丁不是直接失敗,而是調整 batch_size 以不超過最大參數數量。報告者:Hou Zhijie houzj.fnst@cn.fujitsu.com 審閱者:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 討論:https://postgr.es/m/OS0PR01MB571603973C0AC2874AD6BF2594299%40OS0PR01MB5716.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/cb92703384e2bb3fa0a690e5dbb95ad333c2b44c
最佳化 FDW 批量插入的插槽建立。Commit b663a41363 引入了 FDW 的批量插入,但 tuple 插槽的處理被證明存在問題,原因有兩個。首先,插槽是為每個單獨的批次重新建立的。其次,所有插槽都參考同一個 tuple 描述符 - 對於相當小的批次,這不是問題,但對於大型批次,這會在資源擁有者程式碼中觸發 O(N^2) 行為。這兩個問題相互作用 - 為了減少插槽必須建立/刪除的次數,需要更大的批次。但是,批次越大,資源擁有者的成本就越高。對於實際的批次大小 (100 - 1000),這不會是一個大問題,因為好處 (延遲節省) 遠遠超過資源擁有者的成本。但是對於非常大的批次,情況可能會更糟,甚至可能會在非批次模式下丟失。透過僅初始化一次 tuple 插槽(並在批次之間重複使用它們)以及為每個插槽使用新的 tuple 描述符副本來修復。討論:https://postgr.es/m/ebbbcc7d-4286-8c28-0272-61b4753af761%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/b676ac443b6a83558d4701b2dd9491c0b37e17c4
Tom Lane 推送了
修正 FuncCall.funcformat 的 equalfuncs.c 行為不一致。equalfuncs.c 中其他關於 CoercionForm 欄位的檢查使用 COMPARE_COERCIONFORM_FIELD
(這使得它們不執行任何操作),但 commit 40c24bfef 忽略了讓 _equalFuncCall
也這樣做。修正它。只有在 FuncCall.funcformat 沒有語義影響,而只是決定 ruleutils.c 顯示格式時,這才是嚴格正確的。40c24bfef 在解析分析中新增了一些可能會破壞該規則的檢查;但經過仔細檢查,它們是多餘的,所以直接移除它們。根據 Noah Misch 的報告。討論:https://postgr.es/m/20210606063331.GC297923@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a65e9f3f1405b786673feec131879843432bf9a6
修正客戶端程式碼中對可能編碼錯誤字串的不小心處理。字串末尾附近編碼錯誤的多位元組字元可能導致各種處理迴圈超出字串的終止 NUL 運行,導致的結果範圍從未檢測到問題到程式崩潰,取決於後面的記憶體中是什麼。這在伺服器中不是問題,因為我們在對字串進行任何有趣的處理之前會注意驗證字串的編碼。但是,這種缺乏謹慎洩漏到了客戶端程式碼中,客戶端程式碼不應假設任何人已驗證其輸入的編碼。雖然這確實是一個值得修復的錯誤,但 PG 安全團隊選擇不將其視為安全問題,主要是因為任何不受信任的文字都應在使用 PQescapeLiteral 或類似工具合併到 SQL 或 psql 命令中之前進行清理。(如果應用程式未能這樣做,則可以使用相同的技術來導致 SQL 注入,其後果可能比僅僅客戶端程式崩潰更可怕。)這些函數已經證明可以防禦此類問題,請參閱 CVE-2006-2313。為了修復,發明了 PQmblenBounded(),它類似於 PQmblen(),只是它返回的值不會超過字串中剩餘的位元組數。在 HEAD 中,我們可以將其設為一個新的 libpq 函數,就像 PQmblen() 一樣。但更改穩定分支中的 libpq API 似乎是不明智的,因此在後端分支中,將 PQmblenBounded 定義為需要它的檔案中的巨集。(請注意,僅僅更改 PQmblen 的行為不是一個好主意;值得注意的是,它會完全破壞轉義函數對此類問題的防禦。因此,我們只需要一個版本來處理那些沒有任何更好方法來處理此問題的呼叫者。)根據 houjingyi 的私人報告。向所有支援的分支進行向後移植。https://git.postgresql.org/pg/commitdiff/42f94f56bf9559f0a3cf5f3ffde50655834694ee
穩定 contrib/seg 回歸測試。如果 autovacuum 在我們用一些資料填滿表 test_seg 後立即出現,它將更新統計資料到我們更喜歡普通索引掃描而不是位圖掃描的程度,從而破壞了預期的輸出(以及測試案例的要點)。為了修復,只需強制在此處選擇位圖掃描。自 commit de1d042f5 以來,這顯然是錯誤的。目前尚不清楚為什麼我們最近才看到由它引起的任何 buildfarm 失敗;但 prairiedog 在過去的一周中已經兩次在此測試中失敗。因此,向後移植到 v11,這個測試案例是在 v11 中引入的。https://git.postgresql.org/pg/commitdiff/d16ebfbff74b30c83a4669a1df318cacfa7e52ca
修正 SQL 標準函式主體中遇到空語句時崩潰的問題。gram.y 應該在組裝 routine_body_stmt_list 時,像處理其他種類的語句列表一樣,捨棄 NULL 指標(空語句)。由 Julien Rouhaud 和 Tom Lane 修正,根據 Noah Misch 的報告。討論:https://postgr.es/m/20210606044418.GA297923@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/bfeede9fa464ab707eb5ac5704742bf78bd7ac9e
避免在持久化非穩定游標時發生錯誤行為。PersistHoldablePortal 長期以來假設它應該儲存要持久化的查詢的完整輸出,這需要倒帶並重新讀取輸出。如果查詢是不穩定的,這會產生問題:我們可能會得到不同的行內容,甚至不同數量的行,這會嚴重混淆游標狀態。如果游標是 NO SCROLL,這很容易解決:只需儲存剩餘的查詢輸出,無需任何倒帶,並調整入口的游標狀態以匹配即可。除了消除語義問題之外,這可能比儲存整個輸出更有效率。如果游標是可滾動的,我們能做的並不多,但滾動不穩定查詢的結果已經非常不安全。我們只需更清楚地說明,無法保證從中獲得正確的結果。已經存在禁止將 SCROLL 與 FOR UPDATE/SHARE 一起使用的規定,這是 SELECT 查詢產生不穩定結果的一種方式。我們可以想像當查詢包含不穩定函數時禁止 SCROLL,但這將需要昂貴的執行成本。此外,如果使用者忘記將函數標記為穩定,則可能會破壞運行良好的應用程式。因此,決定記錄這個風險。雖然這個問題以某種形式存在了很長時間,但在 v11 中變得更加嚴重,v11 引入了持久化 plpgsql 游標(可能是隱式的)的可能性,即使它們違反了可以標記為 WITH HOLD 的規則。因此,我選擇回溯修補到 v11,但不再往前。根據 Алексей Булгаков 提出的 bug #17050。討論:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/ba2c6d6cec000f0aeaeda4d56a23a335f6164860
強制 plpgsql 的隱式游標使用 NO SCROLL。進一步思考 bug #17050 表明,對於 plpgsql FOR-over-query 迴圈開啟的隱式游標,使用 CURSOR_OPT_NO_SCROLL 是個好主意。這確保了如果有人在迴圈內提交,PersistHoldablePortal 不會嘗試倒帶並重新讀取游標。雖然如果查詢中出現 FOR UPDATE/SHARE,我們無論如何都會選擇 NO_SCROLL,但使用不穩定函數也存在其他風險;而且在任何情況下,花費精力儲存我們確定不需要的行是很愚蠢的。(順便說一句,改進 exec_run_select 中的註釋,它對於何時可以使用並行模式的理由有點困惑。游標操作對於無名入口來說不是風險。)這在 v11 之前不是問題,v11 引入了持久化這些游標的可能性。因此,回溯修補到 v11。根據 Алексей Булгаков 提出的 bug #17050。討論:https://postgr.es/m/17050-f77aa827dc85247c@postgresql.org https://git.postgresql.org/pg/commitdiff/be90098907475f3cfff7dc6d590641b9c2dae081
避免 ECPG 測試在某些具有 GSS 功能的環境中失敗。Buildfarm 成員 hamerkop 報告說,connect/test5.pgc 中的兩個案例顯示的錯誤訊息與測試預期的不同,因為自 commit ffa2e4670 以來,libpq 的連接失敗訊息暴露了嘗試 GSS 加密連接但失敗的事實。這本身就是非常有趣的訊息,我當然不想責怪報信者,但我們需要做些什麼來穩定 ECPG 結果。對於這兩個失敗案例中的第二個,我們可以新增 gssencmode=disable 選項來防止差異。但是,該解決方案對於第一個失敗案例來說是有問題的,因為該案例唯一特殊之處在於它正在測試一個完全省略的連接目標;沒有地方可以新增選項而不影響測試案例的意義。在經過一番對具有不良副作用的替代修復方案的折騰後,最可行的答案是放棄並刪除該測試案例。如果我們弄清楚 GSS 代碼在 hamerkop 環境中為何行為不端,也許我們可以稍後恢復此操作。感謝 Michael Paquier 對替代方案的探索。討論:https://postgr.es/m/YLRZH6CWs9N6Pusy@paquier.xyz https://git.postgresql.org/pg/commitdiff/9bb5eecce645dd72853e3ed262bef7bf11cae566
在 LockRows 節點到達末尾時關閉 EvalPlanQual 機制。先前,我們讓 EPQ 子執行器保持運行,直到 ExecEndLockRows。這導致它可能持有的任何緩衝區釘選或其他資源一直保持到 ExecutorEnd,在某些代碼路徑中,這意味著它們一直保持到入口關閉。這可能會導致使用者可見的問題,例如阻塞 VACUUM;並且這與普通表掃描節點的行為不同,普通表掃描節點在返回 EOF 指示時將釋放所有緩衝區釘選。我們可以通過在返回 NULL 之前調用 EvalPlanQualEnd 使 LockRows 的工作方式更像其他計劃節點。我們仍然需要在 ExecEndLockRows 中調用它,以防節點沒有運行完成,但在正常情況下,第二次調用不會執行任何操作並且代價很小。根據 Yura Sokolov 的報告。原則上這是一個長期存在的 bug,但考慮到缺乏其他投訴和後果的低嚴重性,我選擇不回溯修補。討論:https://postgr.es/m/4aa370cb91ecf2f9885d98b80ad1109c@postgrespro.ru https://git.postgresql.org/pg/commitdiff/bb4aed46a5aeb00d2f1d8b8160feed339f4eaf12
更進一步地重新安排 logrep 工作者的快照處理。事實證明,worker.c 中 TRUNCATE 的代碼路徑在執行使用者定義代碼時也疏忽了建立快照,導致 commit 84f5c2908 新增的檢查在觸發器在該上下文中觸發時失敗。我們只需將 Push/PopActiveSnapshot 包裹在 truncate 調用周圍,但似乎最好建立一個在複製步驟的整個執行過程中保持快照的策略。為了幫助實現這一點以及可能的未來需求,請將之前的 ensure_transaction 調用替換為 begin/end_replication_step 調用對。根據 Mark Dilger 的報告。像之前的更改一樣,回溯修補到 v11。討論:https://postgr.es/m/B4A3AF82-79ED-4F4C-A4E5-CD2622098972@enterprisedb.com https://git.postgresql.org/pg/commitdiff/3a09d75b4f6cabc8331e228b6988dbfcd9afdfbe
重新考慮程序 OUT 參數的處理方式。Commit 2453ea142 重新定義了 pg_proc.proargtypes,使其僅包含程序的 OUT 參數類型。雖然這對於實現 SQL 規範中 DROP PROCEDURE 的行為有一些優勢,但從許多其他角度來看,卻是災難性的。 值得注意的是,由於 pg_proc 的主鍵是 name + proargtypes,因此這使得擁有具有相同名稱 + 輸入參數但輸出參數類型不同的多個程序成為可能。 這將導致無法僅通過編寫 NULL(或"?",或任何其他無資料類型標記)作為輸出參數來調用任何一個程序。 此更改似乎也可能讓檢查 pg_proc 並期望 proargtypes 的傳統定義的客戶端應用程序感到非常困惑。 因此,將 proargtypes 的定義恢復到原來的狀態,並撤銷為支持該定義而添加的許多複雜之處。 為了支持 SQL 規範中 DROP PROCEDURE 的行為,當命令的參數列表中沒有 argmode 標記時,我們將以兩種方式執行查找(即,同時匹配 proargtypes 和 proallargtypes),如果我們只得到一個唯一的匹配項,則成功。 原則上,這可能會導致在使用兩個規則中的任何一個時都不會發生的模糊函數失敗。 但是,程序名稱的重載被認為是一種非常罕見的用法,因此這不應在實踐中引起太多問題。 Postgres 特定的程式碼(例如 pg_dump)可以通過小心地為所有程序參數指定 argmodes 來防禦任何此類失敗的可能性。 這也修復了 CALL 語句中帶有名稱參數的一些其他錯誤,並稍微改進了文檔。 強制 catversion 升級,因為帶有 OUT 參數的程序的表示形式發生了變化。 討論:https://postgr.es/m/3742981.1621533210@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e56bce5d43789cce95d099554ae9593ada92b3b7
修復分割表複製邏輯中的多個崩潰錯誤。 apply_handle_tuple_routing() 在檢測到並報告它需要更新的 tuple 不存在後,仍然嘗試更新該 tuple,從而導致空指針解引用。 logicalrep_partition_open() 無法確保它為分割區構建的 LogicalRepPartMapEntry 完全獨立於分割區根目錄的 LogicalRepPartMapEntry,如果在稍後釋放或重建根目錄條目,則會導致問題。 同時,在發布者端,pgoutput_change() 有時會嘗試將 execute_attr_map_tuple() 應用於 NULL tuple。 其中第一個錯誤由 Sergey Bernikov 在錯誤 #17055 中報告; 我在為這個可悲的未經充分測試的程式碼開發一些測試案例時發現了其他兩個錯誤。 第一個問題的診斷和補丁由 Amit Langote 提供; 其他問題的補丁由我提供; 新的測試案例由我提供。 Back-patch 到引入此邏輯的 v13。 討論:https://postgr.es/m/17055-9ba800ec8522668b@postgresql.org https://git.postgresql.org/pg/commitdiff/ab55d742eb7162c22ee60f1e15e07d2a60063c4e
不要使用 Assert 來檢查複製協議的違規行為。 使用 Assert 來檢查傳入消息的有效性是一個非常糟糕的決定。 在 debug 版本中,一個損壞或惡意的遠程客戶端不應該那麼容易導致 logrep worker 崩潰。 在非 debug 版本中,後果可能更糟,因為這些版本根本不會進行此類檢查,從而導致誰知道會發生什麼樣的錯誤行為。 因此,將每個可能由錯誤或亂序的複製消息觸發的 Assert 提升為完整的測試和 ereport。 為了避免擴大翻譯團隊必須應對的消息集,制定一項策略,即複製協議違規錯誤報告不需要翻譯。 因此,此處的所有新消息都使用 errmsg_internal()。 為了保持一致性,也同樣更改了一些舊消息。 順便說一句,修復了一些非慣用或完全錯誤的 hash_search() 用法。 這些錯誤中的大多數是 "streaming replication" 補丁(commit 464824323)中的新錯誤,但有些錯誤可以追溯到很久以前。 根據需要進行 Back-patch。 討論:https://postgr.es/m/1719083.1623351052@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/fe6a20ce54cbbb6fcfe9f6675d563af836ae799a
確保 pg_filenode_relation(0, 0) 返回 NULL。 以前,relfilenode 的零值會導致關於「意外重複」的令人困惑的錯誤消息。 此函數為其他無效的 relfilenode 值返回 NULL,因此零也應同樣對待。 一直都是這樣,因此 back-patch 到所有受支持的分支。 Justin Pryzby 討論:https://postgr.es/m/20210612023324.GT16435@telsasoft.com https://git.postgresql.org/pg/commitdiff/1250aad42520fd5a3db68d6381997b7e1f9bb4aa
恢復等待 postmaster 重啟的 TAP 測試的穩健性。 幾個 TAP 測試使用 poll_query_until() 等待 postmaster 重啟。 他們正在檢查一個簡單的查詢(例如 "SELECT 1")是否成功。 但是,在 commit 11e9caff8 之後,這是個問題,因為現在我們通過 stdin 將上述查詢提供給 psql,如果 psql 在讀取查詢之前退出,我們可能會遇到 IPC::Run 抱怨 SIGPIPE 失敗的情況。 因此,在我們需要等待連線失敗停止發生的情況下,我們不能使用非空查詢。 按照 commit c757a3da0 和 6d41dd045 的先例,我們可以將 "undef" 作為此類情況下的查詢傳遞,以確保 IPC::Run 沒有任何可寫的內容。 但是,我們必須說預期的輸出為空,這暴露了 poll_query_until 中的缺陷:如果 psql 完全失敗並返回空的 stdout,poll_query_until 會將其視為成功! 這是因為,與其文檔相反,它沒有對 psql 失敗進行實際檢查,既沒有查看退出狀態,也沒有查看 stderr。 為了修復這個問題,調整 poll_query_until 以堅持要求空的 stderr 以及 stdout 匹配。 (我嘗試過檢查退出狀態,但似乎 psql 通常會在我們需要考慮成功的情況下執行 exit(1)。 這可能是有一天需要修復的事情,但這將是一個不可 back-patch 的行為更改。) Back-patch 到 v10。 需要此更改的測試案例僅存在於 v11 中,但似乎明智的做法是在 v10 中保持 poll_query_until 的行為相同,以防我們將來 back-patch 另一個此類測試案例。 (9.6 目前不需要此更改,因為在該分支中無法告訴 poll_query_until 接受空的 stdout 作為成功案例。) 根據各種 buildfarm 失敗,主要是在 hoverfly 上。 討論:https://postgr.es/m/CAA4eK1+zM6L4QSA1XMvXY_qqWwdUmqkOS1+hWvL8QcYEBGA1Uw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f452aaf7d4a96cfcecd6c60ccd294ffe7b8ea088
Etsuro Fujita 推送
修正了對 async-aware Append 節點的重新掃描。在不需要執行期修剪的情況下,當重新掃描節點時,應重複使用 classify_matching_subplans() 判定的 async-aware Append 節點的同步和異步子計畫。但先前的程式碼在每次重新掃描節點時,都會重複使用該函數重新判定它們,導致在正常版本中產生不正確的結果,並在啟用 Assert 的版本中導致 Assert 失敗,因為該函數不假設在這種情況下會被重複呼叫。修正了上述程式碼。這是我在 commit 27e1f1456 中的疏忽。順便一提,為了確保起見,在 ExecInitAppend() 和 ExecReScanAppend() 中將 async 相關的指標/變數明確地初始化為 NULL/零。(在我們到達後者函數之前,這些變數會被設定為零,但我們還是這樣做吧。) 審閱人:Kyotaro Horiguchi 討論:https://postgr.es/m/CAPmGK16Q4B2_KY%2BJH7rb7wQbw54AUprp7TMekGTd2T1B62yysQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3baaf28a6da588987b94a05a725894805c3eae9
文件:進一步更新異步執行的文件。新增關於 postgres_fdw 在應用於包含同步子計畫的 Append 節點時的異步執行的說明。commit 27e1f1456 的後續。Andrey Lepikhov 和 Etsuro Fujita 討論:https://postgr.es/m/58fa2aa5-07f5-80b5-59a1-fec8a349fee7%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/eab81953682d5087295afb911c93f36cb1533bd9
Amit Kapila 推送
Michaël Paquier 推送
修正測試 indirect_toast 中的可移植性問題。當在使用 default_toast_compression 設定為 LZ4 的伺服器上執行時,由於處理的 tuple 的順序不一致,此測試將會失敗。LZ4 會導致一個 tuple 被儲存在 inline 中,而不是被外部化。由於此測試的目標是在資料儲存在外部後進行檢查,因此堅持使用 pglz 作為壓縮演算法,以便此測試的所有資料都以應有的方式儲存。分析人:Dilip Kumar 討論:https://postgr.es/m/YLrDWxJgM8WWMoCg@paquier.xyz https://git.postgresql.org/pg/commitdiff/68a6d8a87006ba727d9662ec84c7a3d9de402df0
重新排序 pg_log_backend_memory_contexts() 中的超級使用者檢查。此函數的使用僅限於超級使用者,並且程式碼包含對此的硬編碼檢查。然而,程式碼會在檢查使用者是否為超級使用者之前,先尋找 PGPROC 條目以發出記憶體轉儲的信號,如果我們知道將會傳回錯誤,這就沒有意義了。請注意,即使對於未授權的使用者,程式碼也會讓使用者知道一個程序是否為 PostgreSQL 程序,但現在情況並非如此,這避免了取得 ProcArrayLock,而 ProcArrayLock 大多數情況下最終會變得不必要。感謝 Julien Rouhaud 和 Tom Lane 的討論。討論:https://postgr.es/m/YLxw1uVGIAP5uMPl@paquier.xyz https://git.postgresql.org/pg/commitdiff/4e47b02834827fa700627290fae02f89a450368c
修正 psql --help=commands 中的不一致之處。\dAp、\do 和 \dy 支援的子命令集在 psql 的 --help 中描述不正確。文件已經與程式碼一致。回報人:inoas,來自 IRC 作者:Matthijs van der Vleuten 審閱人:Neil Chen 討論:https://postgr.es/m/6a984e24-2171-4039-9050-92d55e7b23fe@www.fastmail.com 回溯移植:9.6 https://git.postgresql.org/pg/commitdiff/845cad4d51cb12a34ea012dfe58af5ef490384fc
改進 psql 的 tab 鍵自動完成功能,適用於訂閱和出版物的選項。tab 鍵自動完成功能提供的選項清單對於以下命令已過時: - ALTER SUBSCRIPTION - CREATE SUBSCRIPTION - ALTER PUBLICATION - CREATE PUBLICATION 作者:Vignesh C 審閱人:Bharath Rupireddy 討論:https://postgr.es/m/CALDaNm18oHDFu6SFCHE=ZbiO153Fx7E-L1MG0YyScbaDV--U+A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d08237b5b494f96e72220bcef36a14a642969f16
改進最近新增的 TAP 測試中的日誌模式偵測。ab55d74 引入了一些測試,其中發現邏輯複製訂閱中遺漏了分割表格的列,這些測試依賴於一種邏輯,即尋找產生的日誌,掃描整個檔案。此 commit 使邏輯更精確,僅從執行關鍵查詢之前的位置掃描日誌到我們檢查日誌的位置。如果這些測試在未來變得更複雜,這將降低日誌模式相互重疊的風險。根據與 Tom Lane 的討論。討論:https://postgr.es/m/YMP+Gx2S8meYYHW4@paquier.xyz 回溯移植:13 https://git.postgresql.org/pg/commitdiff/bfd96b7a3dc26a8384d4185d274573fb6a46b033
簡化 getObjectTypeDescription() 中的一些程式碼。此例程的設計目的是永遠不傳回空描述或 NULL,即使接受遺失的物件,也提供描述回退,但它包含一個程式碼路徑,其中認為這是可能的。此例程的所有呼叫者都已經認為 NULL 是不可能的,因此稍微更改程式碼以映射呼叫者的假設,並在此例程的呼叫者附近新增更多註釋以概述預期的行為。此程式碼是 2a10fdc 以來新增的,因此不需要回溯移植。討論:https://postgr.es/m/YMNY6RGPBRCeLmFb@paquier.xyz https://git.postgresql.org/pg/commitdiff/b56b83aa0d6e044cf38d553f7a87f4b84708cac6
在 pg_regress.c 中忽略更多環境變數。這類似於 8279f68 中為 TestLib.pm 所做的工作,如果使用帶有 pg_regress 的臨時安裝,設定的環境變數可能會導致不必要的失敗。根據支援的情況,在每個穩定分支中調整重設的變數清單。新增註釋以記住 TestLib.pm 和 pg_regress.c 中的清單最好保持同步。審閱人:Álvaro Herrera 討論:https://postgr.es/m/YMNR9GYDn+fHlMta@paquier.xyz 回溯移植:9.6 https://git.postgresql.org/pg/commitdiff/a9e0b3b08fe38d5e31f03ea96859ff5e413d4a38
Peter Eisentraut 推送
新增 _outTidRangePath()
。我們有所有路徑節點的 outNode() 覆蓋率,但新增時遺漏了這一個。 https://git.postgresql.org/pg/commitdiff/3bb309be7533e153d86390642e8a2d054bbe82c8
libpq: 修正 SNI 主機處理方式。修正處理 NULL 主機名稱的問題 (可能透過使用 hostaddr)。先前會因此崩潰。此外,我們應該查看 connhost,而非 pghost,以處理多主機規格。同時移除不必要的 SSL_CTX_free()。Reported-by: Jacob Champion pchampion@vmware.com Reviewed-by: Michael Paquier michael@paquier.xyz Discussion: https://postgres.tw/message-id/504c276ab6eee000bb23d571ea9b0ced4250774e.camel@vmware.com https://git.postgresql.org/pg/commitdiff/37e1cce4ddf0be362e3093cee55493aee41bc423
增加一些 const 修飾符。其中一個函式是 PostgreSQL 14 的新功能;最好從一開始就正確使用。 https://git.postgresql.org/pg/commitdiff/b29fa951ec519bdde153465e2caa6c0b7b3bcfc3
Bruce Momjian pushed
doc: 更新關於 v2 wire 協定的發布說明項目。Protocol v2 最後一次使用是在 PG 7.3,而非 7.2。Reported-by: Tatsuo Ishii Discussion: https://postgr.es/m/20210608.091329.906837606658882674.t-ishii@sraoss.co.jp https://git.postgresql.org/pg/commitdiff/444302ed56273e4c4006a9be319e60fa12a90346
docs: 修正 PG 14 發布說明中的不正確縮排。 https://git.postgresql.org/pg/commitdiff/0725913982e5e06895a32a9eeea2c59a13978927
doc: 移除 PG 14 發布說明中多餘的右角括號。Reported-by: Justin Pryzby https://git.postgresql.org/pg/commitdiff/d120e66fac87f768ea2289d2d923d0ee4262ec0f
Robert Haas pushed
修正新的備用伺服器追隨新的主要伺服器時發生的邊角案例失敗。 只有在以下情況下才會發生:(1) 新的備用伺服器在本地沒有可用的 WAL,(2) 新的備用伺服器從舊的時間線開始,(3) 升級發生在新的備用伺服器啟動的 WAL 片段中,(4) 新時間線的時間線歷史檔案可以從歸檔中取得,但 WAL 檔案不可用(即,這是一個競爭條件),(5) 新時間線的 WAL 檔案可透過流式傳輸取得,以及 (6) recovery_target_timeline='latest'。 Commit ee994272ca50f70b53074f0febaec97e28f83c4e 引入了此邏輯,並且比之前的程式碼有所改進,但它錯誤地處理了這種情況。如果 recovery_target_timeline='latest' 且設定了 restore_command,validateRecoveryParameters() 可以將 recoveryTargetTLI 更改為與 receiveTLI 不同。如果在之後嘗試串流,expectedTLEs 會使用錯誤時間線的歷史記錄初始化。它應該是一個解釋如何到達目標時間線的條目列表,但在這種情況下,它最終會得到一個解釋如何到達新備用伺服器原始時間線的條目列表,這是不對的。Dilip Kumar 和 Robert Haas 審閱,Kyotaro Horiguchi 審閱。Discussion: http://postgr.es/m/CAFiTN-sE-jr=LB8jQuxeqikd-Ux+jHiXyh4YDiZMPedgQKup0g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caba8f0d43fb679c6f9643456080408a6bc370e8
調整新的測試案例以設定 wal_keep_size。根據 buildfarm 成員 conchuela 和 Kyotaro Horiguchi 的說法,連鎖備用伺服器需要的 WAL 片段可能會被過快移除。希望這能防止這種情況發生。Kyotaro Horiguchi Discussion: http://postgr.es/m/20210610.101240.1270925505780628275.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/4dcb1d087aebc6fc2477ce4458ea82f548e2c1ee
David Rowley pushed
修正 brin_minmax_multi.c 和 mcv.c 中的一些拼字錯誤。Discussion: https://postgr.es/m/CAApHDvrbyJNOPBws4RUhXghZ7+TBjtdO-rznTsqZECuowNorXg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/55ba5973d9144a552661cf1fa4cbd228a3799212
對縮寫使用正確的冠詞。在文件中,我們累積了相當多的 "an SQL" 和 "a SQL" 實例。最好對這些保持一致。我查看的最新版本的 SQL 標準似乎更喜歡 "an SQL"。這似乎是一個很好的方向,所以我們將所有 "a SQL" 的實例更改為 "an SQL"。大多數實例已經正確使用 "an SQL",因此為了盡可能減少變動,使用主要變體也是有意義的。此外,還有一些其他的縮寫需要調整。FSM、SSPI、SRF 和其他一些。同時修正一些可發音的縮寫,使用 "a" 代替 "an"。例如,"a SASL" 代替 "an SASL"。在這裡,我只調整了文件和錯誤訊息。還有很多其他的存在於原始碼註解中。翻譯提示註解似乎是最大的罪魁禍首。目前更改這些似乎不值得。Discussion: https://postgr.es/m/CAApHDvpML27UqFXnrYO1MJddsKVMQoiZisPvsAGhKE_tsKXquw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/04539e73faaaaa1c06c1407671910dceaffdfcd4
Noah Misch pushed
將 PQtraceSetFlags() 重新命名為 PQsetTraceFlags()。 我們有十幾個 PQset*() 函數。 PQresultSetInstanceData() 和這個是具有不同單字順序的 libpq setter 函數。 採用大多數的單字順序。 Alvaro Herrera 和 Robert Haas 審閱,雖然這個名稱的選擇並非全體一致。 Discussion: https://postgr.es/m/20210605060555.GA216695@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/d0e750c0acaf31f60667b1635311bcef5ab38bbe
更改 struct CreateStatsStmt 中欄位 "transformed" 的位置。 解決 nodes/*funcs.c 欄位順序上的分歧,贊成後者,後者與 IndexStmt 欄位順序更好地對齊。 這個欄位是 v14 中的新欄位。 Discussion: https://postgr.es/m/20210611045546.GA573364@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/13a1ca160dcfc316c9f4005891a312f5a84c5ca2
Álvaro Herrera pushed
修正在使過時的複製槽失效時的競爭條件。在 commit c6550776394e 中新增的將複製槽標記為無效的程式碼存在競爭條件,即槽可能與 checkpointer 嘗試使其無效同時被刪除或推進。 重寫程式碼以消除這些競爭。 使用 c6550776394e 新增的 ReplicationSlotAcquire 的 API 更改不再必要。 為了避免在發布的分支中出現 ABI 斷裂,此 commit 使其保持不變;它將在僅限 master 的 commit 中單獨更改。 回溯到 13,這是此程式碼首次出現的地方。 Reported-by: Andres Freund andres@anarazel.de Author: Andres Freund andres@anarazel.de Author: Álvaro Herrera alvherre@alvh.no-ip.org Discussion: https://postgr.es/m/20210408001037.wfmk6jud36auhfqm@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/96540f80f8334a3f0f4a13f0d42e4565d8fa9eb7
將 ReplicationSlotAcquire API 還原至原始形式。根據 96540f80f833;c6550776394e 引入的笨拙 API 已不再需要。作者:Andres Freund andres@anarazel.de 審閱者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/20210408020913.zzprrlvqyvlt5cyy@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1632ea43682fcea8836ea245771ae85b9e1bcd38
將 'Portal Close' 訊息新增至管線化的 PQsendQuery()。Commit acb7e4eb6b1c 為 PQsendQuery 新增了新的實作,使其可以在管線模式下運作(透過使用擴充查詢協定),但它的行為與常規實作使用的 'Q' 訊息(在簡單查詢協定中)不同:新的實作不會關閉未命名的 Portal。變更新的程式碼,使其具有與舊程式碼相同的行為。報告者:Yura Sokolov y.sokolov@postgrespro.ru 作者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/202106072107.d4i55hdscxqj@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/4efcf47053eaf8dd88de2b1a89478df43d37d5c0
在平行 btree 建置中報告排序階段進度。我們已經在報告它,但僅在平行工作程序完成後才報告,這明顯比序列建置中發生的時間晚得多。透過此變更,我們會在領導者參與建置時開始其自身的排序階段時報告它(正常情況)。現在這可能會比工作程序開始其排序階段的時間晚一點,但 a) 從工作程序傳達實際階段開始可能很麻煩,並且 b) 排序階段開始無論如何都很模糊,因為排序本身實際上是由 tuplesort.c 在內部早於 tuplesort_performsort() 被呼叫時啟動的。向後移植到 pg12,其中 CREATE INDEX 的進度報告程式碼已加入。報告者:Tomas Vondra tomas.vondra@enterprisedb.com 作者:Matthias van de Meent boekewurm+postgres@gmail.com 審閱者:Greg Nancarrow gregn4422@gmail.com 審閱者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/1128176d-1eee-55d4-37ca-e63644422adb https://git.postgresql.org/pg/commitdiff/5cc1cd502879d642da799e1fd12619d83d987369
Andres Freund 推送
Andrew Dunstan 推送
修復用於 msys 的新還原測試。Commit caba8f0d43 對於 msys 來說不太正確,正如包括 jacana 和 fairywren 在內的幾個建置場動物所證明的那樣。我們需要在封存命令中使用 msys perl,但以 Windows 可以理解路徑的方式呼叫它。此外,在複製腳本中,我們需要將 Windows 路徑轉換為 msys 路徑。https://git.postgresql.org/pg/commitdiff/c3652f976b7696a96a9c5606cc2d613af77e2e63
進一步調整 stuck_on_old_timeline 還原測試。翻譯目標目錄路徑上的路徑斜線。這使舊分支感到困惑,但為了統一性,它已應用於所有分支。Perl 完全能夠理解帶有正斜線的路徑。一路走來,根據 Tom Lane 的抱怨,為了與其他測試保持一致,恢復先前的 archive_wait 查詢。https://git.postgresql.org/pg/commitdiff/9d97c3408319b43718e4b85bc694697db1af32c6
Ranier Vilela 發送了另一個修補程式修訂版本,以減少 detoasted 值的開銷。
Takamichi Osumi 發送了三個修補程式修訂版本,以記錄同步邏輯解碼中可能出現的死鎖。
Andrey V. Lepikhov 發送了另一個修補程式修訂版本,以實作大量 COPY FROM 到外部資料表。
侯志杰發送了另一個修補程式修訂版本,以適應性地快取分割區邊界偏移。
Nathan Bossart 發送了一個預先分配 WAL 段的修補程式。
Tomáš Vondra 發送了兩個修補程式修訂版本,使邏輯解碼可以複製序列。
Justin Pryzby 發送了一個在 ps 顯示中顯示「同步資料目錄」的修補程式。
Anastasia Lubennikova 發送了兩個修補程式修訂版本,以測試迴歸測試的重播。
Aleksander Alekseev 和 Michaël Paquier 交換了修補程式,以修復 pg_event_trigger_ddl_commands 中丟棄物件的處理。
Dilip Kumar 和 Amit Langote 交換了修補程式,以修復推測性中止的解碼。
Peter Eisentraut 發送了一個自動產生節點支援函式的修補程式。
Kyotaro HORIGUCHI 和 Amit Kapila 交換了修補程式,旨在修復一個錯誤,該錯誤表現為邏輯複製中的 keepalive 洪水。
Quan Zongliang 發送了一個從 KnownAssignedTransactionIdes 子模組中移除未使用程式碼的修補程式。
Emre Hasegeli 發送了一個在 btree_gist 中支援 bool 的修補程式。
Jacob Champion 發送了一個 PoC 修補程式,以使用 OAUTHBEARER 實作聯合驗證/授權。
Jeff Davis 發送了另一個修補程式修訂版本,以追蹤上次還原 LSN、時間和總計數,這將使您可以從其他節點看到未記錄的資料表重置。
侯志杰發送了一個修補程式,以移除 get_qual_from_partbound 中現在未使用的函式參數。
侯志杰發送了兩個修補程式修訂版本,使 INSERT ... SELECT 可以在平行執行。
Peter Geoghegan 和 Matthias van de Meent 交換了修補程式,以修復 GetOldestNonRemovableTransactionId 中的一個錯誤。GetOldestNonRemovableTransactionId(rel) 沒有傳回與 GlobalVisTestFor(rel) 一致的值。現在已更新,並新增了一些斷言以確保此問題案例不會傳回。
Peter Smith 和 Ajin Cherian 交換了修補程式,以將對準備交易的支援新增到內建邏輯複製、新增串流交易的準備 API 支援,並跳過邏輯複製的空交易。
Ajin Cherian 發送了三個修補程式修訂版本,以新增一個選項來在 CREATE_REPLICATION_SLOT 命令中設定兩階段,並在 pg_recvlogical 中新增對兩階段解碼的支援。
Julien Rouhaud 發送了兩個修補程式修訂版本,以新增一個用於可擴充剖析的 hook。
Kyotaro HORIGUCHI 和 Fabien COELHO 交換了修補程式,旨在修復一個錯誤,該錯誤表現為 pgbench 記錄 0 間隔日誌項目。
Alexander Pyhalov 發送了一個允許將 CASE 表達式推送到外部伺服器的修補程式。
Jeff Davis 發送了兩個修補程式修訂版本,以實作 ALTER TABLE ... SET ACCESS METHOD。
Nitin Jadhav 發送了另一個修補程式修訂版本,以追蹤啟動進度。
Atsushi Torikoshi 發送了另一個修補程式修訂版本,以新增一個函式,用於記錄目前在具有指定程序 ID 的後端上執行的查詢的完整查詢字串及其計畫。
Thomas Mannhart 發送了兩個修補程式修訂版本,以實作範圍合併聯結。
Thomas Munro 發送了一個調整 pg_regress 輸出的修補程式,以適用於新的長測試名稱。
Bharath Rupireddy 發送了兩個修補程式修訂版本,以重構 parse_subscription_options,並移除 parse_subscription_options 中類似的 ereport 呼叫。
Tomáš Vondra 發送了兩個修補程式修訂版本,以建立用於批次處理的描述符副本,並僅為批次處理初始化槽一次。
Nathan Bossart 發送了一個新增用於檢索 shmem 大小的 pg_ctl 選項的修補程式。
John Naylor 發送了另一個修補程式修訂版本,以加快 pg_utf8_verifystr 的重寫速度。
David Rowley 發送了一個在出現 "a SQL" 的地方使用 "an SQL" 的修補程式。
Alexander Korotkov 發送了四個修補程式修訂版本,以支援 UNNEST(multirange) 並將 multirange 轉換為範圍陣列。
Hayato Kuroda 發送了一個忽略 pgbench 中失敗線程的修補程式。
Amit Langote 再次提交了一個補丁的修訂版,以實作多欄位列表分割。
Jacob Champion 再次提交了一個補丁的修訂版,以將欄位投影列表添加到表格 AM API。
Bruce Momjian 提交了三個補丁的修訂版,以記錄某些彙總函式需要在升級後重新建立的事實。
Ranier Vilela 提交了一個補丁,將某些有符號類型更改為無符號類型。
Pavel Stěhule 再次提交了一個補丁的修訂版,以實作 schema 變數。
Thomas Munro 再次提交了一個補丁的修訂版,以新增用於 socket 關閉事件的 WL_SOCKET_CLOSED,並將 WL_SOCKET_CLOSED 用於 client_connection_check_interval。
Fabien COELHO 再次提交了一個補丁的修訂版,以將 SHOW_ALL_RESULTS 新增至 psql。
David Rowley 提交了一個補丁,以清理執行器中的一些彙總程式碼。
David Rowley 提交了一個補丁,通過將每次迭代時的緊密迴圈加倍替換為適當的 pg_nextpower2_32 或 pg_nextpower2_64,來改進一些將緩衝區大小加倍的位置。
David Rowley 提交了一個補丁,以添加對 ORDER BY / DISTINCT 彙總的正確規劃器支援。
Noah Misch 提交了一個補丁,以移除 pg_wait_for_backend_termination()。
Yugo Nagata 和 Fabien COELHO 交換了補丁,以防止 pgbench 因為跳過的交易而卡住。
Ranier Vilela 再次提交了一個補丁的修訂版,以減少 procarray 中不匹配的類型。
Thomas Munro 提交了三個補丁的修訂版,以將 tuple 層級的 SIREAD 鎖用於僅索引掃描,並在可能的情況下跳過 btree 頁面上的 SIREAD 鎖。
Alexander Korotkov 提交了一個補丁,將新文件章節的標題更改為 Range/Multirange Functions and Operators,這更清晰。
Bharath Rupireddy 提交了一個補丁,以增強 postgres_fdw 的批次插入測試案例。
Tomáš Vondra 提交了一個補丁,以縮短 postgres_fdw 測試的執行時間。
Tomáš Vondra 提交了一個補丁,以處理擴展統計信息中的 Expr op Expr 子句。