使用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]
原提问者GitHub用户debughx
WITH...INSERT OVERWRITE... 是一种常用的 SQL 查询语句,它可以将查询结果插入到指定的表中,并覆盖原有的数据。
WITH 子句用于定义一个临时表或子查询,可以在查询语句中多次使用,以提高查询效率和可读性。而 INSERT OVERWRITE 则表示将查询结果覆盖写入指定的表中,这可能会导致原有数据的丢失,需要谨慎使用。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。