一、sqlParse组成
Druid SQL Parser分三个模块:
- Parser
- AST
- Visitor
1.1 Parser
parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。
1.2 AST
AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。这也是语法树的精髓了,sql解析,本质上就是把sql转为 ast语法树,拿到这个语法树后,我们就能做很多事了,遍历也好,加点,修改也好,都可以在ast上完成。
二、java代码编写
/**
* 根据sql由获取sql的表名
* @param sql
* @param dbType 数据库类型 可以用JdbcConstants.MYSQL
* @return Map<别名, 表名>
*/
public static Map<String /* 别名 */, String /* 表名 */> getTables(String sql,DBType dbType) {
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType.name())
Map<String, String> tables = new HashMap<String, String>();for (SQLStatement stmt : stmtList) {
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType);
stmt.accept(visitor);
for (SQLName originalTable : visitor.getOriginalTables()) {
if (originalTable instanceof SQLIdentifierExpr) {
String tableName = ((SQLIdentifierExpr) originalTable).getName();
SQLObject parent = originalTable.getParent();
String alias = null;
if (parent instanceof SQLPropertyExpr) {
alias = ((SQLPropertyExpr) parent).getResolvedTableSource().getAlias();
} else if (parent instanceof SQLExprTableSource) {
alias = ((SQLExprTableSource) parent).getAlias();
}
if (null == alias) {
alias = tableName;
}
tables.put(alias, tableName);
}
}
}
return tables;
}
三、调试结果
对于MLSQL JDBC的表列信息解析依赖于Druid,因此语法支持受限于Druid,目前Druid的支持如下:
数据库 | DML | DDL |
odps | 完全支持 | 完全支持 |
mysql | 完全支持 | 完全支持 |
postgresql | 完全支持 | 完全支持 |
oracle | 支持大部分 | 支持大部分 |
sql server | 支持常用的 | 支持常用的 |
db2 | 支持常用的 | 支持常用的 |
hive | 支持常用的 | 支持常用的 |
四、源码支持DB类型
目前我用的Druid是1.2.18目前源码支持的dbType类型如下