diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java index c3706dd..ddef37b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/RelOptHiveTable.java @@ -131,6 +131,9 @@ public double getRowCount() { } } + if (rowCount == -1) + noColsMissingStats.getAndIncrement(); + return rowCount; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java index a3d1296..c643aa4 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java @@ -86,7 +86,7 @@ public static HiveProjectRel create(RelNode child, List exps, RelOptCluster cluster = child.getCluster(); // 1 Ensure columnNames are unique - OPTIQ-411 - if (!Util.isDistinct(fieldNames)) { + if (fieldNames != null && !Util.isDistinct(fieldNames)) { String msg = "Select list contains multiple expressions with the same name." + fieldNames; throw new OptiqSemanticException(msg); } 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 37813c0..0daad5b 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 @@ -12139,6 +12139,7 @@ private boolean canHandleQuery(QB qbToChk, boolean topLevelQB) { // 1. If top level QB is query then everything below it must also be Query // 2. Nested Subquery will return false for qbToChk.getIsQuery() if ((!topLevelQB || qbToChk.getIsQuery()) + && (!conf.getBoolVar(ConfVars.HIVE_IN_TEST) || conf.getVar(ConfVars.HIVEMAPREDMODE).equalsIgnoreCase("nonstrict")) && (!topLevelQB || (queryProperties.getJoinCount() > 1) || conf.getBoolVar(ConfVars.HIVE_IN_TEST)) && !queryProperties.hasClusterBy() && !queryProperties.hasDistributeBy() && !queryProperties.hasSortBy() && !queryProperties.hasPTF() @@ -13870,7 +13871,6 @@ private RelNode genLogicalPlan(QB qb) throws SemanticException { aliasToRel.put(tableAlias, op); } - if (aliasToRel.isEmpty()) { //// This may happen for queries like select 1; (no source table) // We can do following which is same, as what Hive does. @@ -13910,7 +13910,15 @@ private RelNode genLogicalPlan(QB qb) throws SemanticException { selectRel = genSelectLogicalPlan(qb, srcRel); srcRel = (selectRel == null) ? srcRel : selectRel; - // 6. Incase this QB corresponds to subquery then modify its RR to point + // 6. Build Rel for OB Clause + obRel = genOBLogicalPlan(qb, srcRel); + srcRel = (obRel == null) ? srcRel : obRel; + + // 7. Build Rel for Limit Clause + limitRel = genLimitLogicalPlan(qb, srcRel); + srcRel = (limitRel == null) ? srcRel : limitRel; + + // 8. Incase this QB corresponds to subquery then modify its RR to point // to subquery alias // TODO: cleanup this if (qb.getParseInfo().getAlias() != null) { @@ -13932,14 +13940,6 @@ private RelNode genLogicalPlan(QB qb) throws SemanticException { relToHiveColNameOptiqPosMap.put(srcRel, buildHiveToOptiqColumnMap(newRR, srcRel)); } - // 7. Build Rel for OB Clause - obRel = genOBLogicalPlan(qb, srcRel); - srcRel = (obRel == null) ? srcRel : obRel; - - // 8. Build Rel for Limit Clause - limitRel = genLimitLogicalPlan(qb, srcRel); - srcRel = (limitRel == null) ? srcRel : limitRel; - if (LOG.isDebugEnabled()) { LOG.debug("Created Plan for Query Block " + qb.getId()); }