alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.95k stars 8.58k forks source link

请求添加对【IMPALA-SQL】的HINT解析支持 #5789

Open solidco2 opened 7 months ago

solidco2 commented 7 months ago

在使用com.alibaba.druid.sql.parser.SQLExprParser 类解析IMPALA SQL的时候,添加了HINT会报错。可能由于IMPALA的HINT用法和其他语言有一定差异。下面给出报错的IMPALA SQL,以下SQL在IMPALA中是合法的:

SELECT T1.a
FROM
    D.T1
    JOIN /* +shuffle */ D.T2
        ON T1.x = T2.x

但是在解析时会抛出异常: Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: ERROR. pos 41, line 1, column 28, token HINT

IMPALA的HINT有三种形式:

-- 1.  /* */
D.T1 JOIN /* +shuffle */ D.T2
-- 2. [ ]
D.T1 JOIN [shuffle] D.T2
-- 3. 行尾注释
D.T1 JOIN -- +shuffle
    D.T2

目前只有第3类可以通过解析,但问题是这样的写法局限性比较大,因为是行尾注释。 所以请求兼容前两种HINT,感谢

lizongbo commented 7 months ago

发完整的可以用于验证的sql来。

solidco2 commented 7 months ago

抱歉是我提问的时候没有写清楚,三个Case如下:

  1. /**/ 型HINT,解析抛出异常
    SELECT T1.a
    FROM
    D.T1
    JOIN /* +shuffle */ D.T2
        ON T1.x = T2.x
  2. [ HINT ] 型HINT,解析错误,在HIVE类型中抛出异常,在odps/sqlserver类型中SQL被截断
    SELECT T1.a
    FROM
    D.T1
    JOIN [shuffle] D.T2
        ON T1.x = T2.x
  3. -- 型HINT,解析成功,但会丢失该注释
    SELECT T1.a
    FROM
    D.T1
    JOIN -- +shuffle
        D.T2
        ON T1.x = T2.x