PostgreSQL 每週新聞 - 2021 年 7 月 25 日

發布於 2021-07-26,由 PWN 發布
PWN

PostgreSQL 每週新聞 - 2021 年 7 月 25 日

本週人物

奧地利 pgDay 將於 2021 年 9 月 17 日在維也納 Schönbrunn 宮 (Apothekertrakt) 舉行。https://pgday.at/en/

PostgreSQL 產品新聞

pgSCV 0.7.0,一個與 Prometheus 相容的監控代理程式和 PostgreSQL 的指標匯出器,已發布

pg_validate_extugprade 1.0.0beta,一個用於測試擴充套件升級過程各種組合的工具,已發布

pspg 5.1.0,一個專為 PostgreSQL 設計的分頁程式,已發布。https://github.com/okbob/pspg/releases/tag/5.1.0

Database Lab 2.4,一個用於快速複製大型 PostgreSQL 資料庫以構建非生產環境的工具,已發布:https://gitlab.com/postgres-ai/database-lab/-/releases

PostgreSQL 七月份的職缺

https://archives.postgresql.org/pgsql-jobs/2021-07/

PostgreSQL 新聞

Planet PostgreSQL: https://planet.postgresql.org/

PostgreSQL 每週新聞由 David Fetter 本週為您帶來

請在太平洋標準時間 (PST8PDT) 星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。

已應用的修補程式

Thomas Munro 推送了

Amit Kapila 推送了

Michaël Paquier 推送了

  • doc:提及 DROP STATISTICS 的 CASCADE/RESTRICT。此語法無效,因為統計資料上沒有任何相依性,但剖析器支援它。這與其他 DROP 命令更加一致。作者:Vignesh C 討論:https://postgr.es/m/CALDaNm1LA=yNmzcSfy+0oe6CEAgsxXRf_-UutE3ZncFi8QkFNQ@mail.gmail.com 回溯修補:10 https://git.postgresql.org/pg/commitdiff/d1216635610a9855a8ec139e55cd852f67d5ee81

  • 修正 pg_receivewal --compress 的 WAL 區段開啟的一些問題。如果儲存這些檔案的儲存庫中存在具有相同基本名稱的部分非壓縮區段,則使用 --compress 時,處理新 WAL 區段開啟的邏輯會變得模糊。在這種情況下,使用 --compress 會導致程式碼首先檢查是否存在非壓縮區段及其大小,然後開啟新的壓縮部分區段。程式碼在大多數平台上意外地正常運作,正如建置伺服器所證明的那樣,除了 bowerbird,其中 gzflush() 可能在此程式碼路徑中失敗。在建立新的部分非壓縮區段時,採用填充前使用的程式碼路徑是錯誤的,因此讓我們修正它。請注意,當使用者混合使用有或沒有壓縮的 pg_receivewal 連續執行時,會出現此問題,正如 ffc9dda 引入的測試所發現的那樣。在它之上,這會重構程式碼,以便需要知道 ".gz" 字尾的程式碼路徑從 walmethods.c 中的四個減少到一個,從而稍微簡化了新壓縮方法的引入。這解決了第二個問題,即為意外失敗產生的記錄訊息不會顯示所涉及的壓縮區段名稱,這令人困惑,而是列印非壓縮等效項的名稱。報告人:Georgios Kokolatos 討論:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz 回溯修補:10 https://git.postgresql.org/pg/commitdiff/7fbe0c8c4d4fe429ee1d6383706ea5ccb0f639d3

  • 重新啟用 Windows 上 pg_receivewal 的 ZLIB TAP 測試。這是還原 6cea447 的操作,該提交暫時停用了 Windows 上的這些測試,原因是 bowerbird 發生錯誤,導致 gzflush() 在新開啟的壓縮和部分區段上執行時會失敗。由於 7fbe0c8,這個問題現在應該已解決,所以讓我們看看 buildfarm 對於 Windows 上這些測試的說法。討論:https://postgr.es/m/YPDLz2x3o1aX2wRh@paquier.xyz https://git.postgresql.org/pg/commitdiff/91d395f47aa92849b2556b1a4d6bc1ff34121a30

  • 停用 Windows 上 pg_receivewal 的 ZLIB TAP 測試。這是還原提交 91d395f,以避免在 Windows 上執行這些測試。這些測試在全球 buildfarm 成員中普遍穩定,除了 fairywren (pg_receivewal 崩潰) 和 bowerdird (SIGBREAK 阻止 buildfarm 執行完成)。這些錯誤相當奇怪,因為其他具有非常相似特徵的主機能夠順利運行這些測試。目前,停用 Windows 上的這些測試,以使 buildfarm 恢復正常。根據與 Andrew Dunstan 的討論。討論:https://postgr.es/m/9040d5ed-6462-66a4-07ac-2923785ae563@dunslane.net https://git.postgresql.org/pg/commitdiff/6a2c532c2230159b909382cfa58494ef9d6df703

  • 統一命令列整數選項的解析邏輯。現在,命令列二進制檔案的大部分整數選項都使用能夠完成工作的單一例程,修復了對馬虎值的檢測問題,例如由 atoi() 引起的問題,atoi() 在以數字字元開頭且帶有垃圾尾隨字串的字串上會失敗。根據我的統計,此提交將需要翻譯的字串數量減少了 26 個,將程式碼切換為具有無效和超出範圍值的兩種錯誤類型。在這裡可以做更多的事情,包括浮點數甚至 int64 選項,但 int32 是最吸引人的情況,因為可以依靠 strtol() 來可靠地完成工作。請注意,目前有一些例外情況,例如 pg_ctl 或 pg_upgrade,它們使用自己的日誌記錄邏輯。一些負面的 TAP 測試需要對產生的新錯誤進行一些調整。pg_dump 和 pg_restore 在選項解析中追蹤了並行作業的最大數量。程式碼經過少量重構,以便在專用於並行的程式碼中追蹤它。作者:Kyotaro Horiguchi, Michael Paquier 審閱人:David Rowley, Álvaro Herrera 討論:https://postgr.es/m/CALj2ACXqdG9WhqVoJ9zYf-iZt7sgK7Szv5USs=he6NnWQ2ofTA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f164e6d17616a157ea5d9e34dbb1b211c080c41

  • 為 pg_basebackup 和 pg_{dump,restore} 新增遺失的標頭宣告。這修復了由 6f164e6 引起的兩個編譯失敗。有趣的是,在 Linux 甚至 Windows 中,缺少 <limits.h> 並不會失敗。但在 MacOS 上,它會失敗。根據多個 buildfarm 成員的說法。https://git.postgresql.org/pg/commitdiff/bc0cc68f8a1648029424e9300b2e4457acd474a6

