PostgreSQL 每週新聞 - 2021 年 6 月 6 日

發佈於 2021-06-07,作者:PWN
PWN

PostgreSQL 每週新聞 - 2021 年 6 月 6 日

PG Day Russia 將於 2021 年 7 月 8-9 日在線上舉行。徵稿 (CfP) 現已開放,請至 Submit your talk by June 7, 2021! 提交您的演講!

本週人物

PostgreSQL 產品新聞

PL/R 8.4.2,PostgreSQL 中 R 語言的嵌入,已發布

WAL-G 1.0,一個用於 PostgreSQL 和其他以 Go 編寫的資料庫的備份管理系統,已發布

pgtt 2.4,一個用於實現全域臨時表的擴展,已發布

Database .NET v32.6,一個多資料庫管理工具,現在支援 PostgreSQL,已發布

pg_partman 4.5.1,一個用於分區表的管理系統,已發布

hypopg 1.3.0,一個實現假設索引的擴展,已發布

六月份的 PostgreSQL 職缺

職缺

PostgreSQL 新聞

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

本週 PostgreSQL 每週新聞由 David Fetter 帶給您

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

已套用的補丁

Michaël Paquier 推送

Noah Misch 推送

Tom Lane 推送

  • 修正重複套用投影的錯誤規劃。create_projection_plan 包含一個隱藏的假設(此處透過 Assert 明確指出),即支援投影的 Path 會產生支援投影的 Plan。不幸的是,這個假設在幾行程式碼後,就被 create_projection_plan 本身違反了。這意味著兩個堆疊的 ProjectionPath 可能會產生一種情況,我們嘗試將上層 path 的 tlist 塞入不支援投影的子節點中,導致無效的 plan。沒有任何好的理由要有堆疊的 ProjectionPath;實際上,整個概念都是錯誤的,因為上層所需的 Vars/Aggs/etc 集合不一定在下層的輸出中可用,而且如果下層的輸入中沒有這些值,它也無法建立它們。因此,我們可以透過調整 create_projection_path 來修復這個問題,從它得到的子路徑中移除任何頂層的 ProjectionPath。(這相當於說「喔,我們改變了對這裡需要投影什麼的想法」。)這裡新增的測試案例只在 v13 和 HEAD 中失敗;在此之前,我們不會嘗試將 Sort 塞入 plan 的並行部分,原因我不是很清楚。然而,所有直接相關的程式碼看起來與 v11 幾乎相同,該風險是由 d7c19e62a 引入的。因此,我不太相信在 v11 和 v12 中,如果提供正確的測試案例,就不會存在相同類型的錯誤。因此,將程式碼變更向後移植,但不包括不相關的測試案例。根據 Bas Poot 的報告。討論:https://postgr.es/m/534fca83789c4a378c7de379e9067d4f@politie.nl https://git.postgresql.org/pg/commitdiff/6ee41a301e70fc8e4ad383bad22d695f66ccb0ac

  • 拒絕 SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE。如同不帶 GROUPING SETS 的 FOR UPDATE,此情況應被禁止;FOR UPDATE 只有在查詢結果的每一列都可以與單一資料表列相關聯時才有意義。然而,我們忘記教導 CheckSelectLocking() 檢查 groupingSets 以及 groupClause,導致它允許退化的 grouping sets。這導致了錯誤的 plan 和執行器中的空指標反向引用。尋找相同錯誤的其他實例,我找到的唯一一個是在 examine_simple_variable() 中。這只會導致愚蠢的估計,但它也應該被修復。根據 Yaoguang Chen 的私人報告。向後移植到所有支援的分支。 https://git.postgresql.org/pg/commitdiff/1103033aedc10295eb689a4b7158f21ef4c14a11

  • 教導 tab-complete.c 關於最近新增的 CREATE TYPE 選項。Commit c7aba7c14 遺漏在此處新增 SUBSCRIPT,而 commit 6df7a9698 遺漏新增 MULTIRANGE_TYPE_NAME。Haiying Tang 和 Tom Lane 討論:https://postgr.es/m/OS0PR01MB6113F9EDA46FA53BAA5445BDFB3D9@OS0PR01MB6113.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/9e3b3ff2664dd0b349d2a6d6f047128cb3489cf2

  • 更新 plannodes.h 中關於 PlanRowMark 的註解。此處對繼承的 UPDATE/DELETE 方案中不同實體欄位編號的引用已因 86dc90056 而過時;移除它。同時修改關於繼承情況的文字,使其更清晰。 https://git.postgresql.org/pg/commitdiff/79c50ca57828e9f8375766b36cce1e2960eebf87

  • 修復規劃器針對來自外部資料表的繼承的 row-mark 程式碼。Commit 428b260f8 破壞了需要 row marks 的情況(SELECT FOR UPDATE 等)的規劃,並且查詢的資料表之一是具有一般資料表作為繼承子資料表的外部資料表。我們正確處理了相反的情況,但顯然認為外部資料表不能是繼承父資料表。並非如此;因此,在新增子資料表時,我們需要能夠新增 CTID junk 欄位,而不僅僅是 wholerow junk 欄位。向後移植到 v12,此處引入了錯誤的程式碼。Amit Langote 討論:https://postgr.es/m/CA+HiwqEmo3FV1LAQ4TVyS2h1WM=kMkZUmbNuZSCnfHvMcUcPeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/889592344c48d3965567f331b4ea89dfe6447bce

  • 重新允許具有兩個以上元件的自定義 GUC 名稱。Commit 3db826bd5 禁止了這種情況,但事實證明有些人正在使用它。由於核心語法自 3dc37cd8d 以來就允許它,因此此程式碼也應該遵守。根據 Robert Sosinski 提供的錯誤 #17045。討論:https://postgr.es/m/17045-6a4a9f0d1513f72b@postgresql.org https://git.postgresql.org/pg/commitdiff/2955c2be79b35fa369c83fa3b5f44661cb88afa9

  • 修復 pg_subscription 上不正確的權限。文件記載的意圖是,除了 subconninfo 之外的所有欄位都應可公開讀取。然而,這一點已被忽略了兩次。自從 subsynccommit 被引入以來,它就從未可讀,oid 欄位也是如此(對於 join 而言非常重要)。鑑於之前沒有人抱怨,目前尚不清楚是否值得在較舊的分支中對此進行任何處理。但仍有時間以較低的成本在 v14 中修復它。根據 Israel Barth(透過 Euler Taveira)的報告。由 Euler Taveira 提供的修補程式,由我進行可能無效的註解更新。討論:https://postgr.es/m/b8f7c17c-0041-46b6-acfe-2d1f5a985ab4@www.fastmail.com https://git.postgresql.org/pg/commitdiff/3590680b85a8e51ef8df550e5a10dedd0d2dfd88

  • Doc:修復錯誤的 intarray 索引範例。siglen 參數由 gist__intbig_ops 提供,而不是 gist__int_ops。Simon Norris 討論:https://postgr.es/m/11BF2AA9-17AE-432A-AFE1-584FB9FB079D@hillcrestgeo.ca https://git.postgresql.org/pg/commitdiff/e4539386decae1c435767a69507cc7cbb11ac3ff

  • 修復 postgres_fdw 在 RECORD 類型的整列 Vars 中發生的故障。Commit 86dc90056 期望 FDW 可以處理其資料表的整列 Vars,即使這些 Vars 標記為 vartype RECORDOID。之前,規劃器產生的整列 Vars 的 vartype 等於相關資料表的 rowtype OID。(此變更背後的目的是為了實現跨繼承子資料表的 resjunk 欄位共享。)事實證明,postgres_fdw 無法處理此問題,但幸運的是,它的任何測試案例都沒有暴露此問題。大多數情況下都能正常工作,但是當我們嘗試讀取此類 Var 的值時,record_in() 無法使用預期的 rowtype。幸運的是,修改控制此過程的 tupdesc 並不困難,只需將外部資料表的 rowtype 替換為 RECORDOID。因此,我們可以在解決執行時問題的同時,仍然與其他資料表共享 resjunk 欄位。根據 Alexander Pyhalov 的報告。討論:https://postgr.es/m/7817fb9ebd6661cdf9b67dec6e129a78@postgrespro.ru https://git.postgresql.org/pg/commitdiff/f61db909dfb94f3411f8719916601a11a905b95e

