基于上一篇博文:executeCommand(queryRunner, query, clientOptions.outputFormat);開(kāi)始
//outputFormat:默認(rèn)是csv格式
private static void executeCommand(QueryRunner queryRunner, String query, OutputFormat outputFormat)
{
//默認(rèn)使用";"將語(yǔ)句隔開(kāi)拇舀,通過(guò)ANTLR4的詞法解析獲取語(yǔ)句列表。
//比如非法的語(yǔ)句在這里識(shí)別不出來(lái)“sele * from events limit select” 也不會(huì)報(bào)錯(cuò)
StatementSplitter splitter = new StatementSplitter(query);
//遍歷每一條語(yǔ)句
for (Statement split : splitter.getCompleteStatements()) {
if (!isEmptyStatement(split.statement())) {
process(queryRunner, split.statement(), outputFormat, false);
}
}
if (!isEmptyStatement(splitter.getPartialStatement())) {
System.err.println("Non-terminated statement: " + splitter.getPartialStatement());
}
}
public StatementSplitter(String sql, Set<String> delimiters)
{
//生成詞流
TokenSource tokens = getLexer(sql, delimiters);
ImmutableList.Builder<Statement> list = ImmutableList.builder();
StringBuilder sb = new StringBuilder();
while (true) {
//獲取一個(gè)詞
Token token = tokens.nextToken();
//如果類(lèi)型是結(jié)束則退出
if (token.getType() == Token.EOF) {
break;
}
//如果類(lèi)型是一個(gè)句子的結(jié)束符號(hào)蜻底,默認(rèn)是分號(hào)
if (token.getType() == SqlBaseParser.DELIMITER) {
String statement = sb.toString().trim();
if (!statement.isEmpty()) {
//語(yǔ)句加入到列表中
list.add(new Statement(statement, token.getText()));
}
sb = new StringBuilder();
}
else {
//不斷組裝詞成一個(gè)語(yǔ)句
sb.append(token.getText());
}
}
//完整的語(yǔ)句列表
this.completeStatements = list.build();
//不完整的語(yǔ)句
this.partialStatement = sb.toString().trim();
}