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

由 PWN 於 2021-06-21 發布
PWN

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

pgMustard 4,一個用於「explain analyze」的使用者介面,提供效能提示,已發布

psycopg2 2.9.0,一個用於 PostgreSQL 的 Python 連接器,已發布

pgAdmin4 5.4,一個用於 PostgreSQL 的 Web 和原生 GUI 控制中心,已發布

本週人物

PostgreSQL 產品新聞

六月份的 PostgreSQL 工作

工作

PostgreSQL 新聞

Planet PostgreSQL: Planet

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

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

已套用的補丁

Tom Lane 推送了

  • 解決較新版本的 mktime() 的移植性問題。 近期的 glibc 版本使得 mktime() 在 tm_isdst 與現行時區不一致時會失敗;特別是當時區為 UTC 時,tm_isdst = 1 會失敗。(在我看來,這與 POSIX 授權的對 struct tm 其他欄位中「不正確」值的處理方式極為不一致,所以我認為這是一個錯誤,但我敢肯定他們會說這是故意的。) 已觀察到這會在 pg_restore 還原在不同時區建立的封存檔時導致外觀問題。 要修正此問題,請使用封存檔中的欄位值執行 mktime(),如果失敗,請再次嘗試 tm_isdst = -1。 這將給出一個與原始時區的 UTC 偏移量不同的結果,但以前也是如此。 這不是很重要,因為我們除了可能列印它之外,不會對結果做任何事情。 (有一天我們應該清除所有這些邏輯,並在封存檔中記錄標準格式的時間戳記。 但這對於向後移植的錯誤修復來說是可以的。) 此外,保護我們對 mktime() 的另一個使用,讓 initdb 的 build_time_t() 設定 tm_isdst = -1 而不是 0。 這種情況只可能在全年都是 DST 的時區中出現問題;但我認為有些確實存在,或者未來可能會存在。 根據 Wells Oliver 的報告。 向後移植到所有支援的版本,因為它們中的任何一個都可能需要使用較新的 glibc 執行。 討論:https://postgr.es/m/CAOC+FBWDhDHO7G-i1_n_hjRzCnUeFO+H-Czi1y10mFhRWpBrew@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f807e3410fdfc29ced6590c7c2afa76637e001ad

  • 移除孤立的預期結果檔案。 這應該已在 43e084197 中移除,該檔案移除了相應的 spec 檔案。 在使用 isolationtester 進行測試時注意到。 https://git.postgresql.org/pg/commitdiff/ffbe9dec13599fa786ea6567df1c6a3f3ee3c673

  • 更新變體預期結果檔案。 這應該已在 d2d8a229b 中更新,但被忽略了。 根據 31a877f18 添加此檔案的說明,此檔案旨在顯示在 default_transaction_isolation = serializable 下獲得的結果。 我們在其他隔離測試中基本上已經忘記了這個目標,但只要我們有這個,它就應該是正確的。 在使用 isolationtester 進行測試時注意到。 https://git.postgresql.org/pg/commitdiff/0a1e80c5c4f094087257fc4284a87e0bc7bca591

  • 移除另一個孤立的預期結果檔案。 當在 commit 0ac5ad513 中新增時,顯然需要 aborted-keyrevoke_2.out 來處理可序列化交易模式的情況。 但是,可序列化模式下的輸出實際上與常規的 aborted-keyrevoke.out 檔案相符,並且據我所知已經存在很長時間了。 沒有必要繼續拖著這個變體。 https://git.postgresql.org/pg/commitdiff/f6352a0d4e437ac8bc266f77df22d064592056c9

  • 更新另一個變體預期結果檔案。 這應該已在 533e9c6b0 中更新,但被忽略了。 鑑於沒有任何抱怨,我不會費心向後移植。 https://git.postgresql.org/pg/commitdiff/d3c878499c9d639ff06e0664d06b8c731e30c2fc

  • 改進一些與複寫相關的程式碼中的 SQLSTATE 報告。 我最初的目標是在 walrcv_connect() 失敗時報告 ERRCODE_CONNECTION_FAILURE,但在我四處查看後,我意識到編寫此程式碼的人認為 errcode 純粹是可選的。 這不是我對我們專案政策的理解。 因此,請確保在每個 ereport 中提供一個 errcode,該 ereport (a) 為 ERROR 或更高等級,且 (b) 不能說是內部邏輯錯誤。 此外,修正一些非常可疑的現有 errcode 指派。 雖然這不符合政策,但它在很大程度上也是表面上的,因為很少有這些情況可以報告給應用程式。 所以我不覺得需要向後移植。 討論:https://postgr.es/m/2189704.1623512522@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6b787d9e32005867ee3660d1ea20f447810a403d

  • 修正 ExecuteQuery 中錯誤後的 plancache 參考計數洩漏。 將 plancache 中的計劃塞入 Portal 時,不應該冒著在 GetCachedPlan 和 PortalDefineQuery 之間引發錯誤的風險; 如果發生這種情況,GetCachedPlan 遞增的計劃參考計數將洩漏。 我在 9dbf2b7d7 中重構程式碼時設法打破了這個規則。 除了某些記憶體洩漏之外,沒有可見的後果,而且由於沒有人很可能連續多次觸發相關的錯誤條件,因此我們沒有注意到並不奇怪。 儘管如此,這是一個錯誤,因此重新排列操作順序以消除危險。 在尋找更好的修復 bug #17053 的方法時注意到。 這個錯誤已經存在很長時間了,所以向後移植到所有支援的分支。 https://git.postgresql.org/pg/commitdiff/131ea3e908d3c97a2fe1ab25cce5046dd5cb905f

  • 集中管理工具陳述式的保護性複製邏輯。在「簡單查詢」程式碼路徑中,對於工具陳述式的剖析分析或執行來說,塗改陳述式的節點樹是可以接受的,因為之後會直接丟棄。但是,如果節點樹位於計畫快取中,這就不可接受了,因為這會損壞後續的執行。到目前為止,我們已經通過讓個別的工具陳述式函數在要修改樹時應用 copyObject() 來處理這個問題。但是,這很容易出現遺漏錯誤。Charles Samborski 提出的 Bug #17053 顯示 CREATE/ALTER DOMAIN 沒有收到此備忘,並且如果從計畫快取重複執行可能會崩潰。在後端分支中,我們只會針對此問題應用一個狹窄的臨時解決方案,但在 HEAD 中,似乎謹慎的做法是採用更原則性的修復,以消除未來發生其他類似錯誤的可能性。因此,讓我們將執行 copyObject 的責任從其子項提升到 ProcessUtility 中,從而確保它發生在所有工具陳述式類型中。此外,修改 ProcessUtility 的 API,以便其呼叫者可以告訴它是否需要複製步驟。事實證明,在所有情況下,直接呼叫者都知道節點樹是否是暫時性的,因此這不會涉及大量的程式碼修改。這樣,雖然我們在從快取執行程式碼路徑中由於有時複製不會被修改的節點樹而損失了一點,但我們通過不複製可拋棄的節點樹而在簡單查詢程式碼路徑中獲得了一些東西。複製成本高昂的陳述式幾乎肯定是無論如何都必須複製的陳述式,因此快取程式碼路徑中的損失不應該太大。(請注意,整個問題僅適用於工具陳述式。可優化的陳述式沒有這個問題,因為我們很久以前就讓執行器將計畫樹視為唯讀。也許有一天我們會讓工具陳述式執行也這樣做,但我不抱太大期望。)討論:https://postgr.es/m/931771.1623893989@sss.pgh.pa.us 討論:https://postgr.es/m/17053-3ca3f501bbc212b4@postgresql.org https://git.postgresql.org/pg/commitdiff/7c337b6b527b7052e6a751f966d5734c56f668b5

  • 改進 pgbench 中的版本報告。Commit 547f04e73 導致 pgbench 開始列印其版本號,這似乎是個好主意,但它需要更多的工作: * 如果伺服器版本號不同,也列印伺服器版本號。 * 列印 PG_VERSION 字串,而不是一些重建的近似值。此修補程式複製 psql 用於相同目的的經過良好測試的程式碼。討論:https://postgr.es/m/1226654.1624036821@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/84bee9610965331d5110971d8de390a5bbe2effc

  • 修復 DROP OWNED BY 與重複 polroles 條目的錯誤行為。通常,pg_policy.polroles 陣列不會多次列出相同的角色;但是 CREATE POLICY 不會阻止這種情況。如果我們對多次列出的角色執行 DROP OWNED BY,RemoveRoleFromObjectPolicy 要么遇到斷言失敗,要么遇到 tuple-updated-by-self 錯誤。重寫它以正確處理重複的條目,並添加 CommandCounterIncrement 呼叫以防止其他問題。根據討論,這裡應該進行其他清理,但這似乎是最小的基本修復。根據 Alexander Lakhin 提出的 Bug #17062。它一直都存在問題,因此回溯修補到所有支援的分支。討論:https://postgr.es/m/17062-11f471ae3199ca23@postgresql.org https://git.postgresql.org/pg/commitdiff/d21fca084356946664bfce19d66d2df2bb873cbd

  • 為 v14 中新增的 libpq 功能提供功能測試巨集。我們收到一個請求,要求提供一種在編譯時測試新管線功能可用性的方法。更普遍地說,似乎提供一種通過 #ifdef 測試所有新 libpq API 功能的方法是個好主意。人們一直在使用來自 pg_config.h 的版本來實現這一點;但是在越來越常見的不同情境中,它更可能代表伺服器版本而不是 libpq 版本。如果 libpq-fe.h 本身是關於它提供什麼功能的真實來源,則更安全。因此,制定一項策略,即從 v14 開始,當我們在那裡添加新的 API 時,我們將向 libpq-fe.h 添加一個合適的 feature-is-present 巨集。(追溯應用此策略似乎沒有多大意義,但對於 v14 來說還不算太晚。)Tom Lane 和 Alvaro Herrera,根據 Boris Kolpackov 的建議。討論:https://postgr.es/m/boris.20210617102439@codesynthesis.com https://git.postgresql.org/pg/commitdiff/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5

  • 穩定由 commit f61db909d 新增的測試案例。Buildfarm 成員 ayu 和 tern 有時會顯示與此查詢預期不同的計畫。我之前一直無法重現它,但今天我終於意識到發生了什麼。如果存在併發的開啟交易(可能是 buildfarm 中執行的自動清理,但也可以手動安排),則由 DELETE 刪除的幾行記錄的索引條目不會立即被清除,從而導致規劃器對 ft2.c1 極值估計值的更改,這會將“c1 > 1100”的行數估計值移動到足以將連接計畫從 nestloop 更改為 hash。要修復此問題,請將查詢條件更改為“c1 > 1000”,無論是否存在併發的開啟交易,都會首選 hash 計畫。由於此 UPDATE 被定制為無操作,因此沒有其他任何更改。報告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-09%2022%3A45%3A48 報告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=ayu&dt=2021-06-13%2022%3A38%3A18 報告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=tern&dt=2021-06-20%2004%3A55%3A36 https://git.postgresql.org/pg/commitdiff/5843659d091bfb6f2c60e010ea1fd00e55ee6ada

