예상치 못한 쿼리 성공
SELECT COUNT (*)
FROM rps2_workflow
WHERE workflow_added > TO_DATE ('01.09.2011', 'dd.mm.yyyy')
AND workflow_finished < TO_DATE ('wtf', 'dd.mm.yyyy')
AND workflow_status IN (7, 12, 17)
AND workflow_worker = 159
유효하지 않은 날짜 때문에 이 쿼리가 실패할 것으로 예상하지만 0을 반환합니다.
이 쿼리에 대한 계획은 8번째 단계에서 유효하지 않은 절이 처리됨을 보여줍니다.
8 TABLE ACCESS BY INDEX ROWID TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 11 Bytes: 33 Cardinality: 1 CPU Cost: 8 M IO Cost: 10 Time: 1
댓글을 달면.AND workflow_status IN (7, 12, 17)
조건 - 예상대로 우리는ORA-01858: a non-numeric character was found where a numeric was expected
댓글을 달면.AND workflow_finished < TO_DATE ('wtf', 'dd.mm.yyyy')
그런 다음 해당 조건에 맞는 레코드의 양을 얻습니다(> 0).
이것이 어떻게 가능한 걸까요?
업데이트:
힌트를/*+no_index(rps2_workflow) */
아무것도 변경되지 않습니다(계획에 따라 전체 스캔이 수행됨).
SELECT STATEMENT ALL_ROWSCost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4
2 SORT AGGREGATE Bytes: 31 Cardinality: 1
1 TABLE ACCESS FULL TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: "WORKFLOW_WORKER"=159 AND ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_ADDED")>SYS_EXTRACT_UTC(TIMESTAMP' 2011-09-01 00:00:00') AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4
Optimizer가 함수를 평가할 필요가 없다고 판단하면 평가하지 않으므로 함수는 예외를 적용하지 않습니다.
select 1 from dual where 1 = 1 OR to_date('asdasdasd','asdasdasdas') > sysdate ;
1
----------
1
함수가 실제로 평가되는 경우에만 예외가 발생합니다.
SQL> select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate ;
select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate
*
ERROR at line 1:
ORA-01821: date format not recognized
그러나 함수에 잘못된 인수 유형이 있거나 쿼리에 잘못된 유형이 있기 때문에 파서가 쿼리가 유효하지 않다고 정적으로 결정할 수 있는 경우, 최적화자가 스윙하기 전에 파서가 예외를 제기합니다.
SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate ;
select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42 ;
select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
아마 모든 다른 조건을 만족시키는 모든 기록은NULL
workflow_finished
들판.
그리고 다른 것들은NULL
알 수 없으므로 다른 피연산자를 평가할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/7327849/unexpected-query-success
'programing' 카테고리의 다른 글
og_type을 변경할 수 없습니다. (0) | 2023.09.21 |
---|---|
로컬 호스트와 원격 호스트의 VS 코드에 SQL 구문 오류가 있음 (0) | 2023.09.21 |
구체화된 뷰의 커밋 시 빠른 새로 고침 (0) | 2023.09.16 |
C의 매크로에 괄호가 필요합니다. (0) | 2023.09.16 |
Watch file for changes and run command with powershell (0) | 2023.09.16 |