SQL> select \* from dual where 1=1 and dummy=2;
select \* from dual where 1=1 and dummy=2
\*
ERROR at line 1:
ORA-01722: invalid number
SQL> select * from dual where 1=2 and dummy=2;
no rows selected
Kā redzams, tad konstrukcija abiem pieprasījumiem ir identiska, bet pirmais pieprasījums atgriež ERROR paziņojumu, kamēr otrais pilnīgi legāli izpildās.
Tā kā kļūda ir saistīta ar to, ka tiek salīdzināti dati ar dažādiem tipiem, tad atliek secināt, ka šīs ir runtime tipa kļūdas. Manā skatījumā gan tas ir mazliet nepieņemami un absurdi.
Spekulācija: pieļauju, ka optimaizeris uzmeklē konstanšu clauses un, ja kāda atgriež false, tad pārējās šī līmeņa clauses ignorē. Protams, pārbaudīta tiek visu nosaukumu eksistence, bet netiek pārbaudīta datu tipu atbilstība. Tā tiek pārbaudīta tikai tad, ja visas konstantās (un līdz ar to arī izmetamās) clauses ir atgriezušas false.
Papildinājums: izskatās, ka ORACLE automātiski casto varchar2 uz number, kā rezultātā
> select \* from dual where 1=1 and to_number(dummy)=2;
un
> select \* from dual where 1=1 and dummy=2;
ir ekvivalenti. Pie šādiem nosacījumiem viss ir ok.
Comments