Michaël Paquier 推送了

Bruce Momjian 推送了

Álvaro Herrera 推送了

Noah Misch 推送了

Amit Kapila 推送了

Alexander Korotkov 推送了

Peter Geoghegan 推送了

  • 從 VACUUM 狀態中移除不需要的欄位。錯誤修正 commit 5fc89376 有效地將 vacuumlazy.c 全域狀態結構的 lock_waiter_detected 欄位變成 lazy_truncate_heap() 擁有的私有狀態。透過將結構欄位替換為區域變數來完成此操作。https://git.postgresql.org/pg/commitdiff/958cfbcf2dd338e3179c2d8a35f48bde020eba60

  • 支援停用 VACUUM 的索引略過功能。將 INDEX_CLEANUP VACUUM 參數(以及對應的 reloption)泛化:將其變成三元樣式的布林參數。現在它公開了第三個選項 "auto"。"auto" 選項(現在是預設值)啟用了 commit 1e55e7d1 增加的「略過索引清理」最佳化。"VACUUM (INDEX_CLEANUP TRUE)" 被重新定義為讓 VACUUM 再次簡單地執行任何需要的索引清理,無論在目標堆積關係的第一次掃描期間遇到多少無效元組(除非剛好為零)。這讓使用者可以選擇退出「略過索引清理」最佳化,如果出於任何原因,證明有此需要。PostgreSQL 開發人員預期也會不時地將其用作測試選項。"VACUUM (INDEX_CLEANUP FALSE)" 的作用與以往相同:它強制停用索引清理和索引整理。預計在 PostgreSQL 中不會經常用到。

  • commit 1e55e7d1 增加的故障安全機制以更簡單的方式解決了相同的問題。現在可以將 INDEX_CLEANUP 視為測試和相容性選項。作者:Peter Geoghegan pg@bowt.ie 審閱者:Masahiko Sawada sawada.mshk@gmail.com 審閱者:Justin Pryzby pryzby@telsasoft.com 討論:https://postgr.es/m/CAH2-WznrBoCST4_Gxh_G9hA8NzGUbeBGnOUC8FcXcrhqsv6OHQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/3499df0dee8c4ea51d264a674df5b5e31991319a

