int2 형이 프로그램 상에서는 -32768 ~ 32767 까지 지원 되는데요.
포스트 그레스에서는 -32768 값이 들어가면 에러가 발생합니다.
확인 해보니 -32767 ~ 32767 까지만 적용되는것 같더라구요. 전체적으로 1의 보수를 쓰는것 같은데요.
프로그램과 같은 데이터 영역을 지원할수 있겠끔 할수는 없나요?
RDBMS 쪽에서는 이부분이 그리 중요한 부분이 아닙니다.
다루고자 하는 내용을 흡수 하지 못하는 자료형을 사용했다면, 흡수 할 수 있는 자료형으로 바꾸면 될 일을.
그냥 속 편하게 int4 자료형을 사용하시든지, 아니면, 숫자형의 최대값을 고민하기 싫으시면 numeric 형 사용하시면 될 듯싶습니다.
그리고, -32768 보다 작은 값이 입력되면 오류를 만들어야한다면, check 제약조건을 지정해 두면 되겠지요.
늘 이야기하는 것이지만, 이런 부분에 고민하기 보다는 자료구조를 얼마나 실세계를 잘 흡수 할 수 있는가?에 대해서 고민을 하는 것이 낫습니다.
문제점은 이런 상황인거 같습니다.
먼저 int2, int4, int8 의 하한값
예를 들어 int2의 경우 -32768이 문서에서 하한값으로 정의되어있습니다.
KOEI~# CREATE TABLE test ( id int2 );
KOEI~# INSERT INTO test VALUES ( -32768::int2 ) ;
ERROR: integer out of range
KOEI~# INSERT INTO test VALUES ( -32768 );
INSERT 1 3327
이런 상황이 생기네요.
SELECT -32768::int2
문서의 정의된 하한값이 해당 타입으로 캐스팅이 되지 않고
에러를 내는 상황 같습니다.
sql 형변환자 구문분석 버그네요.
::int2 뿐만 아니라, ::int4, ::int8 모두 그런현상이.
7.4.x 버전에서도 그대로 있는 버그군요.
근데, 왜 아직 이걸 몰랐던 건지...
버그보고를 해야겠네요.
어제 현상을 보고 버그 보고 했습니다 :)
^^:
감사합니다.~
어쩔수없이 음수 마지막 값이 들어왔나 비교하는 inline함수를 만들어 쓰고 있어요. 에혀..
얼른 고쳐졌으면 좋겠네요~
-32768::int2
-2147483648::int4
-9223372036854775808::int8
에서만 발생하는 버그입니다.
피할 수 있는 방법은 ::int4 문자열이 들어가는 부분에서 그 앞의 숫자값을 작은 따옴표로 묶어주면 피할 수 있습니다.
'-32768'::int2
'-2147483648'::int4
'-9223372036854775808'::int8
오늘 tom lane 아자씨의 편지가 왔는데,
너무도 간단하게 답을 했네요.
> select -32768::int2;> ERROR: integer out of rangeThis is not a bug, because the interpretation is -(32768::int2)which indeed is out of range.regards, tom lane
---------------
버그가 아니랍니다. 연산자 우선순위가
형변환자가 - 연산보다 우선되기 때문에 그렀다는군요.
select -32768::int2 연산은
select -(32768::int2) 연산과 같기 때문에 발생하는 형변환자 우선 "정책" 때문이랍니다.
기억해 두어야할 부분이군요.