Peter Eisentraut 推送

Thomas Munro 推送

Amit Kapila 推送

Fujii Masao 推送

Tomáš Vondra 推送

David Rowley 推送

Andrew Dunstan 推送

  • 在 PostgresNode.pm 中,不要在命令行上將 SQL 傳遞給 psql。Msys shell 會竄改其命令行中的某些模式,因此避免將任意 SQL 交給命令行上的 psql,而是使用 IPC::Run 的重新導向機制來處理 stdin。這種模式大部分已經在使用,但 query_poll_until() 並未正確執行。問題在 buildfarm 上發現,當時一個新的 TAP 測試在 msys 上失敗了。 https://git.postgresql.org/pg/commitdiff/11e9caff82bc7326e2bc9782937cb03875050cc4

待處理的補丁

Emre Hasegeli 提交了一個補丁,用於處理 PostgreSQL FDW 中的布林比較謂詞,因為並非所有謂詞都被識別。

Pavel Stěhule 提交了另一個版本的補丁,用於讓 PL/ppgsql debug API 返回變數內容的文字值。

Dilip Kumar 提交了另外四個版本的補丁,用於修補使用 TOAST 解碼推測性插入時的記憶體洩漏。

Hou Zhijie 提交了另外三個版本的補丁,以使 INSERT ... SELECT 能夠並行執行。