Andrew Dunstan 推送了

Heikki Linnakangas 推送了

  • 修正過時的註解,該註解談論 WAL 檔案的搜尋位置。自從 commit c24dcd0cfd 以來,我們一直在使用 pg_pread() 讀取 WAL 檔案,這不會變更搜尋位置(除非我們回退到 src/port/pread.c 中的實作)。相應地更新註解。回溯至:12,我們開始使用 pg_pread() 的版本 https://git.postgresql.org/pg/commitdiff/d0303bc8d2670d11c9df9220aa08a2c33529e100

  • 整理 GetMultiXactIdMembers() 在發生錯誤時的行為。其中一個錯誤路徑讓 *members 未初始化。這不是實際的錯誤,因為大多數呼叫者在函數傳回 -1 時不會查看 *members,但讓我們保持整潔。heap_lock_tuple() 中的一個呼叫者會執行 "if (members != NULL) pfree(members)",但 AFAICS 它從未傳遞無效的 'multi' 值,因此不應達到該錯誤情況。呼叫者的期望也有點不一致。heap_lock_tuple() 會在 'members' 陣列為非 NULL 時釋放它,其他呼叫者會在 "nmembers >= 0" 時釋放它,還有一些呼叫者會在 "nmembers > 0" 時釋放它。這也不是實際的錯誤,因為函數永遠不應傳回 0,但為此新增一個 Assert 以使其更清楚。我暫時沒有動呼叫者。我也移動了我們設定 *nmembers 的行。之前沒有錯,但我喜歡在 'return' 陳述式旁邊執行此操作,以清楚表明它始終在傳回時設定。此外,刪除 ereport(ERROR) 之後的一個無法到達的 return 陳述式,為了簡潔起見,並與之後類似的 if 區塊保持一致。作者:Greg Nancarrow 以及我所做的其他變更 回溯至:9.6,所有支援的版本 https://git.postgresql.org/pg/commitdiff/d24c5658a80c8f5037e9e1948de311d3f3350f12

