orafce_mail,一個類似於 Oracle 的 DBMS_MAIL 的工具,已發布。
https://archives.postgresql.org/pgsql-jobs/2021-08/
Planet PostgreSQL: https://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 帶給您
請在太平洋標準時間/太平洋夏令時間星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。
Michaël Paquier 推送
在 recovery_min_apply_delay 重新載入時,刷新應用程式延遲。 此提交確保在重播由 recovery_min_apply_delay 定義的時間量時,重播延遲迴圈中的等待間隔在重新載入時得到正確處理,如果此 GUC 值已更新,則根據正在重播的提交記錄的時間戳重新計算延遲。 之前的行為對於例如即使延遲已減少或取消,重播仍在等待的情況下會出現問題。 如果應用程式延遲增加到更大的值,則等待將僅尊重舊值,並提前完成。 作者:Soumyadeep Chakraborty、Ashwin Agrawal 審閱者:Kyotaro Horiguchi、Michael Paquier 討論:https://postgr.es/m/CAE-ML+93zfr-HLN8OuxF0BjpWJ17O5dv1eMvSE5jsj9jpnAXZA@mail.gmail.com 回溯修補:9.6 https://git.postgresql.org/pg/commitdiff/e4ba1005c0f7a95e3252f38aee02426117b8e12b
將十六進制程式碼的重構還原到 src/common/。 這是以下提交的組合還原: - c3826f8,一個重構部分,將十六進制解碼程式碼移動到 src/common/。 此程式碼已由 aef8948 清理,因為它最初未包含與 SCRAM 使用的 src/common/ 中的 base64 例程相同方式的溢位檢查,這使其對於其目的而言是不安全的。 - aef8948,對十六進制編碼/解碼程式碼進行更高級的重構到 src/common/,這增加了對十六進制解碼和編碼的結果緩衝區的健全性檢查。 根據 Hans Buschmann 的報告,這些溢位檢查非常昂貴,並且可以看到 bytea 或 LO 的解碼/編碼的效能下降,它們越長。 處理大型 bytea 值的簡單 SQL 在效能分析中顯示出明顯的差異。 - ccf4e27,由 aef8948 實現的清理。 所有這些提交的回復都將十六進制解碼和編碼的效能恢復到 ~13 中的狀態。 現在和 beta3 之後,這是最簡單的選擇。 報告者:Hans Buschmann 討論:https://postgr.es/m/1629039545467.80333@nidsa.net 回溯修補:14 https://git.postgresql.org/pg/commitdiff/2576dcfb76aa71e4222bac5a3a43f71875bfa9e8
提高 btree_gist 中浮點溢位檢查的效能。 目前的程式碼可能會對 isinf() 進行不必要的呼叫(對於參數值始終為兩個,而在某些情況下一個就足夠了)。 zero_is_valid 從未使用過,但仍檢查結果值在檢查的第一個位置是否為 0。 這與 607f8ce 類似。 btree_gist 只是從後端 float4/8 程式碼複製-貼上程式碼,即巨集 CHECKFLOATVAL(),以完成工作。 作者:Haiying Tang 討論:https://postgr.es/m/OS0PR01MB611358E3A7BC3C2F874AC36BFBF39@OS0PR01MB6113.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/32cf7f7acce3891cbc3de53327704372bdd36d38
Daniel Gustafsson 推送
闡明 initdb --sync-only 說明訊息和文件。 initdb --sync-only 的 initdb 說明訊息有點簡潔,而且並非真正的不言自明。 更清楚地說明 initdb --sync-only 將在同步後退出,並使用有關何時可以使用該選項的注意事項來擴充文件。 還使說明輸出與立即退出的其他輸出對齊。 作者:Nathan Bossart、Gurjeet Singh 討論:https://postgr.es/m/CABwTF4U6hbNNE1bv=LxQdJybmUdZ5NJQ9rKY9tN82NXM8QH+iQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ea499f3d28c657a044f0a948e6b77ac56f28a8f6
在複製後錯誤訊息中發出命名空間。 在 VACUUM 或 CLUSTER 指令期間,初始輸出會發出具有命名空間的完整關聯路徑。 然而,後續動作錯誤訊息僅發出關聯名稱,這可能會導致在使用多個 vacuumdb 作業時難以解析輸出,因為來自不同作業的輸出可能會交錯。 在後續動作錯誤訊息中包含完整路徑,以與初始錯誤訊息保持一致。 作者:Mike Fiedler miketheman@gmail.com 審閱者:Corey Huinker corey.huinker@gmail.com 討論:https://postgr.es/m/CAMerE0oz+8G-aORZL_BJcPxnBqewZAvND4bSUysjz+r-oT1BxQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/069d33d0c5a021601245e44df77a0423ddd69359
在 BIO 上設定類型識別符。 在 OpenSSL 中有兩種 BIO 類型(I/O 抽象):來源/接收器和篩選器。 來源/接收器 BIO 是資料的來源和/或接收器,即作用於套接字或檔案的 BIO。 篩選器 BIO 從另一個 BIO 取得輸入流並轉換它。 為了使 BIO_find_type() 能夠遍歷 BIO 鏈並正確找到所有特定類型的 BIO,它們應相應地設定類型位,來源/接收器 BIO(PostgreSQL 實作的)使用 BIO_TYPE_SOURCE_SINK,而篩選器 BIO 使用 BIO_TYPE_FILTER。 除了這些之外,基於檔案描述符的 BIO 應設定描述符位 BIO_TYPE_DESCRIPTOR。 PostgreSQL 實作沒有設定類型位,這長時間以來一直沒有被注意到,因為它只與審核 OpenSSL 安裝或執行類似任務的程式碼真正相關。 但 API 需要它,因此修復了它。 通過 9.6 回溯修補,因為這已經錯誤很長時間了。 作者:Itamar Gafni 討論:https://postgr.es/m/SN6PR06MB39665EC10C34BB20956AE4578AF39@SN6PR06MB3966.namprd06.prod.outlook.com 回溯修補:9.6 https://git.postgresql.org/pg/commitdiff/31f860a52bf97b898d8af6333b23869f1bbac17e
修正 pg_amcheck --skip 選項參數處理。 為 all-visible 和 all-frozen 設定的 skip 選項不正確,因為它們使用空格而不是連字符,從而導致在調用時出現語法錯誤。 此外,沒有跳過任何頁面的選項(none)已記錄但未實現。 通過 14 回溯修補,其中引入了 pg_amcheck。 錯誤:#17149 報告者:Chen Jiaoqian chenjq.jy@fujitsu.com 審閱者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/17149-5918ea748da36b15@postgresql.org 回溯修補:14 https://git.postgresql.org/pg/commitdiff/500256d953444628164f0b77ef1ce8c9e05e575f
Doc:修復邏輯解碼範例中的錯字。 修復邏輯解碼範例區段中出現的 “atleast” 之一。 討論:https://postgr.es/m/5467E625-1369-48CF-BE62-3BB69395C1F1@yesql.se https://git.postgresql.org/pg/commitdiff/76987bad3380be862ea3cc36d1709134be126150
從 pg_amcheck 移除 --quiet 選項。如文件所述,同時使用 --quiet 和 --no-strict-names 並不會生效,仍然會發出警告訊息。由於 --quiet 標誌與其他工具的運作方式不一致,因此修正方法是直接移除此功能。回溯修補至 pg_amcheck 引入的 14 版本。錯誤:17148 報告者:Chen Jiaoqian chenjq.jy@fujitsu.com 審閱者:Julien Rouhaud rjuju123@gmail.com 討論:https://postgr.es/m/17148-b5087318e2b04fc6@postgresql.org 回溯修補版本:14 https://git.postgresql.org/pg/commitdiff/9a9c8b92018d4d48f93cd8fa1895c53fa5946d75
John Naylor 推送
pg_popcount{32,64}_slow
函式的封裝器。審閱和額外 hacking 由 David Rowley 執行,審閱者:Álvaro Herrera 討論:https://postgres.tw/message-id/flat/CAFBsxsE7otwnfA36Ly44zZO%2Bb7AEWHRFANxR1h1kxveEV%3DghLQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/4864c8e8f184a35ed1c2c51a15e9a455e9fbb398Tom Lane 推送
減少未決失效訊息的記憶體消耗。inval.c 中的現有資料結構對於指令或子交易註冊少量快取失效事件的常見情況來說效率較低。雖然如果我們立即提交則沒有關係,但在包含許多 DDL 操作的事務中,它可能會累積成大量的膨脹。透過對預期的用例進行更多假設,我們可以切換到使用密集封裝陣列的表示法。雖然這消除了部分資料複製,但似乎在時間上沒有太大差異。但空間消耗顯著減少。由我撰寫的修補程式;感謝 Nathan Bossart 的審閱。討論:https://postgr.es/m/2380555.1622395376@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/3aafc030a53621e91be2e7c1c72b5f3e8b103486
改進 regex 編譯器的弧移動/複製邏輯。函數 moveins()、copyins()、moveouts()、copyouts() 需要保留 regex 的 NFA 中沒有重複弧的不變性。Spencer 的原始實作是 O(N^2),因為它會分別檢查每個源弧是否匹配。在 commit 579840ca0 中,我透過新增排序/合併邏輯來改進了這一點,以便在移動/複製多個弧時使用。但是,我現在意識到錯失了一個機會。在許多呼叫站點,目標狀態是新建立的,並且不能有任何可能重複的現有入弧(分別是出弧)。因此,在檢查重複項上花費任何週期都是浪費精力;在這些情況下,我們可以盲目地移動/複製所有源弧。新增程式碼路徑來執行此操作。結果表明,對於 copyins()/copyouts(),所有呼叫站點都具有此屬性,從而使它們中的所有「改進」邏輯完全無法訪問。也許有一天我們再次需要完整的功能,所以我只是使用 #ifdef 將這些路徑排除,而不是完全刪除它們。順便一提,新增一些測試案例以改善此區域以及 regc_locale.c/regc_pg_locale.c 中的程式碼涵蓋率。討論:https://postgr.es/m/810272.1629064063@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/78a843f119ca7d4a6eb173a7ee3bed45889d48d8
減少對新 regex 測試中 locale 行為的假設。我過於樂觀地認為基於 UTF8 的 locale 都會認為 U+1500 是 [[:alpha:]] 字元類別的成員。調整 commit 78a843f11 新增的測試案例,以避免此假設。我們可能需要進一步刪減它們,但這應該足以修復早期的 buildfarm 報告。https://git.postgresql.org/pg/commitdiff/b66336c4e1af0e8eae520623e4b018251807b0bb
防止 ALTER TYPE/DOMAIN/OPERATOR 變更擴充功能成員資格。如果在擴充功能更新腳本期間對預先存在的獨立物件調用 recordDependencyOnCurrentExtension,則該物件將歸擴充功能所有。在我們目前的程式碼中,這在三種情況下是可能的:*
替換「shell」類型或運算子。*
CREATE OR REPLACE 覆寫現有物件。*
ALTER TYPE SET、ALTER DOMAIN SET 和 ALTER OPERATOR SET。第一種情況是故意的行為,如 GenerateTypeDependencies 的現有註釋所述。CREATE OR REPLACE 似乎也是合適的行為;至少,明顯的替代方案並不好。但是,它在 ALTER 期間發生的事實是嘗試在 CREATE 和 ALTER 案例之間共享程式碼(GenerateTypeDependencies 和 makeOperatorDependencies)的人工產物。由於擴充功能腳本不太可能 ALTER 不屬於擴充功能的物件,因此此行為對於直接目標物件來說並不太令人不安...但 ALTER TYPE SET 將遞迴到相依的網域,並且如果這些網域尚未歸擴充功能所有,則它們歸擴充功能所有非常不好。讓我們透過重新定義 ALTER 案例來解決此問題,使其永遠不會變更擴充功能成員資格,完全停止。我們可以透過僅在 ALTER TYPE SET 遞迴到網域時變更行為來最大程度地減少行為變更,但這會使程式碼複雜化,並且看起來不是一個更好的定義。依照 Alex Kozhemyakin 的錯誤 #17144。回溯修補至新增 ALTER TYPE SET 的 v13。(其他案例較舊,但由於它們只影響直接命名的物件,因此沒有足夠的問題來證明進一步變更行為是合理的。)討論:https://postgr.es/m/17144-e67d7a8f049de9af@postgresql.org https://git.postgresql.org/pg/commitdiff/6b71c925cb817f79cb0d389edacdd033efaa301d
修正 check_agg_arguments 對聚合 FILTER 子句的檢查。FILTER 子句的遞迴實作錯誤,因此會忽略 FILTER 子句最頂端的相關 Var 或 Aggref。(當然,這必須是純布林 Var 或傳回布林的聚合。)後果將是錯誤地識別聚合的正確語義層級,這可能導致不符合規格的查詢行為。如果 FILTER 表達式是一個聚合,這也可能導致未能發出預期的「聚合函數呼叫不能巢狀」錯誤,這很可能會在稍後導致核心轉儲,因為規劃器和執行器不希望出現這種情況。根本原因是 commit b560ec1b0 盲目地複製了一些程式碼,這些程式碼假設它正在遞迴到一個 List,因此沒有檢查最上層的節點。為了阻止人們詢問為什麼此呼叫看起來與其他呼叫不同,以及將來可能出現的複製貼上錯誤,讓我們變更 check_agg_arguments 中的所有三個 check_agg_arguments_walker 呼叫,即使只有一個用於篩選子句的呼叫確實已損壞。依照 Zhiyong Wu 的錯誤 #17152。自我們實作 FILTER 以來,這一直是錯誤的,因此回溯修補到所有受支援的版本。(測試表明,由於 ExecInitAgg 中的「冗餘」檢查,v11 之前的分支設法避免在 bad-Aggref 案例中崩潰。但我不確定這種保護有多徹底,而且無論如何,錯誤行為問題仍然存在,因此也修復了 9.6 和 10。)討論:https://postgr.es/m/17152-c7f906cc1a88e61b@postgresql.org https://git.postgresql.org/pg/commitdiff/2313dda9d493d3685ac7328b49dc6f5a87c1c295
避免嘗試使用 FOR UPDATE 鎖定規則中的 OLD/NEW。在處理規則的查詢時,transformLockingClause 忽略了排除 OLD/NEW 的偽 RTE。這導致了稍後的奇怪錯誤甚至崩潰。這個錯誤非常古老,但沒有人注意到它並不令人驚訝,因為在非視圖規則中使用 SELECT FOR UPDATE 的情況介於稀少和不存在之間。儘管如此,崩潰是不行的。依照 Zhiyong Wu 的錯誤 #17151。感謝 Masahiko Sawada 對問題的分析。討論:https://postgr.es/m/17151-c03a3e6e4ec9aadb@postgresql.org https://git.postgresql.org/pg/commitdiff/8d2d6ec7708b475787fd92a9f828e554805e3df6
修正 regexp 的 citerdissect/creviterdissect 中的效能錯誤。在迭代節點的第 i 個子匹配中偵測到子匹配 "dissect" 失敗(即,反向參照匹配失敗)後,我們應該調整第 i 個子匹配的嘗試長度。然而,在程式碼中,這些函式會更改最後一個子匹配的嘗試長度,並且只有在窮盡該子匹配的所有可能性後,才會返回並調整倒數第二個子匹配,然後是倒數第三個,等等;所有這些都是徒勞無功的,因為只有更改第 i 個子匹配的起點或長度才有可能使其成功。這個疏忽會造成指數級的效能降低。幸運的是,在大多數情況下,這個問題被其他地方應用的最佳化或約束所掩蓋;這解釋了為什麼我們之前沒有注意到它。但是,使用相當簡單(如果人為設計)的正規表示式是有可能遇到這個問題的。這是 commit 173e29aa5 中的疏忽。那已經是很久以前的事了,所以回溯修補到所有支援的分支。討論:https://postgr.es/m/1808998.1629412269@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/facce1da918a8bf55a8f54606512f944529cba85
改善關於誤用 SELECT INTO 的錯誤訊息。改善 plpgsql 中的兩個地方和 spi.c 中的一個地方,在這些地方,錯誤訊息會令人困惑地告訴您不能使用 SELECT 查詢,而您所撰寫的正是 SELECT 查詢。實際的問題是您不能在這些上下文中使用 SELECT ... INTO,但訊息未能明確說明這一點。特殊處理 SELECT INTO 以使這些錯誤更有幫助。此外,修正 plpgsql 中的相同位置,以及 exec_eval_expr() 中的幾個訊息,使其不要在主要錯誤訊息中引用整個被投訴的查詢或表達式。這種行為很容易導致違反我們關於保持主要錯誤訊息簡短和單行的訊息樣式準則。此外,由於訊息的重要部分在插入的文字之後,這可能會使真正的問題難以發現。我們可以將查詢或表達式作為 errcontext 的第一行報告。根據 Roger Mason 的投訴。回溯修補到 v14,因為 (a) 其中一些訊息是 v14 中新增的,並且 (b) v14 的可翻譯字串仍在變動中。這個問題當然比這更早,但我對於進一步更改行為感到猶豫。討論:https://postgr.es/m/1914708.1629474624@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/26ae66090398082c54ce046936fc41633dbfc41e
Álvaro Herrera 推送
Heikki Linnakangas 推送
Michael Meskes 推送
Amit Kapila 推送
修正 protocol.sgml 中的錯字。 'Stream Stop' 訊息在文件中錯誤拼寫為 'Stream End'。 Author: Masahiko Sawada Backpatch-through: 14,於此版本引入 討論:https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0ac1aee0d7d8d5c3493e6e8b1d3925af35a31648
將 LOGICAL_REP_MSG_STREAM_END 重新命名為 LOGICAL_REP_MSG_STREAM_STOP。在程式碼中,大多數地方都使用 "Stream Stop" 一詞來表示邏輯流訊息。此 commit 透過將 LogicalRepMsgType "LOGICAL_REP_MSG_STREAM_END" 重新命名為 "LOGICAL_REP_MSG_STREAM_STOP" 來提高一致性。Author: Masahiko Sawada Reviewed-by: Hou Zhijie, Amit Kapila 討論:https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4cd7a189687171374ff302ad71c99d39ff6d2bab
Andres Freund 推送
Peter Eisentraut 推送
pg_resetwal:改善數值命令列引數解析。 檢查 strtoul()/strtol() 之後的 errno,以便更好地處理超出範圍的錯誤。 對於超出範圍,strtoul() 會傳回 ULONG_MAX,而之前的程式碼會繼續使用該結果。 Reported-by: Mark Dilger mark.dilger@enterprisedb.com 討論:https://postgres.tw/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/9a6345ed741783e8770ef160e822d2257873adef
pg_amcheck:修正命令列上的區塊編號解析。 之前的程式碼無法在 sizeof(long) == 4 的系統上處理較高的區塊編號。 Reviewed-by: Mark Dilger mark.dilger@enterprisedb.com 討論:https://postgres.tw/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/f1899f251df421a4715ce5e231855eb6914bf77d
psql:新增查詢取消的測試。 psql 中的查詢取消功能意外地被 3a5130672296ed4e682403a77a9a3ad3d21cef75 (已還原) 損壞,因此為此提供一些測試覆蓋似乎很有用。 Reviewed-by: Fabien COELHO coelho@cri.ensmp.fr 討論:https://postgres.tw/message-id/18c78a01-4a34-9dd4-f78b-6860f1420c8e@enterprisedb.com https://git.postgresql.org/pg/commitdiff/5b3f471ff23a2773e6c1ee1704377581c987107d
psql:改善查詢取消測試的可移植性。 某些 shell 明顯不支援 $PPID,因此在這種情況下跳過測試。 https://git.postgresql.org/pg/commitdiff/c818c25f448d0085e1bb2be402463a4b28bc20c4
David Rowley 推送
允許平行 DISTINCT 操作。我們從 e06a38965 開始支援平行聚合。當時,我們沒有完全完成新增平行 DISTINCT 的功能。因此,現在讓我們來做這件事。這是通過引入一個兩階段的 DISTINCT 實現的。第一階段在平行工作者 (parallel workers) 上執行,透過雜湊或排序/唯一化來使資料列在那裡變得唯一。來自平行工作者的結果會被合併,並且最終的 distinct 階段會串列 (serially) 執行,以消除由於合併每個平行工作者的資料列而出現的任何重複資料列。作者:David Rowley 審閱者:Zhihong Yu 討論:https://postgr.es/m/CAApHDvrjRxVKwQN0he79xS+9wyotFXL=RmoWqGGO2N45Farpgw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/22c4e88ebff408acd52e212543a77158bde59e69
修復由 22c4e88eb 引起的損壞迴歸測試。根據 buildfarm 成員 hoverfly 和 thorntail 的報告。https://git.postgresql.org/pg/commitdiff/945f395aeb74cea77d5239db01357bbcbea80534