diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java index 7a1e259..c74336f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.common.type.HiveVarchar; import org.apache.hadoop.hive.ql.exec.FunctionRegistry; +import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException; import org.apache.hadoop.hive.ql.parse.ParseUtils; import org.apache.hadoop.hive.ql.parse.RowResolver; import org.apache.hadoop.hive.ql.parse.SemanticException; @@ -128,8 +129,17 @@ public RexNode convert(ExprNodeDesc expr) throws SemanticException { } private RexNode convert(final ExprNodeFieldDesc fieldDesc) throws SemanticException { - return m_cluster.getRexBuilder().makeFieldAccess(convert(fieldDesc.getDesc()), - fieldDesc.getFieldName(), true); + RexNode rexNode = convert(fieldDesc.getDesc()); + if (rexNode instanceof RexCall) { + // regular case of accessing nested field in a column + return m_cluster.getRexBuilder().makeFieldAccess(rexNode, + fieldDesc.getFieldName(), true); + } else { + // This may happen for schema-less tables, where columns are dynamically + // supplied by serdes. + throw new OptiqSemanticException("Unexpected rexnode : " + + rexNode.getClass().getCanonicalName()); + } } private RexNode convert(final ExprNodeGenericFuncDesc func) throws SemanticException { @@ -211,7 +221,8 @@ private boolean castExprUsingUDFBridge(GenericUDF gUDF) { return castExpr; } - private RexNode handleExplicitCast(ExprNodeGenericFuncDesc func, List childRexNodeLst) { + private RexNode handleExplicitCast(ExprNodeGenericFuncDesc func, + List childRexNodeLst) throws OptiqSemanticException { RexNode castExpr = null; if (childRexNodeLst != null && childRexNodeLst.size() == 1) {