source

여기서 "0보다 큰" Oracle 버그 가능성

factcode 2023. 10. 1. 22:00
반응형

여기서 "0보다 큰" Oracle 버그 가능성

행의 개수를 잘못 전달하는 선별 명세서가 있습니다.문제를 재현할 수 있습니다.Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production등에Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production재생할 수 없습니다.Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

테스트 데이터:

CREATE TABLE PERSON AS
SELECT LEVEL AS ID, 'Person_'||LEVEL AS NAME, 10 as maxVal
FROM DUAL 
CONNECT BY LEVEL <= 5;

create table orders as
SELECT LEVEL AS ID, 'Order_'||LEVEL AS NAME
FROM DUAL 
CONNECT BY LEVEL <= 3;

다음 쿼리를 시도하면 5개가 아닌 3개의 결과만 얻을 수 있습니다.

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 0

쿼리를 다음과 같이 수정하면 5개의 결과(정확한 숫자여야 함)가 나타납니다.

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 1

또한 다음과 같은 수정을 통해 올바른 결과를 얻을 수 있습니다.

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 0 + 0

Bind Variables(변수 바인딩)을 사용하면 올바른 Result(결과) 수를 얻을 수도 있습니다.

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > :num

그렇다면 "0보다 크다"를 사용하면 (알려진) 버그가 있습니까?

다른 버그가 패치 된 후에 나온 버그입니다.

("Bug 17564992 오류 12999577에 대한 수정과 함께 잘못된 결과가 My Oracle Support Doc ID 17564992를 나타냅니다.8")

자체 패치(Patch 17564992, 테스트하지 않음)가 있지만 다음과 같은 해결 방법이 있습니다.

alter session set "_fix_control" = '12999577:0';
alter session set "_optimizer_squ_bottomup"= FALSE;

언급URL : https://stackoverflow.com/questions/25443240/possible-oracle-bug-with-greater-than-0-in-where-clause

반응형