You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by se...@apache.org on 2014/09/06 00:24:44 UTC

svn commit: r1622813 - in /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql: optimizer/optiq/translator/ parse/ udf/generic/

Author: sershe
Date: Fri Sep  5 22:24:43 2014
New Revision: 1622813

URL: http://svn.apache.org/r1622813
Log:
HIVE-8003 : CBO: Handle Literal casting, Restrict CBO to select queries, Translate Strings, Optiq Log (Laljo John Pullokkaran, reviewed by Sergey Shelukhin)

Modified:
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/TypeConverter.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTimestamp.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToUtcTimestamp.java

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java Fri Sep  5 22:24:43 2014
@@ -1,5 +1,10 @@
 package org.apache.hadoop.hive.ql.optimizer.optiq.translator;
 
+import java.sql.Date;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
 import org.apache.hadoop.hive.ql.optimizer.optiq.RelOptHiveTable;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
 import org.apache.hadoop.hive.ql.parse.HiveParser;
@@ -41,30 +46,26 @@ class ASTBuilder {
     return b.node();
   }
 
-  static ASTNode join(ASTNode left, ASTNode right, JoinRelType joinType,
-      ASTNode cond, boolean semiJoin) {
+  static ASTNode join(ASTNode left, ASTNode right, JoinRelType joinType, ASTNode cond,
+      boolean semiJoin) {
     ASTBuilder b = null;
 
     switch (joinType) {
     case INNER:
       if (semiJoin) {
-        b = ASTBuilder.construct(HiveParser.TOK_LEFTSEMIJOIN,
-            "TOK_LEFTSEMIJOIN");
+        b = ASTBuilder.construct(HiveParser.TOK_LEFTSEMIJOIN, "TOK_LEFTSEMIJOIN");
       } else {
         b = ASTBuilder.construct(HiveParser.TOK_JOIN, "TOK_JOIN");
       }
       break;
     case LEFT:
-      b = ASTBuilder.construct(HiveParser.TOK_LEFTOUTERJOIN,
-          "TOK_LEFTOUTERJOIN");
+      b = ASTBuilder.construct(HiveParser.TOK_LEFTOUTERJOIN, "TOK_LEFTOUTERJOIN");
       break;
     case RIGHT:
-      b = ASTBuilder.construct(HiveParser.TOK_RIGHTOUTERJOIN,
-          "TOK_RIGHTOUTERJOIN");
+      b = ASTBuilder.construct(HiveParser.TOK_RIGHTOUTERJOIN, "TOK_RIGHTOUTERJOIN");
       break;
     case FULL:
-      b = ASTBuilder.construct(HiveParser.TOK_FULLOUTERJOIN,
-          "TOK_FULLOUTERJOIN");
+      b = ASTBuilder.construct(HiveParser.TOK_FULLOUTERJOIN, "TOK_FULLOUTERJOIN");
       break;
     }
 
@@ -87,9 +88,8 @@ class ASTBuilder {
   }
 
   static ASTNode unqualifiedName(String colName) {
-    ASTBuilder b = ASTBuilder
-.construct(HiveParser.TOK_TABLE_OR_COL,
-        "TOK_TABLE_OR_COL").add(HiveParser.Identifier, colName);
+    ASTBuilder b = ASTBuilder.construct(HiveParser.TOK_TABLE_OR_COL, "TOK_TABLE_OR_COL").add(
+        HiveParser.Identifier, colName);
     return b.node();
   }
 
@@ -108,39 +108,61 @@ class ASTBuilder {
 
   static ASTNode selectExpr(ASTNode expr, String alias) {
     return ASTBuilder.construct(HiveParser.TOK_SELEXPR, "TOK_SELEXPR").add(expr)
-      .add(HiveParser.Identifier, alias).node();
+        .add(HiveParser.Identifier, alias).node();
   }
 
   static ASTNode literal(RexLiteral literal) {
-    Object val = literal.getValue3();
+    Object val = null;
     int type = 0;
     SqlTypeName sqlType = literal.getType().getSqlTypeName();
 
     switch (sqlType) {
     case TINYINT:
+      val = literal.getValue3();
       type = HiveParser.TinyintLiteral;
       break;
     case SMALLINT:
+      val = literal.getValue3();
       type = HiveParser.SmallintLiteral;
       break;
     case INTEGER:
     case BIGINT:
+      val = literal.getValue3();
       type = HiveParser.BigintLiteral;
       break;
     case DECIMAL:
     case FLOAT:
     case DOUBLE:
     case REAL:
+      val = literal.getValue3();
       type = HiveParser.Number;
       break;
     case VARCHAR:
     case CHAR:
+      val = literal.getValue3();
       type = HiveParser.StringLiteral;
       val = "'" + String.valueOf(val) + "'";
       break;
     case BOOLEAN:
-      type = ((Boolean) val).booleanValue() ? HiveParser.KW_TRUE
-          : HiveParser.KW_FALSE;
+      val = literal.getValue3();
+      type = ((Boolean) val).booleanValue() ? HiveParser.KW_TRUE : HiveParser.KW_FALSE;
+      break;
+    case DATE: {
+      val = literal.getValue();
+      type = HiveParser.TOK_DATELITERAL;
+      DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+      val = df.format(((Calendar) val).getTime());
+      val = "'" + val + "'";
+    }
+      break;
+    case TIME:
+    case TIMESTAMP: {
+      val = literal.getValue();
+      type = HiveParser.TOK_TIMESTAMP;
+      DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+      val = df.format(((Calendar) val).getTime());
+      val = "'" + val + "'";
+    }
       break;
     case NULL:
       type = HiveParser.TOK_NULL;

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java Fri Sep  5 22:24:43 2014
@@ -2,11 +2,18 @@ package org.apache.hadoop.hive.ql.optimi
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hadoop.hive.common.type.Decimal128;
+import org.apache.hadoop.hive.common.type.HiveChar;
+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.parse.ParseUtils;
 import org.apache.hadoop.hive.ql.parse.RowResolver;
@@ -20,12 +27,15 @@ import org.apache.hadoop.hive.ql.udf.gen
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBaseCompare;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBaseNumeric;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFTimestamp;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToBinary;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToChar;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToDate;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToDecimal;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToUnixTimeStamp;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFToVarchar;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
 import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
@@ -81,8 +91,9 @@ public class RexNodeConverter {
 
   public RexNode convert(ExprNodeDesc expr) throws SemanticException {
     if (expr instanceof ExprNodeNullDesc) {
-      return m_cluster.getRexBuilder().makeNullLiteral(TypeConverter.convert(
-        expr.getTypeInfo(), m_cluster.getRexBuilder().getTypeFactory()).getSqlTypeName());
+      return m_cluster.getRexBuilder().makeNullLiteral(
+          TypeConverter.convert(expr.getTypeInfo(), m_cluster.getRexBuilder().getTypeFactory())
+              .getSqlTypeName());
     }
     if (expr instanceof ExprNodeGenericFuncDesc) {
       return convert((ExprNodeGenericFuncDesc) expr);
@@ -182,8 +193,9 @@ public class RexNodeConverter {
       GenericUDF udf = func.getGenericUDF();
       if ((udf instanceof GenericUDFToChar) || (udf instanceof GenericUDFToVarchar)
           || (udf instanceof GenericUDFToDecimal) || (udf instanceof GenericUDFToDate)
-          || (udf instanceof GenericUDFToBinary) || (udf instanceof GenericUDFToUnixTimeStamp)
-          || castExprUsingUDFBridge(udf)) {
+          || (udf instanceof GenericUDFToBinary) || castExprUsingUDFBridge(udf)) {
+        // || (udf instanceof GenericUDFToUnixTimeStamp) || (udf instanceof
+        // GenericUDFTimestamp) || castExprUsingUDFBridge(udf)) {
         castExpr = m_cluster.getRexBuilder().makeCast(
             TypeConverter.convert(func.getTypeInfo(), m_cluster.getTypeFactory()),
             childRexNodeLst.get(0));
@@ -233,7 +245,9 @@ public class RexNodeConverter {
 
     PrimitiveCategory hiveTypeCategory = hiveType.getPrimitiveCategory();
 
-    Object value = literal.getValue();
+    ConstantObjectInspector coi = literal.getWritableObjectInspector();
+    Object value = ObjectInspectorUtils.copyToStandardJavaObject(literal
+        .getWritableObjectInspector().getWritableConstantValue(), coi);
 
     RexNode optiqLiteral = null;
     // TODO: Verify if we need to use ConstantObjectInspector to unwrap data
@@ -255,6 +269,10 @@ public class RexNodeConverter {
       break;
     // TODO: is Decimal an exact numeric or approximate numeric?
     case DECIMAL:
+      if (value instanceof HiveDecimal)
+        value = ((HiveDecimal) value).bigDecimalValue();
+      if (value instanceof Decimal128)
+        value = ((Decimal128) value).toBigDecimal();
       optiqLiteral = rexBuilder.makeExactLiteral((BigDecimal) value);
       break;
     case FLOAT:
@@ -263,11 +281,28 @@ public class RexNodeConverter {
     case DOUBLE:
       optiqLiteral = rexBuilder.makeApproxLiteral(new BigDecimal((Double) value), optiqDataType);
       break;
+    case CHAR:
+      if (value instanceof HiveChar)
+        value = ((HiveChar) value).getValue();
+      optiqLiteral = rexBuilder.makeLiteral((String) value);
+      break;
+    case VARCHAR:
+      if (value instanceof HiveVarchar)
+        value = ((HiveVarchar) value).getValue();
+      optiqLiteral = rexBuilder.makeLiteral((String) value);
+      break;
     case STRING:
       optiqLiteral = rexBuilder.makeLiteral((String) value);
       break;
     case DATE:
+      Calendar cal = new GregorianCalendar();
+      cal.setTime((Date) value);
+      optiqLiteral = rexBuilder.makeDateLiteral(cal);
+      break;
     case TIMESTAMP:
+      optiqLiteral = rexBuilder.makeTimestampLiteral((Calendar) value,
+          RelDataType.PRECISION_NOT_SPECIFIED);
+      break;
     case BINARY:
     case VOID:
     case UNKNOWN:

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/TypeConverter.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/TypeConverter.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/TypeConverter.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/TypeConverter.java Fri Sep  5 22:24:43 2014
@@ -22,6 +22,7 @@ import org.apache.hadoop.hive.serde2.typ
 import org.eigenbase.relopt.RelOptCluster;
 import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.reltype.RelDataTypeFactory;
+import org.eigenbase.reltype.RelDataTypeFactoryImpl.JavaType;
 import org.eigenbase.reltype.RelDataTypeField;
 import org.eigenbase.rex.RexBuilder;
 import org.eigenbase.sql.type.SqlTypeName;
@@ -51,8 +52,7 @@ public class TypeConverter {
   };
 
   /*********************** Convert Hive Types To Optiq Types ***********************/
-  public static RelDataType getType(RelOptCluster cluster,
-      List<ColumnInfo> cInfoLst) {
+  public static RelDataType getType(RelOptCluster cluster, List<ColumnInfo> cInfoLst) {
     RexBuilder rexBuilder = cluster.getRexBuilder();
     RelDataTypeFactory dtFactory = rexBuilder.getTypeFactory();
     List<RelDataType> fieldTypes = new LinkedList<RelDataType>();
@@ -65,8 +65,7 @@ public class TypeConverter {
     return dtFactory.createStructType(fieldTypes, fieldNames);
   }
 
-  public static RelDataType getType(RelOptCluster cluster, RowResolver rr,
-      List<String> neededCols) {
+  public static RelDataType getType(RelOptCluster cluster, RowResolver rr, List<String> neededCols) {
     RexBuilder rexBuilder = cluster.getRexBuilder();
     RelDataTypeFactory dtFactory = rexBuilder.getTypeFactory();
     RowSchema rs = rr.getRowSchema();
@@ -105,8 +104,7 @@ public class TypeConverter {
     return convertedType;
   }
 
-  public static RelDataType convert(PrimitiveTypeInfo type,
-      RelDataTypeFactory dtFactory) {
+  public static RelDataType convert(PrimitiveTypeInfo type, RelDataTypeFactory dtFactory) {
     RelDataType convertedType = null;
 
     switch (type.getPrimitiveCategory()) {
@@ -135,9 +133,7 @@ public class TypeConverter {
       convertedType = dtFactory.createSqlType(SqlTypeName.DOUBLE);
       break;
     case STRING:
-      //TODO: shall we pass -1 for len to distinguish between STRING & VARCHAR on way out
-      convertedType = dtFactory.createSqlType(SqlTypeName.VARCHAR,
-          RelDataType.PRECISION_NOT_SPECIFIED);
+      convertedType = dtFactory.createSqlType(SqlTypeName.VARCHAR, Integer.MAX_VALUE);
       break;
     case DATE:
       convertedType = dtFactory.createSqlType(SqlTypeName.DATE);
@@ -149,8 +145,9 @@ public class TypeConverter {
       convertedType = dtFactory.createSqlType(SqlTypeName.BINARY);
       break;
     case DECIMAL:
-      DecimalTypeInfo dtInf = (DecimalTypeInfo)type;
-      convertedType = dtFactory.createSqlType(SqlTypeName.DECIMAL, dtInf.precision(), dtInf.scale());
+      DecimalTypeInfo dtInf = (DecimalTypeInfo) type;
+      convertedType = dtFactory
+          .createSqlType(SqlTypeName.DECIMAL, dtInf.precision(), dtInf.scale());
       break;
     case VARCHAR:
       convertedType = dtFactory.createSqlType(SqlTypeName.VARCHAR,
@@ -172,45 +169,39 @@ public class TypeConverter {
     return convertedType;
   }
 
-  public static RelDataType convert(ListTypeInfo lstType,
-      RelDataTypeFactory dtFactory) {
+  public static RelDataType convert(ListTypeInfo lstType, RelDataTypeFactory dtFactory) {
     RelDataType elemType = convert(lstType.getListElementTypeInfo(), dtFactory);
     return dtFactory.createArrayType(elemType, -1);
   }
 
-  public static RelDataType convert(MapTypeInfo mapType,
-      RelDataTypeFactory dtFactory) {
+  public static RelDataType convert(MapTypeInfo mapType, RelDataTypeFactory dtFactory) {
     RelDataType keyType = convert(mapType.getMapKeyTypeInfo(), dtFactory);
     RelDataType valueType = convert(mapType.getMapValueTypeInfo(), dtFactory);
     return dtFactory.createMapType(keyType, valueType);
   }
 
-  public static RelDataType convert(StructTypeInfo structType,
-      final RelDataTypeFactory dtFactory) {
-    List<RelDataType> fTypes = Lists.transform(
-        structType.getAllStructFieldTypeInfos(),
+  public static RelDataType convert(StructTypeInfo structType, final RelDataTypeFactory dtFactory) {
+    List<RelDataType> fTypes = Lists.transform(structType.getAllStructFieldTypeInfos(),
         new Function<TypeInfo, RelDataType>() {
           @Override
           public RelDataType apply(TypeInfo tI) {
             return convert(tI, dtFactory);
           }
         });
-    return dtFactory.createStructType(fTypes,
-        structType.getAllStructFieldNames());
+    return dtFactory.createStructType(fTypes, structType.getAllStructFieldNames());
   }
 
-  public static RelDataType convert(UnionTypeInfo unionType,
-      RelDataTypeFactory dtFactory) {
+  public static RelDataType convert(UnionTypeInfo unionType, RelDataTypeFactory dtFactory) {
     // @todo what do we about unions?
     throw new UnsupportedOperationException();
   }
 
   public static TypeInfo convert(RelDataType rType) {
-    if ( rType.isStruct() ) {
+    if (rType.isStruct()) {
       return convertStructType(rType);
-    } else if ( rType.getComponentType() != null ) {
+    } else if (rType.getComponentType() != null) {
       return convertListType(rType);
-    } else if ( rType.getKeyType() != null ) {
+    } else if (rType.getKeyType() != null) {
       return convertMapType(rType);
     } else {
       return convertPrimtiveType(rType);
@@ -218,16 +209,14 @@ public class TypeConverter {
   }
 
   public static TypeInfo convertStructType(RelDataType rType) {
-    List<TypeInfo> fTypes = Lists.transform(
-        rType.getFieldList(),
+    List<TypeInfo> fTypes = Lists.transform(rType.getFieldList(),
         new Function<RelDataTypeField, TypeInfo>() {
           @Override
           public TypeInfo apply(RelDataTypeField f) {
             return convert(f.getType());
           }
         });
-    List<String> fNames = Lists.transform(
-        rType.getFieldList(),
+    List<String> fNames = Lists.transform(rType.getFieldList(),
         new Function<RelDataTypeField, String>() {
           @Override
           public String apply(RelDataTypeField f) {
@@ -247,7 +236,7 @@ public class TypeConverter {
   }
 
   public static TypeInfo convertPrimtiveType(RelDataType rType) {
-    switch(rType.getSqlTypeName()) {
+    switch (rType.getSqlTypeName()) {
     case BOOLEAN:
       return TypeInfoFactory.booleanTypeInfo;
     case TINYINT:
@@ -271,14 +260,14 @@ public class TypeConverter {
     case DECIMAL:
       return TypeInfoFactory.getDecimalTypeInfo(rType.getPrecision(), rType.getScale());
     case VARCHAR:
-      if (rType.getPrecision() == RelDataType.PRECISION_NOT_SPECIFIED)
+      if (rType.getPrecision() == Integer.MAX_VALUE)
         return TypeInfoFactory.getPrimitiveTypeInfo(serdeConstants.STRING_TYPE_NAME);
       else
         return TypeInfoFactory.getVarcharTypeInfo(rType.getPrecision());
     case CHAR:
       return TypeInfoFactory.getCharTypeInfo(rType.getPrecision());
     case OTHER:
-      default:
+    default:
       return TypeInfoFactory.voidTypeInfo;
     }
 
@@ -290,19 +279,21 @@ public class TypeConverter {
 
     switch (optiqType.getSqlTypeName()) {
     case CHAR: {
-      ht = new HiveToken(HiveParser.TOK_CHAR, "TOK_CHAR",
-          String.valueOf(optiqType.getPrecision()));
+      ht = new HiveToken(HiveParser.TOK_CHAR, "TOK_CHAR", String.valueOf(optiqType.getPrecision()));
     }
       break;
     case VARCHAR: {
-      ht = new HiveToken(HiveParser.TOK_VARCHAR, "TOK_VARCHAR",
-          String.valueOf(optiqType.getPrecision()));
+      if (optiqType.getPrecision() == Integer.MAX_VALUE)
+        ht = new HiveToken(HiveParser.TOK_STRING, "TOK_STRING", String.valueOf(optiqType
+            .getPrecision()));
+      else
+        ht = new HiveToken(HiveParser.TOK_VARCHAR, "TOK_VARCHAR", String.valueOf(optiqType
+            .getPrecision()));
     }
       break;
     case DECIMAL: {
-      ht = new HiveToken(HiveParser.TOK_DECIMAL, "TOK_DECIMAL",
-          String.valueOf(optiqType.getPrecision()), String.valueOf(optiqType
-              .getScale()));
+      ht = new HiveToken(HiveParser.TOK_DECIMAL, "TOK_DECIMAL", String.valueOf(optiqType
+          .getPrecision()), String.valueOf(optiqType.getScale()));
     }
       break;
     default:

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=1622813&r1=1622812&r2=1622813&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 Fri Sep  5 22:24:43 2014
@@ -11847,14 +11847,13 @@ public class SemanticAnalyzer extends Ba
   // TODO: Extend QP to indicate LV, Multi Insert, Cubes, Rollups...
   private boolean canHandleQuery() {
     boolean runOptiqPlanner = false;
-
-    if (((queryProperties.getJoinCount() > 1) || conf.getBoolVar(ConfVars.HIVE_IN_TEST))
-        && !queryProperties.hasClusterBy()
-        && !queryProperties.hasDistributeBy()
-        && !queryProperties.hasSortBy()
-        && !queryProperties.hasPTF()
-        && !queryProperties.usesScript()
-        && !queryProperties.hasMultiDestQuery()) {
+    // Assumption: If top level QB is query then everything below it must also
+    // be Query
+    if (qb.getIsQuery()
+        && ((queryProperties.getJoinCount() > 1) || conf.getBoolVar(ConfVars.HIVE_IN_TEST))
+        && !queryProperties.hasClusterBy() && !queryProperties.hasDistributeBy()
+        && !queryProperties.hasSortBy() && !queryProperties.hasPTF()
+        && !queryProperties.usesScript() && !queryProperties.hasMultiDestQuery()) {
       runOptiqPlanner = true;
     } else {
       LOG.info("Can not invoke CBO; query contains operators not supported for CBO.");
@@ -11944,7 +11943,7 @@ public class SemanticAnalyzer extends Ba
 
       optiqOptimizedPlan = hepPlanner.findBestExp();
 
-      if (LOG.isDebugEnabled()) {
+      if (LOG.isDebugEnabled() && !conf.getBoolVar(ConfVars.HIVE_IN_TEST)) {
         LOG.debug("CBO Planning details:\n");
         LOG.debug("Original Plan:\n");
         LOG.debug(RelOptUtil.toString(optiqGenPlan, SqlExplainLevel.ALL_ATTRIBUTES));

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java Fri Sep  5 22:24:43 2014
@@ -22,6 +22,7 @@ import java.util.TimeZone;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.ql.exec.Description;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -33,7 +34,9 @@ import org.apache.hadoop.hive.serde2.obj
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 import org.apache.hadoop.io.Text;
 
-
+@Description(name = "from_utc_timestamp",
+             value = "from_utc_timestamp(timestamp, string timezone) - "
+                     + "Assumes given timestamp ist UTC and converts to given timezone (as of Hive 0.8.0)")
 public class GenericUDFFromUtcTimestamp extends GenericUDF {
 
   static final Log LOG = LogFactory.getLog(GenericUDFFromUtcTimestamp.class);

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTimestamp.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTimestamp.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTimestamp.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTimestamp.java Fri Sep  5 22:24:43 2014
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hive.ql.udf.generic;
 
+import org.apache.hadoop.hive.ql.exec.Description;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
@@ -39,6 +40,8 @@ import org.apache.hadoop.hive.serde2.obj
  * Creates a TimestampWritable object using PrimitiveObjectInspectorConverter
  *
  */
+@Description(name = "timestamp",
+value = "cast(date as timestamp) - Returns timestamp")
 @VectorizedExpressions({CastLongToTimestampViaLongToLong.class,
   CastDoubleToTimestampViaDoubleToLong.class, CastDecimalToTimestamp.class})
 public class GenericUDFTimestamp extends GenericUDF {

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToUtcTimestamp.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToUtcTimestamp.java?rev=1622813&r1=1622812&r2=1622813&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToUtcTimestamp.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToUtcTimestamp.java Fri Sep  5 22:24:43 2014
@@ -17,7 +17,11 @@
  */
 package org.apache.hadoop.hive.ql.udf.generic;
 
+import org.apache.hadoop.hive.ql.exec.Description;
 
+@Description(name = "to_utc_timestamp",
+             value = "to_utc_timestamp(timestamp, string timezone) - "
+                     + "Assumes given timestamp is in given timezone and converts to UTC (as of Hive 0.8.0)")
 public class GenericUDFToUtcTimestamp extends
     GenericUDFFromUtcTimestamp {