Hive Server對SQL語句的編譯過程 : 前奏

上節說了,server接收到一個sql命令後,會編譯此命令。sql

======================================函數

重點就在此了,繼續往下看spa

ParseDriver pd = new ParseDriver();server

ASTNode tree = pd.parse(commandctx);---看來是要解析成一個樹!token

===看看是如何解析成樹的!ip

解析的代碼以下:get

 

public ASTNode parse(String command, Context ctxthrows 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(databasecrtDb.getIfNotExists());

    return 0;

  }

===核心語句在 db.createDatabase(databasecrtDb.getIfNotExists());源碼以下:

 

public void createDatabase(Database dbboolean ifNotExistthrows AlreadyExistsException, HiveException {

try {

getMSC().createDatabase(db);

catch (AlreadyExistsException e) {

if (!ifNotExist) {

throw e;

}

catch (Exception e) {

throw new HiveException(e);

}

}

中間報了一次錯誤:由於hive.metastore.uris而起,這個參數幹嗎的呢?

這個問題放在下一節描述!

相關文章
相關標籤/搜索