SNR#3915 search·if·case·not 등에서 0 등 값의 참/거짓 판정이 저장 방식과 조건 조합에 따라 다른 문제 해결
버전: 4.0.2609.0
search 조건에서 숫자 0, 빈 문자열, 빈 목록 같은 값의 참/거짓 판정이 저장 방식이나 조건 조합에 따라 달라지던 문제를 바로잡아, 이제 어떤 경우에도 동일하게 동작합니다.
기존에는 search 필터가 boolean이 아닌 값(숫자·문자열 등)을 참/거짓으로 판정할 때, 표현식을 단독으로 쓰는지 and/or로 묶는지, 그리고 데이터가 어떤 방식으로 조회되는지에 따라 결과가 달라졌습니다. 대표적으로 숫자 0은 대부분 참(true)으로 통과했지만 벡터화 조회의 and/or 조합에서만 거짓(false)으로 제외되어, 같은 쿼리도 조건 작성 방식이나 테이블 저장 형태에 따라 결과 건수가 달라질 수 있었습니다.
이번 변경으로 참/거짓 판정 기준을 한 곳으로 통일했습니다. 숫자 0/NaN, 빈 문자열, 빈 목록·맵, null, boolean false는 모두 거짓(false)으로 일관되게 처리되고, 그 외 값은 참(true)으로 처리됩니다. 조건을 단독으로 쓰든 and/or로 묶든, 저장·조회 방식과 무관하게 동일하게 적용되며, if()·case()의 조건, mpsearch 명령어의 expr2 표현식, dblookup 명령어의 bypass 조건식에도 같은 기준이 적용됩니다. not()도 이 기준을 따르도록 통일되어, 기존에는 boolean이 아닌 값을 뒤집으면 항상 null을 반환하던 것과 달리 이제는 값의 참/거짓을 뒤집은 결과(예: not(0)은 참(true), not(5)는 거짓(false))를 반환합니다. null을 뒤집으면 여전히 null입니다. 아울러 컬럼 저장(columnar) 테이블에서 불리언 필드를 and 조건과 묶어 쓸 때 드물게 발생하던 오류도 해소됩니다.
동작 방식이 변경되므로, 숫자 0이나 빈 문자열을 "값이 있는 것"으로 간주해 통과시키던 기존 쿼리, 또는 not()으로 숫자·문자열 값을 뒤집으면 항상 null(제외)이 되는 데 의존하던 기존 쿼리는 결과가 달라질 수 있습니다. 값의 존재 여부만 확인하려면 isnull()/isnotnull() 등 명시적 조건 사용을 권장합니다.