Peter Eisentraut 推送

Álvaro Herrera 推送

Peter Geoghegan 推送

Tom Lane 推送

  • 修復 plpgsql 中邊緣情況下的未初始化變數問題。如果在我們最初嘗試檢查成功編譯的表達式是否為“simple”時引發了錯誤,則後續對 exec_stmt_execsql 的調用會假設 stmt->mod_stmt 已經被計算,但實際上並沒有。這可能會導致在除錯版本中出現斷言失敗;在生產版本中,其效果通常會表現得好像指定了 INTO STRICT,即使實際上沒有。當然,這只有在後續嘗試執行表達式成功時才有意義,因此只有透過修復某些被引用、可內聯的 SQL 函數中的失敗,然後在同一個會話中重試調用 plpgsql 函數,才能達到這個問題。(可能還有更模糊的方法可以在不更改 plpgsql 函數的情況下更改表達式的行為,但這似乎是人們在實踐中最有可能遇到的情況。)解決這個問題最萬無一失的方法是安排 exec_prepare_plan 在我們完成輔助的簡單表達式檢查之前不要設定 expr->plan。但似乎很難在不產生引用計數洩漏問題的情況下做到這一點。因此,在註解中記錄危險,並修復 exec_stmt_execsql 以單獨測試是否已計算 stmt->mod_stmt。(這會為每次執行增加一個測試和分支,但希望這在上下文中可以忽略不計。)在 v11 及更高版本中,還修復了 exec_stmt_call,它也存在相同的問題的變體。根據 Alexander Lakhin 提出的錯誤 #17113。回溯修補到所有受支援的分支。討論:https://postgr.es/m/17113-077605ce00e0e7ec@postgresql.org https://git.postgresql.org/pg/commitdiff/d9809bf8694c17e05537c5dd96cde3e67c02d52a

  • Doc:改進關於指數運算子的文件。既然我們不必將其塞入舊的運算子表格格式的束縛中,我們可以添加另一個範例來闡明關於從左到右結合性的觀點。根據來自 mdione at grulic.org.ar 的建議。https://postgr.es/m/162661954599.693.13700316547731859171@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7fa1e1ef741964eeb50f33d7c72622658bb7e5f4

  • 修復一些標頭無法“獨立”編譯的錯誤。最近添加的對 ParseState 的引用未被 #include 引用涵蓋,從而為這些標頭的使用者建立了不必要的排序依賴性。Commit 2bfb50b3d 中的疏忽。根據 headerscheck/cpluspluscheck。https://git.postgresql.org/pg/commitdiff/678f5448c2d86976a98b402ef14482a8ba3b159b

  • 移除配置時的執行緒安全性檢查 (thread_test.c)。這個測試在撰寫時很有用,大約二十年前,但對於過去十幾年或更長時間內建構的任何平台來說,它似乎相當沒有意義。(另請參閱 8a2121185 中的註解。)而且我們現在收到報告,說這個測試程式本身在 ThreadSanitizer 下會失敗。與其花費精力修復它,不如直接刪除它,並假設仍然關心它的少數人已經知道他們需要使用 --disable-thread-safety。回溯修補到 v14 中,與 8a2121185 保持一致。討論:https://postgr.es/m/CADhDkKzPSiNvA3Hyq+wSR_icuPmazG0cFe=YnC3U-CFcYLc8Xw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/76fa3db33654e543b5c796e28c6fc5b505a19c2a

  • 使 printf("%s", NULL) 列印 "(null)" 而不是崩潰。 我們之前採取了一種強硬的態度,認為呼叫者永遠不應該列印一個空字串指標,這樣做應該會導致斷言失敗或崩潰。 但是,我們早就清除了任何容易找到的此類錯誤。 剩下的很多程式碼可能在難以觸及的邊緣情況下會以這種方式失敗。 例如,在像 ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("constraint \"%s\" for table \"%s\" does not exist", conname, get_rel_name(relid)))); 這樣簡單的程式碼中,我們必須想知道是否完全保證 get_rel_name 在這種情況下不會傳回 NULL。 如果發生這種情況,現有的策略會將可能是一個非常小的錯誤轉換為伺服器崩潰的狀況。 這對穩健性不利。 因此,讓我們遵循 glibc 的引導,列印 "(null)" 而不是失敗。 如果在正常使用中可以達到這種行為,我們當然仍然認為這是一個錯誤; 但崩潰似乎不如不崩潰那麼理想。 此修復程式在 v12 及更高版本中全面有效,在這些版本中我們始終使用 src/port/snprintf.c。 在此之前,在大多數平台上,我們受制於本地 libc,但似乎 Solaris 10 是唯一仍然會導致崩潰的受支援平台。 大多數其他平台,例如 *BSD、macOS 和 Solaris 11,都在某個時候採用了 glibc 的行為。 (AIX 和 HPUX 只列印 "" 而不是 "(null)",但這已經足夠接近了。)我沒有檢查 Windows 的原生 printf 會做什麼,但這並不重要,因為我們長期以來一直在該平台上使用 snprintf.c。 在 v12 及更高版本中,也對相關程式碼進行 const-ify,以便我們不會在常數字串上消除 const。 這只是一種整潔主義,因為幾乎沒有編譯器會警告這一點。 討論:https://postgr.es/m/17098-b960f3616c861f83@postgresql.org https://git.postgresql.org/pg/commitdiff/3779ac62d709467fe6331c8f0285d42e7487a01c

  • 修正檢查會話層級與交易層級鎖定的衝突。我們有一個實作限制,`PREPARE TRANSACTION` 無法處理在同一個可鎖定物件上同時持有會話生命週期鎖定和交易生命週期鎖定的情況。(這是因為我們需要在 prepare 後的清理過程中取得一個新的 `PROCLOCK` 項目,而這個操作可能會失敗。這種情況只會在異常使用 advisory locks 時發生,所以移除這個限制可能不值得花費那麼多的精力。) `AtPrepare_Locks` 試圖強制執行這個限制,但它的邏輯非常不足,因為它只偵測到會話鎖定和交易鎖定具有相同鎖定模式的情況。在同一個物件上不同模式的鎖定會導致相當無用的訊息「PANIC: we seem to have dropped a bit somewhere」。為了修正,建立一個暫時的雜湊表,每個 locktag 對應一個條目,而不是每個 locktag + 模式對應一個條目,並使用它來偵測衝突。根據 Alexander Pyhalov 提出的 bug #17122。這個 bug 存在已久,所以 back-patch 到所有支援的分支。討論:https://postgr.es/m/17122-04f3c32098a62233@postgresql.org https://git.postgresql.org/pg/commitdiff/6310809c4aa146b3996a35524955c6c6943d241a

  • 移除 Windows 上雜湊表大小的人為限制。引入 `hash_mem_multiplier` GUC 的目的是讓使用者重現雜湊聚合的舊行為,也就是在需要時可以使用超過 `work_mem` 的記憶體。然而,這個實作在 Win64 上未能完成這項工作,因為在該平台上,`work_mem` 被限制在 2GB,以保護使用 "long int" 計算記憶體大小的各種地方。如同撰寫的那樣,相同的限制也應用於 `hash_mem`。這導致需要超過 2GB 用於雜湊聚合的查詢出現嚴重的效能衰退,因為它們現在會溢出到磁碟,而且無法阻止這種情況發生。移除 `work_mem` 限制似乎是個好主意,但這是一個大工程,並且不可能進行 back-patch。然而,只有少數幾個地方需要關注 `hash_mem` 的值,而且事實證明可以在那裡移除限制,而不需要太多的程式碼變動或任何 ABI 破壞。所以,讓我們現在這樣做來修正效能衰退,並將更大的任務留到以後再處理。這個 patch 確實引入了更多的基礎設施,這些基礎設施應該有助於更大的任務,即 `pg_bitutils.h` 支援處理 `size_t` 值。根據 Laurent Hasson 的抱怨。Back-patch 到 v13,這是引入行為變更的版本。討論:https://postgr.es/m/997817.1627074924@sss.pgh.pa.us 討論:https://postgr.es/m/MN2PR15MB25601E80A9B6D1BA6F592B1985E39@MN2PR15MB2560.namprd15.prod.outlook.com https://git.postgresql.org/pg/commitdiff/28d936031a86d94806c6604480ff3f3f169b371c