Tomáš Vondra 推送了

  • 修正將資料複製到具有 FDW 批次的槽中。Commit b676ac443b 優化了處理使用大量插入到外部表中的元組槽,以便僅初始化槽一次並將其重複用於所有批次。但是,資料僅在初始化後才複製到槽中,從而在重新使用槽時插入重複的值。透過將 ExecCopySlot 移到 init 分支之外來修正此問題。現有的 postgres_fdw 測試未能捕捉到此問題,因為它們將資料插入到沒有唯一索引的外部表中,然後僅檢查插入的列數。這新增了一個新測試,其中包含唯一索引和插入值的檢查。報告者:Alexander Pyhalov 討論:https://postgr.es/m/7a8cf8d56b3d18e5c0bccd6cd42d04ac%40postgrespro.ru https://git.postgresql.org/pg/commitdiff/99cea49d6525e30bc3768e4ffb95377e7584dea1

Fujii Masao 推送了

待處理的修補程式

Amit Khandekar 送出了一個 WIP 修補程式,允許在 worker 程序中使用子交易。

Bertrand Drouvot 送出了另一個修訂版的修補程式,以允許在備用伺服器上進行邏輯解碼。

Thomas Munro 送出了另一個修訂版的修補程式,以針對僅索引掃描使用元組層級的 SIREAD 鎖定,並在可能的情況下跳過 btree 頁面上的 SIREAD 鎖定。

