diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java index 2645fab4c8..17452ce461 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java @@ -709,7 +709,7 @@ boolean canCBOHandleAst(ASTNode ast, QB qb, PreCboCtx cboCtx) { boolean isSupportedRoot = root == HiveParser.TOK_QUERY || root == HiveParser.TOK_EXPLAIN || qb.isCTAS() || qb.isMaterializedView(); // Queries without a source table currently are not supported by CBO - boolean isSupportedType = (qb.getIsQuery() && !qb.containsQueryWithoutSourceTable()) + boolean isSupportedType = (qb.getIsQuery()) || qb.isCTAS() || qb.isMaterializedView() || cboCtx.type == PreCboCtx.Type.INSERT || cboCtx.type == PreCboCtx.Type.MULTI_INSERT; boolean noBadTokens = HiveCalciteUtil.validateASTForUnsupportedTokens(ast); @@ -938,12 +938,51 @@ void resetToken() { } } + // method to remove references to "DUMMY_TABLE" + void removeDummyTable(ASTNode ast) throws SemanticException { + switch(ast.getType()) { + case HiveParser.TOK_QUERY: + if(ast.getChildCount() > 0 && ast.getChild(0).getType() == HiveParser.TOK_FROM) { + ASTNode fromAST = (ASTNode)ast.getChild(0); + ASTNode fromChild = (ASTNode)fromAST.getChild(0); + if(fromChild.getType() == HiveParser.TOK_TABREF) { + String[] qualTableName = getQualifiedTableName((ASTNode)(fromChild.getChild(0))); + + // delete FROM + if(qualTableName.length == 2 && qualTableName[0] == "_dummy_database" && qualTableName[1] == "_dummy_table"){ + ast.deleteChild(0); + } + // we do not need to go deep since we can not hit subquery further + return; + } + else { + // This should be subquery + assert(fromChild.getType() == HiveParser.TOK_SUBQUERY); + if(fromChild.getChildCount() > 0) { + ASTNode subqueryChild = (ASTNode)fromChild.getChild(0); + removeDummyTable(subqueryChild); + } + } + } + break; + + default: + for(int i=0; i