From 797e588f776f663be3ff6a0d4e6b6de853486ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Tue, 3 Oct 2017 13:31:01 -0500 Subject: [PATCH] Updated SQL Parser (markdown) --- SQL-Parser.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/SQL-Parser.md b/SQL-Parser.md index 1f0000b..2668ecd 100644 --- a/SQL-Parser.md +++ b/SQL-Parser.md @@ -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 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都需要针对不同的方言进行特别处理。 \ No newline at end of file