Andrew Dunstan 送出了另一個修訂版的修補程式,旨在修正一個錯誤,該錯誤表現為在變更具有預設值的外部表格欄位的類型時發生分段錯誤。

Tomáš Vondra 送出了另一個修訂版的修補程式,以使用擴展統計資訊來改進聯結估算。

Bharath Rupireddy 送出了另一個修訂版的修補程式,以移除 pg_wait_for_backend_termination()。

Fabien COELHO 送出了另一個修訂版的修補程式,以將 psql 中的 echo 系統整合到其自身的函數中。

Yugo Nagata 和 Fabien COELHO 交換了 pgbench 的修補程式,這些修補程式確保僅在請求時才計算和儲存 conn_duration。

Jehan-Guillaume de Rorthais 送出了一個 PoC 修補程式,當 log_statement_stats=on 時,將等待事件追蹤到記錄檔。

Yugo Nagata 和 Fabien COELHO 交換了 patch,以避免因跳過事務導致 pbgench 進入停滯狀態。

Jacob Champion 和 Daniel Gustafsson 交換了 patch,以支援 NSS 作為 libpq 的 TLS 後端。

Dilip Kumar 和 Amit Langote 交換了 patch,旨在修復一個 bug,該 bug 表現為使用 toast 洩漏記憶體來解碼推測性插入。

Yugo Nagata 和 Fabien COELHO 交換了 patch,旨在修復 pgbench 中的一個 bug,該 bug 表現為負值的「初始連線時間」。

Takamichi Osumi 和 Amit Kapila 交換了 patch,以修復鎖定 [user] 目錄表、2PC 和邏輯複製之間的一個問題。

Justin Pryzby 和 Michaël Paquier 交換了 patch,以新增更多 WAL 壓縮選項。

Ranier Vilela 提交了另一個版本的 patch,以提高對 ProcArray 的存取效率。

David Fetter 提交了一個 patch,以在迴歸測試中適當使用單數形式。

Alexander Pyhalov 提交了另一個版本的 patch,以實作 case expression pushdown。

Ranier Vilela 提交了一個 patch,以修復 ecpg 中未以 null 結尾的緩衝區。

Fabien COELHO 和 Yugo Nagata 交換了 patch,旨在修復一個 bug,該 bug 表現為 pgbench 日誌記錄中的錯誤。

Dmitry Dolgov 提交了另外兩個版本的 patch,以防止 ArrayExpr 中的每個元素被打亂。

