PostgreSQL 14 的功能凍結期已到。任何可能在 PostgreSQL 14 中的新功能都已進入 git 儲存庫。
AGE 0.4.0,一個提供圖形資料庫功能的 PostgreSQL 擴充功能已發布。https://github.com/apache/incubator-age/releases/tag/0.4.0
https://archives.postgresql.org/pgsql-jobs/2021-04/
Planet PostgreSQL: https://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 為您帶來
請在太平洋標準時間 (PST8PDT) 週日下午 3:00 前將新聞和公告提交至 david@fetter.org。
Tom Lane 推送了
修復 SP-GiST 中更多的混淆。 spg_box_quad_leaf_consistent 無條件地將葉節點資料作為 leafValue 返回,即使在它用於 poly_ops 時,該值的類型完全錯誤。在 12 之前的版本中,這沒有任何危害,因為核心代碼在非索引掃描中沒有對 leafValue 做任何事情 ... 但自從 commit 2a6368343 之後,如果我們正在進行 KNN 風格的掃描,spgNewHeapItem 會無條件地嘗試使用錯誤的資料類型參數複製該值。如果我們不打算返回資料,那麼這種複製就是浪費時間和空間,但在我修復了 ac9099fc1 中的資料類型混淆之前,它意外地沒有失敗。因此,更改 spgNewHeapItem 以僅在我們實際上要稍後返回資料時才複製資料。這節省了週期,並迴避了有損 opclass 是否返回正確類型的問題。另外,更改 spg_box_quad_leaf_consistent 以不返回可能類型錯誤的資料,以防止有人在將來向核心代碼引入類似的錯誤。將這兩個更改向後移植到 v12 和 v13 似乎是個好主意,儘管我害怕更改 spgNewHeapItem 對於在這些分支中使用哪種類型的錯誤想法。根據來自 ac9099fc1 的 buildfarm 結果。討論:https://postgr.es/m/3728741.1617381471@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/dfc843d465689d2c2af8b0e01c66c51ccaae2343
在 SP-GiST 中支援 INCLUDE'd 欄位。這裡沒什麼好說的:名符其實。我們從葉節點索引元組的 nextOffset 欄位中竊取了一個以前始終為零的位,以便追蹤是否存在 nulls 位圖。否則,它的工作方式與其他索引類型中的包含欄位大致相同。Pavel Borisov,由 Andrey Borodin 和 Anastasia Lubennikova 審閱,並由我進行了相當多的編輯討論:https://postgr.es/m/CALT9ZEFi-vMp4faht9f9Junb1nO3NOSjhpxTmbm1UGLMsLqiEQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/09c1c6ab4bc5764dd69c53ccfd43b2060b1fd090
清理對遺失的預設值和 CHECK 限制記錄的處理。 Andrew Gierth 報告說,如果沒有找到與具有 atthasdef 設定的屬性匹配的 pg_attrdef 記錄,則可能會使後端崩潰。 AttrDefaultFetch 會警告這種情況,但隨後會留下具有 null "adbin" 指標的關係 tupdesc,大多數地方都沒有對其進行防護。我們考慮將警告提升為錯誤,但在 relcache 載入期間拋出錯誤非常激烈:它實際上鎖定了使用該關係。更好的做法似乎是將載入時的行為保留為警告,然後在任何想要使用預設值但找不到它的程式碼路徑中拋出錯誤。這將錯誤限制在表上 INSERT/UPDATE 操作的子集中,並且至少允許 pg_dump 成功。此外,我們應該修復 AttrDefaultFetch 以不在 tupdesc 中留下任何 null 指標,因為這只會產生未經測試的錯誤風險。同時,將“在載入時警告,僅在使用已知遺失資訊時拋出錯誤”的相同理念應用於 CHECK 限制。 CheckConstraintFetch 與 AttrDefaultFetch 的邏輯幾乎相同,但由於遺失在時間的迷霧中,對於 AttrDefaultFetch 視為 WARNING 的相同情況,它拋出了 ERROR。使這兩個函數更加相似。在傳遞過程中,透過讓 AttrDefaultFetch 在提取條目後對其進行排序來消除 equalTupleDesc 中潛在的 O(N^2) 迴圈,以便 equalTupleDesc 可以假定兩個相等 tupdesc 中的條目必須按匹配的順序排列。(CheckConstraintFetch 已經對 CHECK 限制進行排序,但 equalTupleDesc 尚未被告知這一點。)有一些論點支持向後移植,但由於現場報告的數量如此之少,我很樂意在 HEAD 中對其進行修復。討論:https://postgr.es/m/87pmzaq4gx.fsf@news-spur.riddles.org.uk https://git.postgresql.org/pg/commitdiff/091e22b2e673e3e8480abd68fbb827c5d6979615
修復 nodeResultCache.h 中遺失的 #include。根據 cpluspluscheck。https://git.postgresql.org/pg/commitdiff/789d81de8a50d9a23cc1a3b8ea5d839246020689
將一些東西延遲移出 ExecInitModifyTable。安排按需執行某些操作,而不是立即在執行器啟動期間執行,因為很有可能根本不需要執行它們:* 在需要之前不要開啟結果關係的索引。 * 在需要之前,不要初始化分割元組路由,也不要初始化子到根元組轉換映射。當只有一些分割區實際接收更新時,這在分割表上的 UPDATE 中獲勝;隨著分割區數量的增加,節省量非常明顯。此外,我們可以刪除 ExecInitModifyTable 中一些關於是否設定元組路由的粗略啟發式方法。此外,刪除 execPartition.c 的私有雜湊表,該雜湊表追蹤哪些分割區已被 ModifyTable 節點開啟。相反,使用 commit 86dc90056 新增到 ModifyTable 本身的雜湊。為了允許延遲計算轉換映射,我們現在在所有子 ResultRelInfos 中設定 ri_RootResultRelInfo。我們以前僅在某些不太明確定義的情況下設定它。這具有使用者可見的副作用,因為現在更多的錯誤訊息引用了根關係而不是某些分割區(並且也以根的欄位順序提供錯誤資料)。在我看來,這是對一致性的嚴格改進,因此我對此提交中可見的輸出更改沒有問題。從更大的修補程式中提取,在我看來,這太過混亂,無法在一次提交中推送。Amit Langote,由 Heikki Linnakangas 和我自己不同時間審閱。討論:https://postgr.es/m/CA+HiwqG7ZruBmmih3wPsBZ4s0H2EhywrnXEduckY5Hr3fWzPWA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/c5b7ba4e67aeb5d6f824b74f94114d99ed6e42b7
將 ExecInitModifyTable 中的一些東西延後處理。延遲 INSERT 和 UPDATE 元組的投影創建,直到它們真正需要時才創建。當只有部分分割區被觸及時,這樣可以節省相當多的工作量。與在 UPDATE/DELETE 中識別垃圾列相關的邏輯被移動到另一個迴圈中,允許移除一個遍歷目標關係的迴圈;但實際上沒有任何改變。從一個更大的補丁中提取出來,我覺得一次提交太雜亂了。Amit Langote,由 Heikki Linnakangas 和我本人在不同時間審閱。討論:https://postgr.es/m/CA+HiwqG7ZruBmmih3wPsBZ4s0H2EhywrnXEduckY5Hr3fWzPWA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a1115fa0782378a8238045d238ae70cac36be8ae
收緊自定義 GUC 參數允許的名稱。以前我們對於自定義 GUC 的名稱相當寬鬆;只要它至少有一個點,我們就會接受。然而,名稱中包含破折號或等號等邊緣情況會導致各種功能出現錯誤。与其試圖讓世界完美地安全處理這些情況,不如直接要求自定義名稱看起來像 "identifier.identifier",其中 "identifier" 意味著 scan.l 可以接受且不帶雙引號的東西。在此過程中,此補丁在 guc.c 中稍微重構了一下,以便 find_option() 負責報告找不到 GUC 的情況,從而允許從其呼叫者中刪除重複的程式碼。根據 Hubert Depesz Lubaczewski 的報告。沒有回溯修補程式,因為問題的後果似乎不值得在穩定分支中更改行為。討論:https://postgr.es/m/951335.1612910077@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/3db826bd55cd1df0dd8c3d811f8e5b936d7ba1e4
a1115fa07 的註解清理。Amit Langote 討論:https://postgr.es/m/CA+HiwqEcawatEaUh1uTbZMEZTJeLzbroRTz9_X9Z5CFjTWJkhw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0d46771eaaf77ad08555cf34e421234d5943edfa
從 clientcert=verify-full 測試中移除頻道綁定要求。這在缺乏頻道綁定支援的舊版 OpenSSL 上會失敗。由於該功能對於此測試案例並非必要,因此只需移除它,而不是使情況複雜化。根據 buildfarm。Jacob Champion 討論:https://postgr.es/m/fa8dbbb58c20b1d1adf0082769f80d5466eaf485.camel@vmware.com https://git.postgresql.org/pg/commitdiff/a282ee68a070a8adc6e6d45e8e643769c587ecc3
允許 psql 的 \df 和 \do 命令指定引數類型。在處理重載的函數或運算子名稱時,必須查看長長的匹配清單是很乏味的。讓我們擴充這些命令,允許指定(輸入)引數類型,以便縮減此類結果。每個額外的引數都被視為與 \dT 的模式引數相同,並與適當引數的類型名稱進行匹配。同時,修復 \dT(以及這些新選項),以識別 "foo[]" 的常用表示法,表示 "foo 上的陣列類型",並處理後端語法允許的特殊縮寫,例如 "int" 表示 "integer"。Greg Sabino Mullane,經我大幅修改。討論:https://postgr.es/m/CAKAnmmLF9Hhu02N+s7uAyLc5J1xZReg72HQUoiKhNiJV3_jACQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a3027e1e7f3d3a107ecd72d3b4d6333ea2aab6a5
抑制未初始化的變數警告。一些通常不會產生此類警告的 buildfarm 警告 e717a9a18。我認為它實際上是安全的,但將初始化移動以消除警告。 https://git.postgresql.org/pg/commitdiff/01add89454d5dc289ed3126d5de03169bdeff41b
在 \df、\do 中新增對類型引數的 Tab 鍵自動完成支援。提交 a3027e1e7 中的疏忽。 https://git.postgresql.org/pg/commitdiff/d1fcbde579d440c35023baa0de7ebf27f644a314
Doc: 更新 check_function_bodies 的文件。調整文件和描述字串,以說明 check_function_bodies 也適用於程序。(事後看來,它應該被命名為 check_routine_bodies,但現在似乎太晚了。)Daniel Westermann 討論:https://postgr.es/m/GV0P278MB04834A9EB9A74B036DC7CE49D2739@GV0P278MB0483.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/07b76833b15163c6574ea2c12d05d9a0800665e2
修復 xlogprefetch.h 未包含所有先決條件標頭的問題。根據 cpluspluscheck。 https://git.postgresql.org/pg/commitdiff/99964c4ade468c35a3f6e248a2380a1ff67d9cd3
修復提交 a4d75c86b 中的未初始化變數。*exprs != NIL
的路徑會發生錯誤,並且很可能會崩潰,因為 pull_varattnos 期望其最後一個引數在呼叫時有效。由 Coverity 發現 --- 我們在回歸測試中沒有此路徑的覆蓋率。 https://git.postgresql.org/pg/commitdiff/9cb92334092fa75afc62a71243bbc1f4612ecfa4
新增巨集 PGWARNING,並使 PGERROR 在所有平台上可用。我們之前已經注意到需要應對 Windows 標頭,這些標頭提供了與 elog.h 不同的巨集 "ERROR" 的定義。事實證明,R 也想定義 ERROR,以及 WARNING。PL/R 一直以一種粗糙的方式來解決這個問題,當我們最近更改 ERROR 的數值時,這個方法就失效了。為了讓他們有一個更具未來性的解決方案,提供一個替代巨集 PGWARNING 用於 WARNING,並使 PGERROR 始終可見,而不僅僅是在 #ifdef WIN32 時。討論:https://postgr.es/m/CADK3HHK6iMChd1yoOqssxBn5Z14Zar8Ztr3G-N_fuG7F8YTP3w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d7cff12c4c035b7cf12bb8454824f48f13018730
Michaël Paquier 推送
重構所有執行連線檢查的 TAP 測試套件。此提交重構了更多的 TAP 測試,以適應 PostgresNode 中最近引入的 connect_ok() 和 connect_fails(),由 0d1a3343 引入。這會更改以下測試套件以使用相同的程式碼路徑進行連線檢查: - Kerberos - LDAP - SSL - Authentication 這些常式經過擴充,能夠處理根據每個套件的需求設定的可選參數,如下所示: - 自定義 SQL 查詢。 - 預期的 stderr 匹配模式。 - 預期的 stdout 匹配模式。 新的設計可以通過更多參數進行擴充,並且未來有一些針對這些常式的計劃,包括基於後端日誌內容的檢查。作者:Jacob Champion, Michael Paquier 討論:https://postgr.es/m/d17b919e27474abfa55d97786cb9cfadfe2b59e9.camel@vmware.com https://git.postgresql.org/pg/commitdiff/c50624cdd248c13b4ba199f95e24c88d2cc8a097
修復 collationcmds.c 中的錯字。由 51e225d 引入。作者:Anton Voloshin 討論:https://postgr.es/m/05477da0-703c-7de7-998c-5879738e8f39@postgrespro.ru https://git.postgresql.org/pg/commitdiff/9f6f1f9b8e61f9ce47e1936fc68c21a4a8d6722c
變更 PostgresNode::connect_fails() 使其永遠不發送查詢。此類型的故障與 c757a3da 中已修復的問題相似,其中身份驗證失敗與 psql 將命令推送到其通訊管道中會導致測試失敗。此常式設計為失敗,因此發送查詢無論如何都沒有意義。根據 buildfarm 成員 gaur 和 hoverfly 的說法,基於 Tom Lane 的分析和修復。討論:https://postgr.es/m/513200.1617634642@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6d41dd045ada28ee14182112fc4cf50fb3879d28
修復 SSL 和 Kerberos 測試中的一些問題。c50624c 中最近的重構意外地破壞了查詢後檢查的 kerberos 測試的一部分,因此將其功能添加回來。一些非活動的 SSL 測試的參數順序不正確,如果它們要運行,將導致它們失敗。作者:Jacob Champion 討論:https://postgr.es/m/4f5b0b3dc0b6fe9ae6a34886b4d4000f61eb567e.camel@vmware.com https://git.postgresql.org/pg/commitdiff/5a71964a832febfee23cedc3bb354049d6ca78a7
透過 log_connections 添加有關已驗證身分的一些資訊。「已驗證身分」是身份驗證方法用來識別特定使用者的字串。在許多常見情況下,這與 PostgreSQL 使用者名稱相同,但對於某些第三方身份驗證方法,使用中的識別碼可能會在伺服器儲存之前被縮短或以其他方式翻譯(例如,透過 pg_ident 使用者映射)。為了幫助管理員查看誰實際與系統互動,此提交增加了在後端的 Port 內成功進行身份驗證時儲存原始身分的功能,並在啟用 log_connections 時產生日誌條目。產生的日誌條目看起來像這樣(其中名為「foouser」的本地使用者正在以名為「admin」的資料庫使用者身份連接到資料庫):LOG: connection received: host=[local] LOG: connection authenticated: identity="foouser" method=peer (/data/pg_hba.conf:88) LOG: connection authorized: user=admin database=postgres application_name=psql Port->authn_id 根據身份驗證方法設定:bsd:PostgreSQL 使用者名稱(又名本地使用者名稱)cert:客戶端的 Subject DN gss:使用者主體 ident:遠端使用者名稱 ldap:最終綁定 DN pam:PostgreSQL 使用者名稱(又名 PAM 使用者名稱)password(以及所有 pw-challenge 方法):PostgreSQL 使用者名稱 peer:對等方的 pw_name radius:PostgreSQL 使用者名稱(又名 RADIUS 使用者名稱)sspi:降級(與 SAM 相容)的登入名稱(如果 compat_realm=1),或使用者主體名稱(如果 compat_realm=0)trust 身份驗證方法未設定已驗證身分。clientcert=verify-full 也不設定。Port->authn_id 可以用於其他目的,例如 pg_stat_activity 中的僅超級使用者額外欄位,但這將留作未來工作。PostgresNode::connect_{ok,fails}() 已修改為允許測試使用新的 log_like 和 log_unlike 參數檢查後端日誌檔中所需的或禁止的模式。這使用了一種基於截斷現有伺服器日誌檔的方法,如 issues_sql_like()。測試已添加到 ldap、kerberos、身份驗證和 SSL 測試套件中。作者:Jacob Champion 審閱人:Stephen Frost, Magnus Hagander, Tom Lane, Michael Paquier 討論:https://postgr.es/m/c55788dd1773c521c862e8e0dddb367df51222be.camel@vmware.com https://git.postgresql.org/pg/commitdiff/9afffcb833d3c5e59a328a2af674fac7e7334fc1
刪除一些索引 AM 的頁面初始化中多餘的 memset(0) 呼叫。Bloom、GIN、GiST 和 SP-GiST 依靠 PageInit() 來初始化頁面的內容,並且此常式會以零填充整個頁面,大小為 BLCKSZ,包括特殊空間。這些索引 AM 一直使用額外的 memset() 呼叫來以零填充特殊頁面空間,甚至整個頁面,這是不必要的,因為 PageInit() 已經完成了這項工作,因此讓我們刪除它們。GiST 沒有執行這個額外的呼叫,但自 6236991 以來已經註釋掉了一個執行此操作的系統呼叫。在此過程中,刪除 SP-GiST 的一個 MAXALIGN(),因為 PageInit() 會處理它。這使得所有索引 AM 的整個頁面初始化邏輯更加一致。作者:Bharath Rupireddy 審閱人:Vignesh C, Mahendra Singh Thalor 討論:https://postgr.es/m/CALj2ACViOo2qyaPT7krWm4LRyRTw9kOXt+g6PfNmYuGA=YHj9A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4c0239cb7a7775e3183cb575e62703d71bf3302d
修復 Windows 主機上連線測試中的一些失敗。日誌檔的截斷(這組測試依賴於它來確保連線嘗試與其預期的後端日誌模式相符)失敗,正如 buildfarm 成員 fairywren 所報告的那樣。不要截斷,而是輪換日誌檔並重新啟動節點。這將確保每次測試的連線嘗試資料都是唯一的。討論:https://postgr.es/m/YG05nCI8x8B+Ad3G@paquier.xyz https://git.postgresql.org/pg/commitdiff/c7578fa64019f27edc31261ea49066a4b2569a6c
修復文件和程式碼註解中的錯字和文法。註解修復應用於 HEAD,文件改進應用於需要的回溯分支。作者:Justin Pryzby 討論:https://postgr.es/m/20210408164008.GJ6592@telsasoft.com Backpatch-through:9.6 https://git.postgresql.org/pg/commitdiff/609b0652af00374b89411ea2613fd5bb92bca92c
Peter Eisentraut 推送了
重新編號游標選項標誌。向上移動規劃器控制標誌,以便有更多空間用於解析選項。一些待處理的修補程式需要一些空間,因此請單獨進行此重新編號,以減少潛在的衝突。https://git.postgresql.org/pg/commitdiff/a63dd8afe2b859b853d857cd8a0392ca1e04ab6c
將 EXTRACT 的回傳類型變更為 numeric。EXTRACT 先前的實作在內部對應到 date_part(),而 date_part() 回傳的是 double precision 類型 (因為它是在 numeric 類型存在很久之前實作的)。這在某些情況下可能導致不精確的輸出,因此回傳 numeric 會更好。變更現有函式的回傳類型有點風險,因此我們改為執行以下操作:我們實作了一組新的函式,現在稱為 "extract",與現有的 date_part 函式平行。它們在內部以相同的方式運作,但使用 numeric 而不是 float8。現在,EXTRACT 結構由剖析器對應到這些新的 extract 函式。這樣,舊版本的視圖等的轉儲 (將使用 date_part) 會繼續不變地工作,但新的使用將對應到新的 extract 函式。此外,EXTRACT 的反向編譯現在重現了原始語法,使用 40c24bfef92530bd846e111c1742c2a54441c62c 中引入的新機制。新的實作導致以下行為上的細微變化:- 來自隔離的 EXTRACT 呼叫的欄位名稱現在是 "extract" 而不是 "date_part"。- 從日期中提取現在拒絕不適當的欄位名稱,例如 HOUR。它以前在內部對應到從時間戳記中提取,因此它會靜默地接受所有適合時間戳記的內容。- 提取可能具有小數值的欄位 (例如 second 和 epoch) 的回傳值現在具有該值在內部具有的完整比例 (因此,例如,'1.000000' 而不是僅 '1')。報告者:Petr Fedorov petr.fedorov@phystech.edu 審閱者:Tom Lane tgl@sss.pgh.pa.us 討論:https://postgres.tw/message-id/flat/42b73d2d-da12-ba9f-570a-420e0cce19d9@phystech.edu https://git.postgresql.org/pg/commitdiff/a2da77cdb4661826482ebf2ddba1f953bc74afe4
ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION。目前,如果我們要更新訂閱中的發布 (publication),我們可以使用 SET PUBLICATION。但是,它需要提供所有現有的發布和新的發布。如果我們要新增新的發布,這很不方便。新的語法僅提供新的發布。當 refresh 為 true 時,它只會刷新新的發布。作者:Japin Li japinli@hotmail.com 作者:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 討論:https://postgres.tw/message-id/flat/MEYP282MB166939D0D6C480B7FBE7EFFBB6BC0@MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/82ed7748b710e3ddce3f7ebc74af80fe4869492f
psql: 預設顯示所有查詢結果。之前,如果命令字串傳回多個結果集,psql 只會印出最後一個結果。現在它會印出所有結果。可以將 psql 變數 SHOW_ALL_RESULTS 設定為 off 來獲得先前的行為。作者:Fabien COELHO coelho@cri.ensmp.fr 審閱者:"Iwata, Aya" iwata.aya@jp.fujitsu.com 審閱者:Daniel Verite daniel@manitou-mail.org 審閱者:Peter Eisentraut peter.eisentraut@2ndquadrant.com 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:vignesh C vignesh21@gmail.com 討論:https://postgres.tw/message-id/flat/alpine.DEB.2.21.1904132231510.8961@lancre https://git.postgresql.org/pg/commitdiff/3a5130672296ed4e682403a77a9a3ad3d21cef75
訊息改進。先前的措辭包含多餘的逗號。調整措辭以提高語法正確性和清晰度。 https://git.postgresql.org/pg/commitdiff/0b5e8245283eef67e88fb5380836cdc2c743d848
修正游標敏感度術語的使用。程式碼和測試中的文件和註解一直錯誤地使用相對於 SQL 標準的敏感/不敏感游標術語。(游標敏感度僅與與游標相同的交易中所做的變更有關,而與其他會話中的並行變更無關。) 此外,PostgreSQL 的某些行為根據 SQL 標準是不正確的,這進一步混淆了問題。(WHERE CURRENT OF 變更在不敏感游標中不可見,但它們應該可見。) 此變更更正了術語並刪除了支援敏感游標的聲明。它還新增了一個測試案例,以使用不使用 WHERE CURRENT OF 的變更命令以「正確」的方式檢查不敏感行為。最後,它新增了 ASENSITIVE 游標選項以選擇預設的不敏感行為,根據 SQL 標準。此修補程式中沒有對游標行為進行任何變更。討論:https://postgres.tw/message-id/flat/96ee8b30-9889-9e1b-b053-90e10c050e85%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/dd13ad9d39a1ba41cf329b6fe408b49be57c7b88
文件:改進措辭。討論:https://postgres.tw/message-id/flat/161626776179.652.11944895442156126506%40wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/4560e0acdafd57f3ba109b98e15ac047798d960c
libpq:為 SSL 連線設定伺服器名稱指示 (SNI)。預設情況下,讓 libpq 設定 TLS 擴充功能「伺服器名稱指示」(SNI)。這允許支援 SNI 的 SSL 代理路由連線。(這需要一個了解 PostgreSQL 協定的代理,而不僅僅是任何 SSL 代理。) 將來,這也可能允許伺服器為不同的主機規格使用不同的 SSL 憑證。(這將需要新的伺服器功能。這將是該功能的用戶端功能。) 由於 SNI 使主機名稱以明文顯示在網路流量中,因此在某些情況下可能不希望這樣做。因此,還新增了一個 libpq 連線選項 "sslsni" 來關閉它。討論:https://postgres.tw/message-id/flat/7289d5eb-62a5-a732-c3b9-438cee2cb709%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/5c55dc8b47338e72a4e598c155d2048d756fd10e
SQL 標準函式主體。這增加了對為語言 SQL 編寫 CREATE FUNCTION 和 CREATE PROCEDURE 語句的支援,其函式主體符合 SQL 標準並且可移植到其他實作。除了 PostgreSQL 特有的 AS $$ string literal $$ 語法之外,這允許以未加引號的方式寫出組成主體的 SQL 語句,無論是作為單個語句:CREATE FUNCTION add(a integer, b integer) RETURNS integer LANGUAGE SQL RETURN a + b; 還是作為一個區塊 CREATE PROCEDURE insert_data(a integer, b integer) LANGUAGE SQL BEGIN ATOMIC INSERT INTO tbl VALUES (a); INSERT INTO tbl VALUES (b); END; 函式主體在函式定義時進行剖析,並作為運算式節點儲存在新的 pg_proc 欄位 prosqlbody 中。因此,在執行時,不需要進一步的剖析。但是,這種形式不支援多型引數,因為在呼叫時不再進行剖析分析。函式及其使用的物件之間的相依性被完全追蹤。引入了一個新的 RETURN 語句。這只能在函式主體內使用。在內部,它被視為一個 SELECT 語句。psql 需要一些新的智慧來追蹤函式主體邊界,以便它在看到位於函式主體內的冒號時不會傳送語句。測試者:Jaime Casanova jcasanov@systemguards.com.ec 審閱者:Julien Rouhaud rjuju123@gmail.com 討論:https://postgres.tw/message-id/flat/1c11f1eb-f00c-43b7-799d-2d44132c02d7@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/e717a9a18b2e34c9c40e5259ad4d31cd7e420750
將 Unicode 資料更新到 CLDR 39。 https://git.postgresql.org/pg/commitdiff/2e0e0666790e48cec716d4947f89d067ef53490c
文件:在教學課程中偏好使用明確的 JOIN 語法,而不是舊的隱式語法。更新 src/tutorial/basics.source 以匹配。作者:Jürgen Purtz juergen@purtz.de 審閱者:Thomas Munro thomas.munro@gmail.com 審閱者:"David G. Johnston" david.g.johnston@gmail.com 討論:https://postgres.tw/message-id/flat/158996922318.7035.10603922579567326239@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/fb310f17812e7321599845a29af2f36c7f1191c3
將 ORDER BY 加入到一些迴歸測試查詢中。顯然,一個不相關的修補程式在建置農場上引入了一些變異。回報者:Magnus Hagander magnus@hagander.net https://git.postgresql.org/pg/commitdiff/7e3c54168d9ec058cb3c9d47f8105b1d32dc8ceb
doc: 為 date_bin 增加額外的文件。回報者:Justin Pryzby pryzby@telsasoft.com 作者:John Naylor john.naylor@enterprisedb.com 討論:https://postgres.tw/message-id/CAFBsxsEEm1nuhZmfVQxvu_i3nDDEuvNJ_WMrDo9whFD_jusp-A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/49fb4e6b249029e75ccc6b490d76f15cd53d553b
doc: 修復手冊頁面的空白問題。標籤之間的空白是有意義的,在某些情況下,它會在手冊頁面中產生額外的垂直空間。修復方法是移除標記中的一些換行符號。 https://git.postgresql.org/pg/commitdiff/9cae39b8e6a53decb37cce22852bb2e6d0e3f5d3
改善 date_bin 在 origin (起始時間) 位於未來時的行為。目前,當 origin 晚於輸入時,結果是 bin (時間區間) 的結束時間戳記,而不是預期的開始時間。此變更將結果一致地放在 bin 的開始時間。作者:John Naylor john.naylor@enterprisedb.com 討論:https://postgres.tw/message-id/CAFBsxsGjLDxQofRfH+d4KSAXxPf3MMevUG7s6EDfdBOvHLDLjw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/496e58bb0e5e939e6ed5839c92b05e3ab11b54bb
Álvaro Herrera 推送了程式碼
將 arch-dev.sgml 中的一些術語與詞彙表對齊。這主要是將連結添加到現有文字中的詞彙表,而不是使用 <firstterm>。Heikki 出於樣式上的考量,將其從 29ad6595ef7f 中省略了;這些問題後來得到了解決。作者:Jürgen Purtz juergen@purtz.de 討論:https://postgr.es/m/67d7240f-8596-83fc-5e15-af06c128a0f5@purtz.de https://git.postgresql.org/pg/commitdiff/6734e806958c4ebd253adb30b255983981818710
修復在沒有活動快照的情況下 find_inheritance_children 的問題。當僅使用目錄快照進行掃描時,我們可能沒有設置 ActiveSnapshot。如果我們遇到分離的分區,那將導致崩潰。通過僅在有活動快照時忽略分離的分區來修復此問題。 https://git.postgresql.org/pg/commitdiff/4131f755d548f74eba56285dc674f1f26e4ed6b4
autovacuum:處理分割資料表的 analyze。之前,autovacuum 會完全忽略分割資料表,這對於 analyze 而言是不利的 -- 無法分析這些資料表意味著可能會選擇較差的執行計畫。透過將「自上次分析以來的變更」計數從葉節點分割區向上傳播到分割階層中,使 autovacuum 能夠感知這些資料表。這也引入了必要的分割資料表 reloptions 支援(autovacuum_enabled、autovacuum_analyze_scale_factor、autovacuum_analyze_threshold)。目前尚不清楚如何最好地記錄這方面。作者:Yuzuko Hosoya yuzukohosoya@gmail.com 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Tomas Vondra tomas.vondra@enterprisedb.com 審閱者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/CAKkQ508_PwVgwJyBY=0Lmkz90j8CmWNPUxgHvCUwGhMrouz6UA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0827e8af70f4653ba17ed773f123a60eadd9f9c9
設定分割資料表的 pg_class.reltuples。當 commit 0827e8af70f4 為分割資料表新增自動分析支援時,它包含程式碼以取得分割資料表的 reltuples,作為對 pg_class.reltuples 的每個分割區的目錄存取次數。這不僅效率低下,而且還有問題,因為 autovacuum 不會對任何這些資料表持有任何鎖定 -- 並且不希望這樣做。用讀取分割資料表的 pg_class.reltuples 來取代該程式碼,並確保 ANALYZE 和 TRUNCATE 正確維護該值。我沒有發現任何會受到分割資料表的 relpages 從零變為非零的影響的程式碼,也沒有其他應該維護它的程式碼,但是如果有的話,希望這是一個簡單的修復。依照建置農場。作者:Álvaro Herrera alvherre@alvh.no-ip.org 審閱者:Zhihong Yu zyu@yugabyte.com 討論:https://postgr.es/m/1823909.1617862590@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0e69f705cc1a3df273b38c9883fb5765991e04fe
記錄分割資料表的 ANALYZE 儲存參數。Commit 0827e8af70f4 新增了 autovacuum 的參數以支援分割資料表,但沒有新增任何文件。新增它們。討論:https://postgr.es/m/20210408213051.GL6592@telsasoft.com https://git.postgresql.org/pg/commitdiff/41badeaba8beee7648ebe7923a41c04f1f3cb302
在 PQtrace 迴歸模式中抑制 Notice/Error 訊息的長度。PQtrace() 列印的 ErrorResponse/NoticeResponse 訊息的一個(相對較小的)煩惱是,當我們將錯誤訊息從一個源檔案移動到另一個源檔案、從一個函數移動到另一個函數,甚至當它們的位置行號更改位數時,它們的長度可能會發生變化。為了避免必須調整某些測試的預期檔案,請使 PQtrace() 的迴歸模式抑制 NoticeResponse 和 ErrorResponse 訊息的長度字詞。討論:https://postgr.es/m/20210402023010.GA13563@alvherre.pgsql 審閱者:Tom Lane tgl@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e7e341409a3d85aba4cf754ba9cf722a4d8e6676
Fujii Masao 推送了程式碼
在啟動程序退出時關閉交易追蹤。Maxim Orlov 報告說,備用伺服器的關閉可能導致以下斷言失敗。此問題的原因是,當關閉導致啟動程序退出時,即使恢復時間交易追蹤已經初始化,也沒有關閉它,並且被追蹤的交易持有的一些鎖定無法釋放。在這種情況下,如果調用了其他程序,並且啟動程序使用的 PGPROC 條目被分配給它,則它會在初始化期間找到這些未釋放的鎖定並導致斷言失敗。TRAP: FailedAssertion("SHMQueueEmpty(&(MyProc->myProcLocks[i]))" 這個提交透過使啟動程序在退出時關閉交易追蹤並釋放所有鎖定來修復此問題。反向移植到所有支援的分支。回報者:Maxim Orlov 作者:Fujii Masao 審閱者:Maxim Orlov 討論:https://postgr.es/m/ad4ce692cc1d89a093b471ab1d969b0b@postgrespro.ru https://git.postgresql.org/pg/commitdiff/ad8b674922eb70dc5cd02951dd82fe2c4c37c80a
新增函式以記錄指定後端程序的記憶體上下文。Commit 3e98c0bafb 新增了 pg_backend_memory_contexts 檢視表,以顯示後端程序的記憶體上下文。然而,其目標程序僅限於存取該檢視表的後端程序。因此,當調查其他後端程序的本地記憶體膨脹時,這並不是很方便。為了改善這種情況,此 commit 新增了 pg_log_backend_memory_contexts() 函式,該函式請求記錄指定後端程序的記憶體上下文。這些資訊也可以透過偵錯工具呼叫 MemoryContextStats(TopMemoryContext) 來收集。但這種技術在某些環境中無法使用,因為這些環境中沒有可用的偵錯工具。因此,pg_log_backend_memory_contexts() 讓我們可以更輕鬆地查看指定後端的記憶體上下文。只有超級使用者才被允許請求記錄記憶體上下文,因為允許任何使用者以無限制的速度發出此請求將會導致大量的日誌訊息,這可能會導致阻斷服務攻擊。收到請求後,在下一個 CHECK_FOR_INTERRUPTS() 時,目標後端會以 LOG_SERVER_ONLY 級別記錄其記憶體上下文,以便這些記憶體上下文會出現在伺服器日誌中,但不會發送到用戶端。它會針對每個記憶體上下文記錄一則訊息。因為如果它將所有記憶體上下文緩衝到 StringInfo 中,並將它們記錄為一則訊息,這可能會需要非常大地擴展緩衝區,並導致 OOM 錯誤,因為後端中可能存在大量的記憶體上下文。當後端程序消耗大量記憶體時,記錄其所有記憶體上下文可能會超出可用的磁碟空間。為了防止這種情況,此修補程式現在限制每個父上下文要記錄的子上下文數量為 100 個。與 MemoryContextStats() 類似,它假設日誌變長的實際情況通常是同一個父上下文下有大量的同級上下文;而查看超過 100 個的個別同級上下文的詳細資訊所帶來的額外偵錯價值並不大。在討論中,還有另一個建議的修補程式,用於新增函式以傳回指定後端的記憶體上下文作為結果集,而不是記錄它們。然而,該修補程式並未包含在此 commit 中,因為它有一些問題需要解決。感謝 Tatsuhito Kasahara、Andres Freund、Tom Lane、Tomas Vondra、Michael Paquier、Kyotaro Horiguchi 和 Zhihong Yu 的討論。Bump catalog version. 作者:Atsushi Torikoshi 審閱者:Kyotaro Horiguchi、Zhihong Yu、Fujii Masao 討論:https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/43620e328617c1f41a2a54c8cee01723064e3ffa
修正 pgstat.c 中的錯字。由 9868167500 引入。作者:Vignesh C 討論:https://postgr.es/m/CALDaNm1DqgaLBAJrtGznKk1sR1mH-augmp7LfGvxWwTUhah+rg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f5d94e405e17a49487672316610630be2f9d0bb7
如果找到以 wal_level=minimal 產生的 WAL,則停止封存復原。先前,如果啟用了熱備份,則當找到以 wal_level=minimal 產生的 WAL 時,封存復原會以錯誤退出。但如果禁用了熱備份,則它只會報告警告並在該情況下繼續。這可能會導致正常操作期間的資料遺失或錯誤。發出了一個警告,但使用者很容易錯過它,並且直到遇到實際錯誤時才注意到這種嚴重情況。為了改善這種情況,此 commit 變更了封存復原,以便當找到以 wal_level=minimal 產生的 WAL 時,無論熱備份的設定為何,它都會以 FATAL 錯誤退出。這使使用者可以很快注意到嚴重情況。如果封存復原是從在 wal_level 變更為 minimal 之前取得的基礎備份開始,則會擲回 FATAL 錯誤。當封存復原以錯誤退出時,如果使用者擁有在將 wal_level 設定為高於 minimal 之後取得的基礎備份,則他們可以透過從較新的備份開始封存復原來復原資料庫。但請注意,如果不存在這樣的備份,則沒有簡單的方法可以完成封存復原,這可能會使資料庫伺服器無法啟動,並且使用者可能會遺失整個資料庫。此 commit 將有關此風險的註解新增到文件中。即使在無法啟動資料庫伺服器的情況下,先前只要停用熱備份,使用者就可以避免封存復原期間的錯誤,強制啟動伺服器並從中搶救資料。但請注意,此 commit 使此程序完全不可用。作者:Takamichi Osumi 審閱者:Laurenz Albe、Kyotaro Horiguchi、David Steele、Fujii Masao 討論:https://postgr.es/m/OSBPR01MB4888CBE1DA08818FD2D90ED8EDF90@OSBPR01MB4888.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/9de9294b0c4dac77edb80f029648afca79d14653
postgres_fdw:允許匯入 LIMIT TO 中指定的分區。Commit f49bcd4ef3 不允許 postgres_fdw 匯入資料表分區。因為所有資料都可以透過作為分區階層根目錄的分區資料表存取,因此僅匯入分區資料表應允許存取所有資料,而無需建立額外的物件。當匯入整個綱要時,這是一個合理的預設值。但可能存在使用者想要明確匯入分區資料表的分區之一的情況。對於該用例,此 commit 允許 postgres_fdw 僅當在 LIMIT TO 子句中明確指定時,匯入作為其他資料表分區的資料表或外部資料表。它不會更改未在 IMPORT FOREIGN SCHEMA 命令的 LIMIT TO 中指定的任何分區會自動排除的行為。作者:Matthias van de Meent 審閱者:Bernd Helmle、Amit Langote、Michael Paquier、Fujii Masao 討論:https://postgr.es/m/CAEze2Whwg4i=mzApMe+PXxCEfgoZmHGqdqQFW7J4bmj_5p6t1A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a3740c48eb2f91663c7c06c948dfcfb6493d2588
修復 commit 9de9294b0c 新增的測試。建置伺服器成員 "drongo" 和 "fairywren" 報告說,commit 9de9294b0c 新增的回歸測試 (024_archive_recovery.pl) 失敗。此失敗的原因是測試呼叫了 $node->init() 而沒有 "allows_streaming => 1",並且沒有為來自 pg_basebackup 的 TCP/IP 連線新增 pg_hba.conf 條目。此 commit 透過在呼叫 $node->init() 時指定 "allows_streaming => 1" 來修正此問題。作者:Fujii Masao 討論:https://postgr.es/m/3cc3909d-f779-7a74-c201-f1f7f62c7497@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8ee9b662daa6d51b54d21ec274f22a218462ad2d
允許 TRUNCATE 命令截斷外部資料表。此 commit 為 TRUNCATE 引入了新的外部資料包裝函式 API。它擴展了 TRUNCATE 命令,使其接受外部資料表作為要截斷的目標,並調用該 API。它還擴展了 postgres_fdw,使其可以向外部伺服器發出 TRUNCATE 命令,方法是為該 TRUNCATE API 新增例程。TRUNCATE 命令中指定的選項的相關資訊(例如 ONLY、CASCADE 等)會透過 API 傳遞到 FDW。要截斷的外部資料表清單也會傳遞到 FDW。FDW 會根據這些資訊截斷傳遞的外部資料表指定的外部資料來源。例如,postgres_fdw 會使用它們建構 TRUNCATE 命令,並將其發送到外部伺服器。為了提高效能,TRUNCATE 命令會針對要截斷的外部資料表所屬的每個外部伺服器,調用一次 TRUNCATE 的 FDW 例程。作者:Kazutaka Onishi、Kohei KaiGai,由 Fujii Masao 略作修改 審閱者:Bharath Rupireddy、Michael Paquier、Zhihong Yu、Alvaro Herrera、Stephen Frost、Ashutosh Bapat、Amit Langote、Daniel Gustafsson、Ibrar Ahmed、Fujii Masao 討論:https://postgr.es/m/CAOP8fzb_gkReLput7OvOK+8NHgw-RKqNv59vem7=524krQTcWA@mail.gmail.com 討論:https://postgr.es/m/CAJuF6cMWDDqU-vn_knZgma+2GMaout68YUgn1uyDnexRhqqM5Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8ff1c94649f5c9184ac5f07981d8aea9dfd7ac19
移除 COMMIT_TS_SETTS 記錄。提交 438fc4a39c 防止 WAL 重播寫入 COMMIT_TS_SETTS 記錄。由於此變更,PostgreSQL 核心中不再有產生 COMMIT_TS_SETTS 記錄的程式碼。此外,我們可以認為沒有擴充功能使用此記錄,因為我們目前尚未收到任何關於提交 438fc4a39c 修復的問題的投訴。因此,此提交移除了 COMMIT_TS_SETTS 記錄及其相關程式碼。即使沒有此記錄,提交時間戳記功能所需的時間戳記也可以從 COMMIT 記錄中取得。增加 WAL 頁面魔術數字。報告者:lx zou zoulx1982@163.com 作者:Fujii Masao 審閱者:Alvaro Herrera 討論:https://postgr.es/m/16931-620d0f2fdc6108f1@postgresql.org https://git.postgresql.org/pg/commitdiff/08aa89b326261b669648df97d4f2a6edba22d26a
避免 TRUNCATE 指令中不必要的 table open/close。ExecuteTruncate() 會過濾 TRUNCATE 指令中重複指定的資料表,例如執行 "TRUNCATE foo, foo" 的情況。顯然,此類重複的資料表不需要開啟和關閉,因為它們會被跳過。但先前它總是在檢查它們是否是重複的資料表之前開啟這些資料表,然後在它們是重複的資料表時關閉它們。也就是說,重複的資料表被不必要地開啟和關閉。此提交變更了 ExecuteTruncate(),使其在確認資料表不是重複的資料表後才開啟該資料表,從而避免不必要的資料表開啟/關閉。不要回溯修補,因為這種不必要的資料表開啟/關閉雖然存在於舊版本中,但不是錯誤。作者:Bharath Rupireddy 審閱者:Amul Sul, Fujii Masao 討論:https://postgr.es/m/CALj2ACUdBO_sXJTa08OZ0YT0qk7F_gAmRa9hT4dxRcgPS4nsZA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/81a23dd87999ec9fb62554328c69c5b678612d56
Stephen Frost 推送
Peter Geoghegan 推送
簡化 VACUUM 管理的狀態。重新組織 VACUUM 使用的狀態結構 - 將相關項目組合在一起,以便更容易理解。此外,停止依賴 lazy_scan_heap() 內的堆疊變數 - 改為將這些變數移至狀態結構中。這樣做簡化了大量相關函數,這些函數的函數簽名具有許多不必要的冗餘。切換為使用 int64 作為用於計算透過 log_autovacuum 和 VACUUM VERBOSE 輸出報告給使用者的項目的結構欄位。我們之前使用的是 double,但似乎沒有任何優勢。使用 int64 使得可以新增斷言,以驗證堆積上的第一次傳遞(修剪)遇到的 LP_DEAD 項目數量與稍後在堆積上的第二次傳遞中從索引中刪除的項目數量完全相同。這些斷言將在稍後的提交中新增。最後,在 IndexBulkDeleteResult 指標參數與單一索引或所有索引相關存在歧義的情況下,調整具有 IndexBulkDeleteResult 指標參數的函數的簽名。函數現在使用 ambulkdelete() 和 amvacuumcleanup() 一直使用的慣用語(在適用的情況下):接受可變的 IndexBulkDeleteResult 指標參數,並將結果 IndexBulkDeleteResult 指標傳回呼叫者。作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada sawada.mshk@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/CAH2-WzkeOSYwC6KNckbhk2b1aNnWum6Yyn0NKP9D-Hq1LGTDPw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b4af70cb210393c9c8f41643acf6b213e21178e7
傳播並行 VACUUM 的緩衝區存取策略。並行 VACUUM 依賴於從 leader 流程傳播到 fork() 上的 worker 的全域變數狀態。提交 b4af70cb 移除了 vacuumlazy.c 內部大多數全域變數的使用,但沒有考慮緩衝區存取策略狀態。為了修復此問題,改為透過共享記憶體傳播狀態。根據 elver、curculio 和 morepork 上的建置場失敗情況。非常感謝 Thomas Munro 在清單外提供的協助。 https://git.postgresql.org/pg/commitdiff/49f49defe7c0a330cca084de5da14ccdfdafc6a3
在並行 VACUUM worker 中分配存取策略。提交 49f49def 採取了完全錯誤的方法來修復此問題。只需在每個 worker 中分配一個本地緩衝區存取策略,而不是嘗試傳播狀態。此狀態從未首先由並行 VACUUM 傳播。看起來在提交 40d964ec 之後,這起作用的唯一原因是它涉及靜態全域變數,這些變數根據 C 標準初始化為 0。即使在 HEAD 上,也可能需要更全面的修復。此修復至少應再次使建置場變綠。再次感謝 Thomas Munro 在清單外提供的持續協助。 https://git.postgresql.org/pg/commitdiff/f6b8f19a084ce949522fcbc940dc116c034cfc47
重構 lazy_scan_heap() 迴圈。新增一個 lazy_scan_heap() 的輔助函式,用來處理堆疊修剪和元組凍結:lazy_scan_prune()。這樣程式碼會更乾淨。現在 lazy_scan_heap() 的每個區塊迴圈中剩下的程式碼可以被認為是 lazy_scan_prune() 呼叫之前或之後的程式碼,lazy_scan_prune() 現在是明顯的焦點。這種劃分是透過我們現在管理狀態的方式來強制執行的。lazy_scan_prune() 輸出狀態(使用它自己的結構),描述在修剪和凍結後如何處理頁面(例如,可見性映射維護,在 FSM 中記錄可用空間)。它不會從前言程式碼傳遞任何特殊的指示狀態。此外,乾淨地分離使用 INDEX_CLEANUP=off 的 VACUUM 所使用的邏輯,與單一堆疊掃描 VACUUM 所使用的邏輯。前一種情況現在被組織為雙次掃描 VACUUM 略過索引和堆疊的 vacuuming。後一種情況則恢復為僅在表格恰好沒有索引時使用(就像 commit a96c41fe 之前一樣)。這種結構更自然,因為 INDEX_CLEANUP=off 的重點是跳過原本會發生的索引和堆疊 vacuuming。單一堆疊掃描的情況並沒有跳過任何有用的工作,它只是在表格恰好沒有索引時,一起進行堆疊修剪和堆疊 vacuuming。這兩個變更都是為即將到來的 patch 做準備,該 patch 將概括 INDEX_CLEANUP=off 使用的機制。後續的 patch 將允許 VACUUM 動態放棄索引和堆疊 vacuuming,因為問題出現(例如,發生迴繞),以便受影響的 VACUUM 操作可以盡快完成。此外,修復了單次掃描 VACUUM VERBOSE 輸出中的一個非常古老的錯誤。我們將透過修剪刪除的元組數量,直接替代為報告在處理堆疊第二次掃描的函式中移除的 LP_DEAD 項目數量。但這根本行不通,因為它們是兩回事。為了修復這個問題,開始追蹤修剪期間遇到的 LP_DEAD 項目總數,並在報告中使用它。單次掃描 VACUUM 將始終在修剪後立即 vacuum 掉堆疊頁面擁有的任何 LP_DEAD 項目,因此修剪期間遇到的 LP_DEAD 項目總數等於 vacuum 掉的總數。(在 INDEX_CLEANUP=off 的情況下,它們不相等,但沒關係,因為跳過索引 vacuuming 現在是一個與單次掃描 VACUUM 完全正交的概念。)此外,停止在 VACUUM VERBOSE 輸出中報告 LP_UNUSED 項目的計數。這使 VACUUM VERBOSE 的輸出與 log_autovacuum 的輸出更加一致(因為它從未顯示有關 LP_UNUSED 項目的資訊)。VACUUM VERBOSE 報告了上次 VACUUM 留下的 LP_UNUSED 項目,以及在當前 VACUUM 期間透過修剪 HOT 鏈創建的 LP_UNUSED 項目(它從未包括當前 VACUUM 對堆疊的第二次掃描留下的 LP_UNUSED 項目)。這使其無法作為行指標膨脹的指標,這一定是最初的意圖。(與第一個 VACUUM VERBOSE 問題一樣,這個問題可以說是 commit 282d2a03 中的一個疏忽,該 commit 新增了僅堆疊元組優化。)最後,停止在 VACUUM VERBOSE 輸出中報告 empty_pages,並開始報告 pages_removed。這也使 VACUUM VERBOSE 的輸出與 log_autovacuum 的輸出更加一致(它不顯示 empty_pages,但顯示 pages_removed)。一個空頁面與幾乎為空的頁面,或除了少量剩餘的 LP_UNUSED 項目之外為空的頁面,沒有有意義的差異。作者:Peter Geoghegan pg@bowt.ie 審閱人:Robert Haas robertmhaas@gmail.com 審閱人:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAH2-WznneCXTzuFmcwx_EyRQgfsfJAAsu+CsqRFmFXCAar=nJw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/7ab96cf6b312cfcd79cdc1a69c6bdb75de0ed30f
從 vacuumlazy.c 中移除 tupgone 特例。在極少數情況下重試對 heap_prune_page() 的呼叫,在這些情況下,heap_prune_page() 呼叫與緊隨其後的 HeapTupleSatisfiesVacuum() 呼叫之間存在差異。當並發中止的事務在每個步驟之間的小窗口中使元組變為 DEAD 時,可能會出現差異。這是 VACUUM 認為 DEAD 的元組在修剪後仍然具有儲存空間的唯一情況。VACUUM 對死元組的定義現在非常簡單且明確:每個頁面中的死元組始終是在我們執行修剪之後(以及在我們考慮凍結具有元組儲存空間的剩餘項目之前)遇到的 LP_DEAD 行指標。消除 tupgone=true 特例,可以基於靈活的動態標準跳過 INDEX_CLEANUP=off 樣式的索引 vacuuming。INDEX_CLEANUP=off 的情況必須事先知道跳過索引,這是由於與特例的細微互動(請參閱 commit dd695979)-- 這本身就是一個特例。現在沒有特例了。因此,現在無論我們何時或如何決定跳過索引 vacuuming,都無關緊要:它不會影響修剪的行為方式,也不會受到修剪或凍結的任何實作細節的影響。此外,移除 XLOG_HEAP2_CLEANUP_INFO 記錄。由於我們現在完全依賴堆疊修剪來處理恢復衝突,因此這些不再是必需的。對於修剪剛錯過的 DEAD 元組,不再需要產生恢復衝突。這也意味著堆疊 vacuuming 現在使用與索引 vacuuming 始終使用的策略完全相同的恢復衝突策略:REDO 例程永遠不需要處理來自 WAL 記錄的 latestRemovedXid,因為在所有情況下,更早的修剪 WAL 記錄的 REDO 都是足夠的。通用的 XLOG_HEAP2_CLEAN 記錄類型現在分為兩個新的記錄類型,以反映這種新的劃分(這些稱為 XLOG_HEAP2_PRUNE 和 XLOG_HEAP2_VACUUM)。此外,當堆疊頁面在 VACUUM 的第二次堆疊掃描期間被 vacuum 時,停止獲取堆疊頁面的超級獨佔鎖。常規的獨佔鎖就足夠了。這是正確的,因為堆疊頁面 vacuuming 現在嚴格來說是將 LP_DEAD 行指標設定為 LP_UNUSED。沒有其他後端可以擁有指向位於釘選緩衝區中的元組的指標,該指標可能會被並發堆疊頁面 vacuum 操作無效化。現在可以將堆疊 vacuuming 視為概念上與索引 vacuuming 相似,而與堆疊修剪概念上不同。堆疊修剪現在對涉及資料庫邏輯內容的任何事情負有全部責任(例如,管理事務狀態資訊、恢復衝突、考慮如何處理 HOT 鏈)。索引 vacuuming 和堆疊 vacuuming 現在只關心從支援邏輯資料庫的物理資料結構中回收垃圾項目。由於修剪和堆疊頁面 vacuum WAL 記錄的變更,提高 XLOG_PAGE_MAGIC。避免 tupgone 情況重試修剪頁面的想法歸功於 Andres Freund。作者:Peter Geoghegan pg@bowt.ie 審閱人:Andres Freund andres@anarazel.de 審閱人:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAH2-WznneCXTzuFmcwx_EyRQgfsfJAAsu+CsqRFmFXCAar=nJw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8523492d4e349c4714aa2ab0291be175a88cb4fc
在 VACUUM 期間截斷行指標陣列。使 VACUUM 能夠截斷每個堆積頁面的行指標陣列,當連續的 LP_UNUSED 行指標群組出現在陣列的末尾時 -- 這些未使用且未被引用的項目將被排除。此過程發生在 VACUUM 對堆積的第二次遍歷期間,緊接在頁面上的 LP_DEAD 行指標(在第一次遍歷期間遇到/修剪的指標)被標記為 LP_UNUSED 之後。截斷避免了某些工作負載導致的行指標膨脹,特別是那些涉及針對同一表持續的範圍 DELETE 和批量 INSERT。此外,強化 heapam 代碼,以檢查我們尚未進行檢查的地方是否存在超出範圍的頁面偏移量編號。作者:Matthias van de Meent boekewurm+postgres@gmail.com 作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada sawada.mshk@gmail.com 審閱者:Peter Geoghegan pg@bowt.ie 討論:https://postgr.es/m/CAEze2WjgaQc55Y5f5CQd3L=eS5CZcff2Obxp=O6pto8-f0hC4w@mail.gmail.com 討論:https://postgr.es/m/CAH2-Wzn6a64PJM1Ggzm=uvx2otsopJMhFQj_g1rAj4GWr3ZSzw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3c3b8a4b26891892bccf3d220580a7f413c0b9ca
為 VACUUM 添加環繞失效保護。添加一個失效保護機制,當 VACUUM 注意到表的 relfrozenxid 和/或 relminmxid 非常接近過去時觸發。VACUUM 以有規律的間隔動態檢查表的年齡。當失效保護觸發時,VACUUM 會採取非常措施以盡快完成,以便可以推進 relfrozenxid 和/或 relminmxid。VACUUM 將停止應用任何可能生效的基於成本的延遲。VACUUM 還將繞過任何進一步的索引清理和堆積清理 -- 它只完成所需的任何剩餘的修剪和凍結。繞過索引/堆積清理由 commit 8523492d 啟用,這使得可以動態觸發 VACUUM 內部已使用的機制,當它以 INDEX_CLEANUP 關閉運行時。預計失效保護幾乎總是在自動清理中觸發,以防止環繞,遠在自動清理開始之後。但是,失效保護機制可以在任何 VACUUM 操作中觸發。即使在非積極的 VACUUM 中,我們可能不會推進 relfrozenxid,但完成剩餘的修剪和凍結仍然是一個好主意。隨後將立即啟動積極/反環繞 VACUUM。請注意,隨後的反環繞 VACUUM 本身會觸發失效保護,通常甚至在其開始第一次(也是唯一一次)堆積遍歷之前。失效保護由兩個新的 GUC 控制:vacuum_failsafe_age 和 vacuum_multixact_failsafe_age。沒有等效的 reloption,因為預計它不會有用。GUC 具有相當高的默認值(兩者都默認為 16 億),並且預計通常僅用於使失效保護更早/更頻繁地觸發。作者:Masahiko Sawada sawada.mshk@gmail.com 作者:Peter Geoghegan pg@bowt.ie 討論:https://postgr.es/m/CAD21AoD0SkE11fMw4jD4RENAwBMcw1wasVnwpJVw3tVqPOQgAw@mail.gmail.com 討論:https://postgr.es/m/CAH2-WzmgH3ySGYeC-m-eOBsa2=sDwa292-CFghV4rESYo39FsQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1e55e7d1755cefbb44982fbacc7da461fa8684e6
使 VACUUM 能夠繞過不必要的索引清理。在結束對堆積的第一次遍歷(也是在這種情況下對堆積的唯一一次遍歷)時,如果其 dead_tuples 陣列中恰好有零個 TIDs,則 VACUUM 從不需要為每個索引調用 ambulkdelete()。當發生這種情況時,根本不需要索引清理。索引清理仍然會繼續進行,但實際上,當沒有之前的 ambulkdelete() 調用時,大多數對 amvacuumcleanup() 的調用通常都是空操作。簡而言之,當顯然沒有要從索引中刪除的索引元組時,VACUUM 通常設法避免索引掃描。但是,要刪除的索引元組接近於零的情況是另一回事 -- 進行了一輪 ambulkdelete() 調用(每個索引一個),每個調用都執行了完整的索引掃描。現在,VACUUM 的行為就像要刪除的索引元組為零的情況一樣,實際上是“幾乎為零”的情況。也就是說,它現在可以繞過索引清理和堆積清理作為一種優化(儘管不能繞過索引清理)。VACUUM 是否繞過索引是動態確定的,基於剛剛觀察到的表中具有一個或多個 LP_DEAD 項目的堆積頁面的數量(在最壞的情況下,堆積頁面中的 LP_DEAD 項目與仍然需要從每個索引中刪除的索引元組具有 1:1 的對應關係)。我們僅在表中 2% 或更少的頁面具有一個或多個 LP_DEAD 項目時跳過索引清理 -- 作為一種優化,繞過索引清理不得顯著阻礙在可見性地圖中設置位。作為進一步的條件,在堆積上的第一次遍歷完成時,dead_tuples 陣列(即 VACUUM 的 LP_DEAD 項目 TIDs 陣列)不得超過 32MB,這也是做出繞過決策的時間。(VACUUM 還必須能夠將所有 TIDs 放入其 maintenance_work_mem 綁定的 dead_tuples 空間中,儘管使用默認的 maintenance_work_mem 設置,這無關緊要。)這避免了在連續 VACUUM 操作始終具有幾乎零個無效索引元組的工作負載中,例行清理的持續時間和開銷出現令人驚訝的跳躍。LP_DEAD 項目的數量很可能會在多次 VACUUM 操作中累積,然後最終超過閾值,並且 VACUUM 執行常規索引清理。即便如此,該優化也將避免大量基本上不必要的索引清理。將來,我們可能會教導 VACUUM 在每個索引的基礎上跳過索引清理,使用一種更加複雜的方法。目前,我們僅考慮極端情況,在這些情況下,我們可以非常確信,使用簡單的啟發式方法,索引清理是不值得的。此外,當啟用自動清理日誌記錄時,記錄有關有多少堆積頁面具有一個或多個 LP_DEAD 項目的信息。作者:Masahiko Sawada sawada.mshk@gmail.com 作者:Peter Geoghegan pg@bowt.ie 討論:https://postgr.es/m/CAD21AoD0SkE11fMw4jD4RENAwBMcw1wasVnwpJVw3tVqPOQgAw@mail.gmail.com 討論:https://postgr.es/m/CAH2-WzmkebqPd4MVGuPTOS9bMFvp9MDs5cRTCOsv1rQJ3jCbXw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5100010ee4d5c8ef46619dbd1d17090c627e6d0a
消除另一個 _bt_check_unique
編譯器警告。根據 Tom Lane 的投訴。討論:https://postgr.es/m/1922884.1617909599@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/796092fb84c08162ae803e83a13aa8bd6d9b23d0
Amit Kapila 推送
重構函數 parse_output_parameters。不要在 parse_ouput_parameters 函數簽名中使用多個參數,而是使用封裝所有 pgoutput 選項的 struct PGOutputData。這對於將來需要在 pgoutput 中添加其他選項的工作很有用。作者:Euler Taveira 審閱者:Amit Kapila 討論:https://postgr.es/m/CADK3HHJ-+9SO7KuRLH=9Wa1rAo60Yreq1GFNkH_kd0=CdaWM+A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/531737ddad214cb8a675953208e2f3a6b1be122b
允許 pgoutput 傳送邏輯解碼訊息。輸出外掛程式接受一個新的參數 (messages),用於控制是否將邏輯解碼訊息寫入複製串流。這對於那些使用 pgoutput 作為輸出外掛程式,並且需要處理由 pg_logical_emit_message() 寫入的訊息的客戶端非常有用。雖然邏輯串流複製協議現在支援邏輯解碼訊息,但邏輯複製目前尚未使用此功能。作者:David Pirotte, Euler Taveira 審閱者:Euler Taveira, Andres Freund, Ashutosh Bapat, Amit Kapila 討論:https://postgr.es/m/CADK3HHJ-+9SO7KuRLH=9Wa1rAo60Yreq1GFNkH_kd0=CdaWM+A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ac4645c0157fc5fcef0af8ff571512aa284a2cec
修正 commit ac4645c015 增加的測試。在這些測試中,禁用訂閱後,我們沒有等待複製連線從發布者端斷開。因此,當測試嘗試使用相同的槽透過 SQL API 獲取訊息時,有時會出現錯誤,指出該複製槽正由其他 PID 使用中。根據 buildfarm 報告。https://git.postgresql.org/pg/commitdiff/266b5673b4b6bed2e9ebfe73ca967f44d6dc0e6c
修正 jsonfuncs.c 中的錯字。作者:Tatsuro Yamada 討論:https://postgr.es/m/7c166a60-2808-6b89-9524-feefc6233748@nttcom.co.jp_1 https://git.postgresql.org/pg/commitdiff/8ffb003591ff02f59d92c36a5791307881863146
David Rowley 提交
修正 MSVC 中 fe-trace.c 的編譯器警告。似乎在 MSVC 中,timeval 的 tv_sec 欄位類型為 long。 localtime() 接受一個 time_t 指標。由於 long 即使在 MSVC 的 64 位版本中也是 32 位的,因此傳遞一個 long 指標而不是正確的 time_t 指標會產生編譯器警告。修正此問題。審閱者:Tom Lane 討論:https://postgr.es/m/CAApHDvoRG25X_=ZCGSPb4KN_j2iu=G2uXsRSg8NBZeuhkOSETg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9bc9b4609a246ded5caf3f3d4c0013a002ba2323
修正 libpq_pipeline.c 中 MSVC 的編譯器警告。DEBUG 已經被 MSVC 工具鏈為 "Debug" 建置定義。在這些系統上,無條件的 #define DEBUG 會導致 'DEBUG': 巨集重新定義警告。在這裡,我們將 DEBUG 重新命名為 DEBUG_OUPUT,並且也刪除定義此常數的 #define。這似乎是錯誤地留在程式碼中的。討論:https://postgr.es/m/CAApHDvqTTgDm38s4HRj03nhzhzQ1oMOj-RXFUB1pE6Bj07jyuQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3b82d990ab784881153c0f127e4c1211e9b6065c
清理分割區修剪步驟的產生。gen_prune_steps_from_opexps 中有一些程式碼不必要地檢查一個列表是否為空,而該列表顯然必須至少包含一個項目。這促使 partprune.c 中進行了進一步的清理操作。此外,先前的程式碼最終可能會添加額外的不必要的 INTERSECT 步驟。但是,這些步驟似乎不會導致任何錯誤行為。 gen_prune_steps_from_opexps 現在不再負責產生組合修剪步驟。相反,已經進行一些組合步驟建立的 gen_partprune_steps_internal 已被賦予產生所有組合步驟的唯一責任。這意味著當我們遞迴呼叫 gen_partprune_steps_internal 時,由於它現在總是在產生多個步驟時添加一個組合步驟,因此我們只需關注返回的最終步驟。順便說一下,對註釋進行大量工作,以更清楚地解釋 gen_partprune_steps_internal 和 gen_prune_steps_from_opexps 的作用。這是相當複雜的程式碼,因此額外努力為任何新讀者提供有關事物如何運作的概述似乎是一個好主意。作者:Amit Langote 報告者:Andy Fan 審閱者:Kyotaro Horiguchi, Andy Fan, Ryan Lambert, David Rowley 討論:https://postgr.es/m/CAKU4AWqWoVii+bRTeBQmeVW+PznkdO8DfbwqNsu9Gj4ubt9A6w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5ac9c4307337313bedeafc21dbbab93ba809241c
加速 ScalarArrayOpExpr 的評估。具有 "useOr=true" 和一組 Consts 在右側的 ScalarArrayOpExprs 傳統上一直使用對陣列進行線性搜尋的方式進行評估。當這些陣列包含大量元素時,這種線性搜尋可能會成為執行時間的重要組成部分。在這裡,我們添加了一種新的評估 ScalarArrayOpExpr 運算式的方法,允許透過首先建立一個包含每個元素的雜湊表來對它們進行評估,然後在後續評估中,我們只需探測該雜湊表以確定是否存在匹配項。規劃器負責確定何時可以進行此最佳化,並且它透過在 ScalarArrayOpExpr 中設定 hashfuncid 來啟用它。僅當設定了 hashfuncid 時,執行器才會執行雜湊表評估。這意味著並非所有情況都經過最佳化。例如,包含 IN 子句的 CHECK 約束不會透過規劃器,因此不會設定 hashfuncid。我們可能會在稍後的日期對此做些什麼。我們現在不這樣做的原因是擔心我們可能會減慢運算式僅評估一次的情況。這些情況可能很常見,例如,對包含 IN 子句的 CHECK 約束的表進行單行 INSERT。在規劃器中,當 ScalarArrayOpExpr 的運算符有合適的雜湊函數,並且陣列中至少有 MIN_ARRAY_SIZE_FOR_HASHED_SAOP 個元素時,我們會啟用它。目前閾值設定為 9。作者:James Coleman, David Rowley 審閱者:David Rowley, Tomas Vondra, Heikki Linnakangas 討論:https://postgr.es/m/CAAaqYe8x62+=wn0zvNKCj55tPpg-JBHzhZFFc6ANovdqFw7-dA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/50e17ad281b8d1c1b410c9833955bc80fbad4078
稍微改善 nodeFuncs.c 中容易產生誤導的註釋。nodeFuncs.c 中有一些註釋,根據您對 "result" 一詞的理解,可能會讓您認為這些註釋是從其他地方複製貼上的。如果您將 "result" 視為註釋所寫入函數的返回值,那麼您會被誤導。但是,如果您正確地將 "result" 解釋為給定節點類型的結果類型,那麼您不會看到任何問題。在這裡,我們做一個小的清理,以防止未來出現任何誤解。根據 Tom Lane 的措辭建議。審閱者:Tom Lane 討論:https://postgr.es/m/CAApHDvp+Bw=2Qiu5=uXMKfC7gd0+B=4JvexVgGJU=am2g9a1CA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/152d33bccec7176f50be225bdbedf2e6de214e54
Etsuro Fujita 提交
Dean Rasheed 提交
Heikki Linnakangas 推送
將 test_enc_conversion() 標記為 STRICT。由 Jaime Casanova 使用 SQLsmith 回報。討論:https://postgres.tw/message-id/20210402235337.GA4082@ahch-to https://git.postgresql.org/pg/commitdiff/c4c393b3ec83ceb4b4d7f37cdd5302126377d069
為 gist_btree opclasses 新增 sortsupport,以加快索引建立速度。Commit 16fa9b2b30 引入了一種更快的建立 GiST 索引的方法,即對所有資料進行排序。此 commit 新增了所需的 sortsupport 函式,以便為 btree_gist 使用該功能。作者:Andrey Borodin 討論:https://postgres.tw/message-id/2F3F7265-0D22-44DB-AD71-8554C743D943@yandex-team.ru https://git.postgresql.org/pg/commitdiff/9f984ba6d23dc6eecebf479ab1d3f2e550a4e9be
還原「為 gist_btree opclasses 新增 sortsupport,以加快索引建立速度」。此還原 commit 9f984ba6d23dc6eecebf479ab1d3f2e550a4e9be。它讓 buildfarm 不高興,顯然如果 log_statement='all',則在迴歸測試中設定 client_min_messages 會產生不同的輸出。另一個問題是,我現在懷疑 bit sortsupport 函式實際上不適合呼叫 byteacmp()。還原以調查這兩個問題。https://git.postgresql.org/pg/commitdiff/d92b1cdbab408d8f1299257125c9ae375f3ca644
Tomáš Vondra 推送
修正處理與擴充統計資料不相容的子句。在套用擴充統計資料時,對不相容子句的處理有點混亂 - 在處理相容和不相容子句的組合時,有時會錯誤地將不相容子句視為相容,從而導致崩潰。透過重新設計套用所選統計物件的程式碼來使其更容易理解,並新增適當的相容性檢查來修正此問題。由 David Rowley 回報。討論:https://postgr.es/m/CAApHDvpYT10-nkSp8xXe-nbO3jmoaRyRFHbzh-RWMfAJynqgpQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/518442c7f334f3b05ea28b7ef50f1b551cfcc23e
不要將不存在的頁面從 BRIN 新增到點陣圖。bringetbitmap() 中的程式碼只是將整個匹配的頁面範圍新增到 TID 點陣圖,如 pages_per_range 所確定,即使某些頁面超出堆積的末尾。然後,查詢可能會因類似這樣的錯誤而失敗:ERROR: could not open file "base/20176/20228.2" (target block 262144): previous segment is only 131021 blocks 在這種情況下,關係有 262093 個頁面(131072 和 131021 個頁面),但我們試圖存取區塊 262144,即第 3 個區段的第一個區塊。在那個時候,_mdfd_getseg()
注意到前面的區段不完整,並且失敗。實際上遇到這種情況的可能性很小,因為
Andres Freund 推送
在子交易中止期間增加 xactCompletionCount。快照快取 (在 623a9ba79b 中引入) 未在子交易中止期間增加 xactCompletionCount。這可能導致舊的快照被重複使用。至少就我所能看到的,這不是正確性問題(對於 MVCC 快照,“進行中”和“已中止”之間沒有區別)。新舊快照之間唯一的區別是較新的 ->xmax。雖然 HeapTupleSatisfiesMVCC 做出相同的可見性判斷,但重複使用舊快照會導致 HeapTupleSatisfiesMVCC 不設定 HEAP_XMIN_INVALID。這隨後導致 kill_prior_tuple 最佳化無法啟動(透過 HeapTupleIsSurelyDead() 傳回 false)。重複執行相同索引查找的效能影響是發現此問題的方式... 透過在 XidCacheRemoveRunningXids 中增加 xactCompletionCount 來修正此問題。它已經獨佔地獲取 ProcArrayLock,使其成為一個容易實現的提議。新增一個測試,以確保當涉及目前交易的中止子交易時,kill_prior_tuple 可防止索引成長。作者:Andres Freund 討論:https://postgr.es/m/20210406043521.lopeo7bbigad3n6t@alap3.anarazel.de 討論:https://postgr.es/m/20210317055718.v6qs3ltzrformqoa%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/90c885cdab8bc5a5f12a243774fa0db51002a2fd
處理 ExecInitParallelPlan() 中的 NULL 查詢字串。目前尚不清楚這是否是正確的方法 - 但在 CF 的最後一天,buildfarm 的很大一部分已經變紅幾個小時。這至少修復了明顯的崩潰。所以我們暫且這樣做。討論:https://postgr.es/m/20210407225806.majgznh4lk34hjvu%40alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/b3ee4c503872f3d0a5d6a7cbde48815f555af15b
Magnus Hagander 推送
重構 hba_authname。先前的實作(來自 9afffcb833)對枚舉的邊界進行了不必要的檢查,從而觸發了編譯警告。為了清理它,將預先存在的靜態斷言移動到中心位置並呼叫它。由 Erik Rijkers 回報。經 Michael Paquier 審閱。討論:https://postgr.es/m/1056399262.13159.1617793249020@webmailclassic.xs4all.nl https://git.postgresql.org/pg/commitdiff/c1968426ba3de1fe37848863e35fff30261bf941
在 pg_stat_statements 中獨立追蹤頂層查詢與巢狀查詢。變更 pg_stat_statements.track 設定為 'all' 或 'top' 可以控制 pg_stat_statements 是否僅追蹤頂層陳述式,或是也追蹤函式內的陳述式,但當追蹤所有陳述式時,不會區分這兩者。能夠區分這兩者對於追蹤實際查詢來源,以及查看兩者之間的執行差異都很有用。為了做到這一點,新增一個布林值到雜湊鍵中,以指示陳述式是否為頂層陳述式。來自 pg_stat_kcache 模組的經驗顯示,在至少一些「合理的工作負載」中,只有 <5% 的查詢同時顯示在頂層和巢狀中。基於這個(坦白說很小的)資料集,此修補程式不會嘗試對這些查詢文字進行重複資料刪除,而是會為頂層和巢狀分別儲存一份副本。作者:Julien Rohaud 審閱者:Magnus Hagander, Masahiro Ikeda 討論:https://postgr.es/m/20201202040516.GA43757@nol https://git.postgresql.org/pg/commitdiff/6b4d23feef6e334fb85af077f2857f62ab781848
新增函式以等待後端終止。這新增了一個函式 pg_wait_for_backend_termination(),以及一個新的逾時參數到 pg_terminate_backend(),這將等待後端實際終止(無論是否發送信號要求終止,取決於呼叫哪個函式)。pg_terminate_backend() 的預設行為仍然是 timeout=0,表示不等待。對於 pg_wait_for_backend_termination(),預設等待時間為 5 秒。作者:Bharath Rupireddy 審閱者:Fujii Masao, David Johnston, Muhammad Usama, Hou Zhijie, Magnus Hagander 討論:https://postgr.es/m/CALj2ACUBpunmyhYZw-kXCYs5NM+h6oG_7Df_Tn4mLmmUQifkqA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/aaf043257205ec523f1ba09a3856464d17cf2281
將 pg_stat_statements 的 v1.10 合併到 v1.9。v1.9 在這個 PostgreSQL 版本中已經是新的,因此將其變成一個變更。作者:Julien Rohaud 討論:https://postgr.es/m/20210408120505.7zinijtdexbyghvb@nol https://git.postgresql.org/pg/commitdiff/5844c23dc50508aefeb8183be45f4ee99e9dec17
修正錯字。作者:Daniel Westermann 回溯套用至:9.6 討論:https://postgr.es/m/GV0P278MB0483A7AA85BAFCC06D90F453D2739@GV0P278MB0483.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/1798d8f8b6fbb8ff922f640ff2d5dbd3e47064a2
Robert Haas 推送
amcheck:移除重複的 XID/MXID 範圍檢查。Commit 3b6c1259f9ca8e21860aaf24ec6735a8e5598ea0 導致相同的 xmin 和 xmax 範圍檢查在 check_tuple() 和 check_tuple_visibility() 中都執行。移除重複的檢查。同時,調整該 commit 中被忽略的一些程式碼註解。Mark Dilger 討論:http://postgr.es/m/AC5479E4-6321-473D-AC92-5EC36299FBC2@enterprisedb.com https://git.postgresql.org/pg/commitdiff/4573f6a9af6e232ba073392716a051ae2017d1e9
amcheck:修復 TOAST 指標驗證的數個問題。首先,不要在持有緩衝區鎖定時執行資料庫存取。在檢查堆積時,我們可以透過對 TOAST 索引執行掃描,並查找與主表中 TOAST 指標中出現的每個值 ID 對應的區塊,來驗證 TOAST 指標是否正常。但是,在至少持有緩衝區鎖定時執行此操作,可能會導致其他後端無法中斷地等待,並且可能會導致未被偵測到且無法中斷的死鎖。因此,請建立一個在持有鎖定時要執行的檢查清單,然後在釋放鎖定後執行這些檢查。其次,調整內容,以便我們不會嘗試追蹤已經符合修剪資格的元組的 TOAST 指標。TOAST 元組與主元組同時符合修剪資格,因此嘗試檢查它們可能會導致虛假的損壞報告,如在 buildfarm 中觀察到的那樣。決定正在檢查的元組是否可修剪的必要基礎架構是由 commit 3b6c1259f9ca8e21860aaf24ec6735a8e5598ea0 新增的,但在這個修補程式之前,它實際上並未用於其預期用途。Mark Dilger,我調整了程式碼以避免記憶體洩漏。討論:http://postgr.es/m/AC5479E4-6321-473D-AC92-5EC36299FBC2@enterprisedb.com https://git.postgresql.org/pg/commitdiff/ec7ffb8096e8eb90f4c9230f7ba9487f0abe1a9f
Bruce Momjian 推送
將 pg_stat_statements 查詢混淆移至核心。新增 compute_query_id GUC 來控制查詢識別符是否應由核心計算(預設為關閉)。因此,現在可以禁用核心 queryid 計算,並使用 pg_stat_statements 以及不同的演算法,透過使用第三方模組來計算查詢識別符。為了確保可以使用單一來源的查詢識別符,並且定義良好,計算查詢識別符的模組應該在 compute_query_id 指定要計算查詢 ID 並且已經計算出查詢識別符時,拋出錯誤。討論:https://postgr.es/m/20210407125726.tkvjdbw76hxnpwfi@nol 作者:Julien Rouhaud 審閱者:Alvaro Herrera, Nitin Jadhav, Zhihong Yu https://git.postgresql.org/pg/commitdiff/5fd9dfa5f50e4906c35133a414ebec5b6d518493
使用 commit 5fd9dfa5f5 新增的核心查詢 ID。使用核心查詢 ID 計算用於 pg_stat_activity、log_line_prefix 和 EXPLAIN VERBOSE。與 pg_stat_activity 中的其他欄位類似,僅公開頂層陳述式的 queryid,如果後端狀態不是 active,則顯示上次執行的陳述式的 queryid。新增一個 %Q 佔位符,以在 log_line_prefix 中包含 queryid,這也只會公開頂層陳述式。對於 EXPLAIN VERBOSE,如果已經計算出查詢識別符,無論是透過啟用 compute_query_id 或使用第三方模組,都會顯示它。更新目錄版本。討論:https://postgr.es/m/20210407125726.tkvjdbw76hxnpwfi@nol 作者:Julien Rouhaud 審閱者:Alvaro Herrera, Nitin Jadhav, Zhihong Yu https://git.postgresql.org/pg/commitdiff/4f0b0966c866ae9f0e15d7cc73ccf7ce4e1af84b
修正 commit 4f0b0966c8 造成的迴歸測試失敗。最初使用的查詢太簡單,導致 explain_filter() 無法移除 JIT 輸出文字。回報者:Tom Lane 作者:Julien Rouhaud https://git.postgresql.org/pg/commitdiff/bc70728693bc2d28db7125e7a24d78ad7612f58c
為新的 query_id 值新增 csvlog 輸出。這也調整了 log_line_prefix (%Q) 使用的 query id 的 printf 格式。回報者:Justin Pryzby 討論:https://postgr.es/m/20210408005402.GG24239@momjian.us 作者:Julien Rouhaud, Bruce Momjian https://git.postgresql.org/pg/commitdiff/f57a2f5e03054ade221e554c70e628e1ffae1b66
query_id 功能的修復。忽略 pg_stat_statements 中的平行 worker。4f0b0966c8 中的疏忽導致在平行 worker 中公開了 queryid。計數器由主要後端程序彙總,因此平行 worker 會報告重複的活動,並且也可能報告錯誤條目的活動,因為它們僅知道頂層 queryid。修復在擷取 queryid 時 pg_stat_get_activity 中的筆誤。移除對 pgstat_report_queryid() 的不必要呼叫。回報者:Amit Kapila, Andres Freund, Thomas Munro 討論:https://postgr.es/m/20210408051735.lfbdzun5zdlax5gd@alap3.anarazel.de p634GTSOqnDW86Owrn6qDAVosC5dJjXjp7BMfc5Gz1Q@mail.gmail.com 作者:Julien Rouhaud https://git.postgresql.org/pg/commitdiff/0f61727b75b93915ca9a9f20c996ed7020996a38
Thomas Munro 推送
提供 ReadRecentBuffer() 以按 ID 重新釘選緩衝區。如果您知道最近持有您想要釘選的區塊的緩衝區 ID,則可以使用此函式檢查它是否仍然存在。它可用於避免在 PrefetchBuffer() 報告快取命中後,在緩衝區對應表中進行第二次查找。審閱者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/CA+hUKGJ4VJN8ttxScUFM8dOKX0BrBiboo5uz1cq=AovOddfHpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2f27f8c511494cca9e0e9a4eeeb102fa9f193002
(可選)在恢復過程中預先提取參考資料。引入一個新的 GUC 參數 recovery_prefetch,預設為停用。啟用後,在 WAL 中向前尋找,並嘗試非同步讀取尚未快取到 buffer pool 中的參考資料區塊。目前,這是透過 posix_fadvise() 進行,但有一些注意事項。更好的機制將在後續關於 I/O 子系統的工作中推出。GUC 參數 maintenance_io_concurrency 用於限制我們允許啟動的並行 I/O 數量,基於悲觀的啟發法來推斷 I/O 已經開始和完成。GUC 參數 wal_decode_buffer_size 用於限制我們準備在 WAL 中向前讀取的最大距離,以尋找未快取的區塊。Reviewed-by: Alvaro Herrera alvherre@2ndquadrant.com (部分) Reviewed-by: Andres Freund andres@anarazel.de (部分) Reviewed-by: Tomas Vondra tomas.vondra@2ndquadrant.com (部分) Tested-by: Tomas Vondra tomas.vondra@2ndquadrant.com Tested-by: Jakub Wartak Jakub.Wartak@tomtom.com Tested-by: Dmitry Dolgov 9erthalion6@gmail.com Tested-by: Sait Talha Nisanci Sait.Nisanci@microsoft.com Discussion: https://postgr.es/m/CA%2BhUKGJ4VJN8ttxScUFM8dOKX0BrBiboo5uz1cq%3DAovOddfHpA%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/1d257577e08d3e598011d6850fd1025858de8c8c
從 XLogReader 移除 read_page 回調函數。先前,XLogReader 模組會使用回調函數來提取新的輸入資料。重新設計介面,使其告訴呼叫者插入更多資料,並使用特殊的回傳值代替。此 API 適合後續用於預先提取、加密以及可能其他未來專案的修補程式,否則這些專案將需要不斷擴展回調介面。作為附帶的清理工作,將全域變數 readOff、readLen 和 readSegNo 移至 XlogReaderState 內部。Author: Kyotaro HORIGUCHI horiguchi.kyotaro@lab.ntt.co.jp Author: Heikki Linnakangas hlinnaka@iki.fi (早期版本的部分) Reviewed-by: Antonin Houska ah@cybertec.at Reviewed-by: Alvaro Herrera alvherre@2ndquadrant.com Reviewed-by: Takashi Menjo takashi.menjo@gmail.com Reviewed-by: Andres Freund andres@anarazel.de Reviewed-by: Thomas Munro thomas.munro@gmail.com Discussion: https://postgr.es/m/20190418.210257.43726183.horiguchi.kyotaro%40lab.ntt.co.jp https://git.postgresql.org/pg/commitdiff/323cbe7c7ddcf18aaf24b7f6d682a45a61d4e31b
新增循環 WAL 解碼緩衝區。教導 xlogreader.c 將其輸出解碼到循環緩衝區中,以支援基於向前查看的優化。* XLogReadRecord() 的運作方式與以前相同,一次消耗一條記錄,並允許透過傳統的 XLogRecGetXXX() 巨集來檢查它們。
新增一個替代的新介面 XLogNextRecord(),它回傳指向可以直接檢查的 DecodedXLogRecord 結構的指標。* XLogReadAhead() 提供第二個游標,讓您可以看到更遠的地方,只要有資料可用並且解碼緩衝區中有足夠的空間。這會將 DecodedXLogRecord 指標回傳給呼叫者,但也會將它們新增到稍後將由 XLogNextRecord()/XLogReadRecord() 消耗的記錄佇列中。緩衝區的大小由 wal_decode_buffer_size 控制。緩衝區有可能被放置到共享記憶體中,用於未來的專案。不適合循環緩衝區的大型記錄稱為「超大」,並使用 palloc() 單獨分配。Discussion: https://postgr.es/m/CA+hUKGJ4VJN8ttxScUFM8dOKX0BrBiboo5uz1cq=AovOddfHpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f003d9f8721b3249e4aec8a1946034579d40d42c
移除重複的 typedef。Commit 323cbe7c 中的 Thinko,根據 BF animal locust 的舊 GCC 編譯器的抱怨。https://git.postgresql.org/pg/commitdiff/34399a670a1c559ef8a355ed25d090d73e400ad4
文件:審查「(可選)在恢復過程中預先提取參考資料」。文件中的拼寫錯誤、更正和語言改進,以及程式碼註解中的一些。Reported-by: Justin Pryzby pryzby@telsasoft.com Discussion: https://postgr.es/m/20210409033703.GP6592%40telsasoft.com https://git.postgresql.org/pg/commitdiff/dc88460c24ed71ba7464ef4749e5f25da1bf6652
使新的 GUC 簡短描述更加一致。Reported-by: Daniel Westermann (DWE) daniel.westermann@dbi-services.com Discussion: https://postgr.es/m/GV0P278MB0483490FEAC879DCA5ED583DD2739%40GV0P278MB0483.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/846d35b2dc1bd4d09f5e3e5e5a2cc8efafeb600e
Noah Misch 推送
Bharath Rupireddy 送出另一個修訂版的修補程式,以新增用於多個和單個插入的表格 AM,並將其用於 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。
Sait Talha Nisanci 送出另一個修訂版的修補程式,旨在修復一個錯誤,該錯誤表現為 record_type_typmod_compare 中的崩潰。
Bharath Rupireddy 送出另外兩個修訂版的修補程式,以澄清因將非表格新增至發布而引起的錯誤訊息,命名它是的物件類型,而不是它不是的類型(表格)。
Jaime Casanova 送出一個修補程式,以將 AV worker items 基礎結構用於 GIN 待處理清單的清理。
Jürgen Purtz 送出另一個修訂版的修補程式,以在教學課程中新增一個關於架構的章節。
Andres Freund 送出另一個修訂版的修補程式,以將統計資訊收集器的暫存儲存從檔案移至共享記憶體。
Amul Sul 送出另外三個修訂版的修補程式,以實作 ALTER SYSTEM READ {ONLY | WRITE}。
Michaël Paquier 送出另一個修訂版的修補程式,使其可以使用 NSS 作為 libpq TLS 後端。
Vigneshwaran C、Amit Kapila 和 Masahiko Sawada 交換了使用 HTAB 進行複製槽統計資訊的修補程式。
Bruce Momjian 送出兩個修訂版的修補程式,以修復和澄清間隔算術中一些邊緣案例的文件。
Jaime Casanova 送出一個修補程式,以記錄 BRIN 的 autosummarize 參數預設為關閉的事實。
Heikki Linnakangas 送出另一個修訂版的修補程式,以透過強制預先查看來簡化 COPY FROM 的剖析。
Bruce Momjian 送出另一個修訂版的修補程式,以實作金鑰管理。
Amit Langote 送出另外兩個修訂版的修補程式,以允許在跨分割區更新期間批次處理插入。
Bertrand Drouvot 送出另外三個修訂版的修補程式,使其可以在備用伺服器上進行最小的邏輯解碼。
Himanshu Upadhyaya 送出兩個修訂版的修補程式,以修復 PREPARE TRANSACTION 和 TEMP TABLE 之間的不一致。
Thomas Munro 和 Kyotaro HORIGUCHI 交換了修補程式,以從 XLogReadRecord 移除 read_page 回調函數。
Justin Pryzby 送出另外兩個修訂版的修補程式,以使 pg_ls_*
顯示目錄和共享檔案集。
Hou Zhijie、Masahiko Sawada、Amit Langote 和 Shi Yu 交換了修補程式,以插入邏輯複製中的表格參考洩漏。
Fabien COELHO 和 Michaël Paquier 交換了修補程式,以向 psql 新增 SHOW_ALL_RESULTS 選項。
Takamichi Osumi 送出另一個修訂版的修補程式,使其可以停用 WAL 日誌記錄以加速資料載入。
Yugo Nagata 送出另一個修訂版的修補程式,以實作增量檢視維護。
Michael Banck 送出另一個修訂版的修補程式,以新增新的 PGC_ADMINSET GUC 內容、管理員,並新增 pg_change_role_settings 預定義角色。
Pavel Borisov 送出一個修補程式,以確保在頁面初始化期間對頁面標頭和頁面特殊大小對齊進行相同的處理。現在僅檢查兩者是否與斷言正確對齊,而不是靜默地對任何東西進行 MAXALIGNing。呼叫者應將正確的 maxalinged 值提供給頁面初始化函數。
Thomas Munro 送出了一個補丁的另一個修訂版本,用於為 psql 的 \watch 命令添加 PSQL_WATCH_PAGER 設定。
Tom Lane 送出了三個補丁的另一個修訂版本,使 psql \df 可以通過函數的參數來選擇函數。
Vigneshwaran C 送出了一個補丁的另一個修訂版本,以識別在 CREATE/ALTER SUBSCRIPTION 期間,來自發布者的缺失的發布 (publications)。
Ajin Cherian 和 Amit Kapila 交換了補丁,以添加串流傳輸進行中交易的遺漏文件。
Peter Smith 送出了三個補丁的另一個修訂版本,以添加兩階段交易的邏輯解碼。
Thomas Munro 送出了一個補丁的另一個修訂版本,以實作 WAL 預取 (prefetching)。
Thomas Munro 和 Andrey Borodin 交換了補丁,以使所有 SLRU 緩衝區大小可配置。
Andrey V. Lepikhov 送出了一個補丁的另一個修訂版本,以移除 64k rangetable 限制。
Haotian Wu 送出了一個補丁,以在 pg_dump/restore 中添加一個 --drop-cascade 選項。
Bharath Rupireddy 送出了一個補丁,禁止 CREATE SEQUENCE 的 RESTART 選項,因為它只在 ALTER SEQUENCE 的情況下才有意義。
Andres Freund 送出了一個補丁,以修復 InvalidateObsoleteReplicationSlots() 中的競爭條件,並重新移除 SlotAcquireBehavior。
Bharath Rupireddy 送出了三個補丁的修訂版本,以簡化 postgres_fdw 測試中後端終止和等待邏輯。
Justin Pryzby 送出了一個補丁的另一個修訂版本,將 track_activity_query_size 從先前的正確 Resource Usage / Memory 變更為 STATS_COLLECTOR 類別,將 log_autovacuum_min_duration 變更為 LOGGING_WHAT,將 track_commit_timestamp 變更為 REPLICATION_SENDING,並將 force_parallel_mode 變更為 DEVELOPER GUC,並將其從範例配置中移除,以幫助避免使用者找到此選項並更改它,希望這能使他們的查詢更快,但卻沒有閱讀文件或了解它的作用。
Justin Pryzby 送出了一個補丁的另一個修訂版本,以加速 COPY FROM 到具有外部分割區的分割資料表。
Thomas Munro 送出了一個補丁,使用 SIGIO 來檢測 postmaster 終止。
Pavel Borisov 送出了一個補丁,以穩定分割索引的表空間測試。在執行表空間測試時,有時(非常罕見)父資料表和子資料表的順序會發生變化,從而導致測試失敗。
Maxim Orlov 送出了一個補丁的另一個修訂版本,旨在修復一個錯誤,該錯誤表現為大量連接/斷開連接時的 SSL 協商錯誤。
Andrey V. Lepikhov 送出了一個補丁的另一個修訂版本,通過教導優化器考慮非分割資料表與分割資料表的每個分割區的 partitionwise join,使非對稱 partitionwise join 更有效地工作。 此技術會導致對「reparameterize by child」機制的變更。
Michaël Paquier 送出了一個補丁,將表空間路徑重新建立從 makefile 移動到 pg_regress。
Pavel Stěhule 送出了一個補丁的另一個修訂版本,以實作 schema 變數。
Tom Lane 送出了一個補丁,旨在修復一個錯誤,該錯誤表現為類型 (type) 的參考洩漏,方法是完全放棄將長期存在的 tupdesc refcount 與這些表達式節點關聯,而是依賴於 typcache 條目一旦建立就永遠不會消失的事實。
Rémi Lapeyre 送出了三個補丁的另一個修訂版本,以添加標頭支援到 "COPY TO" 文字格式,以及相應的標頭匹配模式到 "COPY FROM"。
Justin Pryzby 送出了一個補丁的另一個修訂版本,以使 ALTER TABLE ... DETACH CONCURRENTLY 避免建立多餘的約束。
Pavel Stěhule 送出了一個補丁的另一個修訂版本,以在 pg_dump/pg_restore 中添加一個 --options-file
選項。
Tom Lane 送出了一個補丁,以使 PGWARNING 和 PGERROR 普遍可用。
Peter Geoghegan 送出了一個補丁,旨在修復一個錯誤,該錯誤表現為 PANIC: 傳遞給 visibilitymap_clear 的緩衝區錯誤,方法是再次在 lazy_vacuum_heap_rel() 中獲取超獨佔鎖。
Ranier Vilela 送出了一個補丁,以修復 src/backend/statistics/extended_stats.c 中未初始化的純量變數。