本週人物:https://postgresql.life/post/julien_riou/
pspg 4.5.0 已發布,這是一個專為 PostgreSQL 設計的分頁器。https://github.com/okbob/pspg/releases/tag/4.5.0
pgAdmin4 5.1 已發布,這是一個適用於 PostgreSQL 的 Web 和原生 GUI 控制中心。https://www.pgadmin.org/docs/pgadmin4/5.1/release_notes_5_1.html
https://archives.postgresql.org/pgsql-jobs/2021-03/
Planet PostgreSQL: https://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 帶給您
請在太平洋標準時間 (PST8PDT) 星期日下午 3:00 之前將新聞和公告提交至 david@fetter.org。
Andrew Dunstan 推送了
不要在 Windows perl 中執行 recover crash_temp_files 測試。 這會恢復 commit 677271a3a125e294b33b891669f594a2c8cb36ce。「Unbreak recovery test on Windows」此測試在 Windows 上會掛起,並且補救問題的嘗試最多只能證明是脆弱的。 因此,我們僅在 Windows perl 上停用此測試。 (Msys perl 似乎完全沒問題)。 討論:https://postgr.es/m/5b748470-7335-5439-e876-6a88c951e1c5@dunslane.net https://git.postgresql.org/pg/commitdiff/ef823873840c9f341239e18633bdb0116d8d2738
允許PostgresNode的實例感知安裝。 目前,PostgresNode的實例在調用者的 PATH 中找到它們的 Postgres 可執行檔。 此修改允許知道它們應該使用的安裝路徑的實例,並且該模組適當地調整調用 Postgres 可執行檔的方法的環境。 通過將安裝路徑傳遞給建構函數來激活此功能:my $node = PostgresNode->get_new_node('mynode', installation_path => '/path/to/installation'); 這使得許多事情變得更加容易,包括 . 測試第三方模組 . 一起測試不同版本的 postgres . 一起測試 postgres 的不同構建 討論:https://postgr.es/m/a94c74f9-6b71-1957-7973-a734ea3cbef1@dunslane.net Reviewed-By:Alvaro Herrera、Michael Paquier、Dagfinn Ilmari Mannsåker https://git.postgresql.org/pg/commitdiff/b34ca595abd697e716ce369ec1b58624bdd1c431
Tom Lane 推送了
使 compression.sql 回歸測試獨立於預設值。 如果安裝的 default_toast_compression 設定不是 'pglz',則此測試將在 "make installcheck" 中失敗。 使其能夠適應這種情況。 Dilip Kumar 討論:https://postgr.es/m/CAFiTN-t0w+Rc2U3S+y=7KWcLuOYNB5MfWeGdNa7+pg0UovVdcQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/fd1ac9a548966786cf7978e590be816c55936a50
使 configure 對 LZ4 的支持達到標準。 僅僅將 pkg_config 結果直接塞入我們的構建標誌是不可以的,原因有幾個
這未能保持 CPPFLAGS 和 CFLAGS 之間以及 LDFLAGS 和 LIBS 之間的分隔。 (我相信 CPPFLAGS 角度是使用 MacPorts 的 liblz4 構建時報告警告訊息的原因。) * 如果 pkg_config 發出除 -I/-D/-L/-l 開關之外的任何內容,我們極不可能吸收這些內容。 這更有可能破壞構建而不是做任何有用的事情。 (即使是 -D 情況也值得懷疑;但我們正在為 libxml2 執行此操作,因此我保留了它。) 此外,跳過執行 AC_CHECK_LIB 探測是不可以的,topminnow 最近的構建失敗證明了這一點; 應該在配置時捕獲它。 以 configure 的 libxml2 支持為模型修復此問題。 似乎有人忽略了 autoheader 運行。 討論:https://postgr.es/m/20210119190720.GL8560@telsasoft.com https://git.postgresql.org/pg/commitdiff/4d399a6fbeb720b34d33441330910b7d853f703d
修復 ATExecSetCompression() 中的各種愚蠢之處。 直接在 syscache 條目上塗寫是不可以的。 釋放條目後繼續訪問它也是不可以的。 此外,擺脫未使用的局部變量。 根據 valgrind 測試。 https://git.postgresql.org/pg/commitdiff/ac897c483485d3858ada23ca49650a0f2742a50f
刪除 <lz4/lz4.h> 的無用配置探測。 這似乎只是從其他標頭檢查中複製粘貼而來的。 但是我們的 C 代碼完全沒有準備好支持這樣的標頭名稱,因此尋找它只會浪費週期。 如果我們確實需要支持它,則需要一些 #ifdef。 (在 codesearch.debian.net 上快速瀏覽一下會發現一些引用 lz4/lz4.h 的套件;但它們僅使用該拼寫,並且似乎打算引用它們自己的副本,而不是系統級安裝的 liblz4。 沒有證據表明需要此拼寫的獨立安裝。) 討論:https://postgr.es/m/457962.1616362509@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2c75f8a612b207c7d36e5dc73317dc9ab6fb29d4
對 TOAST 相關的宏進行主要外觀上的調整。 bbe0a81db 的作者沒有完全理解像 SOMETHING_4B_C 這樣的命名宏僅用於 postgres.h 中的內部 endianness 相關細節。 為打算在其他地方使用的宏選擇更清晰的名稱。 稍微重新排列 postgres.h,以闡明這些內部宏和打算更廣泛使用的宏之間的分隔。 此外,避免使用術語 "rawsize" 表示真正的解壓縮大小; 我們使用 "extsize" 表示它,因為 "rawsize" 通常表示包括標頭在內的總 Datum 大小。 在比較這些含義之一與另一個含義的測試中,此選擇似乎特別不幸。 此修補程式包括幾個非純粹外觀上的更改:確保對齊壓縮方法的偏移是不帶正負號的(今天並不關鍵,但當存在壓縮方法 2 時將會如此),並修復 VARATT_EXTERNAL_GET_COMPRESSION(現在為 VARATT_EXTERNAL_GET_COMPRESS_METHOD)的錯誤定義,其調用者僅是意外地起作用。 討論:https://postgr.es/m/574197.1616428079@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aeb1631ed207cef2d80e20f79eb52c72f03bca7d
對大於物件大小的切片請求進行短路。 substring(),以及其他調用者,不小心傳遞的切片長度不超過 datum 的實際大小。 由於 toast_decompress_datum_slice 的子項將 palloc 請求的切片長度,因此這可能會浪費記憶體。 此外,仔細研究 liblz4 文檔表明,它依賴於調用者不要求超過正確數量的解壓縮數據; 這與 liblz4 1.8.3 的觀察到的錯誤行為相符。 如果切片請求 >= datum 的解壓縮大小,則通過切換到正常的完整解壓縮代碼路徑來避免這些問題。 Tom Lane 和 Dilip Kumar 討論:https://postgr.es/m/507597.1616370729@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/063dd37ebc7644e8db6419565b50dca019e69e86
避免在完成堆重寫時可能發生的崩潰。 `end_heap_rewrite` 在執行最終的 `smgrimmedsync` 之前,沒有仔細確保目標關係在 smgr 層級已開啟。在一般情況下,這不成問題,因為它會在重寫過程中較早開啟。然而,透過使用啟用 `CLOBBER_CACHE_ALWAYS` 的方式重新叢集一個空的資料表,可以重現崩潰。儘管這種精確的場景在 v13 中不會崩潰,但我認為這是不相關的規劃器變更的一個偶然結果,並且該問題很可能仍然可以透過其他測試案例觸發。造成此故障的真正直接原因是 commit c6b92041d,它將對 `heap_sync` 的呼叫(它謹慎地開啟 smgr)替換為直接呼叫 `smgrimmedsync`。因此,將修補程式回溯至 v13。 Amul Sul,根據 Neha Sharma 的報告;我進行了外觀上的變更和測試案例。 討論: https://postgr.es/m/CANiYTQsU7yMFpQYnv=BrcRVqK_3U3mtAzAsJCaqtzsDHfsUbdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9d523119fd38fd205cb9c8ea8e7cceeb54355818
再次修正 psql 的 \connect 命令。 Jasen Betts 報告了 commit 85c54287a 的另一個意外的副作用:使用 "\c service=whatever" 重新連線沒有產生預期的結果。原因是從 PQconndefaults() 的輸出開始,實際上允許環境變數(例如 PGPORT)覆蓋服務檔案中的條目,而正常的優先順序是相反的。完全不使用 PQconndefaults 將需要在 do_connect 的參數設定中建立第三個主要程式碼路徑,所以我真的不想以這種方式來修正它。但是我們可以讓邏輯有效地忽略所有預設值,只需要再幾行程式碼。此修補程式不會變更 "\c -reuse-previous=on service=whatever" 的行為。這與 85c54287a 之前的情況有很大的不同,因為會重新使用更多參數,因此服務條目無法替換它們。但我認為這(主要)是故意的。無論如何,由於 libpq 不會報告它從何處取得參數值,因此很難採取不同的做法。根據 Jasen Betts 提出的錯誤 #16936。與之前的修補程式一樣,將修補程式回溯至所有支援的分支。(不幸的是,9.5 現在已停止支援,因此此問題不會在那裡得到修正。)討論: https://postgr.es/m/16936-3f524322a53a29f0@postgresql.org https://git.postgresql.org/pg/commitdiff/ea80138545043c0cfcff8405b15626796f2695fe
Peter Geoghegan 推送了
回收在同一次 VACUUM 期間刪除的 nbtree 頁面。維護一個簡單的陣列,其中包含有關在 nbtree VACUUM 目前的 btvacuumscan() 呼叫期間刪除的頁面的元資料。在 btvacuumscan() 結束時使用此元資料,嘗試將新刪除的頁面放入 FSM 中,而無需進一步延遲。屆時可能還不能安全地將任何頁面放入 FSM 中(它們可能不被認為是可回收的),但我們嘗試一下並沒有什麼損失,而且有很多好處。實際上,在清理較大的索引時,這很有可能奏效,因為掃描索引自然需要很長時間。此 commit 不會變更頁面回收不變量;它僅在現有設計的範圍內提高了頁面回收的效率。回收安全是 nbtree 對 Lanin & Shasha 稱為「drain technique」的實作的一部分。該設計恰好使用交易 ID(它們儲存在已刪除的頁面中),但這本身並不能將回收安全性的截止點與 VACUUM 使用的任何基於 XID 的截止點對齊(例如,OldestXmin)。所有重要的是其他後端是否可能觀察到樹狀結構中的各種不一致之處(他們無法僅透過向右移動來偵測和恢復)。回收安全純粹是維護物理資料結構的一致性(或表面上的一致性)的問題。請注意,執行一個涉及大範圍 DELETE 然後是 VACUUM VERBOSE 的簡單序列測試案例可能會顯示任何新刪除的 nbtree 頁面尚未可重用/可回收。這是在沒有任何並行 XID 指派的情況下所預期的。這是一個舊的實作限制。實際上,這不太可能使回收仍然不安全,至少對於較大的索引來說,在同一個 VACUUM 期間回收新刪除的頁面實際上很重要。此 commit 的一個重要高層目標(以及相關的最近 commit e5d8a999 和 9f3665fb)是使索引 AM 中的昂貴的延遲清理操作在一般情況下變得罕見。如果索引清理經常依賴於下一個 VACUUM 操作來完成目前操作開始的工作,那麼索引清理的總體行為就難以預測。這與正在進行的工作相關,該工作新增了一個 vacuumlazy.c 機制,以便在某些情況下跳過索引清理。任何使索引清理的實際行為更簡單和更線性的東西,也將使 vacuumlazy.c 中的自上而下的建模更加穩健。作者:Peter Geoghegan pg@bowt.ie 審閱人:Masahiko Sawada sawada.mshk@gmail.com 討論: https://postgr.es/m/CAH2-Wzk76_P=67iUscb1UN44-gyZL-KgpsXbSxq_bdcMa7Q+wQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9dd963ae2534e9614f0abeccaafbd39f1b93ff8a
nbtree VACUUM:應對有錯誤的 opclass。教導 nbtree VACUUM 在頁面刪除嘗試失敗,「重新找到」其子/目標頁面的下行連結的情況下,繼續進行清理。沒有充分的理由將其視為不可恢復的錯誤。但是有一個很好的理由不這樣做:在這一點上繼續進行可消除 VACUUM 僅由於使用者定義的運算子類別程式碼的錯誤行為而沒有取得進展的任何疑問。 討論: https://postgr.es/m/CAH2-Wzma5G9CTtMjbrXTwOym+U=aWg-R7=-htySuztgoJLvZXg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5b861baa550a369e04bf67fbe83f3a5a8c742fb4
Michaël Paquier 推送了
修正在具有 2PC 交易的檢查點中的時間軸指派。任何由檢查點發現仍然處於準備狀態的交易,其狀態資料都是從 PREPARE TRANSACTION 產生的 WAL 記錄中讀取的,然後再移動到 pg_twophase/ 中的新位置。在讀取這些記錄時,WAL 讀取器使用回呼函數 read_local_xlog_page() 來讀取頁面,該頁面在系統的各個部分之間共享。自 1148e22a 以來,此回呼函數在恢復期間讀取記錄時引入了 ThisTimeLineID 的更新,這可能對串聯 WAL 發送者有所幫助。如果當從其記錄中讀取一些 2PC 資料時發生升級,則 ThisTimeLineID 的此更新會與檢查點發生不良互動,因為透過變更 ThisTimeLineID,任何後續 WAL 記錄都將寫入比升級的時間軸更舊的時間軸。這會導致一致性問題。例如,後續的伺服器重新啟動將導致在尋找有效的檢查點記錄時發生故障,從而導致 PANIC 等。此 commit 變更了讀取 2PC 資料的程式碼,以便在讀取 2PC 記錄後重設時間軸,以防止干擾檢查點的靜態狀態。直接在 read_local_xlog_page() 中執行相同的操作可能很誘人。但是,基於導致 1148e22a 的討論,使用者可能依賴於在恢復中讀取 WAL 記錄頁面時 ThisTimeLineID 的更新,因此變更此回呼可能會破壞一些目前正在工作的案例。新增了一個重現該問題的 TAP 測試,該測試依賴於 PITR 來精確地觸發具有仍然被追蹤的已準備交易的升級。根據與 Heikki Linnakangas、Kyotaro Horiguchi、Fujii Masao 和我本人的討論。作者:Soumyadeep Chakraborty, Jimmy Yih, Kevin Yeap 討論: https://postgr.es/m/CAE-ML+_EjH_fzfq1F3RJ1=XaaNG=-Jz-i3JqkNhXiLAsM3z-Ew@mail.gmail.com Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/595b9cba2ab0cdd057e02d3c23f34a8bcfd90a2d
簡化使用預期日誌檔案內容的 Kerberos TAP 測試。 Kerberos 的 TAP 測試依賴後端產生的日誌來檢查各種連線情境。為了確保給定的測試不會與先前測試產生的日誌內容重疊,測試套件依賴於具有日誌收集器和日誌檔案輪換的邏輯,以確保產生的日誌的唯一性,並帶有一個等待階段。 PostgresNode::issues_sql_like() 以更簡單的方式解決了針對預期模式解析日誌內容的問題,其中日誌檔案在檢查產生的內容之前被截斷,後端將其輸出發送到 pg_ctl 給定的日誌檔案中。 此提交將 Kerberos 測試套件切換為使用此方法,刪除任何等待階段並簡化整個邏輯,從而減少了程式碼。 如果測試中發生故障,由於 like() 的作用,日誌的內容仍然會在故障發生時顯示給使用者,因此這對除錯能力沒有影響。 我在審查一個不同的修補程式集時遇到了這個問題,該修補程式集旨在擴展 Kerberos 測試套件以檢查多個日誌模式,而不是現在的一個。 作者:Michael Paquier 審閱者:Stephen Frost, Bharath Rupireddy 討論:https://postgr.es/m/YFXcq2vBTDGQVBNC@paquier.xyz https://git.postgresql.org/pg/commitdiff/11e1577a576fec6307aa0bfcde7333e63f907fa7
修復 Windows 上 2PC 交易和 PITR 的新 TAP 測試。 595b9cb 增加的測試忘記了在 Windows 上,需要使用特定條目設定 pg_hba.conf(參見 PostgresNode::set_replication_conf),否則基本備份會失敗。 任何需要支援複寫的節點只需在初始化時傳遞 allows_streaming。 這會更新測試以執行此操作。 在此過程中稍微簡化了一些事情。 每個 buildfarm 成員 fairywren。 任何執行此測試的 Windows 主機都會失敗,我也重現了該問題。 向後移植:10 https://git.postgresql.org/pg/commitdiff/992d353a190c551db39bcab2dec0ecf14fbc7a40
修復 Windows 上 WAL 區段回收的並發問題。 此提交主要回復 aaa3aed,它將執行回收 WAL 區段的內部重新命名的常式切換為在 Windows 上使用 CreateHardLinkA() 加上 unlink(),而不是 rename()。 根據 Postgres 13 的多位使用者回報,這在使用 WAL 區段時會導致並發問題,主要表現為以下錯誤: LOG: could not rename file "pg_wal/000000XX000000YY000000ZZ": Permission denied(無法重新命名檔案 "pg_wal/000000XX000000YY000000ZZ": 權限不足) 這會退回到使用單個 rename() (實際上是 Windows 上的 pgrename()) 的邏輯。 事實證明,當我測試時,這個問題很難命中,只有在 archive_command 無法完成其工作時才會遇到一次,因此它對環境敏感。 在我們切換回單個 rename() 之後,此問題的回報者已經能夠確認情況有所改善。 為了檢查事情,我向回報者提供了一個基於 13.2 的已修補組建(其中 aaa3aed 已還原),以測試錯誤是否消失,以及一個未修補的 13.2 組建,以測試錯誤是否仍然出現(只是為了確保我沒有搞砸我的組建過程)。 特別感謝 Fujii Masao 指出看起來像是罪魁禍首的提交,並感謝所有回報者花時間測試我發送給他們的東西。 回報者:Andrus, Guy Burgess, Yaroslav Pashinsky, Thomas Trenz 審閱者:Tom Lane, Andres Freund 討論:https://postgr.es/m/3861ff1e-0923-7838-e826-094cc9bef737@hot.ee 討論:https://postgr.es/m/16874-c3eecd319e36a2bf@postgresql.org 討論:https://postgr.es/m/095ccf8d-7f58-d928-427c-b17ace23cae6@burgess.co.nz 討論:https://postgr.es/m/16927-67c570d968c99567%40postgresql.org 討論:https://postgr.es/m/YFBcRbnBiPdGZvfW@paquier.xyz 向後移植:13 https://git.postgresql.org/pg/commitdiff/909b449e00fc2f71e1a38569bbddbb6457d28485
在自動清理的詳細日誌中增加每個索引的統計資訊。 一旦關係的自動清理完成,如果達到 log_autovacuum_min_duration(或其關係選項)的閾值,則日誌會包含有關此關係狀態的更多資訊,例如關係的 VACUUM 操作、WAL 和系統使用的統計資訊內容。 此提交增加了有關關係索引統計資訊的更多資訊,每個索引產生一行日誌。 索引統計資訊已經計算出來了,但尚未在自動清理的上下文中列印出來。 在此過程中,進行了一些重構,以直接在 LVRelStats 中追蹤索引統計資訊,從而簡化了一些與並行 VACUUM 相關的常式。 作者:Masahiko Sawada 審閱者:Michael Paquier, Euler Taveira 討論:https://postgr.es/m/CAD21AoAy6SxHiTivh5yAPJSUE4S=QRPpSZUdafOSz0R+fRcM6Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5aed6a1fc214913de9ac69c1717dc64a2483e16d
稍微修改自動清理中為索引統計資訊產生的日誌的措辭。 使用 "remain" 會造成混淆,因為這意味著索引檔案可以縮小。 而是使用 "in total"。 根據與 Peter Geoghegan 的討論。 討論:https://postgr.es/m/CAH2-WzkYgHZzpGOwR14CScJsjaQpvJrEkEfkh_=wGhzLb=yVdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/99dd75fb99baa9188971cf47779ed8d7a5e6eb29
清理程式碼註解中的術語 "combo CID"。 在程式碼註解中,Combo CID 使用了不同的術語,因此將使用的術語與某些 README 中目前使用的術語統一起來。 作者:"Hou, Zhijie" 討論:https://postgr.es/m/1d42865c91404f46af4562532fdbea31@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/a1999a01bb56c5f5451116abe61b892b2eec5e49
Noah Misch 推送
使測試能夠承受 log_error_verbosity=verbose。 向後移植到 v13,其中引入了有問題的測試程式碼。 https://git.postgresql.org/pg/commitdiff/e3f4aec027891f794328050e62c9bbbe4ae02811
將類似的演算法合併到 roles_is_member_of() 中。 下一個提交將使兩個或三個演算法複雜化,因此請藉此機會進行整合。 沒有功能變更。 審閱者:John Naylor。 討論:https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/f687bf61ed4dc75ec074c387f848147da2097e13
新增 "pg_database_owner" 預設角色。 成員資格隱含地包括目前資料庫的所有者。 預計在樣板資料庫中使用。 一旦 pg_database_owner 在樣板中擁有權限,從該樣板實例化的每個資料庫的所有者都將行使這些權限。 審閱者:John Naylor。 討論:https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com https://git.postgresql.org/pg/commitdiff/a14a0118a1fecf4066e53af52ed0f188607d0c4b
Fujii Masao 推送
pgbench: 改善 \sleep 命令中的錯誤處理。本次提交改善了 pgbench 的 \sleep 命令,使其能更正確地處理以下三種情況。(1) 當 \sleep 命令中只指定一個參數且該參數不是數字時,之前 pgbench 會報告一個令人困惑的錯誤訊息,例如 "unrecognized time unit, must be us, ms or s"。本次提交修正了這個問題,改為報告更正確的錯誤訊息,例如 "invalid sleep time, must be an integer"。(2) 當 \sleep 命令中指定兩個參數且第一個參數不是數字時,之前 pgbench 會將該參數視為休眠時間 0。在這種情況下不會報告任何錯誤。本次提交修正了這個問題,使其在這種情況下會拋出錯誤。(3) 當一個變數被指定為 \sleep 命令中的第一個參數且該變數儲存了非數字值時,之前 pgbench 會將該參數視為休眠時間 0。在這種情況下不會報告任何錯誤。本次提交修正了這個問題,使其在這種情況下會拋出錯誤。作者:Kota Miyake 審閱人:Hayato Kuroda, Alvaro Herrera, Fujii Masao 討論:https://postgr.es/m/23b254daf20cec4332a2d9168505dbc9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8c6eda2d1c926be76baa79c28521275323bd26fd
pg_waldump: 修正每筆記錄統計中的錯誤。pg_waldump --stats=record 使用 RmgrId 和記錄的 xl_info 欄位的四個位元的組合來識別記錄。但 XACT 記錄使用這四個位元的第一個位元作為可選的旗標變數,而後面的三個位元用於 opcode 來識別記錄。因此,之前相同類型的 XACT 記錄可能會有不同的四個位元(三個位元相同但第一個位元不同),這可能導致 pg_waldump --stats=record 為相同的 XACT 記錄顯示兩行每筆記錄的統計資訊。這是一個錯誤。本次提交變更了 pg_waldump --stats=record,使其僅以不同的方式處理 XACT 記錄,即,僅針對 XACT 記錄,從 xl_info 中篩選出 opcode,並使用 RmgrId 和這三個位元的組合作為記錄的識別符。對於其他記錄,仍然使用 xl_info 欄位的四個位元。回溯修補到所有支援的分支。作者:Kyotaro Horiguchi 審閱人:Shinya Kato, Fujii Masao 討論:https://postgr.es/m/2020100913412132258847@highgo.ca https://git.postgresql.org/pg/commitdiff/51893c8463501fc9a38e39cc097773dbdfb9db82
將 WalReceiverWaitStart 等待事件的類型從 Client 變更為 IPC。先前此等待事件的類型為 Client。但當報告此等待事件時,walreceiver 程序正在等待啟動程序設定串流複製的初始資料。它並非在等待連接到使用者應用程式或 walsender 的 Socket 上的任何活動。因此,本次提交將 WalReceiverWaitStart 等待事件的類型變更為 IPC。作者:Fujii Masao 審閱人:Kyotaro Horiguchi 討論:https://postgr.es/m/cdacc27c-37ff-f1a4-20e2-ce19933abfcc@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/1e3e8b51bda8ddd59984230f876f199c9ce3166a
記錄 GetNewOidWithIndex() 無法多次找到未使用 OID 的情況。GetNewOidWithIndex() 會逐一產生新的 OID,直到找到關聯中不存在的 OID 為止。如果存在很長的連續現有 OID,GetNewOidWithIndex() 需要在迴圈中重複多次才能找到未使用的 OID。由於 TOAST 表可以有大量條目,並且可能存在這種長串的 OID,因此存在需要多次迭代才能找到 TOAST 表中不存在的新 OID 的情況。此外,如果所有(即 2^32)個 OID 都已被使用,GetNewOidWithIndex() 將進入類似忙碌迴圈的狀態,並重複迭代,直到至少一個 OID 被標記為未使用。有一些報告的問題是由 GetNewOidWithIndex() 中大量迭代引起的。例如,當將十億筆記錄插入到表中時,所有執行該插入操作的後端都在某個時間點掛起,並佔用 100% 的 CPU 使用率。之前沒有簡單的方法可以檢測到 GetNewOidWithIndex() 無法多次找到未使用的 OID。因此,例如,需要取得掛起的後端的 gdb 完整回溯,才能調查該問題。這很不方便,並且在某些生產環境中可能無法使用。為了提供簡單的方法,本次提交使 GetNewOidWithIndex() 記錄迭代次數超過 GETNEWOID_LOG_THRESHOLD 但尚未在關聯中找到未使用的 OID 的情況。此外,本次提交使其以指數級增加的時間間隔重複記錄,直到迭代次數超過 GETNEWOID_LOG_MAX_INTERVAL,並使其最終以每 GETNEWOID_LOG_MAX_INTERVAL 的間隔重複記錄,除非找到未使用的 OID。使用這些巨集變數是為了避免在伺服器日誌中填滿類似的訊息。在 pgsql-hackers 的討論中,還有另一個想法是透過等待事件報告 GetNewOidWithIndex() 中大量的迭代。但是由於 GetNewOidWithIndex() 會遍歷索引以尋找未使用的 OID,這將執行 I/O、取得鎖定等等,這將覆寫等待事件並在完成後將其重設為無。因此,這個想法效果不佳,我們沒有採用它。作者:Tomohiro Hiramitsu 審閱人:Tatsuhito Kasahara, Kyotaro Horiguchi, Tom Lane, Fujii Masao 討論:https://postgr.es/m/16722-93043fb459a41073@postgresql.org https://git.postgresql.postgresql.org/pg/commitdiff/7fbcee1b2d5f1012c67942126881bd492e95077e
將等待事件 WalrcvExit 重新命名為 WalReceiverExit。Commit de829ddf23 新增了等待事件 WalrcvExit。但其名稱與其他等待事件(例如 WalReceiverMain 或 WalReceiverWaitStart 等)不一致。因此,本次提交將 WalrcvExit 重新命名為 WalReceiverExit。作者:Fujii Masao 審閱人:Thomas Munro 討論:https://postgr.es/m/cced9995-8fa2-7b22-9d91-3f22a2b8c23c@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/84007043fc1b1be68dad5d0a78269347c12094b6
改善復原期間連線遭拒的錯誤訊息。先前,當啟動封存復原或備用伺服器,且達到一致的復原狀態,但 hot_standby 設定為關閉時,用戶端連線時的錯誤訊息為「資料庫系統正在啟動」,這是不必要地令人困惑,且也不是很準確。本次提交改善了復原期間連線遭拒的錯誤訊息,如下所示,以便使用者立即知道他們的伺服器已配置為拒絕這些連線。
如果停用 hot_standby,當客戶端在封存復原或待機伺服器執行時嘗試連線,會輸出錯誤訊息 "the database system is not accepting connections" (資料庫系統不接受連線),以及詳細訊息 "Hot standby mode is disabled." (已停用熱備援模式)。- 如果啟用 hot_standby,當客戶端在一致的復原狀態達成且 postmaster 開始接受唯讀連線之前嘗試連線,會輸出錯誤訊息 "the database system is not yet accepting connections" (資料庫系統尚未接受連線),以及詳細訊息 "Consistent recovery state has not been yet reached." (尚未達成一致的復原狀態)。此提交不會變更在一般伺服器啟動和當機復原期間的連線拒絕錯誤訊息 "the database system is starting up" (資料庫系統正在啟動中)。因為它仍然適用於這些情況。作者:James Coleman 審閱者:Alvaro Herrera, Andres Freund, David Zhang, Tom Lane, Fujii Masao 討論:https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/df9384492b89aac370ab9d12eb89375aeb38a1d4
修正 WAL 重播 COMMIT_TS_SETTS 記錄中的錯誤。先前,COMMIT_TS_SETTS 記錄的 WAL 重播使用參數 write_xlog=true 呼叫 TransactionTreeSetCommitTsData(),這會產生並寫入新的 COMMIT_TS_SETTS 記錄。這在復原期間是不應該發生的。此提交修正了 COMMIT_TS_SETTS 記錄的 WAL 重播,使其使用 write_xlog=false 呼叫 TransactionTreeSetCommitTsData(),並且在復原期間不產生新的 WAL。向後移植到所有支援的分支。回報者:lx zou zoulx1982@163.com 作者:Fujii Masao 審閱者:Alvaro Herrera 討論:https://postgr.es/m/16931-620d0f2fdc6108f1@postgresql.org https://git.postgresql.org/pg/commitdiff/438fc4a39c3905b7af88bb848bc5aeb1308a017d
Robert Haas 推送
針對可設定的 TOAST 壓縮進行更多程式碼清理。移除未使用的巨集。修正 TOAST 壓縮方法是由 OID 還是 char 識別的混淆。Justin Pryzby 討論:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/226e2be3876d0bda3dc33d16dfa0bed246b7b74f
文件:修正與可設定的 TOAST 壓縮相關的遺漏。先前,default_toast_compression GUC 未被記錄,pg_dump 的新 --no-toast-compression 選項也未被記錄。Justin Pryzby 和 Robert Haas 討論:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/24f0e395ac5892cd12e8914646fe921fac5ba23d
在 CREATE 或 ALTER TABLE 中,針對無效的 TOAST 壓縮產生錯誤。先前的程式碼將無效的壓縮方法名稱視為等同於預設值,這肯定是不對的。Justin Pryzby 討論:http://postgr.es/m/20210321235544.GD4203@telsasoft.com https://git.postgresql.org/pg/commitdiff/a4d5284a10b5096585f1bbf1bf723954e9d6c2e0
改進 pg_amcheck 的 TAP 測試 003_check.pl。停用 autovacuum,因為我們不希望它針對故意損毀的表執行。此外,在損毀表之前,運行 pg_amcheck 並確保它通過。否則,如果我們檢查損毀的表時發生一些意外情況,就不太清楚在我們損毀它們之前是否也會發生這種情況。Mark Dilger 討論:http://postgr.es/m/AA5506CE-7D2A-42E4-A51D-358635E3722D@enterprisedb.com https://git.postgresql.org/pg/commitdiff/87d90ac61fa113ffc886efcdb391c522c1982991
整理更多與可設定的 TOAST 壓縮相關的細節。將 default_toast_compression GUC 更改為枚舉而不是字串。早期,未提交的補丁版本支援使用 CREATE ACCESS METHOD 向正在運行的系統添加新的壓縮方法,但在提交之前放棄了這個想法。因此,我們也可以簡化 GUC 處理,這具有改進錯誤訊息的良好副作用。在更新文件以反映新的 GUC 類型時,也將其移回列表中的正確位置。我在修改成為 commit 24f0e395ac5892cd12e8914646fe921fac5ba23d 的內容時移動了這個,但顯然預期的順序是「字母順序」而不是「Robert 認為看起來不錯的順序」。重新調整事物以避免讓 access/toast_compression.h 依賴於 utils/guc.h,這樣我們就不會最終讓每個包含它的文件也都依賴於一個很大程度上不相關的東西。將一些內聯函數移回 C 原始碼文件中,部分原因是為了減少依賴關係,部分原因只是為了避免混亂。一些非常小的外觀修正。原始補丁由 Justin Pryzby 提供,但經過我大量編輯,並由他和 Tom Lane 進行反向審閱。討論:http://postgr.es/m/CA+TgmoYp=GT_ztUCeZg2i4hkHAQv8o=-nVJ1-TKWTG1zQOmOpg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e5595de03ec6ce60afde980ae05e9353a1501fdf
修正 TOAST 壓縮與表達式索引的交互。之前,嘗試壓縮一個要插入到表達式索引中的值會崩潰。Dilip Kumar,經過我的一些編輯。Jaime Casanova 報告。討論:http://postgr.es/m/CAJKUy5gcs0zGOp6JXU2mMVdthYhuQpFk=S3V8DOKT=LZC1L36Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5db1fd7823a1a12e2bdad98abc8e102fd71ffbda
Tomáš Vondra 推送
將 bsearch_arg 移至 src/port。到目前為止,bsearch_arg 函數僅在擴展統計資訊程式碼中使用,因此它是在該程式碼中定義的。但是我們已經在 src/port 中有 qsort_arg,所以讓我們將它移到它旁邊。 https://git.postgresql.org/pg/commitdiff/bfa2cee784125047771db2768fcf7f04d8bd6bb4
一次將所有掃描鍵傳遞給 BRIN consistent 函數。此提交變更了我們如何將掃描鍵傳遞給 BRIN consistent 函數的方式。現在,我們不是一個一個地傳遞它們,而是將給定屬性的所有掃描鍵一次傳遞。這使得 consistent 函數更加複雜,因為它必須循環遍歷鍵,但它確實允許更精細的 opclass 使用多個鍵來更有效地消除範圍。現有的 BRIN opclass(minmax、inclusion)並沒有真正從這個變更中受益。主要目的是允許未來的 opclass 從一次看到所有鍵中受益。這確實變更了 BRIN API,因為 consistent 函數的簽名發生了變化(一個帶有掃描鍵數的新參數)。因此,這會破壞現有的 opclass,並且需要支援不同 PostgreSQL 版本的程式碼的兩種變體。我們考慮過支援 consistent 的兩種變體,但我們決定不這樣做。首先,還有另一個補丁將 NULL 值的處理從 opclass 中移出,這意味著无论如何都需要更新 opclass。其次,我們不知道任何核心外的 BRIN opclass,因此似乎不值得增加額外的複雜性。由於 pg_proc 的變更,需要增加 catversion。作者:Tomas Vondra tomas.vondra@postgresql.org 審閱者:Alvaro Herrera alvherre@alvh.no-ip.org 審閱者:Mark Dilger hornschnorter@gmail.com 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:John Naylor john.naylor@enterprisedb.com 審閱者:Nikita Glukhov n.gluhov@postgrespro.ru 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/a1c649d889bdf6e74e9382e1e28574d7071568de
將 IS [NOT] NULL 處理從 BRIN 支援函數中移出。IS [NOT] NULL 子句的處理與 opclass 無關,並且在 minmax 和 inclusion 中,大多數程式碼完全相同。因此,將程式碼從支援程序移到 AM。這簡化了程式碼 - 尤其是支援程序 - 相當多,因為它們根本不需要關心 NULL 值和標誌。這也意味著可以在不調用支援程序的情況下評估 IS [NOT] NULL 子句。作者:Tomas Vondra tomas.vondra@postgresql.org 作者:Nikita Glukhov n.gluhov@postgrespro.ru 審閱者:Nikita Glukhov n.gluhov@postgrespro.ru 審閱者:Mark Dilger hornschnorter@gmail.com 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:Masahiko Sawada masahiko.sawada@enterprisedb.com 審閱者:John Naylor john.naylor@enterprisedb.com 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/72ccf55cb99c6450dfb77f2f8f4a28b5c049ef7a
最佳化 bringetbitmap 中的記憶體配置。 bringetbitmap 函式會為各種用途配置記憶體,這可能會相當耗費資源,取決於掃描鍵的數量。 不要分別配置它們,而是配置一個位元組記憶體塊,並根據需要將其切割成更小的部分 - 所有這些部分都具有相同的生命週期,並且可以節省大量的 CPU 和記憶體開銷。 作者:Tomas Vondra tomas.vondra@postgresql.org 審閱者:Alvaro Herrera alvhre@alvh.no-ip.org 審閱者:Mark Dilger hornschnorter@gmail.com 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:Masahiko Sawada masahiko.sawada@enterprisedb.com 審閱者:John Naylor john.naylor@enterprisedb.com 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/8e4b332e88b8339408a3aa8c62bc93d96b67c808
使用正確的統計資訊種類拼寫。 一些錯誤訊息和註解使用了「statistic kind」,而不是正確的「statistics kind」。 修復並回溯到 10,即引入擴充統計資訊的版本。 Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/a5f002ad9a2ddb501148a12281efbaacec6f6397
在 bootstrap 中將 Typ 從陣列轉換為列表。 與普通陣列相比,釋放和重新載入列表更容易且更方便。 這將有助於允許目錄包含複合類型。 作者:Justin Pryzby 審閱者:Dean Rasheed, Tomas Vondra 討論:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/e1a5e65703ce884529340819f6268d24f43ef8f7
允許在目錄 bootstrap 中使用複合類型。 在目錄 bootstrap 期間解析類型時,如果找不到類型,請嘗試重新載入 pg_type 內容。 這允許目錄包含複合類型,例如其他目錄的列類型。 作者:Justin Pryzby 審閱者:Dean Rasheed, Tomas Vondra 討論:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/79f6a942bdb958fbd7ef6870d5bf2e3cefb65da5
移除不必要的 pg_amproc BRIN minmax 條目。 BRIN minmax 操作類別包括具有不匹配的左右類型的 amproc 條目,但這些條目是不必要的。 操作類別只需要交叉類型運算符,而不是交叉類型支持程序。 在嘗試在擴展中定義等效的 BRIN 運算符系列時發現。 Catversion 增加,因為 pg_amproc 發生了變更。 作者:Tomas Vondra 審閱者:Alvaro Herrera 討論:https://postgr.es/m/78c357ab-3395-8433-e7b3-b2cfcc9fdc23%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/a68dfa27d42fb7b7611fd1206d2356fc124ed390
支援舊版本的 BRIN consistent 函式簽章。 Commit a1c649d889 透過新增一個新的必要參數來變更 BRIN consistent 函式的簽章。 將該參數視為可選參數(這會使變更不向後相容)的做法被拒絕,理由是核心外的擴充不多,因此不值得讓程式碼更複雜,最好在擴充中處理。 但是經過進一步考慮,這將會相當有問題,因為 pg_upgrade 只是轉儲目錄內容,並且相同版本的擴充需要在兩個 PostgreSQL 版本上都有效。 支援 consistent 函式的兩種變體(具有 3 個或 4 個引數)可以實現這一點。 簽章不是唯一變更的內容,因為 commit 72ccf55cb9 從支援程序中移除了對 IS [NOT] NULL 鍵的處理。 但是此變更是向後相容的 - 在擴充中處理鍵是不必要的,但無害。 consistent 函式將會執行一些不必要的工作,但應該非常便宜。 這也撤消了對現有操作類別(minmax 和 inclusion)的大部分變更,使它們再次使用舊簽章。 這應該可以簡化回溯。 Catversion 增加,因為 pg_amproc 發生了變更。 作者:Tomas Vondra tomas.vondra@postgresql.org 作者:Nikita Glukhov n.gluhov@postgrespro.ru 審閱者:Mark Dilger hornschnorter@gmail.com 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:Masahiko Sawada masahiko.sawada@enterprisedb.com 審閱者:John Naylor john.naylor@enterprisedb.com 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/a681e3c107aa97eb554f118935c4d2278892c3dd
BRIN bloom 索引。 新增一個 BRIN 操作類別,使用 Bloom 篩選器來總結範圍。 使用新操作類別的索引僅允許等式查詢(類似於雜湊索引),但這對於 UUID、MAC 位址等資料效果很好,對於這些資料,範圍查詢不是很常見。 這也意味著索引適用於與表中的物理位置沒有很好關聯,甚至完全隨機的資料(這是現有 BRIN minmax 操作類別的常見問題)。 可以使用常見的 Bloom 篩選器參數(即所需的誤報率和每個頁面範圍的預期不同值的數量)來指定操作類別參數。 CREATE TABLE t (a int); CREATE INDEX ON t USING brin (a int4_bloom_ops(false_positive_rate = 0.05, n_distinct_per_range = 100)); 操作類別不直接對索引值進行操作,而是先計算 32 位雜湊,然後在雜湊值上建立 Bloom 篩選器。 衝突不應該是一個大問題,因為頁面範圍內的不同值的數量通常很小。 增加 catversion,因為各種目錄發生了變更。 作者:Tomas Vondra tomas.vondra@postgresql.org 審閱者:Alvaro Herrera alvhre@alvh.no-ip.org 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:Sokolov Yura y.sokolov@postgrespro.ru 審閱者:Nico Williams nico@cryptonector.com 審閱者:John Naylor john.naylor@enterprisedb.com 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com 討論:https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/77b88cd1bb9041a735f24072150cacfa06c699a3
BRIN minmax-multi 索引。 新增類似於現有 minmax 的 BRIN 操作類別,不同之處在於,總結不是將頁面範圍總結為單個 [min,max] 範圍,而是由多個範圍和/或點組成,允許存在間隙。 這允許更有效地處理與表中物理位置關聯性差和/或異常值的資料,對於這些資料,常規 minmax 操作類別往往效果不佳。 可以指定為每個頁面範圍保留的值的數量,可以是一個點或一個間隔邊界。 CREATE TABLE t (a int); CREATE INDEX ON t USING brin (a int4_minmax_multi_ops(values_per_range=16)); 在建立摘要時,這些值會組合成間隔,目標是最小化「覆蓋」(間隔長度之和),並使用支援程序計算兩個值之間的距離。 增加 catversion,因為各種目錄發生了變更。 作者:Tomas Vondra tomas.vondra@postgresql.org 審閱者:Alvaro Herrera alvhre@alvh.no-ip.org 審閱者:Alexander Korotkov aekorotkov@gmail.com 審閱者:Sokolov Yura y.sokolov@postgrespro.ru 審閱者:John Naylor john.naylor@enterprisedb.com 討論:https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com 討論:https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com https://git.postgresql.org/pg/commitdiff/ab596105b55f1d7fbd5a66b66f65227d210b047d
修復 BRIN minmax-multi 還原序列化中的對齊問題。 還原序列化未能確保正確的對齊,因為它假設它可以簡單地指向序列化值。 但是序列化忽略了對齊,並且僅複製有效位元組,以便使結果盡可能小。 這導致在對未對齊位址敏感的系統(如 sparc)或啟用了位址清理器的系統上發生故障。 透過複製序列化資料以確保正確的對齊來修復。 同時,修復了在大端機器上序列化的問題,使用了與擴充統計資訊相同的 store_att_byval/fetch_att 技巧。 討論:https://postgr.es/0c8c3304-d3dd-5e29-d5ac-b50589a23c8c%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/73b96bad4af8fd113a36e4633dd3312001c115dc
修正使用系統屬性時的 ndistinct 估計值。當使用擴展統計資訊估計群組數量時,程式碼會捨棄有關系統屬性的資訊。這導致一種奇怪的情況,即 `SELECT 1 FROM t GROUP BY ctid;` 可能會產生比 `SELECT 1 FROM t GROUP BY a, b, ctid;` 更高的估計值(等於 pg_class.reltuples),後者對 (a,b) 具有擴展統計資訊。透過保留有關系統屬性的資訊來修正此問題。全部回溯到 10,即引入擴展統計資訊的版本。作者:Tomas Vondra 回溯:10 https://git.postgresql.org/pg/commitdiff/33e52ad9a32929a6d14dfd98a8440d57028f2e3e
縮短 stats_ext 迴歸測試的持續時間。由於使用具有數千行的相當大的資料集,擴展統計資訊的迴歸測試花費了相當長的時間。到目前為止,這沒問題,但是隨著表達式統計資訊的測試,持續時間會變得有點過長。因此,減少將用於測試表達式的某些測試的大小,以保持持續時間在控制之下。在添加表達式統計資訊之前,在單獨的提交中完成,以清楚地表明預期會發生哪些估計值的變化。作者:Tomas Vondra 討論:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/98376c18f12e562421b5c77e619248e8b7aae3c6
表達式上的擴展統計資訊。允許在表達式上定義擴展統計資訊,而不僅僅是在簡單的欄位引用上。透過此提交,所有現有的擴展統計資訊種類都支援表達式,從而改進了相同類型的估計。一個簡單的範例可能如下所示:CREATE TABLE t (a int); CREATE STATISTICS s ON mod(a,10), mod(a,20) FROM t; ANALYZE t; 收集的統計資訊對於估計在 WHERE 或 GROUP BY 子句中具有這些表達式的查詢非常有用:SELECT * FROM t WHERE mod(a,10) = 0 AND mod(a,20) = 0;
SELECT 1 FROM t GROUP BY mod(a,10), mod(a,20); 這引入了新的內部統計資訊種類 'e' (expressions),當統計資訊物件定義包含任何表達式時,會自動建立該種類。這表示單一表達式統計資訊,就像存在表達式索引一樣(但沒有索引維護的開銷)。統計資訊儲存在 pg_statistics_ext_data 中,作為複合型別的陣列,這要歸功於 79f6a942bd。CREATE STATISTICS 允許在單一表達式上建立統計資訊,在這種情況下,無法指定統計資訊種類。可以使用新的系統視圖 pg_stats_ext_exprs 來顯示表達式統計資訊,類似於 pg_stats 和 pg_stats_ext 視圖。ALTER TABLE ... ALTER COLUMN ... TYPE 現在以與處理索引相同的方式處理索引,即它會刪除並重新建立統計資訊。這表示所有統計資訊都會重置,並且我們不再嘗試至少保留函數依賴性。這在實務中不應成為主要問題,因為函數依賴性實際上依賴於每個欄位的統計資訊,而這些統計資訊無論如何都會重置。作者:Tomas Vondra 審閱者:Justin Pryzby, Dean Rasheed, Zhihong Yu 討論:https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/a4d75c86bf15220df22de0a92c819ecef9db3849
使用其他定序穩定 stats_ext 測試。這些測試使用字串串聯來測試表達式上的統計資訊,但這使得測試與地區設定相關,例如,因為 '11' 和 '1X' 的排序取決於定序。這影響了估計的和實際的列計數,從而破壞了某些測試。透過用 upper() 函數呼叫替換字串串聯來修正,以便文字值僅包含數字。討論:https://postgr.es/m/b650920b-2767-fbc3-c87a-cb8b5d693cbf%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/2a058e938c73bfb85bbc9fa93dea74788043ca6c
Bruce Momjian 推送
RelationIs*
巨集相符。此巨集將在未來的叢集檔案加密修補程式中在更多地方使用。討論:https://postgr.es/m/20210318153134.GH20766@tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/95d77149c53545a74e0c84717cf8f925b8f6d632Amit Kapila 推送
修正 stream_cleanup_files 中的懸置指標參考。我們無法在從 dynahash 移除條目後存取該條目。作者:Peter Smith 討論:https://postgr.es/m/CAHut+Ps-pL++f6CJwPx2+vUqXuew=Xt-9Bi-6kCyxn+Fwi2M7w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4b82ed6eca41220e50d4712ab929c20030b30d35
還原 "為 'INSERT INTO ... SELECT ...' 啟用平行 SELECT。"。為了允許在平行模式下插入,此功能必須確保所有約束、觸發器等對於分割區階層都是平行安全的,這非常昂貴,我們需要找到更好的方法來做到這一點。此外,我們可以在某些情況下使用現有的快取資訊,例如索引、網域等,來確定平行安全性。已還原的提交列表,按時間倒序排列:ed62d3737c Doc:更新平行插入 reloption 的描述。c8f78b6161 新增一個新的 GUC 和一個 reloption 以啟用平行模式下的插入。c5be48f092 改善由 05c8482f7f 新增的 FK 觸發器平行安全性檢查。e2cda3c20a 修正由提交 05c8482f7f 引入的 relcache TriggerDesc 欄位的使用。e4e87a32cc 修正提交 05c8482f7f 中的 valgrind 問題。05c8482f7f 為 "INSERT INTO ... SELECT ..." 啟用平行 SELECT。討論:https://postgr.es/m/E1lMiB9-0001c3-SY@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/26acb54a1368bf3706294400abca85b15c9233a6
Peter Eisentraut 推送
新增 bit_count SQL 函數。此函數用於位元和 bytea,用於計算位元或位元組字串中設定的位元。在內部,我們使用現有的 popcount 功能。對於名稱,經過一些討論後,我們最終確定為 bit_count,它也以這種含義存在於 MySQL、Java 和 Python 中。作者:David Fetter david@fetter.org 討論:https://postgres.tw/message-id/flat/20201230105535.GJ13234@fetter.org https://git.postgresql.org/pg/commitdiff/a6715af1e72da289474011be1e2d536f991eda34
pgcrypto:檢查 px_cipher_decrypt() 的錯誤傳回值。這以前不是問題(從未有人報告過),但在未來的 OpenSSL 版本 (3.0.0) 中,如果傳統密碼被禁用/可以被禁用,這就是報告此問題的地方。因此,我們需要在這裡捕獲錯誤,否則較高層級的函數會傳回垃圾資料。附近的加密程式碼已經以類似的方式處理了錯誤。審閱者:Daniel Gustafsson daniel@yesql.se 討論:https://postgres.tw/message-id/9e9c431c-0adc-7a6d-9b1a-915de1ba3fe7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/22e1943f13b66df22ea4f8d15836411ba259263a
改善錯誤訊息。使其與另一個附近的訊息相同。https://git.postgresql.org/pg/commitdiff/1509c6fc29c07d13c9a590fbd6f37c7576f58ba6
新增 date_bin 函數。類似於 date_trunc,但允許按任意間隔(而不僅僅是完整單位)進行分組。作者:John Naylor john.naylor@enterprisedb.com 審閱者:David Fetter david@fetter.org 審閱者:Isaac Morland isaac.morland@gmail.com 審閱者:Tom Lane tgl@sss.pgh.pa.us 審閱者:Artur Zakirov zaartur@gmail.com 討論:https://postgres.tw/message-id/flat/CACPNZCt4buQFRgy6DyjuZS-2aPDpccRkrJBmgUfwYc1KiaXYxg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/49ab61f0bdc93984a8d36b602f6f2a15f09ebcc7
修正多餘的雙分號。報告者:John Naylor john.naylor@enterprisedb.com https://git.postgresql.org/pg/commitdiff/37c99d304dcbf12ab581ff031f394af93b750895
doc:修正錯字。報告者:Erik Rijkers er@xs4all.nl https://git.postgresql.org/pg/commitdiff/5173e428928ce890be3e3d809b2d23d5f3c7da2f
重新命名一個解析節點,使其更具通用性。WHERE 子句將用於邏輯複製中的列篩選。我們已經有一個類似的節點:'WHERE (此處的條件)'。讓我們將節點重新命名為一個通用的名稱,並將其用於列篩選。作者:Euler Taveira euler.taveira@enterprisedb.com 討論:https://postgres.tw/message-id/flat/CAHE3wggb715X+mK_DitLXF25B=jE6xyNCH4YOwM860JR7HarGQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/91d1f2d302108f49006eedb8053522236dde77cc
修剪解析器檔案中一些多餘的空白。 https://git.postgresql.org/pg/commitdiff/f2c7ce64ae9ba292c1846ae864cef1b8b37af1f3
提高 SQL 程式碼大寫的一致性。 https://git.postgresql.org/pg/commitdiff/8df2f371141ea267627364cd00e1791054d82d7e
Stephen Frost 推送
將 checkpoint_completion_target 的預設值更改為 0.9。常見的建議是,檢查點應盡可能分散,前提是我們避免花費過長的時間。此變更將預設值更新為 0.9(從 0.5),以符合該建議。有人爭論是否可能完全移除此選項,但似乎在某些特殊情況下,將其設定得非常低以嘗試強制檢查點盡可能快地完成,可能會減少由於核心刷新而導致效能降低的時間段。普遍的共識是,「分散更多」是首選方法,但是那些需要調整離開該值的用戶較少。覆閱人:Michael Paquier, Peter Eisentraut, Tom Lane, David Steele, Nathan Bossart 討論:https://postgr.es/m/20201207175329.GM16415%40tamriel.snowman.net https://git.postgresql.org/pg/commitdiff/bbcc4eb2e08fb6e4535c7f84b2c00f3ad508bb9b
文件:將 TLS 定義為縮寫。 Commit c6763156589 為“TLS”新增了一個縮寫參考,但從未新增定義。作者:Daniel Gustafsson 覆閱人:Michael Paquier Backpatch-through: 9.6 討論:https://postgr.es/m/27109504-82DB-41A8-8E63-C0498314F5B0@yesql.se https://git.postgresql.org/pg/commitdiff/b64654d6c450eb9fb04c6e3456915790510af482
Michael Meskes 推送
將 DECLARE STATEMENT 命令新增到 ECPG。此命令為 SQL 語句宣告一個 SQL 識別符,以便在其他嵌入式 SQL 語句中使用。該識別符連結到一個連線。作者:Hayato Kuroda kuroda.hayato@fujitsu.com 覆閱人:Shawn Wang shawn.wang.pg@gmail.com 討論:https://postgres.tw/message-id/flat/TY2PR01MB24438A52DB04E71D0E501452F5630@TY2PR01MB2443.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/ad8305a43d1890768a613d3fb586b44f17360f29
需要在迴圈中向前一步才能到達結尾。 https://git.postgresql.org/pg/commitdiff/65c2ec6f30d9c0878a9ef83e0ec9a53e6b82d9d8
Álvaro Herrera 推送
移除 StoreSingleInheritance 重新實作。我因為沒有充分的理由而在 commit 8b08f7d4820f 中引入了此重複的程式碼。將其移除,並向後移植到引入它的 11。作者:Álvaro Herrera alvherre@alvh.no-ip.org https://git.postgresql.org/pg/commitdiff/a24ae3d7b9efb3b113c0d53030aa99de0d41b40a
重構 HeapTupleHeader 巨集以重複使用 itemptr.h。原始定義毫無意義地忽略了執行相同操作的現有 ItemPointer 巨集。報告人:Michael Paquier michael@paquier.xyz 討論:https://postgr.es/m/20210222201557.GA32655@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/4669cacbd4b4b1baa1b7f2ea53d461433a1b6276
讓 ALTER TABLE Phase 2 常式管理關係指標。Struct AlteredRelationInfo 獲得了一個新的 Relation 成員,僅供 Phase 2 (ATRewriteCatalogs) 使用;這允許 ATExecCmd() 子常式在內部開啟和關閉關係。未來的提交將使用此工具來實作一個 ALTER TABLE 子命令,該子命令會在事務邊界之間關閉並重新開啟關係。(可以將關係保持在 phase 2 之後開啟,以供 phase 3 使用,而不必在該點重新開啟,但這有一些小的複雜性;目前尚不清楚這樣做是否能獲得太多好處。)作者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/cd03c6e94b09ff402cbc3ce8da5587f09f0b5e58
為 AlteredTableInfo->rel 新增註解。 引入它的先前 commit 在程式碼文件方面非常簡陋,因此新增一些註解。 https://git.postgresql.org/pg/commitdiff/cc121d5596964f8aac93607e6f14607184558b16
記錄在分割區分離期間取得的鎖定。在分割區分離時,我們會取得對引用我們從中分離分割區的分割資料表的所有資料表的 SHARE 鎖定,但未能記錄此事實。我在 commit f56f8f8da6af 中的疏忽。修復。向後移植到 12。作者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/20210325180244.GA12738@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/650d623530c884c087c565f1d3b8cd76f8fe2b95
ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY。允許從其分割資料表中分離分割區,而不會封鎖並行查詢,方法是在兩個事務中執行,並且僅需要在分割資料表中具有 ShareUpdateExclusive。由於它在兩個事務中執行,因此不能在事務區塊中使用。這是使用專用語法的主要原因:以便使用者可以選擇在需要時使用原始模式。而且,當存在預設分割區時,它不起作用(因為仍然需要在該分割區上取得獨佔鎖定,以便變更其分割區約束。)如果第二個事務被取消或發生崩潰,則存在 ALTER TABLE .. DETACH PARTITION .. FINALIZE,它會執行最終步驟。使此工作的主要技巧是新增欄位 pg_inherits.inhdetachpending,最初為 false;只能在此命令的第一部分中設定為 true。一旦提交,使用 PartitionDirectory 的並行事務將包含或忽略如此標記的分割區:在最佳化程式中,如果列被標記為已提交以進行快照,則會被忽略;在執行程式中,它們始終包含在內。因此,並且由於 PartitionDirectory 緩存分割區描述符的方式,在分離之前規劃的查詢將看到已分離分割區中的列,而在分離之後規劃的查詢將不會看到。建立一個 CHECK 約束,該約束會重複分割區約束。這可能不是絕對必要的,並且有些使用者可能更喜歡稍後將其刪除,但是如果將分割區重新附加到分割資料表中,則無需重新檢查約束。作者:Álvaro Herrera alvherre@alvh.no-ip.org 覆閱人:Amit Langote amitlangote09@gmail.com 覆閱人:Justin Pryzby pryzby@telsasoft.com 討論:https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/71f4c8c6f74ba021e55d35b1128d22fb8c6e1629
Kyotaro HORIGUCHI 送出另一個修補程式的版本,以使異步副本等待 LSN 被重播。
Bharath Rupireddy 送出一個修補程式,以移除 BloomInitPage、GinInitPage 和 SpGistInitPage 中多餘的 memset 呼叫。
Hou Zhijie 送出另一個修補程式的版本,以避免在 INSERT INTO 參照表時,在 RI 觸發器中執行 CommandCounterIncrement。
Amul Sul 送出另一個修補程式的版本,以建立支援 ALTER SYSTEM READ {ONLY | WRITE} 的基礎架構。
Amit Langote 送出另一個修補程式的版本,以修復 UPDATE ... RETURNING 和在分割區之間移動元組之間的不一致問題。
Greg Nancarrow 送出另一個修補程式的版本,以啟用並行 INSERT 和/或 SELECT 用於 INSERT INTO。
Tang 送出另一個修補程式的版本,以支援 psql 中針對大寫字元輸入的查詢結果使用 Tab 鍵自動完成。
Tom Lane 送出另一個修補程式的版本,以允許根據 SQL 標準將別名直接附加到 JOIN ... USING。
David Oksman 送出一個修補程式,以實現 ALTER TABLE ... RENAME COLUMN IF EXISTS。
Andrei Zubkov 送出兩個修補程式版本,以將語句輸入時間戳記新增到 pg_stat_statements。
Thomas Munro 送出另一個修補程式的版本,以新增 psql \watch 指令的 PSQL_WATCH_PAGER。
Thomas Munro 送出四個修補程式的版本,以檢測執行查詢時連接已斷線的情況。
Fujii Masao 送出一個修補程式,旨在修復一個在待命伺服器關閉時發生的斷言失敗錯誤,方法是在啟動程序退出時呼叫 ShutdownRecoveryTransactionEnvironment()。
Peter Eisentraut 送出另一個修補程式的版本,以新增 result_format_auto_binary_types 設定。
Jan Wieck 送出三個修補程式的版本,以修復 pg_upgrade 以保留 datdba。
Bertrand Drouvot 送出四個修補程式的版本,以在待命伺服器上實現最小的邏輯解碼。
Pavel Stěhule 送出兩個修補程式的版本,以實現 schema 變數。
Marcus Wanner 送出兩個修補程式的版本,以將 xid 參數新增到輸出外掛程式的 filter_prepare 回呼函數。
Amul Sul 送出兩個修補程式的版本,以新增 RelationGetSmgr() 內聯函數。
Peter Smith 和 Amit Kapila 交換修補程式,以新增兩階段交易的邏輯解碼。
Euler Taveira de Oliveira 和 Peter Eisentraut 交換修補程式,以新增邏輯複製的列過濾。
Kyotaro HORIGUCHI 送出另一個修補程式的版本,以將統計收集器的暫時儲存從檔案變更為共享記憶體。
Masahiro Ikeda 和 Fujii Masao 交換修補程式,以使 WAL 接收器報告 WAL 統計資訊。
Bruce Momjian 和 Julien Rouhaud 交換修補程式,以在 pg_stat_activity、log_line_prefix 和 verbose explain 中公開 queryid。
Atsushi Torikoshi 送出四個修補程式的版本,以新增一個函數 pg_get_backend_memory_contexts(),其功能如其名稱所示。
Daniel Gustafsson 送出兩個修補程式的版本,以支援 NSS 作為 libpq TLS 後端。
Michaël Paquier 和 Jeevan Chalke 交換修補程式,以記錄來自所有 auth 後端的已驗證身份。
Stephen Frost 送出另一個修補程式的版本,以使用 WaitLatch 進行 vacuum/autovacuum 休眠。
Stephen Frost 送出三個修補程式的版本,為現在已過時的 recovery.conf 新增文件存根。
Justin Pryzby 送出另一個修補程式的版本,以新增一個可選的 ACCESS METHOD 到 CREATE TABLE ... LIKE。
Takayuki Tsunakawa 送出兩個修補程式的版本,以加速遠端分割區的 COPY FROM 運作。
Amit Langote 送出另一個修補程式的版本,以在分割資料表中建立外部索引鍵觸發程序,並使用它在跨分割區更新期間正確強制執行外部索引鍵。
David Rowley 送出兩個修補程式的版本,以新增 Result Cache 執行器節點。
Li Japin 送出另一個修補程式的版本,以實現 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION。
Tomáš Vondra 送出一個修補程式,以修復 opclass 儲存類型。
Fujii Masao 送出另一個修補程式的版本,以將 WalrcvExit wait_event 重新命名為 WalReceiverExit。
Andrey V. Lepikhov 送出另一個修補程式的版本,以實現全域快照。
Atsushi Torikoshi 送出兩個修補程式的版本,以將 plan type 新增到 pg_stat_statements。
Denis Hirn 送出一個修補程式,以允許在 WITH RECURSIVE 中有多個遞迴自參考。
Masahiro Ikeda 和 Fujii Masao 交換修補程式,以使 pgstat 避免在 SIGQUIT 上寫入。
Kyotaro HORIGUCHI 送出另一個修補程式的版本,以保護 syscache 免於因負快取條目而膨脹。
Hou Zhijie 送出另一個修補程式的版本,以新增 eval_const_expressions 的 nullif 案例。
Mark Dilger 和 Robert Haas 交換修補程式,以新增 pg_amcheck contrib 應用程式。
Daniel Gustafsson 送出另一個修補程式的版本,以重構 SSL 測試工具,以允許使用多個程式庫。
Pavel Stěhule 送出兩個修補程式的版本,以新增例程標籤。
Thomas Munro 送出四個修補程式的版本,以使所有 SLRU 緩衝區大小可配置。
Peter Geoghegan 和 Masahiko Sawada 交換修補程式,以集中每個 VACUUM 的狀態,將 lazy_scan_heap() 分解為多個函數,從 vacuumlazy.c 中移除 tupgone 特殊案例,並在某些情況下跳過索引 vacuuming。
Kyotaro HORIGUCHI 送出另一個修補程式的版本,以實現就地資料表持久性變更,並新增一個新指令 ALTER TABLE ALL IN TABLESPACE SET LOGGED/UNLOGGED 來搭配使用。
Ashutosh Bapat 送出另一個修補程式的版本,以修復使用 TOAST 解碼投機性插入時的記憶體洩漏。
Ekaterina Sokolova 送出另一個修補程式的版本,以新增用於 Nested Loop 的 explain 的額外統計資訊。
Pavel Borisov 送出兩個修補程式的版本,以實現覆蓋 SP-GiST 索引,即支援 INCLUDE 欄位。
Marcus Wanner 為輸出外掛程式新增 concurrent_abort 回呼函數。
Joel Jacobson 送出另一個修補程式的版本,以新增視圖 pg_permissions 和 pg_ownerships。
Bharath Rupireddy 送出另一個修補程式的版本,使在將資料表新增至發佈時的錯誤訊息更具資訊性和一致性。
Kyotaro HORIGUCHI 送出另一個修補程式的版本,旨在修復一個 Walsender 可能無法將 wal 送到結尾的錯誤。
Jim Finnerty 送出另一個修補程式的版本,以新增具有 64 位元 GUC 的功能、使用 XID_FMT 格式化 xid,以及使用 ClogPageNumber 代替 int 以確保類型安全。
Sven Klemm 送出一個修補程式,以允許 CustomScan 節點發出訊號表示它們是否支援投影。
Andrew Dunstan 和 Nikita Glukhov 交換修補程式,以實現 SQL/JSON 的 JSON_TABLE 部分。
Andrew Dunstan 和 Nikita Glukhov 交換修補程式,以實現 SQL/JSON 的函數部分。
Amit Langote 和 Tom Lane 交換修補程式,透過修改更新計算新元組的方式,以及修改繼承更新/刪除的處理方式,使繼承樹中的更新可以更好地擴展。
David Steele 送出兩個修補程式的版本,以記錄備份標籤可能需要在 Windows 上以二進位模式開啟的事實。
Cai Mengjuan 送出一個修補程式,以在每次請求 xlog 串流傳輸時更新 walrcv->flushedUpto。
Andrew Dunstan 送出另一個修補程式的版本,以允許比對來自用戶端憑證的整個 DN。
Masahiro Ikeda 送出一個修補程式,以改善報告 wal 統計資訊的效能。
Tomáš Vondra 送出一個修補程式,以在 explain 中顯示已套用的擴展統計資訊。
Noah Misch 送出另一個修補程式的版本,以新增公用 schema 預設 ACL。
Lætitia Avrot 送出兩個修補程式的版本,以使使用 pg_dump 僅傾印函數成為可能。
Noah Misch 送出另一個修補程式的版本,以接受元組略大於 fillfactor 的略微填滿的頁面。
Álvaro Herrera 送出兩個修補程式的版本,以將追蹤功能新增到 libpq。
Kazutaka Onishi 送出另一個修補程式的版本,以使 TRUNCATE 在外部資料表上運作。
Andrew Dunstan 送出另一個修補程式版本,以實作全域暫存表格。
Yoan SULTAN 送出一個修補程式,使 pg_stat_statements 可以追蹤最新的陳述式。
David Rowley 送出另一個修補程式版本,以從 valgrind 洩漏追蹤中獲得更好的結果。