Dilip Kumar 提交了一個 patch,使 CREATE DATABASE 完全被 WAL 記錄,因此發出該命令不再強制執行檢查點。

Ajin Cherian 提交了另一個版本的 patch,以新增一個選項來在 CREATE_REPLICATION_SLOT 命令中設定 two-phase,並支援 pg_recvlogical 中的 two-phase 解碼。

Peter Smith 和 Ajin Cherian 交換了 patch,以支援 two-phase 事務的邏輯解碼。

Daniel Gustafsson 提交了一個 patch,以在文件中使用更正確和當前的 TLS/SSL 來代替 SSL。

Thomas Munro 提交了另一個版本的 patch,以在共享記憶體中追蹤關係大小、為 smgrnblocks() 提供無鎖定的快速路徑,並將 fifo 更新為 lru 以清除有效的快取。

Kyotaro HORIGUCHI 提交了另一個版本的 patch,以在 pg_waldump 的錯誤中顯示更多詳細資訊。

Tom Lane 提交了一個 patch,允許在 isolationtester 腳本中使用常規識別符號。

Matthias van de Meent 提交了另一個版本的 patch,以修復 GetOldestNonRemovableTransactionId 中的一個 bug,該 bug 沒有傳回與 GlobalVisTestFor(rel) 一致的值。 此外,lazy_scan_prune 有一個不正確的假設,即 GlobalVis*Rels 永遠不會有 OldestXmin < vacrel->OldestXmin,這是錯誤的。 現在已修復此假設,並且已記錄了這些變更。

Heikki Linnakangas 提交了一個 patch,以分割 xlog.c,因為它變得過於笨重。

Thomas Munro 提交了另一個版本的 patch,以建立和使用 qsort 範本。

Amit Langote 提交了另外三個版本的 patch,以使用常數分割區鍵來跳過分割區元組路由。

Jeff Davis 提交了兩個版本的 patch,以闡明複製協定的文件。

Tomáš Vondra 提交了一個 PoC patch,以使用 count-min sketch 進行連接基數估算。

Jeff Davis 提交了另一個版本的 patch,以記錄 START REPLICATION 中發生的情況。

Alexander Korotkov 提交了另外三個版本的 patch,以實作 multiranges 的 UNNEST。

Vigneshwaran C 提交了另一個版本的 patch,以新增對 PUBLICATIONs 的 schema 層級支援。

Amul Sul 提交了另一個版本的 patch,以實作 ALTER SYSTEM SET READ {WRITE | ONLY}。

Nitin Jadhav 提交了另一個版本的 patch,以實作啟動程序進度指示器。

Matthias van de Meent 提交了另一個版本的 patch,以實作和使用索引元組屬性迭代,並為 _bt_binsrch* 實作頁面層級的動態前綴截斷。

Mark Dilger 提交了兩個版本的 patch,以選擇性地在發生錯誤時停用訂閱。

Jeff Davis 提交了一個 patch,以修復啟動複製識別系統。

Thomas Munro 提交了另一個版本的 patch,以使用計時器實作 snapshot_too_old。

Takashi Menjo 提交了另一個版本的 patch,以將 PMEM 上的 WAL 段檔案對應為 WAL 緩衝區。

Amit Kapila 提交了另一個版本的 patch,以實作邏輯複製的行篩選。

Egor Rogov 提交了一個 patch,以在 pg_stats 檢視中包含範圍類型的統計資訊。

Álvaro Herrera 提交了另外兩個版本的 patch,以新增一個測試案例,用於使具有活動 walsender 的插槽過時。

Greg Sabino Mullane 提交了另一個版本的 patch,以避免不必要地計算頁面檢查和。

Noah Misch 提交了一個 patch,以移除 XLogFileInit() 跳過 ControlFileLock 的能力。

David Rowley 提交了另一個版本的 patch,以新增一種具有穩定指標的新雜湊表類型。

Thomas Munro 提交了一個 patch,以調整 LLVM 13 API 的變更。