Fujii Masao 推送

John Naylor 推送

David Rowley 推送

Andres Freund 推送

待處理的 Patches

Dilip Kumar 發送了另一個版本的 patch,以新增 TOAST 壓縮方法選項。

Kyotaro HORIGUCHI 發送了另外兩個版本的 patch,以防止在恢復期間出現 xlog 頁面標頭錯誤。

Greg Nancarrow 發送了另一個版本的 patch,以新增新的 "client_connection" 事件和客戶端連線觸發器支援。

Jacob Champion 發送了另一個版本的 patch,以支援 NSS 作為 libpq TLS 後端。

Thomas Munro 發送了一個 patch,以支援 Solaris 上的直接 I/O。

Andres Freund 發送了兩個版本的 WIP patch,以透過將熱路徑與冷路徑分離來最佳化分配,並透過避免在分配新區塊時需要迭代所有區塊來提高 slab 效能。

Daniel Gustafsson 送出一個 patch,用於停用 pgcrypto 中 OpenSSL EVP 摘要填充 (digest padding),並為未載入 legacy 的 OpenSSL 3 添加替代輸出。

Ranier Vilela 送出了兩個版本的 patch,用於避免一些 strlen 呼叫。

Masahiko Sawada 送出了另外兩個版本的 patch,以將 errcontext 新增到應用邏輯複製變更時發生的錯誤中,新增 pg_stat_logical_replication_error 統計檢視,並向 ALTER SUBSCRIPTION 新增 skip_xid 選項。

