Pgpool-II 4.2.0,PostgreSQL 的連線池和語句複製系統,已發布。https://www.pgpool.net/docs/42/en/html/release-4-2-0.html
pgBadger v11.4,一個用 Perl 編寫的 PostgreSQL 日誌分析器和圖形工具,已發布。https://github.com/darold/pgbadger/releases
Database Lab 2.0,一種用於快速複製大型 PostgreSQL 資料庫以構建非生產環境的工具,已發布:https://postgres.ai/blog/dle-2.0-release/
pgagroal 1.0.0,一個用於 PostgreSQL 的高性能協定原生連線池,已發布。https://agroal.github.io/pgagroal/release/announcement/2020/11/24/pgagroal-1.0.0.html
http://archives.postgresql.org/pgsql-jobs/2020-11/
Planet PostgreSQL: http://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 撰寫
請在太平洋標準時間下午 3:00 前(週日)將新聞和公告提交至 david@fetter.org。
Tom Lane 推送了
允許多行 INSERT 為產生的欄位指定 DEFAULT。 可以使用 "INSERT INTO tab(generated_col) VALUES (DEFAULT)" 而不會產生錯誤。 但是,對於多行 VALUES 列表的等效情況總是會拋出錯誤,即使在每一行中都正確地使用了 DEFAULT。 修正此問題。 在此同時,改進關於 OVERRIDING SYSTEM/USER 值的附近邏輯的測試案例。Dean Rasheed 討論:https://postgr.es/m/9q0sgcr416t.fsf@gmx.us https://git.postgresql.org/pg/commitdiff/17958972fe3bb03454a4b53756b29d65dc285efa
改進與產生的欄位相關的兩個錯誤訊息的措辭。 明確說明只要插入的是 DEFAULT 預留位置,就可以「插入」到產生的欄位中。 此外,使用 ERRCODE_GENERATED_ALWAYS 代替 ERRCODE_SYNTAX_ERROR;似乎沒有任何理由使用不太具體的錯誤代碼。 討論:https://postgr.es/m/9q0sgcr416t.fsf@gmx.us https://git.postgresql.org/pg/commitdiff/d36228a9fcdccd57a7dc332572eb9837c7c301e6
重新命名「點嚴格位於點之上/之下」比較運算子。 歷史上,它們被稱為 >^ 和 <^,但這與類似的方框、多邊形和圓形運算子不一致,後者分別命名為 |>> 和 <<|。 更糟糕的是,>^ 和 <^ 名稱用於方框類型非嚴格之上/之下測試。 因此,發明新的運算子,遵循更常見的命名。 舊的運算子現在仍然可用,並且仍然被相關的索引運算子類別接受。 但是有一個棄用通知,所以也許有一天我們可以擺脫它們。 Emre Hasegeli,由 Pavel Borisov 審閱 討論:https://postgr.es/m/24348.1587444160@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0cc99327888840f2bf572303b68438e4caf62de9
移除不必要的 #include。 Justin Pryzby 討論:https://postgr.es/m/20201123205505.GJ24052@telsasoft.com https://git.postgresql.org/pg/commitdiff/3b9b01f75d6e2d7bf9e0bf8ec958ce420aa037c2
集中跳過無用 ereport/elog 呼叫的邏輯。 雖然 ereport() 和 elog() 本身在錯誤訊息級別太低而無法列印時非常便宜,但有些地方需要做大量工作才能完全呼叫這些巨集。 為了允許在沒有任何內容要列印時優化掉這種設定工作,請使 elog.c 匯出一個新的函數 message_level_is_interesting(elevel),該函數報告 ereport/elog 是否會執行任何操作。 在各種地方使用它,這些地方對 log_min_messages 等進行了臨時直接測試。 另外,教 ProcSleep 使用它以避免一些工作。 (可能還有其他地方可以有效地使用它;我沒有仔細搜尋。) 在 elog.c 中,重構一點以避免重複的策略設定邏輯副本。 在編寫該程式碼時,我們並未依賴內聯函數的可用性; 因此,為了提高效率,它有一些重複,我已將其刪除。 Alvaro Herrera 和 Tom Lane 討論:https://postgr.es/m/129515.1606166429@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/789b938bf2b8e38d0894261eae6bc84bbbb4714e
在內聯函數的宣告中放置「inline」標記。 我很難判斷 C 標準的文字是否要求這樣做,但我們確實有一些 buildfarm 成員在未完成此操作時會拋出警告。 c532d15dd 中的疏忽。https://git.postgresql.org/pg/commitdiff/ec05bafdbbf474bf0a1416772da31f9f1f27fa1e
避免使用多個 ParameterStatus 訊息來轟炸用戶端。 到目前為止,只要任何 GUC_REPORT 變數的有效值發生任何變更,我們就會立即向用戶端傳送 ParameterStatus 訊息。 在設計該功能時,這只是勉強可以接受的; 現在我們有了函數 SET 子句之類的東西,在查詢中,GUC_REPORT 變數可能會多次變更 --- 甚至可能最終回到其原始值,這是非常合理的用例。 幸運的是,我們的大多數 GUC_REPORT 變數不太可能經常變更; 但有一些提議正在進行中,以擴大該集合,甚至使其可由用戶配置。 因此,讓我們修正一些問題,以確保每個查詢每個變數產生的 ParameterStatus 訊息不超過一個,並且除非查詢結束時的值與我們上次報告的值不同,否則根本不傳送任何訊息。 討論:https://postgr.es/m/5708.1601145259@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2432b1a04087edc2fd9536c7c9aa4ca03fd1b363
文件:第 11.2 節「索引類型」的微小改進。 將每個索引類型的討論分成 <sect2>,以便在視覺上將它們更清楚地分開並且更易於找到。 改進標記,並進行一些小的措辭調整。 這也修正了一個對現在已棄用的點運算子 <^ 和 >^ 的錯誤引用。 Dagfinn Ilmari Mannsåker,由 David Johnston 和 Jürgen Purtz 審閱 討論:https://postgr.es/m/877dukhvzg.fsf@wibble.ilmari.org https://git.postgresql.org/pg/commitdiff/85b4ba73423b480902206ca04330c1cbea371c3c
在 psql 的 \d 指令中,不要截斷屬性的預設值。 過去,psql 會將欄位預設表達式的文字截斷為 128 個字元。 這與 describe.c 中的任何其他行為都不同,而且現在變得特別令人困惑,因為該限制僅適用於表達式本身,而不適用於可能包裝在其周圍的 "generated always as (...) stored" 文字。 我們在 git 歷史記錄中的挖掘表明,此限制的最初動機並非真正限制顯示寬度(正如我長期以來所假設的那樣),而是為了確保使用固定寬度的輸出緩衝區來儲存結果是安全的。 當然,該實作限制早已消失,但該限制仍然存在。 讓我們擺脫它。 在此同時,重新安排何時釋放輸出字串的邏輯,使其不那麼依賴於關於 attidentity 和 attgenerated 可能值的未聲明假設。 根據 David Turon 的錯誤 #16743。 回溯修補到 v12,GENERATED 是從那時開始的。 (可以說我們可以更進一步地回溯,但我猶豫是否要為此更改長期穩定的分支的行為。) 討論:https://postgr.es/m/16743-7b1bacc4af76e7ad@postgresql.org https://git.postgresql.org/pg/commitdiff/314fb9baeacb3426a5d9a26132aae8d828cc0ad7
修復最近在 LISTEN/NOTIFY 處理中引入的競爭條件。 Commit 566372b3d 修復了一些涉及並發 SimpleLruTruncate 呼叫的競爭條件,但它在 async.c 中引入了新的競爭條件。 一個新監聽的後端可能會嘗試讀取正在被截斷的 Notify SLRU 頁面,這可能會導致錯誤。 此外,QUEUE_TAIL 指標可能會被設定為不等於任何後端的佇列位置的值。 雖然這在 v13 及更高版本中相當無害(感謝 commit 51004c717),但在舊版本中,它導致佇列截斷邏輯幾乎永久停用,因此繼續使用 NOTIFY 會導致佇列填滿警告,並最終無法發送任何更多通知。 (重新啟動伺服器足以使其消失,但仍然非常令人不快。) 問題的核心在於混淆了 QUEUE_TAIL 代表佇列的「邏輯」尾部(即,最舊的仍然有用的資料)還是「物理」尾部(我們尚未截斷的最舊資料)。 為了修復,將其拆分為兩個變數。 QUEUE_TAIL 重新獲得其作為邏輯尾部的定義,並且我們引入一個新變數來追蹤最舊的未截斷頁面。 根據 Mikael Gustavsson 的報告。 與先前的修補程式一樣,回溯修補到所有支援的分支。 討論:https://postgr.es/m/1b8561412e8a4f038d7a491c8b922788@smhi.se https://git.postgresql.org/pg/commitdiff/9c83b54a9ccdb111ce693ada2309475197c19d70
清理 src/test/locale/ 中的測試之後的殘留。 257836a75 中的疏忽,該提交加入了這些測試。 https://git.postgresql.org/pg/commitdiff/b90a7fe15f78b1e2513cbcb27a33f4adc47bcd3d
Doc: 闡明 PQconnectdbParams() 的行為。 該文件遺漏了一個關鍵細節,即如果關鍵字陣列條目對應的值陣列條目為 NULL 或空字串,則會直接忽略該條目;它不會覆蓋先前取得的任何參數值。 (請參閱 conninfo_array_parse()。) 我原以為這會強制將設定回復為預設值,這就是導致我陷入錯誤 #16746 的原因;但它並沒有。 在此同時,我忍不住想做一些校對工作,無論是在 PQconnectdbParams() 的描述中還是在關於連線 URI 語法的章節中。 討論:https://postgr.es/m/931505.1606618746@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d5e2bdf7dda712a60234f08e036ec9de28085a2d
Heikki Linnakangas 推送了
將 copy.c 分割成四個檔案。 Copy.c 變得非常大。 將其分割成更易於管理的部分: - copy.c 現在僅包含 COPY FROM 和 COPY TO 共用的幾個函式。 - copyto.c 包含 COPY TO 的程式碼。 - copyfrom.c 包含初始化 COPY FROM 的程式碼,以及將元組插入正確表格的程式碼。 - copyfromparse.c 包含從用戶端/檔案/程式讀取,以及將輸入文字/CSV/二進位格式剖析成元組的程式碼。 所有這些部分都相當複雜,並且彼此相當獨立。 目前正在討論一個修補程式,以實作平行 COPY FROM,這將向 COPY FROM 路徑添加大量新程式碼,以及另一個修補程式,該修補程式將允許 INSERT 使用與 COPY FROM 相同的多重插入機制,這兩者都需要重構該程式碼。 有了這兩個修補程式,copy.c 中無論如何都會有大量的程式碼變動,所以現在似乎是進行此重構的好時機。 CopyStateData 結構也被分割。 所有格式選項,如 FORMAT、QUOTE、ESCAPE,都放在一個新的 CopyFormatOption 結構中,COPY FROM 和 TO 都使用它。 其他狀態資料保存在單獨的 CopyFromStateData 和 CopyToStateData 結構中。 經 Soumyadeep Chakraborty、Erik Rijkers、Vignesh C、Andres Freund 審閱 討論:https://postgres.tw/message-id/8e15b560-f387-7acc-ac90-763986617bfb%40iki.fi https://git.postgresql.org/pg/commitdiff/c532d15dddff14b01fe9ef1d465013cb8ef186df
修復了一些引用 copy.c 的註解。 在先前的提交中遺漏了這些。 https://git.postgresql.org/pg/commitdiff/68b1a4877ef54f5ee6e05c64876655dd13d2c73b
將每個聚合和每個轉換的重複尋找移至規劃器。 這具有的優點是,聚合的成本估算可以正確地計算轉換和最終函式的呼叫次數。 增加目錄版本,因為視圖可以包含 Aggrefs。 經 Andres Freund 審閱 討論:https://postgres.tw/message-id/b2e3536b-1dbc-8303-c97e-89cb0b4a9a48%40iki.fi https://git.postgresql.org/pg/commitdiff/0a2bc5d61e713e3fe72438f020eea5fcc90b0f0b
修復預期的輸出:聚合權限檢查的順序已變更。 Commit 0a2bc5d61e 更改了檢查聚合的最終和轉換函式權限的順序。 這顯示為此 sepgsql 迴歸測試中列印的 LOG 訊息順序的差異。 調整預期的輸出。 根據 rhinoceros 中的 buildfarm 失敗。 https://git.postgresql.org/pg/commitdiff/8818ad5b1557d42cd58e5196fac7084a2389bdad
Álvaro Herrera 推送了
使一些健全性檢查 elogs 更加詳細。 funcapi.c 中的一些健全性檢查沒有提及所有可能的失敗子句,這使那些手動修改目錄資料新增的開發人員感到困惑。 使錯誤更詳細,以避免浪費時間來精確定位錯誤。 根據 Craig Ringer 的抱怨。 經 Tom Lane 審閱 tgl@sss.pgh.pa.us 討論:https://postgr.es/m/CAMsr+YH7Kd87A3cU5m_wKo46HPQ46zFv5wesFNL0YWxkGhGv3g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/fe051291550ab88267ce3104e9833925bf757393
在罕見情況下,不要持有 ProcArrayLock 超過需要的時間。 在取消 autovacuum 工作程序時,我們持有 ProcArrayLock 以格式化除錯日誌字串。 我們可以通過儲存我們需要產生訊息的資料並在鎖定區域之外進行格式化來縮短此時間。 這並不是非常重要,因為它只發生在非常罕見的情況下:當後端執行死鎖偵測並且它恰好被執行 autovacuum 的 autovacuum 阻塞時。 儘管如此,沒有必要在 ProcArrayLock 處理中造成延遲,這在某些情況下可能非常繁忙。 同時,重新設計程式碼,以便我們僅在真正要使用字串時才列印字串,正如 Michael Paquier 所建議的那樣。 討論:https://postgr.es/m/20201118214127.GA3179@alvherre.pgsql 經 Michael Paquier 審閱 michael@paquier.xyz https://git.postgresql.org/pg/commitdiff/450c8230b1f7eed1e927c44fb710d80502bea1d2
避免並行索引中的偽造等待。在 CREATE INDEX CONCURRENTLY (CIC) 和 REINDEX CONCURRENTLY (RC) 的各種等待階段中,我們等待其他程序釋放其快照;這通常是為了正確性所必需的。然而,在其他資料表上執行 CIC 的程序不可能影響在「此」資料表上完成的 CIC 或 RC,因此我們不需要等待它們。此提交在 MyProc->statusFlags 中新增一個旗標,以指示目前程序正在執行 CIC,以便其他執行 CIC 或 RC 的程序在等待時可以忽略它。請注意,只有當索引不存取其他資料表時,此邏輯才有效。為了簡化起見,如果索引的欄位是表達式,或具有 WHERE 謂詞,我們避免設定該旗標。(有可能存在不存取其他資料表的表達式或部分索引,但要弄清楚這一點需要更多的工作。)此旗標也可能被執行 REINDEX CONCURRENTLY 的程序用來跳過;以及被 VACUUM 用於忽略 CIC 或 RC 中的程序,以計算 Xmin。這些將留待未來的提交。作者:Álvaro Herrera alvherre@alvh.no-ip.org 作者:Dimitry Dolgov 9erthalion6@gmail.com 審閱者:Michael Paquier michael@paquier.xyz 討論:https://postgr.es/m/20200810233815.GA18970@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/c98763bf51bf610b3ee7e209fc76c3ff9a6b3163
恢復鎖定層級以更新 statusFlags。還原 27838981be9d(保留一些註解)。根據討論,放寬用於此操作的鎖定層級似乎不安全;為了使其安全,必須在我們設定旗標的時間點和我們設定交易 Xid 的時間點之間存在記憶體屏障,這可能不會太糟;但讀取器端也必須存在屏障,從效能角度來看這可能會很糟糕。現在也許這種分析是錯誤的,並且由於某種原因 *是* 安全的,但要證明這一點並不容易。討論:https://postgr.es/m/20201118190928.vnztes7c2sldu43a@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/dcfff74fb16622898a9d1df33e530f477caab095
David Rowley 推送
定義 pg_attribute_cold 和 pg_attribute_hot 巨集。適用於支援 __has_attribute 和 __has_attribute (hot/cold) 的編譯器。gcc >= 5、clang >= 2.9 和 icc >= 17 支援 __has_attribute。後續提交將實作這些巨集的某些用法。作者:David Rowley 審閱者:Andres Freund、Peter Eisentraut 討論:https://postgr.es/m/CAApHDvrVpasrEzLL2er7p9iwZFZ%3DJj6WisePcFeunwfrV0js_A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/697e1d02f53f985992a4f479b0b08fca5c272c6c
改善 elog/ereport ERROR 呼叫中的編譯器程式碼佈局。在這裡,我們使用一些前置處理器技巧來誘導支援的編譯器佈局它們產生的程式碼,以便與 elog(ERROR)/ereport(ERROR) 呼叫位於同一分支中的程式碼從熱路徑中移開。實際上,這減少了熱程式碼的大小,意味著它可以位於更少的快取列上。在使用 pgbench 的 TPC-b 基準測試的高度 CPU 密集型工作負載中,已經觀察到 10-15% 的效能提升。這裡實現的效果與將錯誤條件放在 unlikely() 巨集中非常相似。例如;if (unlikely(x < 0)) elog(ERROR, "invalid x value"); 現在不需要在這裡使用 unlikely(),因為 elog 和 ereport 使用的通用巨集現在會看到 elevel >= ERROR,並使用 pg_attribute_cold 標記的 errstart() 版本。當 elevel < ERROR 或無法確定為常數時,將保持原始行為。作者:David Rowley 審閱者:Andres Freund、Peter Eisentraut 討論:https://postgr.es/m/CAApHDvrVpasrEzLL2er7p9iwZFZ%3DJj6WisePcFeunwfrV0js_A%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/913ec71d682e99852cc188a7edbdccd02d42b4b3
修正 __has_attribute 的不可移植用法。這應該可以修復 697e1d02f 造成的損壞,該損壞似乎會破壞 GCC 版本 < 5 的建置。根據 GCC 手冊,__has_attribute 是一個「特殊運算子」,必須在沒有前置處理器測試中的任何其他條件的情況下進行測試。根據 Greg Nancarrow 透過 GCC 手冊的建議提出 報告者:Greg Nancarrow 討論:https://postgr.es/m/CAJcOf-euSu8fhC10v476o9dqnjqKysVs1_vRms-_fvajpZ3kFw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/1fa22a43a56e1fe44c7bb3a3d5ef31be5bcac41d
整理 pg_attribute_hot 和 pg_attribute_cold 的定義。1fa22a43a 是針對我在 697e1d02f 中引入的可移植性問題的快速修復。1fa22a43a 向前置處理器邏輯添加了一些比我希望的更多的情況。Andres Freund 和 Dagfinn Ilmari Mannsåker 提出了一種更好的方法來執行此操作。順便說一句,也調整了這些巨集的唯一當前用法,以便巨集位於函數宣告中的函數傳回類型之前。這現在與函數的定義的作用相符。討論:https://postgr.es/m/20200625163553.lt6wocbjhklp5pl4@alap3.anarazel.de 討論:https://postgr.es/m/87pn43bmok.fsf@wibble.ilmari.org https://git.postgresql.org/pg/commitdiff/b0727ae99b7056ca88e9708c014a86f6e611d938
針對 MinGW 8.1 中 attribute((cold)) 編譯器錯誤的權宜之計。自從 697e1d02f 和 913ec71d6 推出以來,運行 MinGW 8.1 的 buildfarm 動物 walleye 一直存在問題。這似乎是組譯器中的一個錯誤,該錯誤已在後續版本中修復。目前,為了讓該動物再次呈綠色,讓我們只需在該編譯器上將 pg_attribute_cold 和 pg_attribute_hot 定義為空巨集。希望我們可以獲得該動物所有者的支持,以升級到較少錯誤的編譯器,並在稍後日期還原此操作。討論:https://postgr.es/m/286560.1606233316@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/687f6163447514c23b44a981540987013529a9ec
Michaël Paquier 推送
使用巨集而不是硬編碼的偏移量進行 LWLock 初始化。這使得程式碼更容易理解,因為初始化依賴於與已定義的一組等效巨集重疊的偏移量,這些巨集已在其他地方使用。作者:Japin Li 討論:https://postgr.es/m/MEYP282MB1669FB410006758402F2C3A2B6E00@MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/d03d7549b29236e300aceac0c22173cf19acc675
移除目錄函數 currtid()。currtid() 和 currtid2() 是一組未記錄的函數,其唯一已知的用戶是 Postgres ODBC 驅動程式,能夠檢索呼叫者給定的元組的最新 TID 版本。Postgres ODBC 使用的 currtid() 是一個快捷方式,能夠透過在元組插入後傳遞 OID 0(魔術值)來檢索載入到後端的最後一個 TID。此提交中將其移除,因為在驅動程式開始使用帶插入的「RETURNING ctid」之後,它已過時,該子句自 Postgres 8.2 以來就受到支援(無論如何,使用 RETURNING 對於效能更好,因為它減少了往返後端的次數)。驅動程式仍然使用 currtid2(),因此目前仍然存在。請注意,由於向後相容性原因,此函數保持其原始形狀。與包括 Andres Freund、Peter Eisentraut、Álvaro Herrera、Hiroshi Inoue、Tom Lane 和我自己在內的許多人討論後。Bump 目錄版本。討論:https://postgr.es/m/20200603021448.GB89559@paquier.xyz https://git.postgresql.org/pg/commitdiff/7b94e999606e2e2e10d68d544d49fc5a5d5785ac
Fujii Masao 推送
doc:從一些索引項目中刪除不必要的空格字元。以前,一些索引項目在文件中包含「 ,」(即,空格 + 逗號),如下所示。由於逗號前的空格字元是不必要的,因此此提交刪除了它,以與其他索引項目保持一致。parallel_leader_participation 組態參數 , 其他規劃器選項 作者:Fujii Masao 審閱者:Euler Taveira 討論:https://postgr.es/m/e87b4ddf-1498-2850-bf55-519df3928fd4@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/e522024bd8dd28a0f13dcccfd39170698f45c939
doc: 增加關於預備語句(prepared statement)重新分析與重新規劃的描述。當語句中使用的資料庫物件經過定義上的變更,或是它們的規劃器統計資訊(planner statistics)已經更新時,預備語句會被重新分析與重新規劃。前者之前已經有文件記錄,但後者之前沒有。本次提交將後者的描述加入到文件中。作者:Atsushi Torikoshi 審閱者:Andy Fan, Fujii Masao 討論:https://postgr.es/m/3ac82f4817c9fe274a905c8a38d87bd9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/4a36eab79a193700b7b65baf6c09c795c90c02c6
pg_stat_statements: 追蹤 pgss 條目被釋放的次數。如果觀察到的不同語句比 pg_stat_statements.max 還多,則關於執行次數最少的語句的 pg_stat_statements 條目會被釋放。本次提交使我們能夠追蹤這些條目被釋放的總次數。這個數字可以在本次提交新增的 pg_stat_statements_info 視窗中查看。它在調整 pg_stat_statements.max 參數時很有用。如果它很高,也就是說,這些條目被非常頻繁地釋放,這可能會導致效能下降,我們可以增加 pg_stat_statements.max 以避免這些頻繁的釋放。pg_stat_statements_info 視窗旨在顯示 pg_stat_statements 模組本身的統計資訊。目前它只有一個欄位 "dealloc" 表示條目被釋放的次數。但即將到來的修補程式將在視窗中新增其他欄位(例如,上次重置 pg_stat_statements 統計資訊的時間)。作者:Katsuragi Yuta, Yuki Seino 審閱者:Fujii Masao 討論:https://postgr.es/m/0d9f1107772cf5c3f954e985464c7298@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/9fbc3f318d039c3e1e8614c38e40843cf8fcffde
在 worker_spi 中使用標準的 SIGHUP 和 SIGTERM 訊號處理程序。之前 worker_spi 對於 SIGHUP 和 SIGTERM 使用了自訂的訊號處理程序。本次提交使 worker_spi 使用標準的訊號處理程序,以簡化程式碼。請注意,die() 在 worker_spi 中被用作標準的 SIGTERM 訊號處理程序,而不是 SignalHandlerForShutdownRequest() 或 bgworker_die()。先前,退出處理只能從主迴圈內部退出,而不能從它所呼叫的後端程式碼中退出。這就是為什麼這裡需要使用 die(),以便 worker_spi 可以在執行查詢時響應 SIGTERM 訊號。也許我們可以說 worker_spi 在查詢執行期間無法響應 SIGTERM 是一個錯誤。但由於 worker_spi 只是後台工作程式碼的一個範例,我們不進行回溯修補。感謝 Craig Ringer 報告和調查這個問題。作者:Bharath Rupireddy 審閱者:Fujii Masao 討論:https://postgr.es/m/CALj2ACXDEZhAFOTDcqO9cFSRvrFLyYOnPKrcA1UG4uZn9hUAVg@mail.gmail.com 討論:https://postgr.es/m/CAGRY4nxsAe_1k_9g5b47orA0S011iBoHsXHFMH7cg7HV0O1bwQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2a0847720ae6fa4180bfbe404e4e6bbf2f737708
在 test_shm_mq worker 中使用標準的 SIGTERM 訊號處理程序 die()。之前,test_shm_mq worker 使用精簡版的 die() 作為 SIGTERM 訊號處理程序。本次提交使其使用 die(),以簡化程式碼。就程式碼而言,die() 和先前使用的精簡版本之間的差異在於訊號處理程序是否可以直接呼叫 ProcessInterrupts()。但這種差異在後台工作程式中不存在,因為在 bgworker 中,DoingCommandRead 標誌永遠不會為真,並且 die() 永遠不會直接呼叫 ProcessInterrupts()。因此,test_shm_mq worker 可以安全地使用 die(),就像其他 bgworker 程序(例如,邏輯複製應用程式啟動器或 autoprewarm worker)目前所做的那樣。感謝 Craig Ringer 報告和調查這個問題。作者:Bharath Rupireddy 審閱者:Fujii Masao 討論:https://postgr.es/m/CAGRY4nxsAe_1k_9g5b47orA0S011iBoHsXHFMH7cg7HV0O1bwQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/ef848f4ac5a4bd072c65867186268775acfb4298
修正 CLUSTER 進度報告中掃描的區塊數。先前,pg_stat_progress_cluster 視窗將堆積掃描中的目前區塊號碼報告為掃描的堆積區塊數(即 heap_blks_scanned)。當啟用 synchronize_seqscans 時,這個報告的數字可能不正確,因為它允許堆積掃描從中間的區塊開始。當堆積掃描迴繞時,這可能導致 heap_blks_scanned 欄位中的迴繞。本次提交透過計算從堆積掃描開始的區塊到掃描中的目前區塊的區塊數,並在 heap_blks_scanned 欄位中報告該數字,來修正這個錯誤。此外,在 pg_stat_progress_cluster 視窗中,如果掃描的最後頁面為空,則先前 heap_blks_scanned 無法在堆積掃描階段結束時達到 heap_blks_total。本次提交透過在堆積掃描階段完成時,手動將 heap_blks_scanned 更新為與 heap_blks_total 相同的值,來修正這個錯誤。回溯修補到引入 pg_stat_progress_cluster 視窗的 v12 版本。報告者:Matthias van de Meent 作者:Matthias van de Meent 審閱者:Fujii Masao 討論:https://postgr.es/m/CAEze2WjCBWSGkVfYag001Rc4+-nNLDpWM7QbyD6yPvuhKs-gYQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3df51ca8b39f08ef19a77b9776f2547c86b70c49
Andrew Gierth pushed
Amit Kapila pushed
移除 ri_PlanCheck 頂部的過時註解。提交 5b7ba75f7f 移除了未使用的參數,但忘記更新附近的註解。作者:Li Japin 回溯修補到:13,即引入它的地方。討論:https://postgr.es/m/0E2F62A2-B2F1-4052-83AE-F0BEC8A75789@hotmail.com https://git.postgresql.org/pg/commitdiff/805b816305b62cb3e2670418ced8f7184a2d29c7
在更多地方使用列舉 (Enums) 來表示邏輯複製訊息類型。commit 644f0d7cc9 加入了邏輯複製訊息類型列舉,以取代字元文字 (character literals),但某些字元替換被忽略了。作者:Peter Smith 審閱者:Amit Kapila 討論:https://postgr.es/m/CAHut+PsTG=Vrv8hgrvOnAvCNR21jhqMdPk2n0a1uJPoW0p+UfQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3a8f73ec274bf8cc6066ea315f1a5a022214b02
修正 tablesync worker 中正在進行的交易之複製問題。Tablesync worker 在單一交易下運行,但在串流模式下,我們在 stream_stop、stream_abort 和 stream_commit 時提交 (commit) 了該交易。我們需要避免在 tablesync worker 的串流模式中提交交易。順道一提,將 apply_handle_stream_commit 中呼叫 process_syncing_tables 的動作移到清理串流檔案之後。這將允許在 tablesync worker 結束之前先完成檔案清理,否則這將由其中一個程序結束常式處理。作者:Dilip Kumar 審閱者:Amit Kapila 和 Peter Smith 測試者:Peter Smith 討論:https://postgr.es/m/CAHut+Pt4PyKQCwqzQ=EFF=bpKKJD7XKt_S23F6L20ayQNxg77A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0926e96c493443644ba8e96b5d96d013a9ffaf64
Thomas Munro 推送 (pushed)
Peter Eisentraut 推送 (pushed)
使 bind() 失敗時的錯誤提示更準確。"Is another postmaster already running ..." 這個提示只應針對實際上與其他東西已經使用該位址有關的錯誤印出。在其他情況下,它會產生誤導。因此,只有當 errno == EADDRINUSE 時才顯示該提示。此外,由於檔案系統命名空間中的 Unix 網域 socket 永遠不會為現有檔案回報 EADDRINUSE (它們只會覆寫它),因此提示中說 "If not, remove socket file \"%s\" and retry." 的部分永遠不會發生,因此將其移除。抽象命名空間中的 Unix 網域 socket 可以回報 EADDRINUSE,但在這種情況下,沒有檔案可以移除,因此該提示也不起作用。審閱者:Michael Paquier michael@paquier.xyz 討論:https://postgres.tw/message-id/flat/6dee8574-b0ad-fc49-9c8c-2edc796f0033@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/d5d91acdccae6b322a5634be2c66d62fc6b9a43d
新增對抽象 Unix 網域 socket 的支援。這是正常 Unix 網域 socket 的一種變體,它不使用檔案系統,而是使用一個單獨的 "抽象" 命名空間。在使用者介面上,這樣的 socket 由以 "@" 開頭的名稱表示。目前在 Linux 和 Windows 上支援。審閱者:Michael Paquier michael@paquier.xyz 討論:https://postgres.tw/message-id/flat/6dee8574-b0ad-fc49-9c8c-2edc796f0033@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/c9f0624bc2f544baacafa38e3797d5323401d039
doc: 修正錯字。作者:Justin Pryzby pryzby@telsasoft.com 討論:https://postgres.tw/message-id/20201121194105.GO24784@telsasoft.com https://git.postgresql.org/pg/commitdiff/2fbd786c3446b1bc90f396d3fa5f4614b0a57d89
tablefunc: 拒絕傳遞給 normal_rand() 的負數 tuple 數量。該函數將第一個參數(即要回傳的 tuple 數量)轉換為一個無符號整數,當傳遞一個負值時,這個整數會變成一個巨大的數字。這導致函數執行時間過長。相反地,拒絕負數值。(如果有人真的想要產生更多的結果列,他們應該考慮新增一個 bigint 或 numeric 變體。)同時,改進 SQL 測試以測試此函數回傳的 tuple 數量。作者:Ashutosh Bapat ashutosh.bapat@2ndquadrant.com 討論:https://postgres.tw/message-id/CAG-ACPW3PUUmSnM6cLa9Rw4BEC5cEMKjX8Gogc8gvQcT3cYA1A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f73999262ed6c40d9a7c3d7cccec7143d4d15287
Noah Misch 推送 (pushed)
Amul Sul 送出了另一個版本的補丁,以實作 ALTER SYSTEM READ {ONLY|WRITE}。
Daniel Vérité 送出了另一個版本的補丁,以在 libpq 中實作批次處理/管線化 (batch/pipelining)。
Justin Pryzby 和 Tomáš Vondra 交換了補丁,以在表達式上實作擴充的統計資料。
Álvaro Herrera 送出了另一個版本的補丁,以避免 BRIN 摘要中的錯誤,如果索引被同時重新索引,則可能會發生這些錯誤。
Álvaro Herrera 送出了一個補丁,以修復一個錯誤,該錯誤表現為 walsender 在關機期間卡住且 *沒有* 關機,因此阻止 postmaster 透過檢查 XLogRecPtrIsInvalid(replicatedPtr) 是否為 true 來完成關機週期。
Zeng Wenjing 送出了另一個版本的補丁,以實作全域暫存表。
Bharath Rupireddy 送出了另一個版本的補丁,以實作 postgres_fdw 連線快取 - 導致遠端連線持續存在直到本機連線結束。
Bharath Rupireddy 和 Heikki Linnakangas 交換了補丁,以使在 CREATE TABLE AS 中可以使用平行插入,在這種情況下是安全的。
Tomáš Vondra 送出了另一個版本的補丁,以使用非揮發性儲存體作為 WAL 緩衝區。
Takayuki Tsunakawa 送出了另一個版本的補丁,以新增外部表的批次插入。
Justin Pryzby 送出了另一個版本的補丁,以允許 INSERT SELECT 使用 BulkInsertState、使 INSERT SELECT 使用 multi_insert,並動態切換到 multi_insert 模式。
Michaël Paquier 送出了另一個版本的補丁,以重做 SHA2 和加密雜湊 API、將 cryptohash_openssl.c 切換為使用 EVP,並使 pgcrypto 使用核心中的 resowner 機制來處理 EVP。
Justin Pryzby 送出了另一個版本的補丁,以允許 CLUSTER、VACUUM FULL 和 REINDEX 可以在執行時變更表空間。
Keisuke Kuroda 送出了一個補丁,以修復一個錯誤,該錯誤表現為分割表上具有 FK 的巨大記憶體消耗,方法是減少 ri SPI 計劃雜湊的大小。
Konstantin Knizhnik 送出了另一個版本的補丁,以實作 libpq 的自定義壓縮。
Takamichi Osumi 送出了另一個版本的補丁,以可以停用 WAL 記錄,以加速批次載入。
Nathan Bossart 送出了另一個版本的補丁,以在 CHECKPOINT 中新增 FAST 選項。
Amit Kapila、Ajin Cherian 和 Peter Smith 交換了補丁,以實作兩階段交易的邏輯解碼。
David Rowley 送出了一個補丁,以將 pg_attribute_cold 和 pg_attribute_hot 定義為 minGW 8.1 上的空巨集,以避免該工具鏈中的錯誤。
Li Japin 送出了另一個版本的補丁,以允許透過新的 GUC (idle_session_timeout) 終止閒置的連線,並減少呼叫 setitimer() 的頻率。
Euler Taveira de Oliveira 送出了一個補丁,以將邏輯解碼訊息加入到 pgoutput,在串流傳輸時將 xid 加入到訊息中,解釋為何 LOGICAL_REP_MSG_MESSAGE 會被忽略,簡化 parse_output_parameters 函數,使其接收完整的 PGOutputData 而非零碎的資料片段,調整訊息的 in_streaming 狀態,並徹底修改測試以考慮所有這些。
Peter Eisentraut 送出了另一個修訂版本的補丁,以加入 result_format_auto_binary_types 設定。
Michaël Paquier 送出了另一個修訂版本的補丁,以修復一個問題,該問題表現為如果 pg_database tuple 包含 toast 屬性,vac_update_datfrozenxid 將會引發 "wrong tuple length" 錯誤。
Kyotaro HORIGUCHI 送出了另一個修訂版本的補丁,以修復 geometry 類型中 NaN 的處理。
Masahiko Sawada 送出了另一個修訂版本的補丁,以啟用多個外部伺服器的兩階段提交。
Daniel Gustafsson 送出了另一個修訂版本的補丁,使其能夠線上啟用和停用資料校驗和。
Alexander Korotkov 送出了一個補丁,以實作內建基礎設施,用於在自動測試套件中重現並行問題。此基礎設施的核心是「停止事件」,這些事件是程式碼中的特殊位置,可以在某些條件下停止執行。
Peter Eisentraut 送出了另一個修訂版本的補丁,以根據 SQL 標準在通用表表達式中實作 SEARCH 和 CYCLE 子句。
Thomas Munro 送出了另一個修訂版本的補丁,以減少 latches 發送的訊號數量、使用 SIGURG 而非 SIGUSR1 作為 latches 的訊號、使用 signalfd 作為 epoll latches,以及使用 EVFILT_SIGNAL 作為 kqueue latches。
Tom Lane 送出了另一個修訂版本的補丁,以在查詢結束時報告 GUC 變更。
Peter Smith 送出了一個補丁,以使用 enums 作為訊息類型。
David Zhang 送出了三個修訂版本的補丁,以將表格存取方法作為一個選項加入到 pgbench。
Anastasia Lubennikova 送出了一個補丁,以處理傳遞給 normal_rand() 的負數 tuple 數量。
Peter Eisentraut 送出了一個補丁,以在 pageinspect 中將 block number 參數變更為 bigint。
Bertrand Drouvot 送出了另外四個修訂版本的補丁,使其能夠通過新的 GUC log_recovery_conflict_waits 來記錄 standby 復原衝突等待。
Kasahara Tatsuhito 送出了另外三個修訂版本的補丁,以修復一個錯誤,該錯誤表現為具有大量表格時的 autovacuum 問題。
Masahiko Sawada 送出了另一個修訂版本的補丁,以將基本統計資訊加入到 pg_stat_wal 視窗。
Takamichi Osumi 送出了一個補丁,以防止 archive recovery 遇到來自 wal_level=minimal 的 WAL,並且伺服器繼續工作,這種情況可能導致資料無法複製。
Euler Taveira de Oliveira 送出了一個補丁,以在後端崩潰後移除暫存檔案,以避免可能由多次崩潰引起的 ENOSPC 狀況。
Pavel Borisov 送出了另一個修訂版本的補丁,以使用 SP-GiST 索引存取方法實作 covering indexes。
Kirk Jamison 送出了另一個修訂版本的補丁,以防止在復原期間使 smgrextend() 中的 block 無效、在 smgrnblocks() 中為快取 block 新增一個 bool 參數、通過避免在關係足夠小或要失效的 block 總數低於完整掃描的閾值時掃描整個緩衝池,來簡化復原期間的 DropRelFileNodeBuffers(),並且讓 DropRelFileNodesAllBuffers() 在關係足夠小或要失效的 block 數量低於完整掃描閾值時,跳過復原期間耗時的整個緩衝池掃描。
Krunal Bauskar 和 Alexander Korotkov 交換了補丁,以改善 ARM 上的 spinlock 實作。
Arne Roland 送出了三個修訂版本的補丁,以確保重新命名分割表格上的 trigger 也會重新命名分割區上的 trigger。
Bharath Rupireddy 送出了一個補丁,以修復 pg_workers 關閉的錯誤訊息,使其談論背景工作程序,而不是適用於其他情況的不存在的連線。
Stephen Frost 送出了另一個修訂版本的補丁,以在需要時將 GSS 資訊新增到連線授權記錄訊息。
Michael Banck 送出了一個補丁,以闡明 CREATEROLE 角色可以 GRANT 預設角色。
Ashutosh Bapat 和 Alexander Korotkov 交換了補丁,以使其易於列印 LSN。
Andreas Karlsson 送出了一個 PoC 補丁,以修復 inet/cidr 支援透過丟棄 btree_gist 提供的擴充功能中的 netmask 資訊而損壞的事實。
Pavel Stěhule 和 Justin Pryzby 交換了補丁,以使其能夠從檔案中讀取 pg_dump 要轉儲的表格。
Justin Pryzby 送出了另一個修訂版本的補丁,以使 CLUSTER ON 成為 pg_dump 中的一個單獨的轉儲物件、為分割表格實作 CLUSTER、將 indisclustered 的變更傳播到子/父物件、使父索引失效、在連接時使父索引叢集失效,並保留叢集化的分割索引的子物件上的 indisclustered。
Simon Riggs 送出了另一個修訂版本的補丁,以將 FAST_FREEZE 選項新增到 VACUUM。
Simon Riggs 送出了一個補丁,以實作 lazy VACUUM 的 one_freeze 然後 max_freeze。
Justin Pryzby 送出了另一個修訂版本的補丁,以使 pg_ls_* 顯示目錄和共享檔案集。
Justin Pryzby 送出了另一個修訂版本的補丁,以移除對 pg_dump 8.1 之前的 switch 行為的引用。
Justin Pryzby 送出了另一個修訂版本的補丁,以允許在分割表格上執行 CREATE INDEX CONCURRENTLY、為更多整合新增 SKIPVALID 標誌,並使 ReindexPartitions() 設定 indisvalid。
Paul A Jungwirth 送出了另外兩個修訂版本的補丁,以實作 multiranges。
Dean Rasheed 送出了另一個修訂版本的補丁,以改善 OR 子句的估計。
James Coleman 送出了一個補丁,如果在 gather merge 路徑的排序不夠充分時,會發生錯誤。
James Coleman 送出了另一個修訂版本的補丁,以確保 generate_useful_gather_paths 不會跳過未排序的子路徑、強制執行 generate_useful_gather_paths 中 pathkeys 的並行安全、不允許在 proactive sort 中使用 SRF、移除不必要的 volatile expr 目標搜尋,並記錄 prepare_sort_from_pathkeys 中的 find_em_expr_usable_for_sorting_rel。