上節說了,server接收到一個sql命令後,會編譯此命令。sql
======================================函數
重點就在此了,繼續往下看spa
ParseDriver pd = new ParseDriver();server
ASTNode tree = pd.parse(command, ctx);---看來是要解析成一個樹!token
===看看是如何解析成樹的!ip
解析的代碼以下:get
public ASTNode parse(String command, Context ctx) throws ParseException {源碼
// 看到這裏了it
LOG.info("Parsing command: " + command);io
// 看到這裏了
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而起,這個參數幹嗎的呢?
這個問題放在下一節描述!