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

SQL Parser (odps)解析出错 在odps sql中 当同时存在create 和 union all 时,解析sql中的表出错 #3803

Open smartdongwei opened 4 years ago

smartdongwei commented 4 years ago

样例代码如下:版本是1.1.22

    String sql= "create table  ddd as select * from( select aa from ccc union all select aa from bb) t ";
    final String dbType = JdbcConstants.ODPS;
    //格式化输出
    String result = SQLUtils.format(sql, dbType);
    List<SQLStatement> stmtList = SQLUtils.parseStatements(result, dbType);
    System.out.println(stmtList.size());
    for (int i = 0; i < stmtList.size(); i++) {
        SQLStatement stmt = stmtList.get(i);
        System.out.println(stmt.toString());
        OdpsSchemaStatVisitor visitor = new OdpsSchemaStatVisitor();
        stmt.accept(visitor);
        //获取表名称
        //获取操作方法名称,依赖于表名称
        System.out.println("Manipulation : " + visitor.getTables());
    }

报错信息为:

   java.lang.UnsupportedOperationException:       com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource

at com.alibaba.druid.sql.ast.statement.SQLTableSourceImpl.clone(SQLTableSourceImpl.java:71)
at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.cloneTo(SQLSelectQueryBlock.java:841)
at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.clone(SQLSelectQueryBlock.java:792)
at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.clone(SQLSelectQueryBlock.java:34)
k8king commented 4 years ago

一个绕过方法是暂时改写SQL把create table替换成insert into table,然后去解析。 我翻看了一下issue,看起来可以溯源到去年的一个问题,

3389 SQLUnionQueryTableSource没有实现父类SQLTableSourceImpl的clone方法 ,需要自己实现一下。

PS:请改一下标题,不止在ODPS里报错,我的测试环境是PostgreSQL