PL/Python错误“;无法将SPI错误转换为Python异常;

PL/Python错误“;无法将SPI错误转换为Python异常;,python,postgresql,plpython,Python,Postgresql,Plpython,我正在研究一组PL/Python存储过程。我正在使用PostgreSQL 9.3(从apt.PostgreSQL.org安装)和Python 2.7解释器;在Ubuntu 13.04上运行 这个错误发生在一个大操作的中间(创建一个物化视图,它使用来自300000行的源表中的数据,并使用PL/Python存储过程计算一些字段)。 我得到的错误输出是: ERROR: could not convert SPI error to Python exception CONTEXT: PL/Pytho

我正在研究一组PL/Python存储过程。我正在使用PostgreSQL 9.3(从apt.PostgreSQL.org安装)和Python 2.7解释器;在Ubuntu 13.04上运行

这个错误发生在一个大操作的中间(创建一个物化视图,它使用来自300000行的源表中的数据,并使用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 server日志没有提供任何进一步的说明(我不熟悉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错误代码文档告诉我
XX000
内部错误的错误代码。如果我隔离对存储过程的调用并在它自己的语句中运行它,例如
选择get\u first\u level\u parent(373673007)
,则不会引发错误


我的问题是-我可以使用什么工具/技术来调试此类错误?对于我当前的问题,我可能会通过重写存储过程来“解决”问题(慢慢地,一次测试一个小部分)。这是唯一的出路吗?

我会在
src/pl/plpython/plpy\u spi.c:PLy\u spi\u exception\u set()中添加一些调试语句。这可能是PL/Python在处理某些边缘条件时的一个错误。

在大量使用了
plpy之后。请注意(…
语句在存储过程中,我最终隔离了一个SQL存储过程调用,该调用可靠地再现了错误

这里的罪魁祸首是我编写的一个PL/Python过程中的一个边缘案例。我在其中一个存储过程中有一个递归算法。递归的使用是由问题域决定的。在所有正常操作条件下,递归深度都不会超过10-12(输入数据是众所周知的且相对静态的).我的实现中有一个bug,在某些情况下会导致无限递归


PL/Python似乎没有设置为处理超过最大递归深度时发生的
运行时错误
。这可能是一种极不常见的边缘情况。

给出了错误的结果(参见下面我自己的答案),这将是一种有效的调试技术,即使它需要设置PostgreSQL开发环境