2013-10-18 94 views
1

我正在處理一組PL/Python存儲過程。我使用PostgreSQL 9.3(從apt.postgresql.org安裝)和Python 2.7解釋器;在Ubuntu 13.04上運行。PL/Python錯誤「無法將SPI錯誤轉換爲Python異常」

該錯誤發生在大型操作的中間(創建物化視圖使用來自具有> 300,000行的源表的數據並使用PL/Python存儲過程計算某些字段)。

錯誤輸出,我得到的是:

ERROR: could not convert SPI error to Python exception 
CONTEXT: PL/Python function "get_first_level_parent" 
********** Error ********** 

ERROR: could not convert SPI error to Python exception 
SQL state: XX000 
Context: PL/Python function "get_first_level_parent" 

(「get_first_level_parent」是一個存儲過程的名稱)。

PostgreSQL服務器日誌不提供任何進一步的照明(我不熟悉PostgreSQL和PL/Python內部)。當與詳細的錯誤日誌記錄運行時,我得到這個:

2013-10-18 12:56:43 EAT ERROR: XX000: could not convert SPI error to Python exception 
2013-10-18 12:56:43 EAT CONTEXT: PL/Python function "get_first_level_parent" 
2013-10-18 12:56:43 EAT LOCATION: PLy_spi_exception_set, plpy_spi.c:576 

PostgreSQL的錯誤代碼文檔告訴我XX000internal_error錯誤代碼。如果我將調用隔離到存儲過程並運行它自己的語句,例如SELECT get_first_level_parent(373673007),它不會引發錯誤。

我的問題是 - 我可以使用什麼工具/技術來調試這種錯誤?對於我目前的問題,我很可能通過重寫存儲過程來「解決」問題(慢慢地,一次只測試一小部分)。這是唯一的出路嗎?

回答

1

我會在src/pl/plpython/plpy_spi.c:PLy_spi_exception_set()中灑一些調試語句。這可能是PL/Python在處理某些邊緣條件時的一個錯誤。

+0

鑑於錯誤發生了什麼(請參閱我自己的答案),這將是一種有效的調試技術,即使它需要設置PostgreSQL開發環境 –

0

經過在存儲過程中大量使用plpy.notice(...語句之後,我最終隔離了一個可靠地重現錯誤的SQL存儲過程調用。

這裏的罪魁禍首是我寫的一個PL/Python程序中的一個邊緣案例。我有一個存儲過程中的遞歸算法。遞歸的使用是由問題領域決定的。在所有正常操作條件下,遞歸不會超過10-12深度(輸入數據衆所周知並且相對靜態)。在我的實現中存在一個錯誤,在某些情況下會導致無限遞歸。

PL/Python似乎沒有設置來處理當超過最大遞歸深度時發生的RuntimeError。這可能是一個非常罕見的邊緣情況。

相關問題