搜索

DruidParser

Jun 07, 2016 pm 02:50 PM
druid源代码阿里

最近用阿里的Druid的SQL parser来解析SQL语句。在此记录下研究: 调用它来解析出AST语意树一般这么写(针对MySQL): MySqlStatementParser parser = new MySqlStatementParser(sql);ListSQLStatement statementList = parser.parseStatementList(); for (SQ

最近用阿里的Druid的SQL parser来解析SQL语句。在此记录下研究:
调用它来解析出AST语意树一般这么写(针对MySQL):

<code class="language-java hljs ">MySqlStatementParser parser = <span class="hljs-keyword">new</span> MySqlStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
<span class="hljs-keyword">for</span>(SQLStatement statement:statementList){
    MySqlSchemaStatVisitor visitor = <span class="hljs-keyword">new</span> MySqlSchemaStatVisitor();
    statemen.accept(visitor);
}        </code>

对于每一个SQL请求(可能包含多语句),需要先新建一个MySqlStatementParser。注意,MySqlStatementParser 不是线程安全的,所以一种做法是针对每个session的请求,需要新建一个MySqlStatementParser。
那么这个初始化过程究竟是怎样的呢?涉及到哪些类?

涉及到的类如下所示:
这里写图片描述
SQL解析可以分为三层:语句解析->表达式解析->词法解析。对应的主要类分别是MySqlStatementParser,MySqlExprParser,MySqlLexer。可以说,MySqlLexer是解析出每个词的词义,表达式由词组成,MySqlExprParser用来解析出不同表达式的含义。多个表达式和词组成完整的语句,这个由MySqlStatementParser解析。
首先看MySqlStatementParser的结构:
这里写图片描述

  • SQLParser.java
    • errorEndPos :解析出错记录位置
    • lexer:词法解析
    • dbType:数据库类型
  • SQLStatement.java
    • exprParser:表达式解析类
    • SQLCreateTableParser:建表语句解析类,因为建表语句比较复杂,所以单拿出来。其他DDL语句都在本类SQLStatement中解析
    • parseValuesSize:记录解析结果集大小
    • keepComments:是否保留注释
    • parseCompleteValues:是否全部解析完成
  • MySqlStatementParser.java:
    • 静态关键词:比如auto increment,collate等,对于DDL语句或者DCL语句
    • exprParser:针对MySQL语句的parser

接着是MySqlStatementParser的MySqlExprParser的结构:
这里写图片描述

  • SQLExprParser:
    • AGGREGATE_FUNCTIONS:一些统计函数的关键词
    • aggregateFunctions:保存统计函数的关键词
  • MySqlSQLExprParser:
    • AGGREGATE_FUNCTIONS:针对MySql统计函数的关键词

最后是MySqlLexer:
这里写图片描述

  • Lexer:
    • text:保存目前的整个SQL语句
    • pos:当前处理位置
    • mark:当前处理词的开始位置
    • ch:当前处理字符
    • buf:当前缓存的处理词
    • bufPos:用于取出词的标记,当前从text中取出的词应该为从mark位置开始,mark+bufPos结束的词
    • token:当前位于的关键词
    • stringVal:当前处理词
    • comments:注释
    • skipComment:是否跳过注释
    • savePoint:保存点
    • varIndex:针对?表达式
    • lines:总行数
    • digits:数字ASCII码
    • EOF:是否结尾
    • keepComments:是否保留注释
    • endOfComment:是否注释结尾
    • line:当前处理行数
    • commentHandler:注释处理器
    • allowComment:是否允许注释
    • KeyWords:所有关键词集合

新建MySqlStatementParser

初始化MySqlStatementParser:
MySqlStateMentParser.java:

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-title">MySqlStatementParser</span>(String sql){
    <span class="hljs-keyword">super</span>(<span class="hljs-keyword">new</span> MySqlExprParser(sql));
}</code>

会新建MySqlExprParser:
MySqlExprParser.java

<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-title">MySqlExprParser</span>(String sql){
    <span class="hljs-keyword">this</span>(<span class="hljs-keyword">new</span> MySqlLexer(sql));
    <span class="hljs-comment">//读取第一个有效词</span>
    <span class="hljs-keyword">this</span>.lexer.nextToken();
}</code>

