Database Lab 2.2.1 發布,此工具可用於快速複製大型 PostgreSQL 資料庫以構建非生產環境:https://gitlab.com/postgres-ai/database-lab/-/releases
dbMigration .NET v13.4 發布,此為資料庫遷移和同步工具。https://fishcodelib.com/DBMigration.htm
Joe 0.9.0 發布,此為 Slack 聊天機器人,可協助後端開發人員和 DBA 排除故障並優化 PostgreSQL 查詢。https://gitlab.com/postgres-ai/joe/-/releases#0.9.0
pgAdmin4 5.0 發布,此為適用於 PostgreSQL 的網頁和原生 GUI 控制中心。https://www.pgadmin.org/docs/pgadmin4/5.0/release_notes_5_0.html
pgagroal 1.2.0 發布,此為適用於 PostgreSQL 的高性能、協議原生的連線池。https://agroal.github.io/pgagroal/release/announcement/2021/02/23/pgagroal-1.2.0.html
本週人物:https://postgresql.life/post/takayuki_tsunakawa/
https://archives.postgresql.org/pgsql-jobs/2021-02/
Planet PostgreSQL: https://planet.postgresql.org/
本週 PostgreSQL 每週新聞由 David Fetter 為您帶來
請在太平洋標準時間(PST8PDT)星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。
Tom Lane 推送了
修復 trgm_regexp.c 中的無效陣列存取。08c0d6ad6 中的棕色紙袋錯誤:我漏掉了一個需要防止 RAINBOW 弧顏色的地方。值得注意的是,除了 buildfarm 成員 thorntail 之外,沒有人注意到無效的陣列存取。感謝 Noah Misch 協助追蹤此問題。https://git.postgresql.org/pg/commitdiff/6ee479abfc27a18c37fe77140d16d3ac31f4ac31
簡化 regex DFA 的記憶體管理。 Coverity 抱怨 regexec.c 中的函式可能會洩漏 DFA 儲存空間。 它是錯誤的,但此邏輯非常混亂,以至於 Coverity 無法理解它並不令人驚訝。 重寫以期使其對人類和機器更具可讀性。https://git.postgresql.org/pg/commitdiff/190c79884aae540c92f017701726ed69265e2dab
在新的 regex 比對所有偵測程式碼中抑制編譯器警告。 gcc 10 足夠聰明,可以注意到控制可能會在 depth < 0 的情況下到達此 "hasmatch[depth]" 賦值,但不足以了解這需要嚴重損壞的 NFA 圖形。 將 assert() 變更為純粹的執行階段測試以使其安靜。 根據 Andres Freund 的報告。 討論:https://postgr.es/m/20210223173437.b3ywijygsy6q42gq@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/3db05e76f92846d4b54d7de251b0875cf1e23aa4
允許在 regex 方括號內使用補碼字元類別跳脫字元。 現在允許在括號表達式中使用補碼類別跳脫字元 \D、\S、\W。 這樣做沒有語義上的困難,但是之前使用的相當笨拙的基於巨集擴充的實作無法應付。 此外,將 "word" 發明為允許的字元類別名稱,因此 "\w" 現在在括號外等效於 "[[:word:]]",在括號內等效於 "[:word:]"。 POSIX 允許這種特定於實作的擴充功能,並且相同的名稱用於例如 bash。 這提出的一個令人驚訝的相容性問題是,現在不允許使用諸如 "[\w-_]"
之類的建構,因為我們的文件一直說應該這樣做:字元類別不能是範圍的端點。 以前,由於 \w 只是 "[:alnum:]_"
的巨集,因此這樣的建構會被讀取為 "[[:alnum:]_-_]"
,因此只要 "-" 之後的字元在數值上大於或等於 "_"
,就會被接受。 沿途進行了一些實作清理: * 移除 lexnest() hack,並因此清理 wordchrs() 以不與詞法分析器互動。 * 修復 colorcomplement(),使其在涉及的顏色數量上不是 O(N^2)。 * 擺脫了在 brackpart() 中對單個字元字元元素名稱進行 element() 的無用的呼叫(就我所見)。 element() 總是將這些對應到字元本身,如果它沒有對應到字元本身,事情就會非常糟糕 --- "[a]" 是否應該比 "a" 比對不同的內容? 此外,brackpart() 中的捷徑路徑無論如何都沒有這樣做,使其更加不一致。 討論:https://postgr.es/m/2845172.1613674385@sss.pgh.pa.us 討論:https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2a0af7fe460eb46f9af996075972bf7c2e3f211d
變更 regex \D 和 \W 簡寫以始終比對換行符號。 換行符號肯定不是數字,也不是單字字元,因此它應該比對這些補碼字元類別是有意義的。 以前,\D 和 \W 預設以這種方式運作,但在換行符號敏感模式('n' 或 'p' 旗標)下,它們不比對換行符號。 之前強制執行此行為,因為顯式補碼字元類別在換行符號敏感模式下不比對換行符號;但從先前的提交開始,該實作限制不再存在。 更改此設定似乎很有用,因為換行符號敏感模式的主要實際用途似乎是比對其他 regex 引擎(例如 Perl 和 Javascript)的預設行為...而它們的預設行為是這些比對換行符號。 舊的行為可以透過編寫顯式補碼字元類別來保留,即 [^[:digit:]] 或 [^[:word:]]。 (這表示 \D 和 \W 與這些字串不完全等效,但它們無論如何都不是。) 討論:https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7dc13a0f0805a353cea0455ed95701322b39d4dd
文件:移除 src/backend/regex/re_syntax.n。 我們沒有將此檔案作為文件發布,並且它的維護比 func.sgml 中的真實文件要隨意得多,因此我們就將其刪除吧。 我認為我將其包含在 commit 7bcc6d98f 中的唯一原因是 Berkeley 時代的來源在這個目錄中有一個 man 頁面。 討論:https://postgr.es/m/4099447.1614186542@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/301ed8812e3f8b102b85e1f5a59e95990ed9a868
修正 WITH RECURSIVE 處理中的列表操作錯誤。makeDependencyGraphWalker 和 checkWellFormedRecursionWalker 認為它們可以在列表被遞迴呼叫修改時,保持指向列表第一個 cons cell 的指標。當 cons cell 實際上是分開 palloc'd 時,這是可以接受的... 但自從 commit 1cff1b95a 以來,這非常不安全,會導致核心傾印或錯誤地抱怨錯誤的 WITH 巢狀結構。在實際應用中,這至少需要七層深的 WITH 巢狀結構才會導致問題,但啟用 DEBUG_LIST_MEMORY_USAGE 可以讓您在較淺的巢狀深度下看到這個錯誤。根據 Alexander Lakhin 提供的 bug #16801。反向移植到 v13。Michael Paquier 和 Tom Lane 的討論: https://postgr.es/m/16801-393c7922143eaa4d@postgresql.org https://git.postgresql.org/pg/commitdiff/80ca8464fe02296c8efefd53746e6d6a3f456d1e
改善 regex 編譯器中的記憶體管理。先前的邏輯為每個狀態建立一個單獨的 arcs 池,以便每個狀態的 out-arcs 實際上儲存在其中。也許這個選擇是為了避免在每個 arc 中包含一個 "from" 指標;但 Spencer 很久以前就放棄了這個想法,現在很難看出它的價值。然而,這種方法在記憶體消耗方面證明是相當災難性的。首先,這個引擎建立的 NFAs 平均每個狀態大約有 4 個 arcs,其中大多數只有一個或兩個 out-arcs。因此,為每個狀態預先分配 10 個 out-arcs 已經導致了兩倍或更多的膨脹。更糟的是,NFA 優化階段會隨意地移動 arcs。在一個大型 NFA 中,某些狀態將擁有數百個 out-arcs,因此在優化階段的最後,我們有大量的狀態,它們的 arc 池有容納數百個 arcs 的空間,即使只有少數 arcs 正在使用。我們已經在現實世界的 regexes 中看到,這種效應會使記憶體需求膨脹 25 倍甚至更多。因此,放棄每個狀態的 arc 池,而採用一個適用於整個 NFA 的單一 arc 池,使用可變大小的分配批次,而不是每次都請求 10 個。在我們進行這項操作的同時,也對狀態結構進行批次分配,以進一步減少 malloc 流量。這也順便允許以類似於 moveins() 的方式優化 moveouts():當將一個 arc 移動到另一個狀態時,現在可以直接將同一個 arc 結構重新鏈接到不同的 outchain 中,而在以前,程式碼不變性要求我們建立一個物理上新的 arc,然後釋放舊的 arc。這些變更將 regex 編譯器對於平均大小的 regexes 的典型空間消耗減少了大約兩倍,對於大型或複雜的 regexes 則減少更多。在一個大型的現實世界 regexes 測試集中,我們以前有六個案例由於超過 REG_MAX_COMPILE_SPACE 限制(約 150MB)而失敗,並顯示 "regular expression too complex" 錯誤;我們必須將該限制提高到接近 400MB 才能使它們使用舊程式碼工作。現在,這些案例都不需要超過 13MB 來編譯。此外,由於 malloc 流量減少,測試集整體速度提高了約 10%。討論:https://postgr.es/m/168861.1614298592@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0fc1af174cf7113445e116feb2813405b838a47d
文件:進一步闡明 libpq 對連線字串 URI 的描述。將概要分解為命名部分,使其不那麼令人困惑。盡力應用 SGML 標記。對附近的文字進行一些複製編輯。概要修訂由 Alvaro Herrera 和 Paul Förster 完成,其餘是我的責任。反向移植到出現多主機連線字串的 v10。討論:https://postgr.es/m/6E752D6B-487C-463E-B6E2-C32E7FB007EA@gmail.com https://git.postgresql.org/pg/commitdiff/4e90052c46c7751779ed83627676ed5e74ebe6d4
Thomas Munro 推送
移除對 RAID spindles 的過時參考。 Commit b09ff536 在 GUC "effective_io_concurrency" 的 long_desc 欄位中留下了一些過時的建議。移除它。反向移植到 13。Reported-by: Andrew Gierth andrew@tao11.riddles.org.uk Reviewed-by: Julien Rouhaud rjuju123@gmail.com 討論:https://postgr.es/m/CA%2BhUKGJyyWqFBxL9gEj-qtjBThGjhAOBE8GBnF8MUJOJ3vrfag%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/db8374d804f2dd35a0f934984d1d3686cc71f545
隱藏 pg_collation_actual_version(<bad OID>) 的內部錯誤。對於錯誤的 OID,不要顯示難看的內部 "cache lookup failed" 訊息,而是像其他類似的東西一樣,只返回 NULL。Reported-by: Justin Pryzby pryzby@telsasoft.com Reviewed-by: Michael Paquier michael@paquier.xyz 討論:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/0fb0a0503bfc125764c8dba4f515058145dc7f8b
pg_collation_actual_version() -> pg_collation_current_version()。新名稱似乎更自然一些。討論:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8
重構 get_collation_current_version()。三種不同作業系統的程式碼路徑最終都使用三種不同的方式來排除 C[.xxx] 和 POSIX 的考慮。合併它們。Reviewed-by: Michael Paquier michael@paquier.xyz 討論:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/beb4480c853a60ec43bd3f1a71252890dd234f10
Tab-complete CREATE COLLATION。Reviewed-by: Michael Paquier michael@paquier.xyz 討論:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/5bc09a74719dfeb6c4cebb311b81385c508459a8
Revert "pg_collation_actual_version() -> pg_collation_current_version()."。這會還原 commit 9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8。名稱變更不如預期般受到歡迎。討論:https://postgr.es/m/afcfb97e-88a1-a540-db95-6c573b93bc2b%40eisentraut.org https://git.postgresql.org/pg/commitdiff/8556267b2b1b8e1c26037c4c25cf390ee5afb5d9
Michaël Paquier 推送
盡可能使用 pgstat_progress_update_multi_param()。此 commit 變更了 REINDEX INDEX 中的一個程式碼路徑和 CREATE INDEX CONCURRENTLY 中的一個程式碼路徑,以使用 pgstat_progress_update_multi_param() 而不是多次呼叫 pgstat_progress_update_param() 來報告每個操作的進度。這樣做的好處是在不影響所提供資訊量的情況下,使進度報告對最終使用者更一致。Author: Bharath Rupireddy 討論:https://postgr.es/m/CALj2ACV5zW7GxD8D_tyO==bcj6ZktQchEKWKPBOAGKiLhAQo=w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/92942642788c9d73e4c090ee0a77603f7afbc1d7
doc:改善 wal_receiver_status_interval 的描述。此參數描述先前令人困惑,說值為 0 會完全停用狀態更新。這是不正確的,因為在某些情況下,會忽略此參數值並傳送更新。改進了文檔,以概述排定的狀態訊息和強制狀態訊息的處理方式差異。Reported-by: Dmitriy Kuzmin Author: Michael Paquier Reviewed-by: Euler Taveira 討論:https://postgr.es/m/161346024420.3455.1345266601055047937@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/c82d59d64e127a5e743f9cf16537f4c7c120ce7b
修正文件和註解中的一些錯字、文法和風格。修正文件的部分已根據需要進行回溯修補。作者:Justin Pryzby 討論:https://postgr.es/m/20210210235557.GQ20012@telsasoft.com 回溯修補至:9.6 https://git.postgresql.org/pg/commitdiff/bcf2667bf62d72faced64cb60ffbd2e599a0ebe8
文件:提及 pgbench 支援 PGDATABASE。PGHOST、PGPORT 和 PGUSER 已經被提及,但 PGDATABASE 沒有。如同 5aaa584,回溯修補至
回報者:Christophe Courtois 討論:https://postgr.es/m/161399398648.21711.15387267201764682579@wrigleys.postgresql.org 回溯修補至:12 https://git.postgresql.org/pg/commitdiff/a6f8dc47a0582e37c234c8e916377b46d2b03817
文件:改善用於壓縮日誌的 {archive,restore}_command
。文件中提及的 gzip 和 gunzip 指令,對於封存檔案沒有加上 ".gz" 前綴,並且封存檔案的路徑也不一致,這可能會造成混淆。回報者:Philipp Gramzow 審閱者:Fujii Masao 討論:https://postgr.es/m/161397938841.15451.13129264141285167267@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/329784e11849ff691f0157f3b27c50f652bce76a
pgbench:移除現已失效的 CState->ecnt
。ecnt 的最後一次使用是在 12788ae 中。從那時起,它在後端錯誤發生後會遞增,但沒有任何作用,所以我們移除它。作者:Kota Miyake 審閱者:Álvaro Herrera 討論:https://postgr.es/m/786c3d9fbe067763d899e78c296f9f0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/943eb478803cc2ed6f0b1f5df6f1b20c9ad6245d
Peter Eisentraut 推送
改善新的雜湊分割區邊界檢查錯誤訊息。對於錯誤訊息「每個雜湊分割區模數必須是下一個較大模數的因子」,新增一個詳細訊息,顯示涉及的特定數字和現有分割區。並對程式碼進行更多註解。審閱者:Amit Langote <amitlangote09@gmail.com>
審閱者:Heikki Linnakangas <hlinnaka@iki.fi>
討論:https://postgres.tw/message-id/flat/bb9d60b4-aadb-607a-1a9d-fdc3434dddcd%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/efbfb642414b61db1567a7a902ace3f307d7564a
簡化 LSN 的列印。新增一個巨集 LSN_FORMAT_ARGS
,用於 printf 樣式的 LSN 列印。將所有適用的程式碼轉換為使用它。審閱者:Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>
審閱者:Kyotaro Horiguchi <horikyota.ntt@gmail.com>
審閱者:Michael Paquier michael@paquier.xyz 討論:https://postgres.tw/message-id/flat/CAExHW5ub5NaTELZ3hJUCE6amuvqAtsSxc7O+uK7y4t9Rrk23cw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f6f284c7ee44264eb3e128e2bf54d9276711d11
訊息樣式修正。不要引用類型名稱佔位符。 https://git.postgresql.org/pg/commitdiff/8ec8fe0f31712c62b761da9ef6d32214e08340d1
稍微擴展一個測試案例。這可能會幫助後續的修補程式,確保通知訊息是不同的,以便清楚地表明它們以正確的順序出現。作者:Fabien COELHO coelho@cri.ensmp.fr 討論:https://postgres.tw/message-id/alpine.DEB.2.21.1904240654120.3407%40lancre https://git.postgresql.org/pg/commitdiff/b3a9e9897ec702d56602b26a8cdc0950f23b29dc
增強的循環標記值。根據 SQL:202x 草案,在遞迴查詢的 CYCLE 子句中,循環標記值的類型可以是布林值,並且可以省略,在這種情況下,它們預設為 TRUE 和 FALSE。審閱者:Vik Fearing vik@postgresfriends.org 討論:https://postgres.tw/message-id/flat/db80ceee-6f97-9b4a-8ee8-3ba0c58e5be2@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/f4adc41c4f92cc91d507b19e397140c35bb9fd71
Fujii Masao 推送
在 postmaster 啟動時,初始化 PGPROC 中的原子變數 waitStart。Commit 46d6e5f567 將原子變數 "waitStart" 新增到 PGPROC 結構中,用於儲存開始等待鎖定取得的時間。先前,此變數在每個後端啟動時都會初始化。相反地,此 commit 讓 postmaster 在啟動時初始化它,以確保變數在使用前已初始化。此 commit 還將初始化 prepare transaction 的 "waitStart" 變數的程式碼,從 TwoPhaseGetDummyProc() 移至 MarkAsPreparingGuts()。因為 MarkAsPreparingGuts() 更適合執行該操作,因為它初始化了其他 PGPROC 變數。作者:Fujii Masao 審閱者:Atsushi Torikoshi 討論:https://postgr.es/m/1df88660-6f08-cc6e-b7e2-f85296a2bdab@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/f05ed5a5cfa55878baa77a1e39d68cb09793b477
改善 TRUNCATE 的 Tab 鍵自動完成功能。作者:Kota Miyake 審閱者:Muhammad Usama 討論:https://postgr.es/m/f5d30053d00dcafda3280c9e267ecb0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/6b40d9bdbdc9f873868b0ddecacd9a307fc8ee26
Magnus Hagander 推送
Álvaro Herrera 推送
修正錯字。 https://git.postgresql.postgresql.org/pg/commitdiff/6a03369a71d4a7dc5b8d928aab775ddd28b72494
移除無意義的 HeapTupleHeaderIndicatesMovedPartitions 呼叫。Pavan Deolasee 最近注意到,commit 5db6df0c0117 新增的一些 HeapTupleHeaderIndicatesMovedPartitions 呼叫是無用的,因為它們是在將 t_self 與 t_ctid 進行比較之後完成的。但是因為 t_self 永遠無法設定為指示元組已移動分割區的 magic 值,所以這永遠不會成功:如果第一個測試失敗(所以我們知道 t_self 等於 t_ctid),則第二個測試也必然會失敗。因此,可以刪除這些檢查,而不會造成任何損害。這裡沒有錯誤,只是一個程式碼可讀性的問題。回報者:Pavan Deolasee pavan.deolasee@gmail.com 討論:https://postgr.es/m/20200929164411.GA15497@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/0f5505a8815aa4eb03ca61245a5a51ff9adda2f4
VACUUM:忽略帶有 CONCURRENTLY 的索引操作。正如 commit c98763bf51bf 中所設想的那樣,VACUUM 可以忽略某些正在執行 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 的事務,以計算 Xmin;那是因為我們知道這些事務不會檢查任何其他表格,並且不會在同一個事務中執行任何其他操作。(只能忽略「安全」索引上的操作:那些既不是 partial 也不是 expressional 的索引)。這在 CIC/RC 可能運行很長時間的情況下非常有用,因為這過去是對其他表格進行並發 vacuuming 的一個重大麻煩。審閱者:Matthias van de Meent boekewurm+postgres@gmail.com 審閱者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/20210115133858.GA18931@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/d9d076222f5b94a85e0e318339cfc44b8f26022d
重新允許 HEAP_XMAX_LOCK_ONLY|HEAP_KEYS_UPDATED 的組合。Commit 866e24d47db1 增加了一個斷言 (assert),聲明 HEAP_XMAX_LOCK_ONLY 和 HEAP_KEYS_UPDATED 不能同時出現,其錯誤假設是後者必然指的是更新而非 tuple 鎖定;但這是錯誤的,因為 SELECT FOR UPDATE 就能使用這種組合,正如這裡新增的 amcheck 測試案例所證明的那樣。移除 Assert(),同時也修補 amcheck 的 verify_heapam.c,使其在找到這種組合時不會發出警告。此外,為了更加謹慎,更新所有分支的 README.tuplock,使其對此更加明確。作者:Julien Rouhaud rjuju123@gmail.com 審閱者:Mahendra Singh Thalor mahi6run@gmail.com 審閱者:Dilip Kumar dilipbalaut@gmail.com 討論: https://postgr.es/m/20210124061758.GA11756@nol https://git.postgresql.org/pg/commitdiff/8deb6b38dc4c7a7fd4719ee45e4b00d62b27dffe
修正關於 generate_gather_paths 的註解中的混淆。d2d8a229bc58 引入了一個新的函數 generate_useful_gather_paths 作為 generate_gather_paths 的替代品,但忘記更新一些引用舊函數的地方。這可能不是 100% 完整(參考 create_ordered_paths),但總比什麼都不改好。作者:"Hou, Zhijie" houzj.fnst@cn.fujitsu.com 審閱者:Tomas Vondra tomas.vondra@enterprisedb.com 討論: https://postgr.es/m/4ce1d5116fe746a699a6d29858c6a39a@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/5a65eacfdc69ee8c9d3ed92d838bc53628fbb7c6
修正 AfterTriggersTableData.storeslot 的 use-after-free 錯誤。AfterTriggerSaveEvent() 錯誤地在 execution-span memory context 中分配了 slot,而正確的做法是在 transaction-span context 中分配它,因為封閉的 AfterTriggersTableData 實例就應該屬於那裡。回溯修補到 12(測試回溯到 11,在那裡它可以很好地工作,無需任何程式碼更改,並且可以確認該案例以前得到很好的支持);此錯誤似乎是由 commit ff11e7f4b9ae 引入的。報告者:Bertrand Drouvot bdrouvot@amazon.com 作者:Amit Langote amitlangote09@gmail.com 討論: https://postgr.es/m/39a71864-b120-5a5c-8cc5-c632b6f16761@amazon.com https://git.postgresql.org/pg/commitdiff/25936fd46c97039aad042ae8d46917d38d132fe4
Amit Kapila 推送了
更改邏輯複製驗證失敗的錯誤訊息。驗證失敗錯誤訊息沒有區分是物理複製還是邏輯複製連線失敗,並且在邏輯複製連線的情況下,沒有提供導致失敗的不完整資訊。作者:Paul Martinez 和 Amit Kapila 審閱者:Euler Taveira 和 Amit Kapila 討論: https://postgr.es/m/CACqFVBYahrAi2OPdJfUA3YCvn3QMzzxZdw0ibSJ8wouWeDtiyQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc617a7b1cada2ec5f8b9d45a4312e49fc1766ad
修正 ReorderBufferFinishPrepared 中的一個疏忽。如果當我們解碼 commit prepared 時,ReorderBufferTXN 不存在,那麼我們就沒有任何東西需要在交易中解碼。因此,不要在這裡創建一個新的 ReorderBufferTXN。這是 commit a271a1b5 中的一個疏忽。報告者:Markus Wanner 討論: https://postgr.es/m/dbec82e2-dbd7-95a2-c6b6-e488cbbdf853@bluegap.ch https://git.postgresql.org/pg/commitdiff/ade89ba5f408e6034db7cc8a2c9b7858f5a214c4
修正由 ce0fdbfe97 引入的 relcache 參考洩漏。作者:Sawada Masahiko 審閱者:Amit Kapila 討論: https://postgr.es/m/CAD21AoA7ZEfsOXQ9HQqMv3QYGsEm2H5Wk5ic5S=mvzDf-3a3SA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8a4f9522d0c7d197c7eaa62cc72fb1bf9b90f05b
Peter Geoghegan 推送了
在已刪除的 nbtree 頁面中使用完整的 64 位元 XID。否則,我們可能會因為使它們無限期地無法回收而「洩漏」已刪除的頁面。Commit 6655a729 對 GiST 索引中已刪除的頁面做了同樣的事情。這裡的工作以此為起點。停止儲存 XID,該 XID 指示 nbtree meta 頁面中所有已刪除但未回收的頁面中最舊的 bpto.xact。不再有任何理由關心該條件/最舊的 XID。只有在 wraparound 是 _bt_vacuum_needs_cleanup()
必須考慮的情況時,這才有意義。btm_oldest_btpo_xact meta 頁面欄位已被重新利用和重新命名。它現在是 btm_last_cleanup_num_delpages,用於記住上次 VACUUM 操作中剩餘多少個未回收的已刪除頁面(實際上,它的值通常是在上次設定該欄位的特定 VACUUM 操作期間_新刪除的_
頁面的確切數量)。儲存 btm_last_cleanup_num_delpages 的總體思路是使用它來_某種程度上_
考慮到 _bt_vacuum_needs_cleanup()
內的未回收已刪除頁面 -- 儘管永遠不會太多。我們只需要避免在未回收狀態下永久保留過多的已刪除頁面。我們這樣做只是為了涵蓋某些狹窄的情況,在這些情況下,沒有其他因素使 VACUUM 執行完整掃描,但索引繼續增長(因此實際上錯過了回收現有已刪除頁面的機會)。這些 meta 頁面變更會帶來明顯的使用者可見的好處:我們不再僅僅因為大型索引中存在 1 或 2 個已知的已刪除(但未回收)區塊而在 VACUUM 操作期間觸發完整的索引掃描。現在重要的是隨著時間的推移保持成本和收益的平衡。修正自 commit 857f9c36 以來一直存在的問題,該 commit 新增了「跳過索引的完整掃描」機制(即 _bt_vacuum_needs_cleanup()
邏輯)。btm_last_cleanup_num_heap_tuples 的準確性意外地取決於何時儲存源值。我們現在始終在 btvacuumcleanup() 中儲存 btm_last_cleanup_num_heap_tuples。這修正了該問題,因為預期 IndexVacuumInfo.num_heap_tuples(來源欄位)能夠準確地指示 VACUUM 在 btvacuumcleanup() 內部完成後資料表的狀態。無法輕易從此 commit 中提取可回溯修補的修復程式。針對該問題的定向修復將在稍後的 commit 中進行,儘管這不會在今天發生。我 (pgeoghegan) 已選擇在 vacuum_cleanup_index_scale_factor GUC/參數的文檔中刪除任何提及已刪除頁面的資訊,因為已刪除(但未回收)的頁面不再是使用者關心的問題。無論如何,文檔中 vacuum_cleanup_index_scale_factor 的描述現在看起來相當不清楚,並且可能需要在不久的將來重寫。也許會在同一時間重新添加一些關於頁面刪除的簡要提及。由於 nbtree WAL 紀錄現在使用完整的 XID,因此增加 XLOG_PAGE_MAGIC。作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada <sawada.mshk@gmail.com>
討論: https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX=d5u-tRYhi-F4wnV2uN2zHpMUXw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e5d8a999030418a1b9e53d5f15ccaca7ed674877
VACUUM VERBOSE:計算「新刪除」的索引頁面。教導 VACUUM VERBOSE 報告由目前 VACUUM 操作刪除的頁面 -- 這些是新刪除的頁面。VACUUM VERBOSE 繼續報告整個索引中刪除的頁面總數(沒有變更)。前者是後者的子集。每個類別的已刪除索引頁面之間的區別僅在支援頁面刪除且為了效能原因而與頁面回收分離的索引 AM 中才會出現。這是 commit e5d8a999 的後續工作,該 commit 使 nbtree 在刪除時將 64 位 XID(而不是 32 位 XID)儲存在頁面中。請注意,該 commit 新增的 btm_last_cleanup_num_delpages metapage 欄位通常會設定為 pages_newly_deleted。例外情況(它們不相等的情況)似乎都是頁面刪除和回收的一般實現中棘手的案例。作者:Peter Geoghegan pg@bowt.ie 討論:https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX%3Dd5u-tRYhi-F4wnV2uN2zHpMUXw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2376361839091b0dcdcc0b77f938b809b5f21646
David Rowley 推送了
新增 TID 範圍掃描以支援有效率地掃描 TID 範圍。這新增了一個名為 TID 範圍掃描的新執行器節點。當在基本關係上發現限定詞時,查詢規劃器將為 TID 範圍掃描產生路徑,這些限定詞在表的 ctid 欄位上搜尋範圍。這些範圍可能在任一端都是開放的。例如,WHERE ctid >= '(10,0)'; 將傳回第 10 頁及以上的全部元組。為了支援這一點,已向表 AM 新增了兩個新的可選回呼函式。scan_set_tidrange 用於將掃描範圍設定為僅給定的 TID 範圍。scan_getnextslot_tidrange 提取給定範圍內的下一個元組。對於掃描 TID 範圍沒有意義的 AM,這些函式可以在 TableAmRoutine 中設定為 NULL。在這種情況下,查詢規劃器不會產生 TID 範圍掃描路徑。作者:Edmund Horner, David Rowley 審閱者:David Rowley, Tomas Vondra, Tom Lane, Andres Freund, Zhihong Yu 討論:https://postgr.es/m/CAMyN-kB-nFTkF=VA_JPwFNo08S0d-Yk0F741S2B7LDmYAi8eyA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bb437f995d47405ecd92cf66df71f7f7e40ed460
新增遺失的 TidRangeScan readfunc。在 bb437f995 中錯誤地忘記了 https://git.postgresql.org/pg/commitdiff/977b2c08535f2a82ba7c310c88420cbbca1772e8
Noah Misch 推送了
Justin Pryzby 寄來了另一個修補程式版本,該修補程式使 INSERT SELECT 使用 BulkInsertState 和 multi_insert,檢查 volatile 預設值以確保不會遺失對它們的任何依賴關係,使 COPY 根據元組的累積大小而不是行長度來刷新 multi-insert 緩衝區,並檢查元組大小以在計算何時刷新緩衝區時獲得更準確的區塊大小。
Hou Zhijie 寄來了另一個修補程式版本,該修補程式新增了一個 GUC 和一個每表選項,都名為 enable_parallel_dml,以控制 DML 是否包含以平行方式執行的選項。
Bharath Rupireddy 寄來了另一個修補程式版本,該修補程式在 FDW 層級和外部伺服器層級都新增了名為 keep_connections 的 GUC。
Masahiko Sawada 寄來了一個修補程式,該修補程式新增了一個檢查,根據所有堆積頁面中是否有 1% 具有 LP_DEAD 行指標,來判斷是否要執行索引清理 (index vacuum)(和堆積清理 (heap vacuum))。
Shenhao Wang 寄來了一個修補程式,該修補程式使 --enable-coverage 在未找到 lcov 的情況下也能成功,因為實際的涵蓋範圍測試可以在沒有它的情況下執行。
Jim Mlodgenski 寄來了一個修補程式,該修補程式新增了一個剖析器掛鉤。
Mats Kindahl 寄來了一個修補程式,該修補程式新增了一個到 TableAccessMethod 的回呼,當應該排程取消連結表時會呼叫該回呼,並實作堆積存取方法的方法。
Justin Pryzby 寄來了三個更多版本的修補程式,以在 typinput 的錯誤期間報告文字參數,並使用二進位參數在錯誤時執行參數輸出。
Daniel Gustafsson 寄來了兩個更多版本的修補程式,使其可以使用 NSS 作為 libpq 的 TLS 後端。
Jan Wieck 寄來了另一個修補程式版本,使連線協定可插入,並使用相同協定透過 telnet 回答。
Justin Pryzby 寄來了另一個修補程式版本,以潤飾即將發佈版本的文檔。
Iwata Aya 和 Álvaro Herrera 交換了修補程式以改善 libpq 追蹤功能。
Amit Kapila 寄來了一個修補程式,以更新準備好的 xact 解碼的文檔和註解,以符合目前的行為。
Daniel Gustafsson 寄來了另一個修補程式版本,以檢查 pg_upgrade 中目標叢集二進位檔的版本。
Mark Rofail 寄來了另一個修補程式版本,以實作外部鍵陣列。
Matthias van de Meent 寄來了另一個修補程式版本,以新增 COPY 進度報告的進度報告元件,包括一個新的檢視表 pg_stat_progress_copy,新增回到進度報告文檔的反向連結,並為相同元件新增迴歸測試。
Dilip Kumar 寄來了三個更多版本的修補程式,以提供一個新的介面來取得恢復暫停狀態,pg_get_wal_replay_pause_state,該介面會傳回恢復暫停的實際狀態,即如果未請求暫停則為「未暫停」,如果已請求暫停但尚未暫停恢復則為「已請求暫停」,如果恢復實際上已暫停則為「已暫停」。
KaiGai Kohei 寄來了一個修補程式,以將二進位輸入/輸出處理常式新增到 contrib/cube。
Georgios Kokolatos 寄來了另一個修補程式版本,以使 dbsize 更一致。
Mark Dilger 寄來了另一個修補程式版本,以新增 pg_amcheck,這是一個命令列介面,用於針對表和索引執行 amcheck 的驗證。
John Naylor 寄來了兩個更多版本的修補程式,使其可以使用 SIMD 指令來驗證 utf-8。
Hayato Kuroda 寄來了三個版本的修補程式,以重構 ECPGconnect 並允許在那裡進行 IPv6 連線。
Amit Langote、Greg Nancarrow 和 Amit Kapila 交換了修補程式,使其可以使用多個工作程序來執行 INSERT (INTO ... SELECT ...)。
Julien Rouhaud 寄來了另一個修補程式版本,以將新的 COLLATION 選項新增到 REINDEX。
John Naylor 寄來了兩個版本的修補程式,以允許將元組插入到幾乎為空的頁面中。
Paul Martinez 寄來了兩個更多版本的修補程式,以記錄 max_replication_slots 對訂閱者端 (subscriber side) 的影響。
Ajin Cherian 和 Amit Kapila 交換了修補程式,以避免在重新啟動後重複解碼準備好的交易,並新增一個選項以在 pg_create_logical_replication_slot 中啟用兩階段提交。
Peter Eisentraut 送出另一個修訂版的 patch,修正游標敏感度術語,使其與 SQL 標準一致,並移除對支援敏感游標的聲明,並為游標新增一個選項 ASENSITIVE,作為預設行為。
Benoit Lobréau 送出一個 patch,更詳細地記錄了 archive_command 如何根據收到的訊號失敗,以及是否在 pg_stat_archiver 中報告。
Peter Eisentraut 送出另一個修訂版的 patch,為來自客戶端的 SSL 連線設定 SNI,這允許支援 SNI 的代理程式路由連線。
Peter Smith 送出另三個修訂版的 patch,以實作兩階段交易的邏輯解碼。
Amit Kapila 送出另一個修訂版的 patch,更新邏輯複製的文件,以包含最近新增的邏輯複製組態設定,並提及資料表同步 worker 現在使用複製來源來追蹤進度的事實。
Thomas Munro 送出另一個修訂版的 patch,以條件變數取代緩衝區 I/O 鎖定。
Amit Langote 送出另一個修訂版的 patch,修正分割區列移動的錯誤行為,方法是確保在外鍵觸發器在分割區資料表上建立,並使用相同的觸發器在跨分割區更新期間正確強制執行外鍵。
Thomas Munro 送出另一個修訂版的 patch,以防止鎖存器向目前未處於休眠狀態的程序傳送訊號,對鎖存器使用 SIGURG 而非 SIGUSR1,對 epoll 鎖存器使用 signalfd,這透過等待 signalfd 而非訊號處理常式和自我管道來減少系統呼叫和其他管理負擔,並對 kqueue 鎖存器使用 EVFILT_SIGNAL。
Michaël Paquier 送出一個 patch,為 reindexdb 新增 --tablespace 選項,與最近為 REINDEX 新增的功能相符。
Kota Miyake 送出一個 patch,修正在同時設定 PGUSER 和 PGPORT 時,pgbench 在錯誤中報告資料庫名稱的問題。
Amul Sul 送出另一個修訂版的 patch,使用全域屏障實作 wal 禁止狀態,在 WAL 寫入的 START_CRIT_SECTION 之前產生錯誤或 Assert,並記錄相同內容。
Justin Pryzby 送出另一個修訂版的 patch,使在分割區資料表上使用 CREATE INDEX CONCURRENTLY 成為可能。
Jacob Champion 送出另一個修訂版的 patch,儲存使用者原始的已驗證身分以進行記錄。
Daniel Gustafsson 送出另一個修訂版的 patch,透過忽略會開啟 SSL 壓縮的選項來禁止 SSL 壓縮。稍後的 patch 將完全移除該選項,因為它已被棄用。
Daniel Gustafsson 送出一個 patch,從 libpq 的 authtype 參數中移除預設值,因為它已被棄用。
Álvaro Herrera 送出另一個修訂版的 patch,以實作 ALTER TABLE .. DETACH PARTITION CONCURRENTLY。
Dilip Kumar 送出另兩個修訂版的 patch,使設定資料表的壓縮類型成為可能。
Euler Taveira de Oliveira 送出另一個修訂版的 patch,使用 PUBLICATIONs 的 DDL 中的可選 WHERE 子句實作邏輯複製的列篩選。
Thomas Munro 送出另一個修訂版的 patch,為 FeBeWaitSet 位置引入符號名稱,並將 FeBeWaitSet 用於 walsender.c。
Thomas Munro 送出另一個修訂版的 patch,將條件變數用於 ProcSignalBarriers,允許在 interrupt 程式碼中使用條件變數,並使用全域屏障來修復 Windows 上的 DROP TABLESPACE,方法是強制所有後端關閉該平台上的所有 fds。
Andrey Borodin 送出一個 patch,為 FPI 使用不同的壓縮方法。
Julien Rouhaud 送出一個 patch,將 pg_prewarm 和 pg_stat_statements 中的明確對齊使用變更為 CACHELINEALIGN,並根據 CACHELINEALIGN 更新 hash_estimate_size() 中的對齊,以估計 ShmemInitHash 實際將消耗的量。
Thomas Munro 送出一個 patch,移除 Linux < 2.6.27 的 latch.c 解決方案。
Peter Eisentraut 送出另一個修訂版的 patch,psql 預設顯示所有查詢結果。
Jeff Janes 送出一個 patch,使 SCRAM 的行為與 MD5 相符,方法是在使用者的密碼不符時,在 DETAIL 訊息中報告。
Joel Jacobson 送出一個 patch,以實作 regexp_positions() 函數。
Paul Förster 送出一個 patch,在 psql 的 --help 輸出中提及資料庫 URI。
Justin Pryzby 送出一個 patch,以 ATExecForceNoForceRowSecurity 的樣式重構 ATExec{En,Dis}ableRowSecurity,並進行一些進一步的重構。
Justin Pryzby 送出一個 patch,以實作 ALTER TABLE SET TABLE ACCESS METHOD。