Query cast injection

1. 인수의 데이터 유형과 예상 데이터 유형이 일치하지 않는 표현식 및 조건 내 쿼리 항목 트리에 형변경 작업 추가

  • 쿼리 결과나 실행 속도에 영향을 미치지 않지만 이전 DBMS 릴리스와의 하위 호환성을 유지하면서 표준을 준수하는 쿼리와 동일하게 실행되는 쿼리 생성

  • 표준 숫자 비교 연산자(=, >=, >, <, <=, <>/!= 또는 <=>)를 사용하여 비교될 때마다 시간 타입과 숫자 타입 간에 묵시적 형변형 수행

  • 문자열 타입을 다른 유형과 비교할 때도 수행

    • DATE 또는 TIME 값과 DATETIME 값을 비교하기 위해 DATETIME으로 형변형

    • 숫자 타입 또는 YEAR와 비교할 때 또는 FLOAT, DOUBLE 또는 REAL이 아닌 경우에도 DOUBLE 로 문자열 형변형

    • DATETIME 또는 TIMESTAMP 값과 비교할 때 DATETIME으로, DATE와 비교할 때 DATE로 문자열 형변형

CREATE TABLE d (dt DATETIME, d DATE, t TIME);

CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);

CREATE TABLE s (c CHAR(25), vc VARCHAR(25), bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT, e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));

SELECT * from d JOIN n ON d.dt = n.i

/*
EXPLAIN FORMAT=TREE
-> Inner hash join (cast(d.dt as double) = cast(n.i as double))  (cost=0.70 rows=1)
    -> Table scan on n  (cost=0.35 rows=1)
    -> Hash
        -> Table scan on d  (cost=0.35 rows=1)
*/

SELECT * from s JOIN d ON d.dt = s.c;

/*
EXPLAIN FORMAT=TREE
-> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
    -> Table scan on s  (cost=0.35 rows=1)
    -> Hash
        -> Table scan on n  (cost=0.35 rows=1)
*/

SELECT * from n JOIN s ON n.d = s.c;

/*
EXPLAIN FORMAT=TREE
-> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
    -> Table scan on s  (cost=0.35 rows=1)
    -> Hash
        -> Table scan on n  (cost=0.35 rows=1)
*/

Last updated