Peter Smith 和 Ajin Cherian 交換了補丁,以支持內建邏輯複製中的預備交易。

Dilip Kumar 提交了三個版本的補丁,用於提取未更改的複製身分鍵(如果它被儲存在外部)。如果複製身分設定為鍵,且該鍵未被修改,我們不會單獨記錄該鍵,因為它應該與更新的元組一起記錄。但是,如果該鍵儲存在外部,我們必須對其進行 detoast 並單獨記錄它。

Justin Pryzby 提交了另一個版本的補丁,用於實作 CREATE TABLE (LIKE .. INCLUDING ACCESS METHOD)。

Zhihong Yu 提交了一個補丁,用於從 pgtls_init() 返回正確的錯誤代碼。

Peter Smith 和 Takamichi Osumi 交換了補丁,以記錄目錄上的 AEL 可能在同步模式下的邏輯解碼中導致死鎖的風險。

Etsuro Fujita 提交了另一個版本的補丁,用於修復異步附加的重新掃描。

Bharath Rupireddy 提交了另外兩個版本的補丁,用於重構 parse_subscription_options,使其更易於擴展,並更容易透過點陣圖檢測互斥選項。

Hou Zhijie 和 Amit Langote 交換了補丁,以跳過具有恆定分割區鍵的分割區元組路由。

Kyotaro HORIGUCHI 提交了兩個版本的補丁,用於修復可能獲得重複歷史檔案的錯誤。

Aleksander Alekseev 提交了另一個版本的補丁,用於新增一種方法,可以將列投影列表指定給表格存取方法 API。

Joe Wildish 提交了另一個版本的補丁,允許在 FOR EACH STATEMENT 觸發器的 WHEN 表達式中使用查詢。

Greg Sabino Mullane 提交了另外兩個版本的補丁,用於在已設定校驗和的情況下加速 pg_checksums。

Andrew Dunstan 提交了三個版本的補丁,用於澄清和更新簡短版本的安裝文件。

Matthias van de Meent 提交了一個補丁,用於報告並行 btree 構造中排序階段的階段進度。

Jim Mlodgenski 提交了一個補丁,用於實作 CREATE MODULE。

John Naylor 提交了另外兩個版本的補丁,用於加速 UTF-8 的驗證。

Thomas Munro 提交了一個補丁,用於移除更多關於信號量的過時註釋。

Thomas Munro 提交了另一個版本的補丁,透過將目標進程的引用從 pid 更改為使用 pgprocno,使 ProcSendSignal() 更加有效率,這使得避免掃描 ProcArray 和追蹤啟動進程成為可能。

Greg Nancarrow 提交了另一個版本的補丁,用於實作客戶端連線的事件觸發器。

Amit Langote 提交了另一個版本的補丁,用於新增一個斷言,以確保子列標記不會過早出現。