Peter Smith 送出了另外兩個版本的 patch,以新增對串流交易的 prepare API 支援。

Dipesh Pandit 送出了另外兩個版本的 patch,透過維護目前正在封存的日誌段號碼並將其遞增 '1' 以取得下一個 WAL 檔案,而不是預設重新掃描目錄,來降低 WAL 封存程式的目錄掃描。

Andres Freund 和 Yura Sokolov 交換了 patch,以改善 Andres 針對 lazy vacuum 處理無效 tuple 儲存的方式,Andres 的 patch 透過新增 radix tree 實作,Yura 的 patch 則透過新增專用的 vacuum tid map。

Denis Hirn 送出了另一個版本的 patch,以允許 CTE 中存在多個線性遞迴自引用。

Peter Eisentraut 送出一個 patch,使 Unicode makefile 具有平行安全性。

Ronan Dunklau 送出了另一個版本的 patch,用於標記和移除為 SortGroupClause 新增的 resjunk,並教導排序和結果節點執行簡化版本的投影 (projection)。

Filip Gospodinov 送出了另一個版本的 patch,透過在 Libs.private 中硬式編碼 -lpgcommon 和 -lpgport 來修復靜態連結的 pkg-config 檔案。

Tomáš Vondra 送出了另一個版本的 patch,以實作序列的邏輯解碼/複製。

