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..a0689b2a8b 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); @@ -4175,7 +4175,11 @@ private RelNode genLogicalPlan(QB qb, boolean outerMostQB, // table // So, for now lets just disable this. Anyway there is nothing much to // optimize in such cases. - throw new CalciteSemanticException("Unsupported", UnsupportedFeature.Others); + qb.getMetaData().setSrcForAlias(DUMMY_TABLE, getDummyTable()); + qb.addAlias(DUMMY_TABLE); + qb.setTabAlias(DUMMY_TABLE, DUMMY_TABLE); + RelNode op = genTableLogicalPlan(DUMMY_TABLE, qb); + aliasToRel.put(DUMMY_TABLE, op); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 1c74779dec..916a832dd7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2018,6 +2018,9 @@ private void getMetaData(QB qb, ReadEntity parentInput) } if (tab == null) { + if(tabName.equals(DUMMY_DATABASE + "." + DUMMY_TABLE)) { + continue; + } ASTNode src = qb.getParseInfo().getSrcForAlias(alias); if (null != src) { throw new SemanticException(ErrorMsg.INVALID_TABLE.getMsg(src)); @@ -10597,6 +10600,9 @@ public Operator genPlan(QB qb, boolean skipAmbiguityCheck) // Recurse over all the source tables for (String alias : qb.getTabAliases()) { + if(alias.equals(DUMMY_TABLE)) { + continue; + } Operator op = genTablePlan(alias, qb); aliasToOpInfo.put(alias, op); } @@ -10724,7 +10730,7 @@ private void rewriteRRForSubQ(String alias, Operator operator, boolean skipAmbig opParseCtx.get(operator).setRowResolver(newRR); } - private Table getDummyTable() throws SemanticException { + public Table getDummyTable() throws SemanticException { Path dummyPath = createDummyFile(); Table desc = new Table(DUMMY_DATABASE, DUMMY_TABLE); desc.getTTable().getSd().setLocation(dummyPath.toString());