현상
IN 절에서 중복 값을 제거하는 과정에서 Element의 데이터 타입이 서로 다른 경우, SELECT 수행 중 아래와 같은 Internal Error가 발생하며 세션이 비정상 종료되는 현상이 나타납니다.
•
Internal Error with condition: 'number_is_valid_ptr((x))' (7 args)
테스트 시나리오
테스트 데이터 생성
SQL>create table test (c1 varchar(100), c2 number);
SQL>insert into test values ('TEST01',1);
SQL>insert into test values ('TEST02',2);
SQL>insert into test values ('TEST03',3);
SQL>insert into test values ('TEST04',4);
SQL>insert into test values ('TEST05',5);
SQL>insert into test values ('TEST06',6);
SQL
복사
TBR-2131: Generic I/O error. 발생 케이스
SQL>select * from test where c2 in ('3','4','1','1');
SQL
복사
정상 동작 케이스
SQL>select * from test where c2 in ('3','4',to_number('1'),to_number('1'));
SQL
복사
원인
IN 절의 중복 값 제거 과정에서 해시 테이블에 인자들이 저장되는 시점에, 데이터 타입이 상이하여 Internal Error가 발생하였습니다.
해결
IN 절에 명시된 데이터 타입을 수정하거나, Type Casting 로직을 개선한 패치를 적용하여 문제를 해결하였습니다.
참고
IN 절에서 인자들끼리의 데이터 타입을 동일하게 Casting 후 사용하여 우회할 수 있습니다.
•
'1' -> to_number('1')
•
'1' -> 1