Tomáš Vondra 送出了另一個版本的 patch,以處理擴展統計資訊中的 Expr op Expr 子句。

Tomáš Vondra 送出了另外兩個版本的 patch,以提高 GROUP BY 的效率。

David Rowley 送出了另一個版本的 patch,使 nodeSort.c 對於單欄排序執行 Datum 排序。

Peifeng Qiu 送出了兩個版本的 patch,以將 kerberos delegation 支援新增到 libpq。

John Naylor 送出了另一個版本的 patch,以重寫 pg_verify_str 以提高速度。

Hou Zhijie 和 Greg Nancarrow 交換了 patch,以允許使用者宣告表的平行資料修改安全性,啟用平行 select for insert,並新增一個 pg_get_table_parallel_dml_safety(regclass) 函數,傳回 (objid, classid, parallel_safety) 的記錄。

Ranier Vilela 和 Aleksander Alekseev 交換了 patch,以取消隱藏幾個變數。

Simon Riggs 送出了另外兩個版本的 patch,以使 hash 索引能夠支援 UNIQUE 限制,並允許使用多欄 hash 索引。

Bruce Momjian 送出了另外四個版本的 patch,以修復分數間隔 (fractional intervals) 算術中的錯誤。

Yugo Nagata 送出一個 patch,以更正 libpq 文件中的錯誤,其中指出命令會本地儲存在輸出緩衝區中,直到它被刷新。

Yugo Nagata 送出了另一個版本的 patch,旨在修復一個錯誤,該錯誤表現為在 pgbench 的管道 (pipeline) 中使用準備好的 BEGIN 語句可能會導致錯誤。

Richard Guo 送出了另一個版本的 patch,以修復分區式 JOIN 中的一些不理想之處。

David Rowley 送出了另一個版本的 patch,以新增對 ORDER BY 聚合的規劃器支援。

Ronan Dunklau 和 Ranier Vilela 交換了 patch,以修正 postgres_fdw PathKey 的處理方式,方法是注意用於排序的運算子族。

Thomas Munro 送出了兩個版本的 patch,使 SIMD 程式碼更具平台中立性,新增對 UTF-8 驗證的 ARM/NEON 支援,並新增對 UTF-8 驗證的 POWER AltiVec 支援。

Dean Rasheed 送出了另一個版本的 patch,使負指數的指數運算能與 NUMERIC 配合使用。

Peter Eisentraut 送出一個 patch,以在 psql 中測試查詢取消。

Pavel Stěhule 和 Aleksander Alekseev 交換了 patch,以增強 PL/pgsql 偵錯 API,以新增傳回變數內容的文字值。

