上节说了,server接收到一个sql命令后,会编译此命令。
======================================
重点就在此了,继续往下看
ParseDriver pd = new ParseDriver();
ASTNode tree = pd.parse(command, ctx);---看来是要解析成一个树!
===看看是如何解析成树的!
解析的代码如下:
public ASTNode parse(String command, Context ctx) throws ParseException {
// 看到这里了
LOG.info("Parsing command: " + command);
// 看到这里了
HiveLexerX lexer = new HiveLexerX(new ANTLRNoCaseStringStream(command));
TokenRewriteStream tokens = new TokenRewriteStream(lexer);
if (ctx != null) {
ctx.setTokenRewriteStream(tokens);
}
HiveParserX parser = new HiveParserX(tokens);
parser.setTreeAdaptor(adaptor);
HiveParser.statement_return r = null;
try {
r = parser.statement();
} catch (RecognitionException e) {
throw new ParseException(parser.getErrors());
}
if (lexer.getErrors().size() == 0 && parser.getErrors().size() == 0) {
LOG.info("Parse Completed");
} else if (lexer.getErrors().size() != 0) {
throw new ParseException(lexer.getErrors());
} else {
throw new ParseException(parser.getErrors());
}
return (ASTNode) r.getTree();
}
那么到底是个啥意思呢?
这下面都是编译原理antlr的专业知识,凭我目前的功力无法破解!!!直接给出解析后的树
看来解析倒是成功了!然后后面的解析过程还是挺麻烦的,都看晕了,直接给出结果吧
看来就是这种任务在执行了!!!然后跑去看DDLTask的源码,发现有这么一个函数
看来这一步走对了! 进入这个函数执行!
进入createDatabase函数执行!!!源码如下:
private int createDatabase(Hive db, CreateDatabaseDesc crtDb)
throws HiveException, AlreadyExistsException {
Database database = new Database();
database.setName(crtDb.getName());
database.setDescription(crtDb.getComment());
database.setLocationUri(crtDb.getLocationUri());
database.setParameters(crtDb.getDatabaseProperties());
db.createDatabase(database, crtDb.getIfNotExists());
return 0;
}
===核心语句在 db.createDatabase(database, crtDb.getIfNotExists());源码如下:
public void createDatabase(Database db, boolean ifNotExist) throws AlreadyExistsException, HiveException {
try {
getMSC().createDatabase(db);
} catch (AlreadyExistsException e) {
if (!ifNotExist) {
throw e;
}
} catch (Exception e) {
throw new HiveException(e);
}
}
中间报了一次错误:因为hive.metastore.uris而起,这个参数干嘛的呢?
这个问题放在下一节描述!