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 4f760a2..a3d1296 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 @@ -24,6 +24,7 @@ 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.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 HiveProjectRel(RelOptCluster cluster, RelTraitSet traitSet, RelNode child * @param fieldNames * aliases of the expressions */ - public static HiveProjectRel create(RelNode child, List exps, List fieldNames) { + public static HiveProjectRel create(RelNode child, List exps, + List 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. emptyList()); } @@ -127,8 +136,9 @@ public static HiveProjectRel create(RelOptCluster cluster, RelNode child, List fieldNames) { + public static RelNode projectMapping(RelNode rel, Mapping mapping, List fieldNames) throws OptiqSemanticException { assert mapping.getMappingType().isSingleSource(); assert mapping.getMappingType().isMandatorySource(); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java index 0ba320c..32db7cd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java @@ -25,6 +25,7 @@ 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 @@ hiveAST = new HiveAST(); } - public static ASTNode convert(final RelNode relNode, List resultSchema) { + public static ASTNode convert(final RelNode relNode, List resultSchema) throws OptiqSemanticException { SortRel sortrel = null; RelNode root = DerivedTableInjector.convertOpTree(relNode, resultSchema); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java index be740cc..e324b9c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java @@ -22,6 +22,7 @@ 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 @@ public class DerivedTableInjector { - public static RelNode convertOpTree(RelNode rel, List resultSchema) { + public static RelNode convertOpTree(RelNode rel, List resultSchema) throws OptiqSemanticException { RelNode newTopNode = rel; if (!(newTopNode instanceof ProjectRelBase) && !(newTopNode instanceof SortRel)) { @@ -119,7 +120,7 @@ private static void convertOpTree(RelNode rel, RelNode parent) { } private static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel, - List resultSchema) { + List resultSchema) throws OptiqSemanticException { RelNode tmpRel = rootRel; RelNode parentOforiginalProjRel = rootRel; HiveProjectRel originalProjRel = null; 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 465aebd..67b4027 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 @@ -13612,15 +13612,6 @@ private RelNode genSelectRelNode(List optiqColLst, RowResolver out_rwsc 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