会新建MySqlLexer:
MySqlLexer.java

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-title">MySqlLexer</span>(String input){
    <span class="hljs-keyword">super</span>(input);
    <span class="hljs-comment">//初始化MySQL关键词</span>
    <span class="hljs-keyword">super</span>.keywods = DEFAULT_MYSQL_KEYWORDS;
}</code>

Lexer.java

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-title">Lexer</span>(String input){
 <span class="hljs-keyword">this</span>(input, <span class="hljs-keyword">null</span>);
}

<span class="hljs-javadoc">/**
 *<span class="hljs-javadoctag"> @param</span> input 输入SQL语句
 *<span class="hljs-javadoctag"> @param</span> commentHandler 注释处理器
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-title">Lexer</span>(String input, CommentHandler commentHandler){
    <span class="hljs-keyword">this</span>(input, <span class="hljs-keyword">true</span>);
    <span class="hljs-keyword">this</span>.commentHandler = commentHandler;
}
<span class="hljs-javadoc">/**
 *
 *<span class="hljs-javadoctag"> @param</span> input
 *<span class="hljs-javadoctag"> @param</span> skipComment 是否跳过注释
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-title">Lexer</span>(String input, <span class="hljs-keyword">boolean</span> skipComment){
    <span class="hljs-keyword">this</span>.skipComment = skipComment;

    <span class="hljs-keyword">this</span>.text = input;
    <span class="hljs-keyword">this</span>.pos = -<span class="hljs-number">1</span>;
    <span class="hljs-comment">//读取第一个字符</span>
    scanChar();
}
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">void</span> <span class="hljs-title">scanChar</span>() {
    ch = charAt(++pos);
}</code>

初始化Lexer之后,回到MySqlExprParser的构造器,初始化KeyWords集合:

<code class=" hljs avrasm">public final static Keywords DEFAULT_MYSQL_KEYWORDS<span class="hljs-comment">;</span>

    static {
    //MySQL关键词
    Map<String, Token> map = new HashMap<String, Token>()<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.putAll</span>(Keywords<span class="hljs-preprocessor">.DEFAULT</span>_KEYWORDS<span class="hljs-preprocessor">.getKeywords</span>())<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DUAL"</span>, Token<span class="hljs-preprocessor">.DUAL</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FALSE"</span>, Token<span class="hljs-preprocessor">.FALSE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"IDENTIFIED"</span>, Token<span class="hljs-preprocessor">.IDENTIFIED</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"IF"</span>, Token<span class="hljs-preprocessor">.IF</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"KILL"</span>, Token<span class="hljs-preprocessor">.KILL</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LIMIT"</span>, Token<span class="hljs-preprocessor">.LIMIT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TRUE"</span>, Token<span class="hljs-preprocessor">.TRUE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"BINARY"</span>, Token<span class="hljs-preprocessor">.BINARY</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SHOW"</span>, Token<span class="hljs-preprocessor">.SHOW</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CACHE"</span>, Token<span class="hljs-preprocessor">.CACHE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ANALYZE"</span>, Token<span class="hljs-preprocessor">.ANALYZE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OPTIMIZE"</span>, Token<span class="hljs-preprocessor">.OPTIMIZE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ROW"</span>, Token<span class="hljs-preprocessor">.ROW</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"BEGIN"</span>, Token<span class="hljs-preprocessor">.BEGIN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"END"</span>, Token<span class="hljs-preprocessor">.END</span>)<span class="hljs-comment">;</span>

    // for oceanbase & mysql <span class="hljs-number">5.7</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"PARTITION"</span>, Token<span class="hljs-preprocessor">.PARTITION</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CONTINUE"</span>, Token<span class="hljs-preprocessor">.CONTINUE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"UNDO"</span>, Token<span class="hljs-preprocessor">.UNDO</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SQLSTATE"</span>, Token<span class="hljs-preprocessor">.SQLSTATE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CONDITION"</span>, Token<span class="hljs-preprocessor">.CONDITION</span>)<span class="hljs-comment">;</span>

    DEFAULT_MYSQL_KEYWORDS = new Keywords(map)<span class="hljs-comment">;</span>
}</code>

Keywords.java:

<code class=" hljs avrasm">public final static Keywords     DEFAULT_KEYWORDS<span class="hljs-comment">;</span>

static {
    Map<String, Token> map = new HashMap<String, Token>()<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ALL"</span>, Token<span class="hljs-preprocessor">.ALL</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ALTER"</span>, Token<span class="hljs-preprocessor">.ALTER</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"AND"</span>, Token<span class="hljs-preprocessor">.AND</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ANY"</span>, Token<span class="hljs-preprocessor">.ANY</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"AS"</span>, Token<span class="hljs-preprocessor">.AS</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ENABLE"</span>, Token<span class="hljs-preprocessor">.ENABLE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DISABLE"</span>, Token<span class="hljs-preprocessor">.DISABLE</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ASC"</span>, Token<span class="hljs-preprocessor">.ASC</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"BETWEEN"</span>, Token<span class="hljs-preprocessor">.BETWEEN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"BY"</span>, Token<span class="hljs-preprocessor">.BY</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CASE"</span>, Token<span class="hljs-preprocessor">.CASE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CAST"</span>, Token<span class="hljs-preprocessor">.CAST</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CHECK"</span>, Token<span class="hljs-preprocessor">.CHECK</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CONSTRAINT"</span>, Token<span class="hljs-preprocessor">.CONSTRAINT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CREATE"</span>, Token<span class="hljs-preprocessor">.CREATE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DATABASE"</span>, Token<span class="hljs-preprocessor">.DATABASE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DEFAULT"</span>, Token<span class="hljs-preprocessor">.DEFAULT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"COLUMN"</span>, Token<span class="hljs-preprocessor">.COLUMN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TABLESPACE"</span>, Token<span class="hljs-preprocessor">.TABLESPACE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"PROCEDURE"</span>, Token<span class="hljs-preprocessor">.PROCEDURE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FUNCTION"</span>, Token<span class="hljs-preprocessor">.FUNCTION</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DELETE"</span>, Token<span class="hljs-preprocessor">.DELETE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DESC"</span>, Token<span class="hljs-preprocessor">.DESC</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DISTINCT"</span>, Token<span class="hljs-preprocessor">.DISTINCT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DROP"</span>, Token<span class="hljs-preprocessor">.DROP</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ELSE"</span>, Token<span class="hljs-preprocessor">.ELSE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"EXPLAIN"</span>, Token<span class="hljs-preprocessor">.EXPLAIN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"EXCEPT"</span>, Token<span class="hljs-preprocessor">.EXCEPT</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"END"</span>, Token<span class="hljs-preprocessor">.END</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ESCAPE"</span>, Token<span class="hljs-preprocessor">.ESCAPE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"EXISTS"</span>, Token<span class="hljs-preprocessor">.EXISTS</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FOR"</span>, Token<span class="hljs-preprocessor">.FOR</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FOREIGN"</span>, Token<span class="hljs-preprocessor">.FOREIGN</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FROM"</span>, Token<span class="hljs-preprocessor">.FROM</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FULL"</span>, Token<span class="hljs-preprocessor">.FULL</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"GROUP"</span>, Token<span class="hljs-preprocessor">.GROUP</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"HAVING"</span>, Token<span class="hljs-preprocessor">.HAVING</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"IN"</span>, Token<span class="hljs-preprocessor">.IN</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INDEX"</span>, Token<span class="hljs-preprocessor">.INDEX</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INNER"</span>, Token<span class="hljs-preprocessor">.INNER</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INSERT"</span>, Token<span class="hljs-preprocessor">.INSERT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INTERSECT"</span>, Token<span class="hljs-preprocessor">.INTERSECT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INTERVAL"</span>, Token<span class="hljs-preprocessor">.INTERVAL</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INTO"</span>, Token<span class="hljs-preprocessor">.INTO</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"IS"</span>, Token<span class="hljs-preprocessor">.IS</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"JOIN"</span>, Token<span class="hljs-preprocessor">.JOIN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"KEY"</span>, Token<span class="hljs-preprocessor">.KEY</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LEFT"</span>, Token<span class="hljs-preprocessor">.LEFT</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LIKE"</span>, Token<span class="hljs-preprocessor">.LIKE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LOCK"</span>, Token<span class="hljs-preprocessor">.LOCK</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"MINUS"</span>, Token<span class="hljs-preprocessor">.MINUS</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"NOT"</span>, Token<span class="hljs-preprocessor">.NOT</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"NULL"</span>, Token<span class="hljs-preprocessor">.NULL</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ON"</span>, Token<span class="hljs-preprocessor">.ON</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OR"</span>, Token<span class="hljs-preprocessor">.OR</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ORDER"</span>, Token<span class="hljs-preprocessor">.ORDER</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OUTER"</span>, Token<span class="hljs-preprocessor">.OUTER</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"PRIMARY"</span>, Token<span class="hljs-preprocessor">.PRIMARY</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"REFERENCES"</span>, Token<span class="hljs-preprocessor">.REFERENCES</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"RIGHT"</span>, Token<span class="hljs-preprocessor">.RIGHT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SCHEMA"</span>, Token<span class="hljs-preprocessor">.SCHEMA</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SELECT"</span>, Token<span class="hljs-preprocessor">.SELECT</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SET"</span>, Token<span class="hljs-preprocessor">.SET</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SOME"</span>, Token<span class="hljs-preprocessor">.SOME</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TABLE"</span>, Token<span class="hljs-preprocessor">.TABLE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"THEN"</span>, Token<span class="hljs-preprocessor">.THEN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TRUNCATE"</span>, Token<span class="hljs-preprocessor">.TRUNCATE</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"UNION"</span>, Token<span class="hljs-preprocessor">.UNION</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"UNIQUE"</span>, Token<span class="hljs-preprocessor">.UNIQUE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"UPDATE"</span>, Token<span class="hljs-preprocessor">.UPDATE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"VALUES"</span>, Token<span class="hljs-preprocessor">.VALUES</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"VIEW"</span>, Token<span class="hljs-preprocessor">.VIEW</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"SEQUENCE"</span>, Token<span class="hljs-preprocessor">.SEQUENCE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TRIGGER"</span>, Token<span class="hljs-preprocessor">.TRIGGER</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"USER"</span>, Token<span class="hljs-preprocessor">.USER</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"WHEN"</span>, Token<span class="hljs-preprocessor">.WHEN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"WHERE"</span>, Token<span class="hljs-preprocessor">.WHERE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"XOR"</span>, Token<span class="hljs-preprocessor">.XOR</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OVER"</span>, Token<span class="hljs-preprocessor">.OVER</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"TO"</span>, Token<span class="hljs-preprocessor">.TO</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"USE"</span>, Token<span class="hljs-preprocessor">.USE</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"REPLACE"</span>, Token<span class="hljs-preprocessor">.REPLACE</span>)<span class="hljs-comment">;</span>

    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"COMMENT"</span>, Token<span class="hljs-preprocessor">.COMMENT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"COMPUTE"</span>, Token<span class="hljs-preprocessor">.COMPUTE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"WITH"</span>, Token<span class="hljs-preprocessor">.WITH</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"GRANT"</span>, Token<span class="hljs-preprocessor">.GRANT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"REVOKE"</span>, Token<span class="hljs-preprocessor">.REVOKE</span>)<span class="hljs-comment">;</span>

    // MySql procedure: <span class="hljs-keyword">add</span> by zz
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"WHILE"</span>, Token<span class="hljs-preprocessor">.WHILE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DO"</span>, Token<span class="hljs-preprocessor">.DO</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"DECLARE"</span>, Token<span class="hljs-preprocessor">.DECLARE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LOOP"</span>, Token<span class="hljs-preprocessor">.LOOP</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"LEAVE"</span>, Token<span class="hljs-preprocessor">.LEAVE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"ITERATE"</span>, Token<span class="hljs-preprocessor">.ITERATE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"REPEAT"</span>, Token<span class="hljs-preprocessor">.REPEAT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"UNTIL"</span>, Token<span class="hljs-preprocessor">.UNTIL</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OPEN"</span>, Token<span class="hljs-preprocessor">.OPEN</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CLOSE"</span>, Token<span class="hljs-preprocessor">.CLOSE</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"CURSOR"</span>, Token<span class="hljs-preprocessor">.CURSOR</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"FETCH"</span>, Token<span class="hljs-preprocessor">.FETCH</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"OUT"</span>, Token<span class="hljs-preprocessor">.OUT</span>)<span class="hljs-comment">;</span>
    map<span class="hljs-preprocessor">.put</span>(<span class="hljs-string">"INOUT"</span>, Token<span class="hljs-preprocessor">.INOUT</span>)<span class="hljs-comment">;</span>

    DEFAULT_KEYWORDS = new Keywords(map)<span class="hljs-comment">;</span>
}</code>

之后,回到构造MySqlStatementParser:
调用父类方法初始化:
SQLStatementParser.java

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-title">SQLStatementParser</span>(SQLExprParser exprParser){
    <span class="hljs-keyword">super</span>(exprParser.getLexer(), exprParser.getDbType());
    <span class="hljs-keyword">this</span>.exprParser = exprParser;
}</code>

SQLParser.java

<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-title">SQLParser</span>(Lexer lexer, String dbType){
    <span class="hljs-keyword">this</span>.lexer = lexer;
    <span class="hljs-keyword">this</span>.dbType = dbType;
}</code>

至此,初始化完成

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何处理MySQL中的数据库升级?您如何处理MySQL中的数据库升级?Apr 30, 2025 am 12:28 AM

MySQL数据库升级的步骤包括:1.备份数据库,2.停止当前MySQL服务,3.安装新版本MySQL,4.启动新版本MySQL服务,5.恢复数据库。升级过程需注意兼容性问题,并可使用高级工具如PerconaToolkit进行测试和优化。

您可以使用MySQL的不同备份策略是什么?您可以使用MySQL的不同备份策略是什么?Apr 30, 2025 am 12:28 AM

MySQL备份策略包括逻辑备份、物理备份、增量备份、基于复制的备份和云备份。1.逻辑备份使用mysqldump导出数据库结构和数据,适合小型数据库和版本迁移。2.物理备份通过复制数据文件,速度快且全面,但需数据库一致性。3.增量备份利用二进制日志记录变化,适用于大型数据库。4.基于复制的备份通过从服务器备份,减少对生产系统的影响。5.云备份如AmazonRDS提供自动化解决方案,但成本和控制需考虑。选择策略时应考虑数据库大小、停机容忍度、恢复时间和恢复点目标。

什么是mySQL聚类?什么是mySQL聚类?Apr 30, 2025 am 12:28 AM

MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

如何优化数据库架构设计以在MySQL中的性能?如何优化数据库架构设计以在MySQL中的性能?Apr 30, 2025 am 12:27 AM

在MySQL中优化数据库模式设计可通过以下步骤提升性能:1.索引优化:在常用查询列上创建索引,平衡查询和插入更新的开销。2.表结构优化:通过规范化或反规范化减少数据冗余,提高访问效率。3.数据类型选择:使用合适的数据类型,如INT替代VARCHAR,减少存储空间。4.分区和分表:对于大数据量,使用分区和分表分散数据,提升查询和维护效率。

您如何优化MySQL性能?您如何优化MySQL性能?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)

如何使用MySQL的函数进行数据处理和计算如何使用MySQL的函数进行数据处理和计算Apr 29, 2025 pm 04:21 PM

MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。

MySQL批量插入数据的高效方法MySQL批量插入数据的高效方法Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

给MySQL表添加和删除字段的操作步骤给MySQL表添加和删除字段的操作步骤Apr 29, 2025 pm 04:15 PM

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,删除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段时,需指定位置以优化查询性能和数据结构;删除字段前需确认操作不可逆;使用在线DDL、备份数据、测试环境和低负载时间段修改表结构是性能优化和最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具