You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/09/17 17:56:48 UTC

svn commit: r1625636 - in /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql: optimizer/optiq/reloperators/ optimizer/optiq/translator/ parse/

Author: hashutosh
Date: Wed Sep 17 15:56:47 2014
New Revision: 1625636

URL: http://svn.apache.org/r1625636
Log:
HIVE-8159 : CBO: bail from Optiq planning if a Select list contains multiple references to the same name (Ashutosh Chauhan via Harish Butani)

Modified:
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java?rev=1625636&r1=1625635&r2=1625636&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveProjectRel.java Wed Sep 17 15:56:47 2014
@@ -24,6 +24,7 @@ import java.util.List;
 import com.google.common.collect.ImmutableList;
 
 import org.apache.hadoop.hive.ql.optimizer.optiq.HiveOptiqUtil;
+import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException;
 import org.apache.hadoop.hive.ql.optimizer.optiq.TraitsUtil;
 import org.apache.hadoop.hive.ql.optimizer.optiq.cost.HiveCost;
 import org.eigenbase.rel.ProjectRelBase;
@@ -40,6 +41,7 @@ import org.eigenbase.reltype.RelDataType
 import org.eigenbase.rex.RexBuilder;
 import org.eigenbase.rex.RexNode;
 import org.eigenbase.rex.RexUtil;
+import org.eigenbase.util.Util;
 import org.eigenbase.util.mapping.Mapping;
 import org.eigenbase.util.mapping.MappingType;
 
@@ -79,8 +81,15 @@ public class HiveProjectRel extends Proj
    * @param fieldNames
    *          aliases of the expressions
    */
-  public static HiveProjectRel create(RelNode child, List<? extends RexNode> exps, List<String> fieldNames) {
+  public static HiveProjectRel create(RelNode child, List<? extends RexNode> exps,
+    List<String> fieldNames) throws OptiqSemanticException{
     RelOptCluster cluster = child.getCluster();
+
+    // 1 Ensure columnNames are unique - OPTIQ-411
+    if (!Util.isDistinct(fieldNames)) {
+      String msg = "Select list contains multiple expressions with the same name." + fieldNames;
+      throw new OptiqSemanticException(msg);
+    }
     RelDataType rowType = RexUtil.createStructType(cluster.getTypeFactory(), exps, fieldNames);
     return create(cluster, child, exps, rowType, Collections.<RelCollation> emptyList());
   }
@@ -127,8 +136,9 @@ public class HiveProjectRel extends Proj
    *          Field names; if null, or if a particular entry is null, the name
    *          of the permuted field is used
    * @return relational expression which projects a subset of the input fields
+   * @throws OptiqSemanticException
    */
-  public static RelNode projectMapping(RelNode rel, Mapping mapping, List<String> fieldNames) {
+  public static RelNode projectMapping(RelNode rel, Mapping mapping, List<String> fieldNames) throws OptiqSemanticException {
     assert mapping.getMappingType().isSingleSource();
     assert mapping.getMappingType().isMandatorySource();
 

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java?rev=1625636&r1=1625635&r2=1625636&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java Wed Sep 17 15:56:47 2014
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.Atomi
 import net.hydromatic.optiq.util.BitSets;
 
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveSortRel;
 import org.apache.hadoop.hive.ql.optimizer.optiq.translator.SqlFunctionConverter.HiveToken;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
@@ -78,7 +79,7 @@ public class ASTConverter {
     hiveAST = new HiveAST();
   }
 
-  public static ASTNode convert(final RelNode relNode, List<FieldSchema> resultSchema) {
+  public static ASTNode convert(final RelNode relNode, List<FieldSchema> resultSchema) throws OptiqSemanticException {
     SortRel sortrel = null;
     RelNode root = DerivedTableInjector.convertOpTree(relNode, resultSchema);
 

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java?rev=1625636&r1=1625635&r2=1625636&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java Wed Sep 17 15:56:47 2014
@@ -22,6 +22,7 @@ import java.util.List;
 
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.optimizer.optiq.HiveOptiqUtil;
+import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveAggregateRel;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveProjectRel;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveSortRel;
@@ -45,7 +46,7 @@ import org.eigenbase.rex.RexNode;
 
 public class DerivedTableInjector {
 
-  public static RelNode convertOpTree(RelNode rel, List<FieldSchema> resultSchema) {
+  public static RelNode convertOpTree(RelNode rel, List<FieldSchema> resultSchema) throws OptiqSemanticException {
     RelNode newTopNode = rel;
 
     if (!(newTopNode instanceof ProjectRelBase) && !(newTopNode instanceof SortRel)) {
@@ -119,7 +120,7 @@ public class DerivedTableInjector {
   }
 
   private static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel,
-      List<FieldSchema> resultSchema) {
+      List<FieldSchema> resultSchema) throws OptiqSemanticException {
     RelNode tmpRel = rootRel;
     RelNode parentOforiginalProjRel = rootRel;
     HiveProjectRel originalProjRel = null;

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1625636&r1=1625635&r2=1625636&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Wed Sep 17 15:56:47 2014
@@ -13619,15 +13619,6 @@ public class SemanticAnalyzer extends Ba
         columnNames.add(getColumnInternalName(i));
       }
 
-      // 1.1 Ensure columnNames are unique
-      if (!Util.isDistinct(columnNames)) {
-        String msg = String.format(
-            "Select list contains multiple expressions with the same name %s."
-                + columnNames);
-        LOG.debug(msg);
-        throw new OptiqSemanticException(msg);
-      }
-
       // 2. Prepend column names with '_o_'
       /*
        * Hive treats names that start with '_c' as internalNames; so change the