mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Updated SQL Parser (markdown)
+8
-7
@@ -21,18 +21,19 @@ SELECT ID, NAME, AGE FROM USER WHERE ID = ?
|
||||
```
|
||||
这样的SQL,druid parser处理大约是5us,也就是每秒中可以处理20万次。
|
||||
|
||||
* 3. 测试代码看这里: https://github.com/alibaba/druid/blob/master/src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfTest.java
|
||||
## 2.1 测试代码看这里
|
||||
[MySqlPerfTest.java](https://github.com/alibaba/druid/blob/master/src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfTest.java)
|
||||
|
||||
# 4. Druid SQL Parser的代码结构
|
||||
# 3. Druid SQL Parser的代码结构
|
||||
Druid SQL Parser分三个模块:
|
||||
* Parser
|
||||
* AST
|
||||
* Visitor
|
||||
|
||||
## 4.1 parser
|
||||
## 3.1 parser
|
||||
parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。
|
||||
|
||||
## 4.2 AST
|
||||
## 3.2 AST
|
||||
AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。下面是获得抽象语法树的一个例子:
|
||||
```java
|
||||
final String dbType = JdbcConstants.MYSQL; // 可以是ORACLE、POSTGRESQL、SQLSERVER、ODPS等
|
||||
@@ -40,7 +41,7 @@ String sql = "select * from t";
|
||||
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
|
||||
```
|
||||
|
||||
## 4.3 Visitor
|
||||
## 3.3 Visitor
|
||||
Visitor是遍历AST的手段,是处理AST最方便的模式,Visitor是一个接口,有缺省什么都没做的实现VistorAdapter。
|
||||
|
||||
我们可以实现不同的Visitor来满足不同的需求,Druid内置提供了如下Visitor:
|
||||
@@ -51,9 +52,9 @@ Visitor是遍历AST的手段,是处理AST最方便的模式,Visitor是一个
|
||||
* ExportParameterVisitor用来提取SQL中的变量参数
|
||||
* SchemaStatVisitor用来统计SQL中使用的表、字段、过滤条件、排序表达式、分组表达式
|
||||
|
||||
## 4.4 自定义Visitor
|
||||
## 3.4 自定义Visitor
|
||||
每种方言的Visitor都有一个缺省的VisitorAdapter,使得编写自定义的Visitor更方便。
|
||||
https://github.com/alibaba/druid/wiki/SQL_Parser_Demo_visitor
|
||||
|
||||
## 4.5 方言
|
||||
## 3.5 方言
|
||||
SQL-92、SQL-99等都是标准SQL,mysql/oracle/pg/sqlserver/odps等都是方言,也就是dialect。parser/ast/visitor都需要针对不同的方言进行特别处理。
|
||||
Reference in New Issue
Block a user