阿飞Javaer,转载请注明原创出处,谢谢!!
INSERT语法
分析insert解析之前,首先看一下mysql官方对insert语法的定义,因为SQL解析跟语法息息相关:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT解析
接下来分析sharding-jdbc是如何解析insert类型的SQL语句的,通过SQLStatement result = sqlParser.parse();
得到SQL解析器后,执行AbstractInsertParser中parse()方法解析insert sql,核心源码如下:
@Override
public final DMLStatement parse() {
lexerEngine.nextToken();
InsertStatement result = new InsertStatement();
insertClauseParserFacade.getInsertIntoClauseParser().parse(result);
insertClauseParserFacade.getInsertColumnsClauseParser().parse(result);
if (lexerEngine.equalAny(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
throw new UnsupportedOperationException("Cannot INSERT SELECT");
}
insertClauseParserFacade.getInsertValuesClauseParser().parse(result);
insertClauseParserFacade.getInsertSetClauseParser().parse(result);
appendGenerateKey(result);
return result;
}
对应的泳道图如下所示:
第1步-lexerEngine.nextToken()
由parse()源码可知,insert解析第1步就是调用 lexerEngine.nextToken()
,nextToken()在之前的文章已经分析过(戳链接),即跳到下一个token,由于任意SQL解析都会在SQLParsing