PGConf NYC 將於 2021 年 12 月 3-4 日舉行。CfP 徵稿正在開放,贊助機會亦同。
Pgpool-II 4.2.4、4.1.8、4.0.15、3.7.20 和 3.6.27,PostgreSQL 的連線池和語句複製系統,已發布
pgmoneta 0.4.0,PostgreSQL 的備份和還原系統,已發布
Buildfarm 13.1 軟體,PostgreSQL 專案的持續整合系統,已發布
dbForge Schema Compare 1.2 for PostgreSQL 已發布
pg_timetable 4.0.0,PostgreSQL 的工作排程器,已發布。https://github.com/cybertec-postgresql/pg_timetable/releases
https://archives.postgresql.org/pgsql-jobs/2021-08/
Planet PostgreSQL: https://planet.postgresql.org/
本週的 PostgreSQL 每週新聞由 David Fetter 帶給您
請在星期日下午 3:00 (PST8PDT) 之前將新聞和公告提交至 david@fetter.org。
Amit Kapila 推送
修復 021_twophase.pl 中的測試失敗。 該測試期望有兩個與兩個訂閱對應的已準備交易,但它只等待趕上一個訂閱。透過允許等待兩個訂閱來修復它。報告者:Michael Paquier,根據 buildfarm。作者:Ajin Cherian。審閱者:Amit Kapila、Vignesh C、Peter Smith。討論:https://postgr.es/m/CAA4eK1+_0iNQ8Z=KVTjmmAqNX-hyv+1+fnZ-Yx8CVP=uAcekqw@mail.gmail.com
https://git.postgresql.org/pg/commitdiff/eaf5321c352478266cebe2aa50ea4c34a8fdd2c7
新增對邏輯複製中串流交易的準備 API 支援。Commit a8fd13cab0 透過訂閱的新選項 "two_phase" 為內建邏輯複製新增了對準備交易的支援。現有的串流選項不允許使用 "two_phase" 選項。此 commit 允許組合 "streaming" 和 "two_phase" 訂閱選項。它擴展了 pgoutput 外掛程式和訂閱者端程式碼,以新增串流交易的準備 API,該 API 將在準備時套用暫存檔中累積的變更。作者:Peter Smith 和 Ajin Cherian。審閱者:Vignesh C、Amit Kapila、Greg Nancarrow。測試者:Haiying Tang。討論:https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru 討論:https://postgr.es/m/CAMGcDxeqEpWj3fTXwqhSwBdXd2RS9jzwWscO-XbeCfso6ts3+Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/63cf61cdeb7b0450dcf3b2f719c553177bac85a2
Etsuro Fujita 推送
修復 commit 1ec7fca8592178281cd5cdada0f27a340fb813fc 中的疏忽。我未能考慮到當 ExecAppendAsyncEventWait() 使用 postgres_fdw 通知多個具備非同步功能的節點時,前面的節點可能會調用 process_pending_request() 來處理後續節點提出的待處理非同步請求。在這種情況下,當收到通知時,後續節點應產生一個元組,以從 process_pending_request() 擷取的元組返回給父 Append 節點。修復。每個 buildfarm 透過 Michael Paquier。像之前的 commit 一樣,向後移植到 v14。感謝 Tom Lane 進行測試。討論:https://postgr.es/m/YQP0UPT8KmPiHTMs%40paquier.xyz https://git.postgresql.org/pg/commitdiff/a8ed9bd59d48c13da50ed2358911721b2baf1de3
postgres_fdw:修復外部資料表中產生欄位的問題。 postgres_fdw 從遠端資料表匯入產生的欄位作為普通欄位,並且在插入到外部資料表時,會導致諸如「ERROR: cannot insert a non-DEFAULT value into column "foo"」之類的故障,因為它嘗試將值插入到產生的欄位中。為了修復,我們在假設 postgres_fdw 外部資料表中的產生欄位的定義使其代表底層遠端資料表中的產生欄位的基礎上,執行以下操作: * 在插入或更新時,將 DEFAULT 發送到外部伺服器的產生欄位,而不是在本地伺服器上計算的產生欄位值。
Andres Freund 推送
從 AuxiliaryProcessMain() 中移除錯位的註解。 自至少 626eb021988 以來,該註解不再有意義。由於它實際上沒有解釋任何內容,因此只需將其刪除。作者:Andres Freund andres@anarazel.de https://git.postgresql.org/pg/commitdiff/8b1de88b7ce9fe0458d3950121a797fd3d988f6c
pgstat:分割 bgwriter 和 checkpointer 統計資訊的報告/提取。自 bgwriter 和 checkpointer 在 806a2aee379 中分成兩個處理程序以來,這些就沒有關係了。由於有幾個待處理的 patch (共享記憶體統計資訊、擴展追蹤的 IO / 緩衝區統計資訊集合),因此這種分組使這些 patch 變得更加尷尬,因此將它們分開。單獨完成以使審閱更容易。這不會更改 pg_stat_bgwriter 的內容,也不會將不屬於 bgwriter/checkpointer 統計資訊的欄位移出。但是,pgstat_fetch_global() 已重新命名並分為 pgstat_fetch_stat_checkpointer() 和 pgstat_fetch_stat_bgwriter()。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1bc8e7b0991c1eae5fa6dc2d29bb2280efb52740
pgbench:僅在必要時才在使用管線化時執行 PQconsumeInput()。到目前為止,我們為每個管線化查詢都執行 PQconsumeInput(),向作業系統請求更多輸入 - 但作業系統通常不會有,因為所有結果可能都已傳送。事實證明,這會對效能產生明顯的影響。Alvaro Herrera 審閱了添加 PQisBusy() 檢查的想法,但不是這個具體修補程式。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210720180039.23rivhdft3l4mayn@alap3.anarazel.de 回溯修補:14,libpq/pgbench 管線化是從此版本引入的。https://git.postgresql.org/pg/commitdiff/87bff68840d542011ed8f60427502fb90fdf2873
程序啟動:將 postmaster 的 --forkboot 重新命名為 --forkaux。由於引導模式無法在 postmaster 下方執行,因此使用 --forkboot 啟動輔助程序令人困惑。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/50017f77722b8b998ead5ca6fdb0b821fe7a34d2
程序啟動:將 BootstrapModeMain 從 AuxiliaryProcessMain 中分離出來。一旦移除所有 if 語句,兩者之間實際上沒有共享程式碼。而且輔助程序實際上不是由 main() 中的 AuxiliaryProcessMain() 呼叫啟動的,這非常令人困惑。還有更多工作要做,AuxiliaryProcessMain() 應該移出 bootstrap.c,並且 BootstrapModeMain() 不應該使用/成為 AuxProcType 的一部分。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/5aa4a9d2077fa902b4041245805082fec6be0648
程序啟動:auxprocess:重新縮排區塊。保持獨立以便於審閱,特別是因為 pgindent 堅持重新排版一些註解。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/27f790346621e1db3cc0305e7ae2b2cbfb537aa6
程序啟動:將 AuxiliaryProcessMain 移至其自己的檔案中。在前面的提交之後,auxprocess 程式碼與 bootstrap.c 無關 - 因此專用檔案看起來不那麼令人困惑。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/0a692109dcc73178962069addf7478ac89950e4d
程序啟動:從 AuxProcType 中移除 bootstrap / checker 模式。兩者實際上都沒有初始化為輔助程序,因此為它們保留 PGPROC 等等並沒有真正的意義。這使得檢查器模式通過在引導模式中途退出來實現。在某些時候可能值得改變這種情況,也許是如果我們將檢查器模式擴展為更通用的工具。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/f8dd4ecb0b7fc3420e199021375e622815cd326f
程序啟動:集中 pgwin32_signal_initialize() 呼叫。首先,現有的位置導致 main() 中出現一些尷尬的程式碼。另一方面,無論如何,新的位置更容易理解。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/07bf37850991c68a7038fb06186bddfd64c72faf
也在 postmaster 中呼叫 pgwin32_signal_initialize()。這是 07bf3785099 中的一個疏忽。雖然它確實減少了該提交帶來的簡化益處,但對我來說似乎仍然是一個勝利。對於 miscinit.c 中的 postmaster,似乎最好有一個與 InitPostmasterChild() / InitStandaloneProcess() 鏡像的函數,以便更容易保持三種可能的環境之間的初始化同步。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210805214109.lzfk3r3ae37bahmv@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/0de13bbc47d19c95de132cc85c341fdab079c170
程序啟動:始終在 BaseInit() 之前呼叫 Init[Auxiliary]Process()。對於 EXEC_BACKEND,需要 SubPostmasterMain() 需要 LWLocks 才能工作,因此必須在呼叫 BaseInit() 之前呼叫 InitProcess()/InitAuxiliaryProcess()。不同平台之間初始化順序的不同使得理解系統並為新子系統添加初始化點變得不必要地困難,並且需要大量重複。為了能夠更改順序,BaseInit() 不能再觸發 CreateSharedMemoryAndSemaphores() - 顯然這需要在我們可以呼叫 InitProcess() 之前發生。無論如何,在單一使用者/引導模式下顯式建立共享記憶體似乎更乾淨。在此變更之後,將 bufmgr 初始化分為 InitBufferPoolAccess() / InitBufferPoolBackend() 不再有意義,因此移除了後者。作者:Andres Freund andres@anarazel.de 審閱者:Kyotaro Horiguchi horikyota.ntt@gmail.com 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/b406478b87e2234c0be4ca4105eee3bb466a646b
pgstat:在 BaseInit() 中啟動 pgstat 以修復 AV 對 pgstat 的未初始化使用。先前 pgstat_initialize() 在 InitPostgres() 和 AuxiliaryProcessMain() 中被呼叫。事實證明,至少在我們呼叫 pgstat_initialize() 之前報告統計資料的案例,請參閱 AutoVacWorkerMain() 有意提前呼叫 pgstat_report_autovac()。事實證明,這對於目前的 pgstat 實現來說不是問題,因為 pgstat_initialize() 僅註冊一個關閉回呼。但是在我們正在努力實現的基於共享記憶體的統計資料實現中,pgstat_initialize() 必須做更多的工作。在 b406478b87e 之後,BaseInit() 是一個中心位置,可以在其中放置普通後端和輔助後端共享的初始化。顯然,在 InitPostgres() 註冊 ShutdownPostgres 之前,會呼叫 BaseInit()。先前 ShutdownPostgres 是第一個 before_shmem_exit 回呼,現在通常是 pgstats。這應該沒問題。先前 pgstat_initialize() 沒有在引導模式下被呼叫,但似乎沒有這樣做的需要。現在它是無條件完成的。為了檢測未來類似的問題,在幾個位置添加了斷言,以驗證 pgstat 子系統已初始化且尚未關閉。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/ee3f8d3d3aec0d7c961d6b398d31504bb272a450
透過 before_shmem_exit() 完全完成平行 worker 的關閉。這是朝向將統計資料儲存在動態共享記憶體的一個步驟。由於動態共享記憶體區段在 before_shmem_exit() 回呼函式處理完畢後,但在 on_shmem_exit() 回呼函式處理之前被分離,因此在 before_shmem_exit() 回呼函式處理完畢後,無法收集任何統計資料。平行 worker 的關閉可能會在 DSM 分離回呼期間導致發出統計資料,例如 SharedFileSet (它會關閉其檔案,這可能會導致 fd.c 發出關於暫存檔案的統計資料)。因此,平行 worker 的關閉需要在 before_shmem_exit 回呼函式處理期間完成。有人可能會認為,這個問題可以透過仔細排序 DSM 區段的附加順序來解決,以便 pgstats 區段比平行查詢區段更晚分離。但事實證明這樣行不通,因為統計資料雜湊可能需要增長,這可能會導致分配新的區段,然後這些區段會更早被分離。有兩個程式碼變更:首先,透過 before_shmem_exit 呼叫 ParallelWorkerShutdown()。這本身就是一個好主意,因為其他關閉回呼,例如 ShutdownPostgres 和 ShutdownAuxiliaryProcess 是透過 before_*
呼叫的。其次,明確地從平行查詢 DSM 區段分離,從而確保所有統計資料在 ParallelWorkerShutdown() 期間發出。對於這些問題有更好的解決方案,但哪個解決方案是正確的還不明顯。由於共享記憶體統計資料的工作量已經很大... 作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 討論:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/fa91d4c91f28f4819dc54f93adbd413a685e366a
在單一使用者模式中使用 before_shmem_exit() 排程 ShutdownXLOG()。先前使用 on_shmem_exit()。即將推出的共享記憶體統計資料修補程式使用 DSM 區段來儲存統計資料,這在 shmem_exit() 中的 dsm_backend_shutdown() 呼叫之後無法使用。似乎沒有理由透過 on_shmem_exit() 執行 ShutdownXLOG(),因此進行變更。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 討論:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/a1bb3d5dbe6a66ae73d7805a63b951793b5d55df
pgstat: 透過 before_shmem_exit() 排程每個後端的 pgstat 關閉。先前使用 on_shmem_exit()。即將推出的共享記憶體統計資料修補程式使用 DSM 區段來儲存統計資料,這在 shmem_exit() 中的 dsm_backend_shutdown() 呼叫之後無法使用。需要先前的 commit 才能允許此變更。此 commit 從共享記憶體統計資料修補程式中分離出來,以便更容易隔離由排序變更引起的問題,而不是統計資料儲存位置中更大的變更。作者:Andres Freund andres@anarazel.de 作者:Kyotaro Horiguchi horikyota.ntt@gmail.com 討論:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de 討論:https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de 討論:https://postgr.es/m/20210803023612.iziacxk5syn2r4ut@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/fb2c5028e63589c01fbdf8b031be824766dc7a68
將暫存檔案清理移至 before_shmem_exit()。正如一些 OSX buildfarm 動物回報的那樣,在 AtProcExit_Files() 處理期間至少存在一條暫存檔案的路徑。由於暫存檔案清理會導致 pgstat 報告,因此 ee3f8d3d3ae 中新增的斷言導致失敗。這不是 OSX 特有的問題,我們只是幸運地發現 OSX 上的時序可靠地觸發了該問題。造成這種情況的已知方法是在使用 MANIFEST 的 perform_base_backup() 期間發生 FATAL 錯誤 - 在 InitializeBackupManifest() 之後新增 elog(FATAL) 可靠地在隔離狀態下重現該問題。問題在於 InitializeBackupManifest() 中建立的暫存檔案沒有透過資源擁有者清理來清理,因為 WalSndResourceCleanup() 目前僅用於非 FATAL 錯誤。然後,這允許使用現有的暫存檔案到達 AtProcExit_Files(),從而導致斷言失敗。為了修復這個問題,將暫存檔案清理移至 before_shmem_exit() hook,並新增斷言以確保在暫存檔案管理初始化/關閉之前/之後沒有建立暫存檔案。最乾淨的方法似乎是將 fd.c 初始化分為兩個階段,一個用於普通檔案存取,另一個用於暫存檔案存取。現在沒有必要在程序結束期間執行進一步的 fd.c 清理,所以我只是將 AtProcExit_Files() 重命名為 BeforeShmemExit_Files()。或者,我們可以再次遍歷檔案以檢查是否存在暫存檔案,但新增的斷言似乎提供了足夠的保護。事實證明,ee3f8d3d3ae 中新增的斷言會產生太多的雜訊 - 在這種情況下,我們至少必須暫時將它們降級為 WARNING。這個 commit 不一定是解決這個問題的最佳方法,但它應該可以解決 buildfarm 失敗的問題。我們可以稍後修改。作者:Andres Freund andres@anarazel.de 討論:https://postgr.es/m/20210807190131.2bm24acbebl4wl6i@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/675c945394b36c2db0e8c8c9f6209c131ce3f0a8
Thomas Munro 推送
在崩潰恢復中執行檢查點程序和背景寫入程序。在崩潰恢復期間(除了在 --single 模式下),啟動檢查點程序和背景寫入程序,就像我們對複製所做的那樣。出於謹慎考慮,commit cdd46c76 沒有這樣做。現在,讓這兩種情況下的環境盡可能相似似乎是一個更好的主意。也可能存在一些效能優勢。審閱者:Robert Haas robertmhaas@gmail.com 審閱者:Aleksander Alekseev aleksander@timescale.com 測試者:Jakub Wartak Jakub.Wartak@tomtom.com 討論:https://postgr.es/m/CA%2BhUKGJ8NRsqgkZEnsnRc2MFROBV-jCnacbYvtpptK2A9YYp9Q%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/7ff23c6d277d1d90478a51f0dd81414d343f3850
進一步簡化 StartupXLOG() 中的一些邏輯。Commit 7ff23c6d277d1d90478a51f0dd81414d343f3850 讓我們有兩個相同的情況。將它們合併。作者:Robert Haas robertmhaas@gmail.com 討論:https://postgr.es/m/CA%2BhUKGJ8NRsqgkZEnsnRc2MFROBV-jCnacbYvtpptK2A9YYp9Q%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/8f7c8e2bef2bd2587e5d66dd20de15f3db0a6bcb
Tom Lane 推送
文件:對邏輯複製協定文件的細微改進。在適當的地方,使用後端程式碼中資料類型的名稱來註釋訊息欄位資料類型,例如 XLogRecPtr 或 TimestampTz。以前我們只說“Int64”,這沒有提供那麼多的資訊。此外,闡明對物件 OID 的引用,並利用現有的約定來表示必須具有固定值的欄位的值。Vignesh C,由 Peter Smith 和 Euler Taveira 審閱。討論:https://postgr.es/m/CALDaNm0+fatx57KFcBopUZWQpH_tz3WKKfm-_eiTwcXui5BnhQ@mail.gmail.com
https://git.postgresql.org/pg/commitdiff/a5cb4f9829fbfd68655543d2d371a18a8eb43b84
新增各式各樣的 regexp_xxx SQL 函數。這個修補程式新增了 regexp_count()、regexp_instr()、regexp_like() 和 regexp_substr() 這些函數,並擴展了 regexp_replace(),新增了一些可選參數。所有這些函數都遵循 Oracle 中使用的定義,儘管由於使用我們自己的 regexp 引擎,regexp 語言存在細微差異 —— 最值得注意的是,預設的換行符匹配行為有所不同。類似的函數也出現在 DB2 和其他地方。除了簡化移植性之外,對於某些任務,這些函數比我們現有的 regexp_match[es] 函數更容易使用。Gilles Darold,經我大幅修改。討論:https://postgr.es/m/fc160ee0-c843-b024-29bb-97b5da61971f@darold.net https://git.postgresql.org/pg/commitdiff/6424337073589476303b10f6d7cc74f501b8d9d7
不要省略轉換為 typmod -1。將一個已經具有特定 typmod 的類型的值轉換為未指定的 typmod,就運行時行為而言,不會做任何事情。但是,它確實應該更改表示式的公開類型以匹配。到目前為止,coerce_type_typmod 並沒有處理這個問題,這在諸如遞迴聯集 (recursive unions) 之類的上下文中產生了陷阱。例如,如果聯集的一側是 numeric(18,3),但它需要是 plain numeric 才能匹配另一側,則沒有直接的方法來表達這一點。通過插入一個 RelabelType 來更新表示式的公開類型,這很容易修復。但是,更改此行為有點令人不安,因為它已經存在很長時間了。(我強烈懷疑部分原因是該邏輯早於 7.0 中 RelabelType 的引入。57b30e8e2 的提交日誌訊息在這裡很有趣。)作為一個折衷方案,我們將偷偷地將此更改放入 14beta3 中,如果未來三個月內沒有出現投訴,則考慮向後移植到穩定分支。討論:https://postgr.es/m/CABNQVagu3bZGqiTjb31a8D5Od3fUMs7Oh3gmZMQZVHZ=uWWWfQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5c056b0c2519e602c2e98bace5b16d2ecde6454b
確實修復了 REFRESH MATERIALIZED VIEW CONCURRENTLY 中的歧義。與其嘗試選擇不會與任何可能的用戶定義的實體化視圖列名衝突的表別名,不如調整查詢的語法,以便別名僅在不會被誤認為是列名的地方使用。主要是寫成 "alias.*"
而不是僅僅 "alias",這也為人類和機器增加了清晰度。我們確實存在 "SELECT alias.*"
的行為與 "SELECT alias" 不同的問題,但我們可以使用 ruleutils.c 用於 SELECT 列表中的整行變數的相同技巧:寫成 "alias.*::compositetype"
。在完成此操作後,我們不妨恢復到原始別名;它們更容易閱讀。與 75d66d10e 一樣,向後移植到所有受支援的分支。討論:https://postgr.es/m/2488325.1628261320@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9179a82d7af38112cd0f6e84ab62d0b3592a6e0e
使 regexp 引擎的 backref 相關編譯狀態更具防禦性。到目前為止,我們透過儲存指向相關 subRE 節點的指標來記住捕獲括號子表達式的定義。在之前這沒問題,因為在解析 regexp 的其餘部分時,不會再修改該 subRE。但是,在 commit ea1268f63 之後,情況不再如此:parseqatom() 的外部調用可以自由地塗寫該 subRE。儘管如此,這似乎仍然有效,因為我們在「準備通用狀態骨架」段落中塞入子 atom 的狀態在語義上與子 atom 的原始端點沒有真正的不同。但這很容易被破壞,而且絕對不是以前的工作方式。考慮到這一點以及先前提交中修復的問題,最好完全消除對 subRE 節點的這種依賴。我們不需要整個子 subRE 用於將來的 backref,只需要它的開始和結束 NFA 狀態;所以讓我們只儲存指向這些狀態的指標。此外,在我們建立一個額外的 subRE 來處理立即巢狀的捕獲括號的邊角情況下,似乎最好讓額外的 subRE 具有與原始子 subRE 相同的 begin/end 狀態 (s/s2 not lp/rp)。我認為從 lp 連結到 rp 實際上在語義上可能是錯誤的,但由於 Spencer 的原始程式碼是這樣做的,所以我不能完全確定。無論如何,使用 s/s2 肯定沒有錯。根據 Mark Dilger 的報告。向後移植到引入問題修補程式的 v14。討論:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/cb76fbd7ec87e44b3c53165d68dc2747f7e26a9a
修復 regexp 引擎中的 use-after-free 問題。Commit cebc1d34e 教導 parseqatom() 透過擺脫多餘的 subRE 節點來優化分支僅包含一個「雜亂」atom 的情況。我們真正應該做的是保留為「雜亂」子 atom 建構的 subRE;但是為了避免更改 parseqatom 的名義 API,我使其在將其欄位複製到 parsebranch() 建立的外部 subRE 之後刪除該節點。似乎當時這實際上是有效的;但在 ea1268f63 之後變得危險,因為後面的提交允許 parse() 的較低調用返回一個 subRE,該 subRE 也被某些 v->subs[] 條目指向。這意味著我們可能會在 v->subs[] 中得到一個懸空指標,從而導致後來的 backref 行為不正常,但前提是該 subRE struct 在這期間被重複使用。因此,損壞似乎僅限於 '((...))...(...\2' 之類的情況。為了修復這個問題,做我之前應該做的事情,並修改 parseqatom 的 API,使其可以刪除呼叫者的 subRE 而不是被呼叫者的 subRE。這更安全,因為我們知道 subRE 尚未完成,因此沒有其他地方會有指向它的指標。根據 Mark Dilger 的報告。向後移植到引入問題修補程式的 v14。討論:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/cc1868799c8311ed1cc3674df2c5e1374c914deb
重新思考 regexp 引擎的反向參照相關編譯狀態。在推送 cb76fbd7e 後幾乎立刻感到後悔,因為我發現從資料結構中移除捕獲子表達式的 subREs 會破壞我提議的 REG_NOSUB 優化補丁。恢復該資料結構的變更。取而代之,解決關於不變更捕獲子表達式端點的問題,方法是不變更端點。我們不需要變更,因為該位的重點只是確保原子具有與我們在分支之間串聯的外部狀態對不同的端點。我們已經在括號子表達式的情況下建立了合適的狀態,因此額外的狀態只是無用的開銷。這似乎比 Spencer 最初的編碼更容易理解,並且通過節省一些狀態建立和弧線變更,它應該也會稍微快一點。(我實際上在 Jacobson 的網路語料庫上看到了幾個百分點的改進,雖然這幾乎超出了雜訊基底,所以我不會對此結果抱有太大的期望。)此外,修復 ea1268f63 添加的邏輯,以確保 v->subs[subno] 中記錄的 subRE 正是 capno == subno 的那個。Spencer 最初的編碼記錄了捕獲節點的子 subRE,就擁有正確的端點狀態而言,這還可以,但從 cb76fbd7e 開始,捕獲 subRE 本身也總是具有這些端點。我認為這種不一致會讓 REG_NOSUB 優化感到困惑。和以前一樣,向後移植到 v14。討論:https://postgr.es/m/0203588E-E609-43AF-9F4F-902854231EE7@enterprisedb.com https://git.postgresql.org/pg/commitdiff/00116dee5ad4c1964777c91e687bb98b1d9f7ea0
文件:移除虛假的 <indexterm> 項目。顯然是 665c5855e 中的複製貼上錯誤。9.6 文件工具鏈抱怨重複的索引條目,雖然我們現代的工具鏈沒有。無論如何,這些 GUC 肯定不是關於這些值的預設設定。https://git.postgresql.org/pg/commitdiff/cf5ce5aa70d33fc3048ab63c50585b8cc0f11dfd
David Rowley 推送了
在 RelOptInfo 中追蹤未修剪分區的 Bitmapset。對於具有大量分區的分割資料表,且查詢能夠修剪除極少數分區之外的所有分區,規劃器在 RelOptInfo.part_rels 上循環檢查非 NULL RelOptInfos 所花費的時間可能佔據整體規劃時間的很大一部分。在這裡,我們添加一個 Bitmapset 來記錄未修剪的分區。這允許我們通過循環遍歷 Bitmapset 來更有效地跳過修剪的分區。這會在無法修剪或修剪不多分區的情況下導致非常輕微的減速,但是,這些情況已經很難規劃,並且與其他任務(例如為大量分區建立路徑)相比,循環遍歷 Bitmapset 的開銷將是無法衡量的。Reviewed-by: Amit Langote, Zhihong Yu 討論:https://postgr.es/m/CAApHDvqnPx6JnUuPwaf5ao38zczrAb9mxt9gj4U1EKFfd4AqLA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/475dbd0b718de8ac44da144f934651b959e3b705
允許在更多情況下進行有序分區掃描。959d00e9d 添加了使用 Append 節點而不是 MergeAppend 的功能,當我們想要執行分割資料表的掃描,並且所需的排序順序與分割鍵相同,並且分割資料表的定義方式保證較早的分區僅包含低於較晚分區的值時。但是,以前,當存在允許使用多個 Datums 的分區時,我們不允許對 LIST 分割資料表進行這些有序分區掃描。這是一個非常簡單的檢查,如果我們檢查是否存在交錯分區,我們可能會做得更好,但當時我們無法知道哪些分區已被修剪,因此我們仍然可能不允許所有交錯分區都被修剪的情況。自 475dbd0b7 以來,我們現在了解已修剪的分區,我們可以在 partitions_are_ordered() 內部做得更好。在這裡,我們將從分區修剪中倖存的分區傳遞到 partitions_are_ordered(),並且對於 LIST 分區,讓它檢查是否存在任何位於 PartitionBoundInfo 中定義的新 "interleaved_parts" 欄位中的活動分區。對於 RANGE 分區,我們可以放鬆代碼,該代碼在存在 DEFAULT 分區時導致分區無序。由於我們現在知道哪些分區已被修剪,因此當 DEFAULT 分區已被修剪時,partitions_are_ordered() 現在返回 true。Reviewed-by: Amit Langote, Zhihong Yu 討論:https://postgr.es/m/CAApHDvrdoN_sXU52i=QDXe2k3WAo=EVry29r2+Tq2WYcn2xhEA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/db632fbca392389807ffb9d9b2207157e8e9b3e8
移除未使用的函數宣告。似乎宣告了 check_track_commit_timestamp,但從未在我們的程式碼庫中定義。這很可能是原始補丁的開發版本中添加 commit timestamps 後留下的殘餘物。讓我們移除無用的宣告。包含 guc.h 似乎也是多餘的。Author: Andrey Lepikhov 討論:https://postgr.es/m/f49aefb5-edbb-633a-af07-3e777023a94d@postgrespro.ru https://git.postgresql.org/pg/commitdiff/75a2d132eaef7d951db894cf3201f85e9a524774
Bruce Momjian 推送了
文件:新增使用 pg_dump 與 GNU split 和 gzip 的範例。這僅適用於 GNU split,不適用於其他版本,例如 BSD split。Reported-by: jim@jdoherty.net 討論:https://postgr.es/m/162653459215.701.6323855956817776386@wrigleys.postgresql.org Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/cfbbb8610d17bc6d82f37a446c38b29e2a5258f4
文件:提及繼承的 tableoid 可用於分割。先前,tableoid 未在分割文件部分中提及。我們只有一個指向繼承部分 "所有常規規則" 的連結。Reported-by: michal.palenik@freemap.sk 討論:https://postgr.es/m/162627031219.693.11508199541771263335@wrigleys.postgresql.org Backpatch-through: 10 https://git.postgresql.org/pg/commitdiff/691272cae96b3c947d3d2d4d8c43c499e72c65a2
pg_upgrade: 改善關於擴充功能升級的文件。先前的措辭不清楚升級擴充功能所需的步驟,以及在 pg_upgrade 後如何更新它們。Reported-by: Dave Cramer 討論:https://postgr.es/m/CADK3HHKawwbOcGwMGnDuAf3-U8YfvTcS8jqDv3UM=niijs3MMA@mail.gmail.com Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/5090d709f172ecd00b16b6e336c8c149a3f3d33d
pg_upgrade: 警告需要更新的擴充功能。並建立一個可以執行以更新它們的腳本。Reported-by: Dave Cramer 討論:https://postgr.es/m/CADK3HHKawwbOcGwMGnDuAf3-U8YfvTcS8jqDv3UM=niijs3MMA@mail.gmail.com Backpatch-through: 9.6 https://git.postgresql.org/pg/commitdiff/e462856a7a559c94bad51507c6b324f337d8254b
interval:在溢出到月份時對值進行四捨五入。先前溢出的單位大於月份時會被截斷為月份。同時也記錄溢出行為。報告者:Bryn Llewelly 討論:https://postgr.es/m/BDAE4B56-3337-45A2-AC8A-30593849D6C0@yugabyte.com 回溯修補:master https://git.postgresql.org/pg/commitdiff/95ab1e0a9db321dd796344d526457016eada027f
C 註解:修正擴充查詢的標題。報告者:Justin Pryzby 討論:https://postgr.es/m/20210803161345.GZ12533@telsasoft.com 回溯修補:9.6 https://git.postgresql.org/pg/commitdiff/9e51cc87fd0ac46b183cb7302a6751d52d3f159a
Peter Geoghegan 推送了
Dean Rasheed 推送了
修正 to_char() 中 'EEEE' 格式的除以零錯誤。修正了使用 to_char() 格式化科學記號表示法的數值時的一個長期存在的錯誤 -- 如果該值的指數小於 -NUMERIC_MAX_DISPLAY_SCALE-1 (-1001),則會產生除以零的錯誤。此錯誤的原因是 get_str_from_var_sci() 將其輸入除以 10^exp,這是使用 power_var_int() 產生的。但是,power_var_int() 中的下溢測試會使其在結果比例太小時返回零。對於 power_var_int() 的另一個唯一呼叫者 power_var() 來說,這不是問題,因為該呼叫者將 rscale 限制為 1000,但在 get_str_from_var_sci() 中,指數可以小得多,需要更大的 rscale。通過引入一個新函數來直接計算 10^exp,而沒有 rscale 限制來解決此問題。這也使得 10^exp 可以更有效地計算,而無需任何數值乘法、除法或四捨五入。討論:https://postgr.es/m/CAEZATCWhojfH4whaqgUKBe8D5jNHB8ytzemL-PnRx+KCTyMXmg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/226ec49ffd78c0f246da8fceb3094991dd2302ff
調整 numeric 程式碼中的整數溢位測試。以前,numeric 程式碼通過將較大型別的整數值轉換為較小型別,然後測試反向轉換是否產生原始值來測試該整數值是否適合較小型別。除了它在 buildfarm 動物 castoroides 上導致測試失敗(很可能是由於編譯器錯誤)之外,這完全沒問題。取而代之的是,通過與 PG_INT16/32_MIN/MAX 進行比較來進行這些測試。這與其他地方(例如 int84())的現有程式碼相符,經過更廣泛的測試,因此不太可能出錯。同時,添加涵蓋 numeric-to-int8/4/2 轉換的回歸測試,並將最近添加的測試調整為 434ddfb79a(在 v11 分支上)的風格,以使故障更容易診斷。每個 buildfarm 通過 Tom Lane,由 Tom Lane 審閱。討論:https://postgr.es/m/2394813.1628179479%40sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2642df9fac09540c761441edd9bdd0a72c62f39c
Fujii Masao 推送了
Peter Eisentraut 推送了
修正措辭。https://git.postgresql.org/pg/commitdiff/05e60aece33e84960ef566e4735b2d93c2d791c8
添加遺漏的訊息標點符號。https://git.postgresql.org/pg/commitdiff/ba4eb86ceff4eded5920d36ef82a2096db7ad0c0
訊息樣式改進。https://git.postgresql.org/pg/commitdiff/f4f4a649d80fea3ae0214b06e160eb5d46b48a16
pg_amcheck:添加遺漏的翻譯標記。https://git.postgresql.org/pg/commitdiff/789d8060f0517d4da0776480d937d8b64d5c5976
pg_amcheck:訊息樣式改進。https://git.postgresql.org/pg/commitdiff/80dfbbf1b17a1fb1123401799efdc660ee977051
移除 T_MemoryContext。這是一個不應該定義節點標籤的抽象節點。討論:https://postgres.tw/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/256909c6c1679767230d1088f1bfab727dd99e14
將 NestPath 節點變更為包含 JoinPath 節點。這使得所有 JoinPath 派生節點的結構相同,而與它們是否具有附加欄位無關。討論:https://postgres.tw/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/18fea737b5e47cc677eaf97365c765a47f346763
將 SeqScan 節點變更為包含 Scan 節點。這使得所有 Scan 派生節點的結構相同,而與它們是否具有附加欄位無關。討論:https://postgres.tw/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/2226b4189bb4ccfcc53917a8695d24e91ff2f950
在 COPY_POINTER_FIELD 中檢查大小,而不是讓每個呼叫者都這樣做。討論:https://postgres.tw/message-id/flat/c1097590-a6a4-486a-64b1-e1f9cc0533ce@enterprisedb.com https://git.postgresql.org/pg/commitdiff/c1132aae336c41cf9d316222e525d8d593c2b5d2
移除格式引數中一些不必要的強制轉換。我們可以 %zd 或 %zu 直接使用,不需要強制轉換為 int。相反地,有些程式碼在可以使用 %d 直接使用時,卻在強制轉換掉 int。https://git.postgresql.org/pg/commitdiff/ae03a7c7391dfc59f14226b7cfd8ef9f3390e56f