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 cfa032c..9189e63 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
@@ -27,6 +27,7 @@
import org.eigenbase.rel.rules.SemiJoinRel;
import org.eigenbase.reltype.RelDataTypeField;
import org.eigenbase.rex.RexCall;
+import org.eigenbase.rex.RexFieldAccess;
import org.eigenbase.rex.RexFieldCollation;
import org.eigenbase.rex.RexInputRef;
import org.eigenbase.rex.RexLiteral;
@@ -272,6 +273,13 @@ protected RexVisitor(Schema schema) {
}
@Override
+ public ASTNode visitFieldAccess(RexFieldAccess fieldAccess) {
+ return ASTBuilder
+ .construct(HiveParser.DOT, ".")
+ .add(super.visitFieldAccess(fieldAccess)).add(HiveParser.Identifier, fieldAccess.getField().getName()).node();
+ }
+
+ @Override
public ASTNode visitInputRef(RexInputRef inputRef) {
ColumnInfo cI = schema.get(inputRef.getIndex());
if (cI.agg != null) {
@@ -495,7 +503,7 @@ public QueryBlockInfo(Schema schema, ASTNode ast) {
* 1. ProjectRel will always be child of SortRel.
* 2. In Optiq every projection in ProjectRelBase is uniquely named
* (unambigous) without using table qualifier (table name).
- *
+ *
* @param order
* Hive Sort Rel Node
* @return Schema
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 0228553..fcba801 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
@@ -14,6 +14,7 @@
import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
+import org.apache.hadoop.hive.ql.plan.ExprNodeFieldDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeNullDesc;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
@@ -90,10 +91,17 @@ public RexNode convert(ExprNodeDesc expr) throws SemanticException {
return convert((ExprNodeConstantDesc) expr);
} else if (expr instanceof ExprNodeColumnDesc) {
return convert((ExprNodeColumnDesc) expr);
+ } else if (expr instanceof ExprNodeFieldDesc) {
+ return convert((ExprNodeFieldDesc) expr);
} else {
throw new RuntimeException("Unsupported Expression");
}
- // TODO: handle a) ExprNodeFieldDesc b) ExprNodeColumnListDesc
+ // TODO: handle ExprNodeColumnListDesc
+ }
+
+ private RexNode convert(final ExprNodeFieldDesc fieldDesc) throws SemanticException {
+ return m_cluster.getRexBuilder().makeFieldAccess(convert(fieldDesc.getDesc()),
+ fieldDesc.getFieldName(), true);
}
private RexNode convert(final ExprNodeGenericFuncDesc func) throws SemanticException {