Nitin Jadhav 提交了另一個版本的補丁,用於實作多列列表分割區。

David Christensen 提交了另一個版本的補丁,用於擴展 pg_size_pretty(numeric) 知道的單位,直到 YB,並擴展 pg_size_bytes 中支持的單位以涵蓋所有單位。

Zhihong Yu 提交了兩個版本的補丁,用於記錄在 write_relcache_init_file 中不必檢查 unlink 返回值的原因。

Robert Haas 和 Dilip Kumar 交換了補丁,用於修復新的備用伺服器無法跟隨新主伺服器的邊緣情況失敗。

Bharath Rupireddy 提交了一個補丁,當 fsm_set_and_search 的返回值被忽略時,使用 (void)。

David Christensen 提交了一個補丁,用於實作 DELETE...CASCADE。

Kyotaro HORIGUCHI 提交了一個補丁,使 pg_waldump 中的錯誤訊息更清晰,並更明確地說明哪裡出了問題以及在哪裡。

Andrey V. Lepikhov 提交了另一個版本的補丁,用於在具有外部分割區的表格上使用 COPY 進行大量寫入。

Zeng Wenjing 提交了另一個版本的補丁,用於實作全域臨時表格。

Tomáš Vondra 提交了一個補丁,用於新增 PQ_QUERY_PARAM_MAX_LIMIT、建立用於批處理的描述符副本,以及僅為批處理初始化插槽一次。

Nitin Jadhav 提交了一個補丁,用於為啟動進程建立進度指示器。

Aleksander Alekseev 提交了一個補丁,用於將 ZSON 擴充功能新增至 contrib。

Andrew Dunstan 提交了一個補丁,用於確保 pg_upgrade 回顯 Windows 命令。

Maxim Orlov 提交了一個補丁,旨在修復在並行掃描中使用 SubTransGetTopmostTransaction 斷言時表現為核心轉儲的錯誤。

Ajin Cherian 提交了一個補丁,用於從 CreateReplicationSlotCmd 結構中移除兩階段選項,並新增一個選項以在 CREATE_REPLICATION_SLOT 中設定兩階段。

Tom Lane 提交了另一個版本的補丁,用於修復 CALL 和具有僅輸出參數的程序之間的不一致。

Melanie Plageman 提交了另一個版本的補丁,用於新增一個追蹤共享緩衝區操作的系統檢視。

Jehan-Guillaume de Rorthais 提交了另一個版本的補丁,用於新增一個 pg_stat_waitaccum 檢視,並將等待事件時間的測量方法從 INSTR_TIME 更改為 rdtsc。

Michaël Paquier 提交了一個補丁,用於防止 VACUUM 重新壓縮。

Álvaro Herrera 提交了一個補丁,使 toast_get_compression_id 內聯化。

Álvaro Herrera 提交了另一個版本的補丁,用於減少表格重寫時 TOAST 重新壓縮的開銷。

David Rowley 提交了一個補丁,用於修復 brin_minmax_multi.c 中的一些錯字。

Vigneshwaran C 提交了另一個版本的補丁,用於新增對發布的架構層級支持,並為其新增測試。

Ranier Vilela 提交了另一個版本的補丁,用於減少表格重寫時 TOAST 重新壓縮的開銷。

Vigneshwaran C 提交了另一個版本的補丁,用於在 CREATE/ALTER SUBSCRIPTION 期間識別發布者中遺失的發布。

Julien Rouhaud 再次提交了一個補丁的修訂版本,以新增一個 parser_hook hook,基於此新增一個 sqlol parser,在核心解析器中新增一個 MODE_SINGLE_QUERY,並在 pg_parse_query 中使用它,並教導 sqlol 使用新的 MODE_SINGLE_QUERY 解析器模式。

Julien Rouhaud 提交了一個補丁,以修正 SQL 標準主體空語句處理。

Michaël Paquier 提交了一個補丁,旨在修正 pg_log_backend_memory_contexts() 中錯誤放置的超級使用者檢查。

Tomáš Vondra 再次提交了一個補丁的修訂版本,以修正 psql 的 \dX(擴展統計資訊)中的一個錯誤,該錯誤未能檢查物件的可見性。