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

解析with......insert overwrite......类sql问题 #4933

Closed debughx closed 2 years ago

debughx commented 2 years ago

使用visitor遍历sql的SQLExprTableSource,发现vistitor在遍历类似 wtih......insert overwrite......这种类型的sql时,不会遍历with里的表,而with......select 则不会出现这种情况。

visitor定义如下:

public static class TableVisitor extends OdpsASTVisitorAdapter {

    public List<String> tableList = new ArrayList<>();

    @Override
    public boolean visit(SQLExprTableSource tableSource) {
        tableList.add(tableSource.getTableName());
        return true;
    }
}

遍历代码如下:

 String sql1 = "with \n" +
        "  a as (select * from src where key is not  null),\n" +
        "  b as (select  * from src2 where value>0),\n" +
        "  c as (select * from src3 where value>0),\n" +
        "  d as (select a.key,b.value from a join b on a.key=b.key  ),\n" +
        "  e as (select a.key,c.value from a left outer join c on a.key=c.key and c.key is not null )\n" +
        "  insert overwrite table x select * from y;";

SQLStatement statement = SQLUtils.parseSingleStatement(sql1, DbType.odps, false);
TableVisitor visitor = new TableVisitor();
statement.accept(visitor);
System.out.println(visitor.tableList.toString());

打印结果: [x, y]

wenshao commented 2 years ago

https://github.com/alibaba/druid/releases/tag/1.2.13 问题已修复,请用新版本