阿飞Javaer,转载请注明原创出处,谢谢!!
DELETE语法
分析delete解析之前,首先看一下mysql官方对delete语法的定义:
- Single-Table Syntax
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
- Multi-table Syntax
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]
DELETE解析
接下来分析sharding-jdbc是如何解析delete类型的SQL语句的,SQLStatement result = sqlParser.parse()
得到SQL解析器后,执行AbstractDeleteParser中parse()方法,核心源码如下:
@Override
public DMLStatement parse() {
lexerEngine.nextToken();
lexerEngine.skipAll(getSkippedKeywordsBetweenDeleteAndTable());
lexerEngine.unsupportedIfEqual(getUnsupportedKeywordsBetweenDeleteAndTable());
DMLStatement result = new DMLStatement();
deleteClauseParserFacade.getTableReferencesClauseParser().parse(result, true);
lexerEngine.skipUntil(DefaultKeyword.WHERE);
deleteClauseParserFacade.getWhereClauseParser().parse(shardingRule, result, Collections.<SelectItem>emptyList());
return result;
}
对应的泳道图如下所示: