5. 开始解析insert语句,AbstractInsertParser#parse,执行nextToken获取到下一个字符段INTO,
public final DMLStatement parse() {
lexerEngine.nextToken();
InsertStatement result = new InsertStatement();
insertClauseParserFacade.getInsertIntoClauseParser().parse(result);
insertClauseParserFacade.getInsertColumnsClauseParser().parse(result, shardingMetaData);
if (lexerEngine.equalAny(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
throw new UnsupportedOperationException("Cannot INSERT SELECT");
}
insertClauseParserFacade.getInsertValuesClauseParser().parse(result, shardingMetaData);
insertClauseParserFacade.getInsertSetClauseParser().parse(result);
processGeneratedKey(result);
return result;
}
InsertIntoClauseParser#parse,校验不支持的关键词,如果该字段不是INTO关键词或者是Assist.END,则跳过获取下一个字符段
public void parse(final InsertStatement insertStatement) {
lexerEngine.unsupportedIfEqual(getUnsupportedKeywordsBeforeInto());
lexerEngine.skipUntil(DefaultKeyword.INTO);
lexerEngine.nextToken();
tableReferencesClauseParser.parse(insertStatement, true);
skipBetweenTableAndValues(insertStatement);
}
继续获取下移字符段,表名,TableReferencesClauseParser以及子类MySQLTableReferencesClauseParser
public final void parse(final SQLStatement sqlStatement, final boolean isSingleTableOnly) {
do {
parseTableReference(sqlStatement, isSingleTableOnly);
} while (lexerEngine.skipIfEqual(Symbol.COMMA));
}
protected void parseTableReference(final SQLStatement sqlStatement, final boolean isSingleTableOnly) {
parseTableFactor(sqlStatement, isSingleTableOnly);
parsePartition();
parseIndexHint(sqlStatement);
}
获取表名以及下标解析出正确的表名,解析别名,保存表名以及它的相关标识TableToken,解析强制走索引标识以及JOIN.最后解析分区字符段和索引标识,最后跳过一些mysql的分区关键词,完成解析。
protected final void parseTableFactor(final SQLStatement sqlStatement, final boolean isSingleTableOnly) {
final int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
String literals = lexerEngine.getCurrentToken().getLiterals();
int skippedSchemaNameLength = 0;
lexerEngine.nextToken();
if (lexerEngine.skipIfEqual(Symbol.DOT)) {
skippedSchemaNameLength = literals.length() + Symbol.DOT.getLiterals().length();
literals = lexerEngine.getCurrentToken().getLiterals();
}
String tableName = SQLUtil.getExactlyValue(literals);
if (Strings.isNullOrEmpty(tableName)) {
return;
}