Vigneshwaran C 送出了另外兩個版本的 patch,以新增 PUBLICATION 的 schema 等級粒度。

Jacob Champion 送出一個 patch,以新增自 Unicode 5.0 以來新增的寬 Unicode 代碼點的指示符。

Thomas Munro 和 Soumyadeep Chakraborty 交換了 patch,透過將追蹤目標後端的方式從 pid 更改為使用 pgprocno 來最佳化 ProcSendSignal(),這不需要掃描 ProcArray。 這樣做還消除了在啟動期間需要檢查的一些特殊情況。

Andres Freund 送出一個針對 pgbench 的 patch,將管道化 (pipelining) 的使用限制為僅在必要時執行 PQconsumeInput()。

Nitin Jadhav 送出了另外兩個版本的 patch,以顯示啟動過程中執行的操作的進度。

Ajin Cherian 送出了另外四個版本的 patch,以從邏輯複製中刪除空交易。

Thomas Munro 送出一個 patch,以教導 pgindent 關於特殊檔案本地類型名稱。

Erik Rijkers 送出了另一個版本的 patch,以實作 SQL/JSON 規範的 JSON_TABLE 部分。

Alexander Pyhalov 送出了另一個版本的 patch,以使 CASE 運算式能夠被推送到外部伺服器。

Zeng Wenjing 送出了另一個版本的 patch,以實作全域臨時表。

Justin Pryzby 送出了另一個版本的 patch,以實作 ALTER TABLE ... ACCESS METHOD,並使能夠指定分區表的表存取方法。

Hou Zhijie 送出一個 patch,以新增 quickselect 功能,該功能可用於快速計算中位數等。

Artur Zakirov 送出一個 patch,旨在修復一個錯誤,該錯誤表現為邏輯複製觸發的儲存程序無法使用通知事件,方法是將 SignalBackends() 呼叫移動到 AtCommit_Notify() 中。

Peter Eisentraut 送出一個針對 pg_amcheck 的 patch,以修復命令列上的區塊編號剖析,以便正確處理 sizeof(long)==4 的系統。

Haiying Tang 送出一個 patch,以支援包含等號的單引號輸入的 Tab 鍵自動完成功能。

Fabien COELHO 送出了另一個版本的 patch,以新增 SHOW_ALL_RESULTS 選項到 psql。

Dean Rasheed 和 Tom Lane 交換了 patch,以允許 NUMERIC 具有負數比例。

Michael Banck 送出了另一個版本的 patch,以新增一個新的 PGC_ADMINSET GUC 上下文和一個新的 pg_change_role_settings 預定義角色。這些建立了一個管理員,其能力介於超級使用者和使用者之間。

Greg Nancarrow 送出了另一個版本的 patch,以修復平行工作程序失敗的 assertion 和 coredump。

Andrey Borodin 送出一個 patch,以避免在 relcache 和 syscache 回呼 (callbacks) 中出現重複。

Vigneshwaran C 送出了另一個版本的 patch,以包含邏輯複製訊息描述中使用的實際資料類型。

Robert Haas 送出一個 patch,以從 StartupXLOG() 中重構一些復原結束程式碼,延遲一些與允許 WAL 相關的復原結束操作,並建立一個具有 StartupXLOG() 中程式碼的 XLogAcceptWrites() 函數。

Andrey Borodin 送出了一個修補程式,以改善 ReadPageInternal() 的錯誤回報,確保不再出現「找不到記錄」這種無用的錯誤訊息。

Tom Lane 送出了一個修補程式,以移除雜湊表大小中與 "long int" 相關的限制。

Haiying Tang 送出了修補程式的另一個修訂版本,針對迴歸範例進行小修正。

Bharath Rupireddy 送出了修補程式的另一個修訂版本,以使用 WaitLatch 處理 {pre, post}_auth_delay。

Bharath Rupireddy 送出了修補程式的另一個修訂版本,以禁止 CREATE SEQUENCE 的 RESTART 選項。

Julien Rouhaud 送出了一個修補程式,使 pg_stat_statements 測試不受預備語句失效的影響。