2013-10-18 3 views
1

PL/Python 저장 프로 시저 세트를 작업하고 있습니다. PostgreSQL 9.3 (apt.postgresql.org에서 설치) 및 Python 2.7 인터프리터를 사용하고 있습니다. 우분투에서 실행 13.04.PL/Python 오류 "SPI 오류를 파이썬 예외로 변환 할 수 없습니다"

큰 작업 중간에 오류가 발생합니다 (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을 처리하도록 설정되지 않은 것처럼 보입니다. 이것은 매우 드문 경우입니다.