http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
----------------------------------------------------------------------
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 6373746..f0ea4c5 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
@@ -6340,6 +6340,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     ArrayList<ExprNodeDesc> partnCols = new ArrayList<ExprNodeDesc>();
     ArrayList<ExprNodeDesc> sortCols = new ArrayList<ExprNodeDesc>();
     ArrayList<Integer> sortOrders = new ArrayList<Integer>();
+    ArrayList<Integer> nullSortOrders = new ArrayList<Integer>();
     boolean multiFileSpray = false;
     int numFiles = 1;
     int totalFiles = 1;
@@ -6357,6 +6358,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
         (dest_tab.getSortCols().size() > 0)) {
       sortCols = getSortCols(dest, qb, dest_tab, table_desc, input, true);
       sortOrders = getSortOrders(dest, qb, dest_tab, input);
+      nullSortOrders = getNullSortOrders(dest, qb, dest_tab, input);
       if (!enforceBucketing && !dest_tab.isIndexTable()) {
         throw new 
SemanticException(ErrorMsg.TBL_SORTED_NOT_BUCKETED.getErrorCodedMsg(dest_tab.getCompleteName()));
       } else {
@@ -6394,8 +6396,12 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
       for (int sortOrder : sortOrders) {
         order.append(sortOrder == BaseSemanticAnalyzer.HIVE_COLUMN_ORDER_ASC ? 
'+' : '-');
       }
-      input = genReduceSinkPlan(input, partnCols, sortCols, order.toString(),  
maxReducers,
-        (AcidUtils.isAcidTable(dest_tab) ? getAcidType() : 
AcidUtils.Operation.NOT_ACID));
+      StringBuilder nullOrder = new StringBuilder();
+      for (int pos : nullSortOrders) {
+        nullOrder.append(pos == BaseSemanticAnalyzer.HIVE_COLUMN_NULLS_FIRST ? 
'a' : 'z');
+      }
+      input = genReduceSinkPlan(input, partnCols, sortCols, order.toString(), 
nullOrder.toString(),
+              maxReducers, (AcidUtils.isAcidTable(dest_tab) ? getAcidType() : 
AcidUtils.Operation.NOT_ACID));
       
reduceSinkOperatorsAddedByEnforceBucketingSorting.add((ReduceSinkOperator)input.getParentOperators().get(0));
       ctx.setMultiFileSpray(multiFileSpray);
       ctx.setNumFiles(numFiles);
@@ -7356,6 +7362,23 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     return orders;
   }
 
+  private ArrayList<Integer> getNullSortOrders(String dest, QB qb, Table tab, 
Operator input)
+      throws SemanticException {
+    List<Order> tabSortCols = tab.getSortCols();
+    List<FieldSchema> tabCols = tab.getCols();
+
+    ArrayList<Integer> orders = new ArrayList<Integer>();
+    for (Order sortCol : tabSortCols) {
+      for (FieldSchema tabCol : tabCols) {
+        if (sortCol.getCol().equals(tabCol.getName())) {
+          orders.add(sortCol.getNullOrder());
+          break;
+        }
+      }
+    }
+    return orders;
+  }
+
   private Operator genReduceSinkPlan(String dest, QB qb, Operator<?> input,
       int numReducers, boolean hasOrderBy) throws SemanticException {
 
@@ -7396,6 +7419,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     }
     ArrayList<ExprNodeDesc> sortCols = new ArrayList<ExprNodeDesc>();
     StringBuilder order = new StringBuilder();
+    StringBuilder nullOrder = new StringBuilder();
     if (sortExprs != null) {
       int ccount = sortExprs.getChildCount();
       for (int i = 0; i < ccount; ++i) {
@@ -7405,20 +7429,40 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
           // SortBy ASC
           order.append("+");
           cl = (ASTNode) cl.getChild(0);
+          if (cl.getType() == HiveParser.TOK_NULLS_FIRST) {
+            nullOrder.append("a");
+          } else if (cl.getType() == HiveParser.TOK_NULLS_LAST) {
+            nullOrder.append("z");
+          } else {
+            throw new SemanticException(
+                    "Unexpected null ordering option: " + cl.getType());
+          }
+          cl = (ASTNode) cl.getChild(0);
         } else if (cl.getType() == HiveParser.TOK_TABSORTCOLNAMEDESC) {
           // SortBy DESC
           order.append("-");
           cl = (ASTNode) cl.getChild(0);
+          if (cl.getType() == HiveParser.TOK_NULLS_FIRST) {
+            nullOrder.append("a");
+          } else if (cl.getType() == HiveParser.TOK_NULLS_LAST) {
+            nullOrder.append("z");
+          } else {
+            throw new SemanticException(
+                    "Unexpected null ordering option: " + cl.getType());
+          }
+          cl = (ASTNode) cl.getChild(0);
         } else {
           // ClusterBy
           order.append("+");
+          nullOrder.append("a");
         }
         ExprNodeDesc exprNode = genExprNodeDesc(cl, inputRR);
         sortCols.add(exprNode);
       }
     }
     Operator result = genReduceSinkPlan(
-        input, partCols, sortCols, order.toString(), numReducers, 
Operation.NOT_ACID);
+        input, partCols, sortCols, order.toString(), nullOrder.toString(),
+        numReducers, Operation.NOT_ACID);
     if (result.getParentOperators().size() == 1 &&
         result.getParentOperators().get(0) instanceof ReduceSinkOperator) {
       ((ReduceSinkOperator) result.getParentOperators().get(0))
@@ -7430,7 +7474,8 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
   @SuppressWarnings("nls")
   private Operator genReduceSinkPlan(Operator<?> input,
       ArrayList<ExprNodeDesc> partitionCols, ArrayList<ExprNodeDesc> sortCols,
-      String sortOrder, int numReducers, AcidUtils.Operation acidOp) throws 
SemanticException {
+      String sortOrder, String nullOrder, int numReducers, AcidUtils.Operation 
acidOp)
+              throws SemanticException {
 
     RowResolver inputRR = opParseCtx.get(input).getRowResolver();
 
@@ -7497,7 +7542,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     dummy.setParentOperators(null);
 
     ReduceSinkDesc rsdesc = PlanUtils.getReduceSinkDesc(sortCols, valueCols, 
outputColumns,
-        false, -1, partitionCols, sortOrder, numReducers, acidOp);
+        false, -1, partitionCols, sortOrder, nullOrder, numReducers, acidOp);
     Operator interim = putOpInsertMap(OperatorFactory.getAndMakeChild(rsdesc,
         new RowSchema(rsRR.getColumnInfos()), input), rsRR);
 
@@ -11552,7 +11597,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
             }
           }
           for (int child_pos = 0; child_pos < orderbyNode.getChildCount(); 
++child_pos) {
-            ASTNode colNode = (ASTNode) orderbyNode.getChild(child_pos);
+            ASTNode colNode = (ASTNode) 
orderbyNode.getChild(child_pos).getChild(0);
             ASTNode node = (ASTNode) colNode.getChild(0);
             if (node.getToken().getType() == HiveParser.Number) {
               if( isByPos ) {
@@ -11884,13 +11929,20 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     int exprCnt = sortNode.getChildCount();
     for(int i=0; i < exprCnt; i++) {
       OrderExpression exprSpec = new OrderExpression();
-      exprSpec.setExpression((ASTNode) sortNode.getChild(i).getChild(0));
-      if ( sortNode.getChild(i).getType() == HiveParser.TOK_TABSORTCOLNAMEASC 
) {
+      ASTNode orderSpec = (ASTNode) sortNode.getChild(i);
+      ASTNode nullOrderSpec = (ASTNode) orderSpec.getChild(0);
+      exprSpec.setExpression((ASTNode) nullOrderSpec.getChild(0));
+      if ( orderSpec.getType() == HiveParser.TOK_TABSORTCOLNAMEASC ) {
         
exprSpec.setOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order.ASC);
       }
       else {
         
exprSpec.setOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order.DESC);
       }
+      if ( nullOrderSpec.getType() == HiveParser.TOK_NULLS_FIRST ) {
+        
exprSpec.setNullOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.NullOrder.NULLS_FIRST);
+      } else {
+        
exprSpec.setNullOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.NullOrder.NULLS_LAST);
+      }
       oSpec.addExpression(exprSpec);
     }
     return oSpec;
@@ -12228,7 +12280,8 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
       RowResolver inputRR,
       ArrayList<ExprNodeDesc> partCols,
       ArrayList<ExprNodeDesc> orderCols,
-      StringBuilder orderString) throws SemanticException {
+      StringBuilder orderString,
+      StringBuilder nullOrderString) throws SemanticException {
 
     List<PTFExpressionDef> partColList = 
tabDef.getPartition().getExpressions();
 
@@ -12238,6 +12291,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
         partCols.add(exprNode);
         orderCols.add(exprNode);
         orderString.append('+');
+        nullOrderString.append('a');
       }
     }
 
@@ -12252,13 +12306,16 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     for (int i = 0; i < orderColList.size(); i++) {
       OrderExpressionDef colDef = orderColList.get(i);
       char orderChar = colDef.getOrder() == PTFInvocationSpec.Order.ASC ? '+' 
: '-';
+      char nullOrderChar = colDef.getNullOrder() == 
PTFInvocationSpec.NullOrder.NULLS_FIRST ? 'a' : 'z';
       int index = ExprNodeDescUtils.indexOf(colDef.getExprNode(), orderCols);
       if (index >= 0) {
         orderString.setCharAt(index, orderChar);
+        nullOrderString.setCharAt(index, nullOrderChar);
         continue;
       }
       orderCols.add(colDef.getExprNode());
       orderString.append(orderChar);
+      nullOrderString.append(nullOrderChar);
     }
   }
 
@@ -12301,6 +12358,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
       ArrayList<ExprNodeDesc> partCols = new ArrayList<ExprNodeDesc>();
       ArrayList<ExprNodeDesc> orderCols = new ArrayList<ExprNodeDesc>();
       StringBuilder orderString = new StringBuilder();
+      StringBuilder nullOrderString = new StringBuilder();
 
       /*
        * Use the input RR of TableScanOperator in case there is no map-side
@@ -12308,8 +12366,9 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
        * If the parent of ReduceSinkOperator is PTFOperator, use it's
        * output RR.
        */
-      buildPTFReduceSinkDetails(tabDef, rr, partCols, orderCols, orderString);
-      input = genReduceSinkPlan(input, partCols, orderCols, 
orderString.toString(), -1, Operation.NOT_ACID);
+      buildPTFReduceSinkDetails(tabDef, rr, partCols, orderCols, orderString, 
nullOrderString);
+      input = genReduceSinkPlan(input, partCols, orderCols, 
orderString.toString(),
+              nullOrderString.toString(), -1, Operation.NOT_ACID);
     }
 
     /*
@@ -12367,6 +12426,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
     ArrayList<ExprNodeDesc> partCols = new ArrayList<ExprNodeDesc>();
     ArrayList<ExprNodeDesc> orderCols = new ArrayList<ExprNodeDesc>();
     StringBuilder order = new StringBuilder();
+    StringBuilder nullOrder = new StringBuilder();
 
     for (PartitionExpression partCol : 
spec.getQueryPartitionSpec().getExpressions()) {
       ExprNodeDesc partExpr = genExprNodeDesc(partCol.getExpression(), 
inputRR);
@@ -12374,6 +12434,7 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
         partCols.add(partExpr);
         orderCols.add(partExpr);
         order.append('+');
+        nullOrder.append('a');
       }
     }
 
@@ -12381,17 +12442,21 @@ public class SemanticAnalyzer extends 
BaseSemanticAnalyzer {
       for (OrderExpression orderCol : 
spec.getQueryOrderSpec().getExpressions()) {
         ExprNodeDesc orderExpr = genExprNodeDesc(orderCol.getExpression(), 
inputRR);
         char orderChar = orderCol.getOrder() == PTFInvocationSpec.Order.ASC ? 
'+' : '-';
+        char nullOrderChar = orderCol.getNullOrder() == 
PTFInvocationSpec.NullOrder.NULLS_FIRST ? 'a' : 'z';
         int index = ExprNodeDescUtils.indexOf(orderExpr, orderCols);
         if (index >= 0) {
           order.setCharAt(index, orderChar);
+          nullOrder.setCharAt(index, nullOrderChar);
           continue;
         }
         orderCols.add(genExprNodeDesc(orderCol.getExpression(), inputRR));
         order.append(orderChar);
+        nullOrder.append(nullOrderChar);
       }
     }
 
-    return genReduceSinkPlan(input, partCols, orderCols, order.toString(), -1, 
Operation.NOT_ACID);
+    return genReduceSinkPlan(input, partCols, orderCols, order.toString(), 
nullOrder.toString(),
+            -1, Operation.NOT_ACID);
   }
 
   public static ArrayList<WindowExpressionSpec> parseSelect(String 
selectExprStr)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java 
b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
index 598520c..45dfd27 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
@@ -735,6 +735,8 @@ public class TypeCheckProcFactory {
       windowingTokens.add(HiveParser.KW_CURRENT);
       windowingTokens.add(HiveParser.TOK_TABSORTCOLNAMEASC);
       windowingTokens.add(HiveParser.TOK_TABSORTCOLNAMEDESC);
+      windowingTokens.add(HiveParser.TOK_NULLS_FIRST);
+      windowingTokens.add(HiveParser.TOK_NULLS_LAST);
     }
 
     protected static boolean isRedundantConversionFunction(ASTNode expr,

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java 
b/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
index 990a10c..ae8c77f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/PlanUtils.java
@@ -23,15 +23,12 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.JavaUtils;
 import org.apache.hadoop.hive.conf.HiveConf;
@@ -39,7 +36,6 @@ import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.hive.metastore.MetaStoreUtils;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.exec.ColumnInfo;
-import org.apache.hadoop.hive.ql.exec.Operator;
 import org.apache.hadoop.hive.ql.exec.RowSchema;
 import org.apache.hadoop.hive.ql.exec.TableScanOperator;
 import org.apache.hadoop.hive.ql.exec.Utilities;
@@ -66,8 +62,8 @@ import org.apache.hadoop.hive.serde2.Deserializer;
 import org.apache.hadoop.hive.serde2.MetadataTypedColumnsetSerDe;
 import org.apache.hadoop.hive.serde2.binarysortable.BinarySortableSerDe;
 import org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe;
-import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;
 import org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters;
+import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;
 import org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
@@ -76,6 +72,8 @@ import org.apache.hadoop.mapred.JobConf;
 import org.apache.hadoop.mapred.SequenceFileInputFormat;
 import org.apache.hadoop.mapred.SequenceFileOutputFormat;
 import org.apache.hadoop.mapred.TextInputFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * PlanUtils.
@@ -392,7 +390,7 @@ public final class PlanUtils {
    * Generate the table descriptor for reduce key.
    */
   public static TableDesc getReduceKeyTableDesc(List<FieldSchema> fieldSchemas,
-      String order) {
+      String order, String nullOrder) {
     return new TableDesc(
         SequenceFileInputFormat.class, SequenceFileOutputFormat.class,
         Utilities.makeProperties(serdeConstants.LIST_COLUMNS, MetaStoreUtils
@@ -400,6 +398,7 @@ public final class PlanUtils {
         serdeConstants.LIST_COLUMN_TYPES, MetaStoreUtils
         .getColumnTypesFromFieldSchema(fieldSchemas),
         serdeConstants.SERIALIZATION_SORT_ORDER, order,
+        serdeConstants.SERIALIZATION_NULL_SORT_ORDER, nullOrder,
         serdeConstants.SERIALIZATION_LIB, 
BinarySortableSerDe.class.getName()));
   }
 
@@ -414,8 +413,10 @@ public final class PlanUtils {
       // be broadcast (instead of partitioned). As a consequence we use
       // a different SerDe than in the MR mapjoin case.
       StringBuilder order = new StringBuilder();
+      StringBuilder nullOrder = new StringBuilder();
       for (FieldSchema f: fieldSchemas) {
         order.append("+");
+        nullOrder.append("a");
       }
       return new TableDesc(
           SequenceFileInputFormat.class, SequenceFileOutputFormat.class,
@@ -424,6 +425,7 @@ public final class PlanUtils {
               serdeConstants.LIST_COLUMN_TYPES, MetaStoreUtils
               .getColumnTypesFromFieldSchema(fieldSchemas),
               serdeConstants.SERIALIZATION_SORT_ORDER, order.toString(),
+              serdeConstants.SERIALIZATION_NULL_SORT_ORDER, 
nullOrder.toString(),
               serdeConstants.SERIALIZATION_LIB, 
BinarySortableSerDe.class.getName()));
     } else {
       return new TableDesc(SequenceFileInputFormat.class,
@@ -609,15 +611,15 @@ public final class PlanUtils {
   public static ReduceSinkDesc getReduceSinkDesc(
       ArrayList<ExprNodeDesc> keyCols, ArrayList<ExprNodeDesc> valueCols,
       List<String> outputColumnNames, boolean includeKeyCols, int tag,
-      ArrayList<ExprNodeDesc> partitionCols, String order, int numReducers,
-      AcidUtils.Operation writeType) {
+      ArrayList<ExprNodeDesc> partitionCols, String order, String nullOrder,
+      int numReducers, AcidUtils.Operation writeType) {
     return getReduceSinkDesc(keyCols, keyCols.size(), valueCols,
         new ArrayList<List<Integer>>(),
         includeKeyCols ? outputColumnNames.subList(0, keyCols.size()) :
           new ArrayList<String>(),
         includeKeyCols ? outputColumnNames.subList(keyCols.size(),
             outputColumnNames.size()) : outputColumnNames,
-        includeKeyCols, tag, partitionCols, order, numReducers, writeType);
+        includeKeyCols, tag, partitionCols, order, nullOrder, numReducers, 
writeType);
   }
 
   /**
@@ -654,8 +656,8 @@ public final class PlanUtils {
       List<String> outputKeyColumnNames,
       List<String> outputValueColumnNames,
       boolean includeKeyCols, int tag,
-      ArrayList<ExprNodeDesc> partitionCols, String order, int numReducers,
-      AcidUtils.Operation writeType) {
+      ArrayList<ExprNodeDesc> partitionCols, String order, String nullOrder,
+      int numReducers, AcidUtils.Operation writeType) {
     TableDesc keyTable = null;
     TableDesc valueTable = null;
     ArrayList<String> outputKeyCols = new ArrayList<String>();
@@ -666,11 +668,14 @@ public final class PlanUtils {
       if (order.length() < outputKeyColumnNames.size()) {
         order = order + "+";
       }
-      keyTable = getReduceKeyTableDesc(keySchema, order);
+      if (nullOrder.length() < outputKeyColumnNames.size()) {
+        nullOrder = nullOrder + "a";
+      }
+      keyTable = getReduceKeyTableDesc(keySchema, order, nullOrder);
       outputKeyCols.addAll(outputKeyColumnNames);
     } else {
       keyTable = getReduceKeyTableDesc(getFieldSchemasFromColumnList(
-          keyCols, "reducesinkkey"),order);
+          keyCols, "reducesinkkey"), order, nullOrder);
      for (int i = 0; i < keyCols.size(); i++) {
         outputKeyCols.add("reducesinkkey" + i);
       }
@@ -767,12 +772,14 @@ public final class PlanUtils {
     }
 
     StringBuilder order = new StringBuilder();
+    StringBuilder nullOrder = new StringBuilder();
     for (int i = 0; i < keyCols.size(); i++) {
       order.append("+");
+      nullOrder.append("a");
     }
     return getReduceSinkDesc(keyCols, numKeys, valueCols, distinctColIndices,
         outputKeyColumnNames, outputValueColumnNames, includeKey, tag,
-        partitionCols, order.toString(), numReducers, writeType);
+        partitionCols, order.toString(), nullOrder.toString(), numReducers, 
writeType);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/plan/ReduceSinkDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ReduceSinkDesc.java 
b/ql/src/java/org/apache/hadoop/hive/ql/plan/ReduceSinkDesc.java
index 41d9ffe..d7e404c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ReduceSinkDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ReduceSinkDesc.java
@@ -22,10 +22,10 @@ import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.hadoop.hive.ql.io.AcidUtils;
 import org.apache.hadoop.hive.ql.plan.Explain.Level;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 
@@ -380,6 +380,25 @@ public class ReduceSinkDesc extends AbstractOperatorDesc {
     return false;
   }
 
+  /**
+   * Returns the null order in the key columns.
+   *
+   * @return null, which means default for all key columns, or a String
+   *         of the same length as key columns, that consists of only "a"
+   *         (null first) and "z" (null last).
+   */
+  @Explain(displayName = "null sort order", explainLevels = { Level.EXTENDED })
+  public String getNullOrder() {
+    return keySerializeInfo.getProperties().getProperty(
+        
org.apache.hadoop.hive.serde.serdeConstants.SERIALIZATION_NULL_SORT_ORDER);
+  }
+
+  public void setNullOrder(String nullOrderStr) {
+    keySerializeInfo.getProperties().setProperty(
+        
org.apache.hadoop.hive.serde.serdeConstants.SERIALIZATION_NULL_SORT_ORDER,
+        nullOrderStr);
+  }
+
   public List<List<Integer>> getDistinctColumnIndices() {
     return distinctColumnIndices;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/OrderExpressionDef.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/OrderExpressionDef.java 
b/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/OrderExpressionDef.java
index e367d13..827911a 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/OrderExpressionDef.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/OrderExpressionDef.java
@@ -18,15 +18,18 @@
 
 package org.apache.hadoop.hive.ql.plan.ptf;
 
+import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.NullOrder;
 import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order;
 
 public class OrderExpressionDef extends PTFExpressionDef {
   private Order order;
+  private NullOrder nullOrder;
 
   public OrderExpressionDef() {}
   public OrderExpressionDef(PTFExpressionDef e) {
     super(e);
     order = Order.ASC;
+    nullOrder = NullOrder.NULLS_FIRST;
   }
 
   public Order getOrder() {
@@ -36,5 +39,13 @@ public class OrderExpressionDef extends PTFExpressionDef {
   public void setOrder(Order order) {
     this.order = order;
   }
-}
 
+  public NullOrder getNullOrder() {
+    return nullOrder;
+  }
+
+  public void setNullOrder(NullOrder nullOrder) {
+    this.nullOrder = nullOrder;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/PartitionedTableFunctionDef.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/PartitionedTableFunctionDef.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/PartitionedTableFunctionDef.java
index 2a8b1c0..54b0fb8 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/PartitionedTableFunctionDef.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/plan/ptf/PartitionedTableFunctionDef.java
@@ -122,8 +122,16 @@ public class PartitionedTableFunctionDef extends 
PTFInputDef {
         builder.append(", ");
       }
       builder.append(expression.getExprNode().getExprString());
-      if (expression.getOrder() == PTFInvocationSpec.Order.DESC) {
-        builder.append("(DESC)");
+      builder.append(" ");
+      if (expression.getOrder() == PTFInvocationSpec.Order.ASC) {
+        builder.append("ASC ");
+      } else {
+        builder.append("DESC ");
+      }
+      if (expression.getNullOrder() == 
PTFInvocationSpec.NullOrder.NULLS_FIRST) {
+        builder.append("NULLS FIRST");
+      } else {
+        builder.append("NULLS LAST");
       }
     }
     return builder.toString();

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java 
b/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java
index 2c076f50..2ac4039 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java
@@ -27,19 +27,18 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang.ArrayUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
-import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.PTFOperator;
 import org.apache.hadoop.hive.ql.exec.PTFPartition;
-import org.apache.hadoop.hive.ql.exec.WindowFunctionInfo;
 import org.apache.hadoop.hive.ql.exec.PTFPartition.PTFPartitionIterator;
 import org.apache.hadoop.hive.ql.exec.PTFRollingPartition;
+import org.apache.hadoop.hive.ql.exec.WindowFunctionInfo;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.NullOrder;
 import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 import org.apache.hadoop.hive.ql.parse.WindowingSpec.BoundarySpec;
@@ -62,6 +61,8 @@ import 
org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.StructField;
 import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @SuppressWarnings("deprecation")
 public class WindowingTableFunction extends TableFunctionEvaluator {
@@ -110,6 +111,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
     WindowTableFunctionDef wTFnDef = (WindowTableFunctionDef) getTableDef();
     Order order = wTFnDef.getOrder().getExpressions().get(0).getOrder();
+    NullOrder nullOrder = 
wTFnDef.getOrder().getExpressions().get(0).getNullOrder();
 
     for(WindowFunctionDef wFn : wTFnDef.getWindowFunctions()) {
       boolean processWindow = processWindow(wFn);
@@ -121,7 +123,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
         }
         oColumns.add((List<?>)out);
       } else {
-        oColumns.add(executeFnwithWindow(getQueryDef(), wFn, iPart, order));
+        oColumns.add(executeFnwithWindow(getQueryDef(), wFn, iPart, order, 
nullOrder));
       }
     }
 
@@ -421,7 +423,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
         int rowToProcess = 
streamingState.rollingPart.rowToProcess(wFn.getWindowFrame());
         if (rowToProcess >= 0) {
           Range rng = getRange(wFn, rowToProcess, streamingState.rollingPart,
-              streamingState.order);
+              streamingState.order, streamingState.nullOrder);
           PTFPartitionIterator<Object> rItr = rng.iterator();
           PTFOperator.connectLeadLagFunctionsToPartition(ptfDesc, rItr);
           Object out = evaluateWindowFunction(wFn, rItr);
@@ -499,7 +501,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
           int rowToProcess = streamingState.rollingPart.size() - 
numRowsRemaining;
           if (rowToProcess >= 0) {
             Range rng = getRange(wFn, rowToProcess, streamingState.rollingPart,
-                streamingState.order);
+                streamingState.order, streamingState.nullOrder);
             PTFPartitionIterator<Object> rItr = rng.iterator();
             PTFOperator.connectLeadLagFunctionsToPartition(ptfDesc, rItr);
             Object out = evaluateWindowFunction(wFn, rItr);
@@ -659,11 +661,12 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
   ArrayList<Object> executeFnwithWindow(PTFDesc ptfDesc,
       WindowFunctionDef wFnDef,
       PTFPartition iPart,
-      Order order)
+      Order order,
+      NullOrder nullOrder)
     throws HiveException {
     ArrayList<Object> vals = new ArrayList<Object>();
     for(int i=0; i < iPart.size(); i++) {
-      Range rng = getRange(wFnDef, i, iPart, order);
+      Range rng = getRange(wFnDef, i, iPart, order, nullOrder);
       PTFPartitionIterator<Object> rItr = rng.iterator();
       PTFOperator.connectLeadLagFunctionsToPartition(ptfDesc, rItr);
       Object out = evaluateWindowFunction(wFnDef, rItr);
@@ -672,7 +675,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
     return vals;
   }
 
-  private Range getRange(WindowFunctionDef wFnDef, int currRow, PTFPartition 
p, Order order) throws HiveException
+  private Range getRange(WindowFunctionDef wFnDef, int currRow, PTFPartition 
p, Order order, NullOrder nullOrder) throws HiveException
   {
     BoundaryDef startB = wFnDef.getWindowFrame().getStart();
     BoundaryDef endB = wFnDef.getWindowFrame().getEnd();
@@ -691,10 +694,10 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
     else {
       ValueBoundaryScanner vbs;
       if ( startB instanceof ValueBoundaryDef ) {
-        vbs = ValueBoundaryScanner.getScanner((ValueBoundaryDef)startB, order);
+        vbs = ValueBoundaryScanner.getScanner((ValueBoundaryDef)startB, order, 
nullOrder);
       }
       else {
-        vbs = ValueBoundaryScanner.getScanner((ValueBoundaryDef)endB, order);
+        vbs = ValueBoundaryScanner.getScanner((ValueBoundaryDef)endB, order, 
nullOrder);
       }
       vbs.reset(startB);
       start =  vbs.computeStart(currRow, p);
@@ -775,12 +778,14 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
   {
     BoundaryDef bndDef;
     Order order;
+    NullOrder nullOrder;
     PTFExpressionDef expressionDef;
 
-    public ValueBoundaryScanner(BoundaryDef bndDef, Order order, 
PTFExpressionDef expressionDef)
+    public ValueBoundaryScanner(BoundaryDef bndDef, Order order, NullOrder 
nullOrder, PTFExpressionDef expressionDef)
     {
       this.bndDef = bndDef;
       this.order = order;
+      this.nullOrder = nullOrder;
       this.expressionDef = expressionDef;
     }
 
@@ -1135,7 +1140,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
 
     @SuppressWarnings("incomplete-switch")
-    public static ValueBoundaryScanner getScanner(ValueBoundaryDef vbDef, 
Order order)
+    public static ValueBoundaryScanner getScanner(ValueBoundaryDef vbDef, 
Order order, NullOrder nullOrder)
         throws HiveException {
       PrimitiveObjectInspector pOI = (PrimitiveObjectInspector) vbDef.getOI();
       switch(pOI.getPrimitiveCategory()) {
@@ -1144,16 +1149,16 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
       case LONG:
       case SHORT:
       case TIMESTAMP:
-        return new LongValueBoundaryScanner(vbDef, order, 
vbDef.getExpressionDef());
+        return new LongValueBoundaryScanner(vbDef, order, nullOrder, 
vbDef.getExpressionDef());
       case DOUBLE:
       case FLOAT:
-        return new DoubleValueBoundaryScanner(vbDef, order, 
vbDef.getExpressionDef());
+        return new DoubleValueBoundaryScanner(vbDef, order, nullOrder, 
vbDef.getExpressionDef());
       case DECIMAL:
-        return new HiveDecimalValueBoundaryScanner(vbDef, order, 
vbDef.getExpressionDef());
+        return new HiveDecimalValueBoundaryScanner(vbDef, order, nullOrder, 
vbDef.getExpressionDef());
       case DATE:
-        return new DateValueBoundaryScanner(vbDef, order, 
vbDef.getExpressionDef());
+        return new DateValueBoundaryScanner(vbDef, order, nullOrder, 
vbDef.getExpressionDef());
       case STRING:
-        return new StringValueBoundaryScanner(vbDef, order, 
vbDef.getExpressionDef());
+        return new StringValueBoundaryScanner(vbDef, order, nullOrder, 
vbDef.getExpressionDef());
       }
       throw new HiveException(
           String.format("Internal Error: attempt to setup a Window for 
datatype %s",
@@ -1162,9 +1167,9 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
   }
 
   public static class LongValueBoundaryScanner extends ValueBoundaryScanner {
-    public LongValueBoundaryScanner(BoundaryDef bndDef, Order order,
+    public LongValueBoundaryScanner(BoundaryDef bndDef, Order order, NullOrder 
nullOrder,
         PTFExpressionDef expressionDef) {
-      super(bndDef,order,expressionDef);
+      super(bndDef,order,nullOrder,expressionDef);
     }
 
     @Override
@@ -1196,8 +1201,8 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
   public static class DoubleValueBoundaryScanner extends ValueBoundaryScanner {
     public DoubleValueBoundaryScanner(BoundaryDef bndDef, Order order,
-        PTFExpressionDef expressionDef) {
-      super(bndDef,order,expressionDef);
+        NullOrder nullOrder, PTFExpressionDef expressionDef) {
+      super(bndDef,order,nullOrder,expressionDef);
     }
 
     @Override
@@ -1229,8 +1234,8 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
   public static class HiveDecimalValueBoundaryScanner extends 
ValueBoundaryScanner {
     public HiveDecimalValueBoundaryScanner(BoundaryDef bndDef, Order order,
-        PTFExpressionDef expressionDef) {
-      super(bndDef,order,expressionDef);
+        NullOrder nullOrder, PTFExpressionDef expressionDef) {
+      super(bndDef,order,nullOrder,expressionDef);
     }
 
     @Override
@@ -1262,8 +1267,8 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
   public static class DateValueBoundaryScanner extends ValueBoundaryScanner {
     public DateValueBoundaryScanner(BoundaryDef bndDef, Order order,
-        PTFExpressionDef expressionDef) {
-      super(bndDef,order,expressionDef);
+        NullOrder nullOrder, PTFExpressionDef expressionDef) {
+      super(bndDef,order,nullOrder,expressionDef);
     }
 
     @Override
@@ -1290,8 +1295,8 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
 
   public static class StringValueBoundaryScanner extends ValueBoundaryScanner {
     public StringValueBoundaryScanner(BoundaryDef bndDef, Order order,
-        PTFExpressionDef expressionDef) {
-      super(bndDef,order,expressionDef);
+        NullOrder nullOrder, PTFExpressionDef expressionDef) {
+      super(bndDef,order,nullOrder,expressionDef);
     }
 
     @Override
@@ -1347,6 +1352,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
     int[] wFnsToProcess;
     WindowTableFunctionDef wTFnDef;
     Order order;
+    NullOrder nullOrder;
     PTFDesc ptfDesc;
     StructObjectInspector inputOI;
     AggregationBuffer[] aggBuffers;
@@ -1362,6 +1368,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
       this.currIdx = 0;
       wTFnDef = (WindowTableFunctionDef) getTableDef();
       order = wTFnDef.getOrder().getExpressions().get(0).getOrder();
+      nullOrder = wTFnDef.getOrder().getExpressions().get(0).getNullOrder();
       ptfDesc = getQueryDef();
       inputOI = iPart.getOutputOI();
 
@@ -1416,7 +1423,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
             out = ObjectInspectorUtils.copyToStandardObject(out, wFn.getOI());
             output.set(j, out);
           } else {
-            Range rng = getRange(wFn, currIdx, iPart, order);
+            Range rng = getRange(wFn, currIdx, iPart, order, nullOrder);
             PTFPartitionIterator<Object> rItr = rng.iterator();
             PTFOperator.connectLeadLagFunctionsToPartition(ptfDesc, rItr);
             output.set(j, evaluateWindowFunction(wFn, rItr));
@@ -1453,6 +1460,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
     AggregationBuffer[] aggBuffers;
     Object[][] funcArgs;
     Order order;
+    NullOrder nullOrder;
     RankLimit rnkLimit;
 
     @SuppressWarnings("unchecked")
@@ -1467,6 +1475,7 @@ public class WindowingTableFunction extends 
TableFunctionEvaluator {
           precedingSpan, followingSpan);
 
       order = tabDef.getOrder().getExpressions().get(0).getOrder();
+      nullOrder = tabDef.getOrder().getExpressions().get(0).getNullOrder();
 
       int numFns = tabDef.getWindowFunctions().size();
       fnOutputs = new ArrayList[numFns];

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/org/apache/hadoop/hive/ql/txn/compactor/TestWorker.java
----------------------------------------------------------------------
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/txn/compactor/TestWorker.java 
b/ql/src/test/org/apache/hadoop/hive/ql/txn/compactor/TestWorker.java
index cf7eb70..7f6430f 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/txn/compactor/TestWorker.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/txn/compactor/TestWorker.java
@@ -224,7 +224,7 @@ public class TestWorker extends CompactorTest {
   @Test
   public void sortedTable() throws Exception {
     List<Order> sortCols = new ArrayList<Order>(1);
-    sortCols.add(new Order("b", 1));
+    sortCols.add(new Order("b", 1, 0));
 
     Table t = newTable("default", "st", false, new HashMap<String, String>(), 
sortCols, false);
 
@@ -249,7 +249,7 @@ public class TestWorker extends CompactorTest {
   @Test
   public void sortedPartition() throws Exception {
     List<Order> sortCols = new ArrayList<Order>(1);
-    sortCols.add(new Order("b", 1));
+    sortCols.add(new Order("b", 1, 0));
 
     Table t = newTable("default", "sp", true, new HashMap<String, String>(), 
sortCols, false);
     Partition p = newPartition(t, "today", sortCols);

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/queries/clientpositive/keyword_3.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/keyword_3.q 
b/ql/src/test/queries/clientpositive/keyword_3.q
new file mode 100644
index 0000000..098d0f9
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/keyword_3.q
@@ -0,0 +1,8 @@
+drop table NULLS;
+
+create table NULLS (LAST string);
+
+insert overwrite table NULLS
+  select key from src where key = '238' limit 1;
+
+select LAST from NULLS;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/queries/clientpositive/order_null.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/order_null.q 
b/ql/src/test/queries/clientpositive/order_null.q
new file mode 100644
index 0000000..ea833e0
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/order_null.q
@@ -0,0 +1,29 @@
+create table src_null (a int, b string);
+insert into src_null values (1, 'A');
+insert into src_null values (null, null);
+insert into src_null values (3, null);
+insert into src_null values (2, null);
+insert into src_null values (2, 'A');
+insert into src_null values (2, 'B');
+
+SELECT x.* FROM src_null x ORDER BY a asc;
+
+SELECT x.* FROM src_null x ORDER BY a desc;
+
+SELECT x.* FROM src_null x ORDER BY b asc, a asc nulls last;
+
+SELECT x.* FROM src_null x ORDER BY b desc, a asc;
+
+SELECT x.* FROM src_null x ORDER BY a asc nulls first;
+
+SELECT x.* FROM src_null x ORDER BY a desc nulls first;
+
+SELECT x.* FROM src_null x ORDER BY b asc nulls last, a;
+
+SELECT x.* FROM src_null x ORDER BY b desc nulls last, a;
+
+SELECT x.* FROM src_null x ORDER BY a asc nulls last, b desc;
+
+SELECT x.* FROM src_null x ORDER BY b desc nulls last, a desc nulls last;
+
+SELECT x.* FROM src_null x ORDER BY b asc nulls first, a asc nulls last;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/queries/clientpositive/windowing_order_null.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/windowing_order_null.q 
b/ql/src/test/queries/clientpositive/windowing_order_null.q
new file mode 100644
index 0000000..6d8ece0
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/windowing_order_null.q
@@ -0,0 +1,35 @@
+drop table over10k;
+
+create table over10k(
+           t tinyint,
+           si smallint,
+           i int,
+           b bigint,
+           f float,
+           d double,
+           bo boolean,
+           s string,
+          ts timestamp, 
+           dec decimal,  
+           bin binary)
+       row format delimited
+       fields terminated by '|';
+
+load data local inpath '../../data/files/over10k' into table over10k;
+load data local inpath '../../data/files/over4_null' into table over10k;
+
+select i, s, b, sum(b) over (partition by i order by s nulls last,b rows 
unbounded preceding) from over10k limit 10;
+
+select d, s, f, sum(f) over (partition by d order by s,f desc nulls first rows 
unbounded preceding) from over10k limit 10;
+
+select ts, s, f, sum(f) over (partition by ts order by f asc nulls first range 
between current row and unbounded following) from over10k limit 10;
+
+select t, s, d, avg(d) over (partition by t order by s,d desc nulls first rows 
between 5 preceding and 5 following) from over10k limit 10;
+
+select ts, s, sum(i) over(partition by ts order by s nulls last) from over10k 
limit 10 offset 3;
+
+select s, i, round(sum(d) over (partition by s order by i desc nulls last) , 
3) from over10k limit 5;
+
+select s, i, round(avg(d) over (partition by s order by i desc nulls last) / 
10.0 , 3) from over10k limit 5;
+
+select s, i, round((avg(d) over  w1 + 10.0) - (avg(d) over w1 - 10.0),3) from 
over10k window w1 as (partition by s order by i nulls last) limit 5;

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table2_h23.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table2_h23.q.out
 
b/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table2_h23.q.out
index 3b71598..9eea7f7 100644
--- 
a/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table2_h23.q.out
+++ 
b/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table2_h23.q.out
@@ -232,7 +232,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           8                        
 Bucket Columns:        [key]                    
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: INSERT OVERWRITE TABLE tst1 PARTITION (ds = '1') SELECT key, 
value FROM src
@@ -281,7 +281,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           8                        
 Bucket Columns:        [key]                    
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test changing the bucket columns
@@ -326,7 +326,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           8                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: INSERT OVERWRITE TABLE tst1 PARTITION (ds = '1') SELECT key, 
value FROM src
@@ -375,7 +375,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           8                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test changing the number of buckets
@@ -420,7 +420,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: INSERT OVERWRITE TABLE tst1 PARTITION (ds = '1') SELECT key, 
value FROM src
@@ -469,7 +469,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:key, order:0)]        
+Sort Columns:          [Order(col:key, order:0, nullOrder:1)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test changing the sort columns
@@ -514,7 +514,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:value, order:0)]      
+Sort Columns:          [Order(col:value, order:0, nullOrder:1)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: INSERT OVERWRITE TABLE tst1 PARTITION (ds = '1') SELECT key, 
value FROM src
@@ -563,7 +563,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:value, order:0)]      
+Sort Columns:          [Order(col:value, order:0, nullOrder:1)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test changing the sort order
@@ -608,7 +608,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:value, order:1)]      
+Sort Columns:          [Order(col:value, order:1, nullOrder:0)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: INSERT OVERWRITE TABLE tst1 PARTITION (ds = '1') SELECT key, 
value FROM src
@@ -657,7 +657,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [value]                  
-Sort Columns:          [Order(col:value, order:1)]      
+Sort Columns:          [Order(col:value, order:1, nullOrder:0)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test a sorted partition gets converted to unsorted

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table_h23.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table_h23.q.out
 
b/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table_h23.q.out
index cab3de4..af2f47a 100644
--- 
a/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table_h23.q.out
+++ 
b/ql/src/test/results/clientpositive/alter_numbuckets_partitioned_table_h23.q.out
@@ -408,7 +408,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           12                       
 Bucket Columns:        [key]                    
-Sort Columns:          [Order(col:key, order:1)]        
+Sort Columns:          [Order(col:key, order:1, nullOrder:0)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test changing sort order
@@ -455,7 +455,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           12                       
 Bucket Columns:        [key]                    
-Sort Columns:          [Order(col:value, order:0)]      
+Sort Columns:          [Order(col:value, order:0, nullOrder:1)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Test removing test order

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/alter_partition_clusterby_sortby.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/alter_partition_clusterby_sortby.q.out 
b/ql/src/test/results/clientpositive/alter_partition_clusterby_sortby.q.out
index 184d2e4..46d5b34 100644
--- a/ql/src/test/results/clientpositive/alter_partition_clusterby_sortby.q.out
+++ b/ql/src/test/results/clientpositive/alter_partition_clusterby_sortby.q.out
@@ -110,7 +110,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [b]                      
-Sort Columns:          [Order(col:b, order:0)]  
+Sort Columns:          [Order(col:b, order:0, nullOrder:1)]     
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: -- Turn off clustering for a partition
@@ -200,7 +200,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [a, b]                   
-Sort Columns:          [Order(col:a, order:0), Order(col:b, order:1)]   
+Sort Columns:          [Order(col:a, order:0, nullOrder:1), Order(col:b, 
order:1, nullOrder:0)]         
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: drop table alter_table_partition_clusterby_sortby

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/alter_partition_coltype.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/alter_partition_coltype.q.out 
b/ql/src/test/results/clientpositive/alter_partition_coltype.q.out
index 20ef536..a184372 100644
--- a/ql/src/test/results/clientpositive/alter_partition_coltype.q.out
+++ b/ql/src/test/results/clientpositive/alter_partition_coltype.q.out
@@ -131,6 +131,7 @@ STAGE PLANS:
                 outputColumnNames: _col0
                 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
+                  null sort order: 
                   sort order: 
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   tag: -1
@@ -357,6 +358,7 @@ STAGE PLANS:
                 outputColumnNames: _col0
                 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
+                  null sort order: 
                   sort order: 
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   tag: -1
@@ -515,6 +517,7 @@ STAGE PLANS:
                 outputColumnNames: _col0
                 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
+                  null sort order: 
                   sort order: 
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   tag: -1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/alter_table_not_sorted.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/alter_table_not_sorted.q.out 
b/ql/src/test/results/clientpositive/alter_table_not_sorted.q.out
index 6e1ec59..8a88bc4 100644
--- a/ql/src/test/results/clientpositive/alter_table_not_sorted.q.out
+++ b/ql/src/test/results/clientpositive/alter_table_not_sorted.q.out
@@ -34,7 +34,7 @@ OutputFormat:         
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           4                        
 Bucket Columns:        [a]                      
-Sort Columns:          [Order(col:a, order:1)]  
+Sort Columns:          [Order(col:a, order:1, nullOrder:0)]     
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: alter table alter_table_not_sorted not sorted

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/authorization_index.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/authorization_index.q.out 
b/ql/src/test/results/clientpositive/authorization_index.q.out
index adc02ad..a6ec998 100644
--- a/ql/src/test/results/clientpositive/authorization_index.q.out
+++ b/ql/src/test/results/clientpositive/authorization_index.q.out
@@ -41,7 +41,7 @@ OutputFormat:         
org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           -1                       
 Bucket Columns:        []                       
-Sort Columns:          [Order(col:a, order:1)]  
+Sort Columns:          [Order(col:a, order:1, nullOrder:0)]     
 PREHOOK: query: alter index t1_index on t1 rebuild
 PREHOOK: type: ALTERINDEX_REBUILD
 PREHOOK: Input: default@t1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_join_reordering_values.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/auto_join_reordering_values.q.out 
b/ql/src/test/results/clientpositive/auto_join_reordering_values.q.out
index 22c8300..ac349a4 100644
--- a/ql/src/test/results/clientpositive/auto_join_reordering_values.q.out
+++ b/ql/src/test/results/clientpositive/auto_join_reordering_values.q.out
@@ -192,6 +192,7 @@ STAGE PLANS:
                 Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
                   key expressions: _col1 (type: string)
+                  null sort order: a
                   sort order: +
                   Map-reduce partition columns: _col1 (type: string)
                   Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
@@ -212,6 +213,7 @@ STAGE PLANS:
                 Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
                   key expressions: _col0 (type: string)
+                  null sort order: a
                   sort order: +
                   Map-reduce partition columns: _col0 (type: string)
                   Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
@@ -301,6 +303,7 @@ STAGE PLANS:
             GatherStats: false
             Reduce Output Operator
               key expressions: _col0 (type: int)
+              null sort order: a
               sort order: +
               Map-reduce partition columns: _col0 (type: int)
               Statistics: Num rows: 1 Data size: 39 Basic stats: COMPLETE 
Column stats: NONE
@@ -321,6 +324,7 @@ STAGE PLANS:
                 Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
                   key expressions: _col0 (type: int)
+                  null sort order: a
                   sort order: +
                   Map-reduce partition columns: _col0 (type: int)
                   Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
@@ -431,6 +435,7 @@ STAGE PLANS:
             GatherStats: false
             Reduce Output Operator
               key expressions: _col2 (type: int)
+              null sort order: a
               sort order: +
               Map-reduce partition columns: _col2 (type: int)
               Statistics: Num rows: 1 Data size: 42 Basic stats: COMPLETE 
Column stats: NONE
@@ -451,6 +456,7 @@ STAGE PLANS:
                 Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
                   key expressions: _col0 (type: int)
+                  null sort order: a
                   sort order: +
                   Map-reduce partition columns: _col0 (type: int)
                   Statistics: Num rows: 1 Data size: 36 Basic stats: COMPLETE 
Column stats: NONE
@@ -561,6 +567,7 @@ STAGE PLANS:
             GatherStats: false
             Reduce Output Operator
               key expressions: _col3 (type: int)
+              null sort order: a
               sort order: +
               Map-reduce partition columns: _col3 (type: int)
               Statistics: Num rows: 1 Data size: 46 Basic stats: COMPLETE 
Column stats: NONE
@@ -581,6 +588,7 @@ STAGE PLANS:
                 Statistics: Num rows: 100 Data size: 288 Basic stats: COMPLETE 
Column stats: NONE
                 Reduce Output Operator
                   key expressions: _col0 (type: int)
+                  null sort order: a
                   sort order: +
                   Map-reduce partition columns: _col0 (type: int)
                   Statistics: Num rows: 100 Data size: 288 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_1.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_1.q.out
index 3a91947..f768ea4 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_1.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_1.q.out
@@ -174,6 +174,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -394,6 +395,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -691,6 +693,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1007,6 +1010,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1208,6 +1212,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out
index efdd94a..f4bbfd0 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_11.q.out
@@ -242,6 +242,7 @@ STAGE PLANS:
                     outputColumnNames: _col0
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       Statistics: Num rows: 1 Data size: 8 Basic stats: 
COMPLETE Column stats: NONE
                       tag: -1
@@ -589,6 +590,7 @@ STAGE PLANS:
                     outputColumnNames: _col0
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       Statistics: Num rows: 1 Data size: 8 Basic stats: 
COMPLETE Column stats: NONE
                       tag: -1
@@ -934,6 +936,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1
@@ -1357,6 +1360,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_12.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_12.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_12.q.out
index 33e2def..e5ff904 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_12.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_12.q.out
@@ -447,6 +447,7 @@ STAGE PLANS:
                       outputColumnNames: _col0
                       Statistics: Num rows: 1 Data size: 8 Basic stats: 
COMPLETE Column stats: NONE
                       Reduce Output Operator
+                        null sort order: 
                         sort order: 
                         Statistics: Num rows: 1 Data size: 8 Basic stats: 
COMPLETE Column stats: NONE
                         tag: -1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_2.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_2.q.out
index fbbe9c4..0de079d 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_2.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_2.q.out
@@ -154,6 +154,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -453,6 +454,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -769,6 +771,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -970,6 +973,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_3.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_3.q.out
index 52cea36..a161f1c 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_3.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_3.q.out
@@ -154,6 +154,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -328,6 +329,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -622,6 +624,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -892,6 +895,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1093,6 +1097,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_4.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_4.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_4.q.out
index c50865e..3421ab1 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_4.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_4.q.out
@@ -170,6 +170,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -344,6 +345,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -638,6 +640,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -908,6 +911,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1109,6 +1113,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_5.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_5.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_5.q.out
index 2e63698..9c2663c 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_5.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_5.q.out
@@ -141,6 +141,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -306,6 +307,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -504,6 +506,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -675,6 +678,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -821,6 +825,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_7.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_7.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_7.q.out
index 2675eca..a25db01 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_7.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_7.q.out
@@ -187,6 +187,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -409,6 +410,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -751,6 +753,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1111,6 +1114,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1357,6 +1361,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/auto_sortmerge_join_8.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/auto_sortmerge_join_8.q.out 
b/ql/src/test/results/clientpositive/auto_sortmerge_join_8.q.out
index 9de9d73..38996a7 100644
--- a/ql/src/test/results/clientpositive/auto_sortmerge_join_8.q.out
+++ b/ql/src/test/results/clientpositive/auto_sortmerge_join_8.q.out
@@ -187,6 +187,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -409,6 +410,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -753,6 +755,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1113,6 +1116,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)
@@ -1359,6 +1363,7 @@ STAGE PLANS:
                     mode: hash
                     outputColumnNames: _col0
                     Reduce Output Operator
+                      null sort order: 
                       sort order: 
                       tag: -1
                       value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket1.q.out 
b/ql/src/test/results/clientpositive/bucket1.q.out
index 9e03236..0680176 100644
--- a/ql/src/test/results/clientpositive/bucket1.q.out
+++ b/ql/src/test/results/clientpositive/bucket1.q.out
@@ -53,6 +53,7 @@ STAGE PLANS:
               outputColumnNames: _col0, _col1
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
+                null sort order: 
                 sort order: 
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket2.q.out 
b/ql/src/test/results/clientpositive/bucket2.q.out
index 374b0e1..958e556 100644
--- a/ql/src/test/results/clientpositive/bucket2.q.out
+++ b/ql/src/test/results/clientpositive/bucket2.q.out
@@ -53,6 +53,7 @@ STAGE PLANS:
               outputColumnNames: _col0, _col1
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
+                null sort order: 
                 sort order: 
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket3.q.out 
b/ql/src/test/results/clientpositive/bucket3.q.out
index 542bbb7..eca9ba5 100644
--- a/ql/src/test/results/clientpositive/bucket3.q.out
+++ b/ql/src/test/results/clientpositive/bucket3.q.out
@@ -57,6 +57,7 @@ STAGE PLANS:
               outputColumnNames: _col0, _col1
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
+                null sort order: 
                 sort order: 
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket4.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket4.q.out 
b/ql/src/test/results/clientpositive/bucket4.q.out
index 5c7126b..dd9ef00 100644
--- a/ql/src/test/results/clientpositive/bucket4.q.out
+++ b/ql/src/test/results/clientpositive/bucket4.q.out
@@ -50,6 +50,7 @@ STAGE PLANS:
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
                 key expressions: UDFToInteger(_col0) (type: int)
+                null sort order: a
                 sort order: +
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket5.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket5.q.out 
b/ql/src/test/results/clientpositive/bucket5.q.out
index 46e3d54..aa47ba8 100644
--- a/ql/src/test/results/clientpositive/bucket5.q.out
+++ b/ql/src/test/results/clientpositive/bucket5.q.out
@@ -93,6 +93,7 @@ STAGE PLANS:
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
                 key expressions: UDFToInteger(_col0) (type: int)
+                null sort order: a
                 sort order: +
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE
@@ -239,6 +240,7 @@ STAGE PLANS:
             GatherStats: false
             Reduce Output Operator
               key expressions: _col0 (type: string)
+              null sort order: a
               sort order: +
               Map-reduce partition columns: _col0 (type: string)
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
@@ -533,7 +535,7 @@ OutputFormat:               
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
 Compressed:            No                       
 Num Buckets:           2                        
 Bucket Columns:        [key]                    
-Sort Columns:          [Order(col:key, order:1)]        
+Sort Columns:          [Order(col:key, order:1, nullOrder:0)]   
 Storage Desc Params:            
        serialization.format    1                   
 PREHOOK: query: SELECT * FROM bucketed_table TABLESAMPLE (BUCKET 1 OUT OF 2) s 
LIMIT 10

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket_many.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket_many.q.out 
b/ql/src/test/results/clientpositive/bucket_many.q.out
index ecd5e29..a9e2f0b 100644
--- a/ql/src/test/results/clientpositive/bucket_many.q.out
+++ b/ql/src/test/results/clientpositive/bucket_many.q.out
@@ -49,6 +49,7 @@ STAGE PLANS:
               outputColumnNames: _col0, _col1
               Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: NONE
               Reduce Output Operator
+                null sort order: 
                 sort order: 
                 Map-reduce partition columns: UDFToInteger(_col0) (type: int)
                 Statistics: Num rows: 500 Data size: 5312 Basic stats: 
COMPLETE Column stats: NONE

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket_map_join_1.q.out 
b/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
index 5f1e9b9..05fb434 100644
--- a/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
+++ b/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
@@ -156,6 +156,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucket_map_join_2.q.out 
b/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
index 07958ce..1173c93 100644
--- a/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
+++ b/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
@@ -156,6 +156,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucketcontext_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucketcontext_1.q.out 
b/ql/src/test/results/clientpositive/bucketcontext_1.q.out
index 8b2ebb0..78a0c8c 100644
--- a/ql/src/test/results/clientpositive/bucketcontext_1.q.out
+++ b/ql/src/test/results/clientpositive/bucketcontext_1.q.out
@@ -245,6 +245,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1
@@ -471,6 +472,7 @@ STAGE PLANS:
                   mode: hash
                   outputColumnNames: _col0
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     tag: -1
                     value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucketcontext_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucketcontext_2.q.out 
b/ql/src/test/results/clientpositive/bucketcontext_2.q.out
index 9168ee1..bc08fd2 100644
--- a/ql/src/test/results/clientpositive/bucketcontext_2.q.out
+++ b/ql/src/test/results/clientpositive/bucketcontext_2.q.out
@@ -229,6 +229,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1
@@ -455,6 +456,7 @@ STAGE PLANS:
                   mode: hash
                   outputColumnNames: _col0
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     tag: -1
                     value expressions: _col0 (type: bigint)

http://git-wip-us.apache.org/repos/asf/hive/blob/9350b693/ql/src/test/results/clientpositive/bucketcontext_3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/bucketcontext_3.q.out 
b/ql/src/test/results/clientpositive/bucketcontext_3.q.out
index e9e3406..0cba2ca 100644
--- a/ql/src/test/results/clientpositive/bucketcontext_3.q.out
+++ b/ql/src/test/results/clientpositive/bucketcontext_3.q.out
@@ -272,6 +272,7 @@ STAGE PLANS:
                   outputColumnNames: _col0
                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE 
Column stats: NONE
                     tag: -1
@@ -452,6 +453,7 @@ STAGE PLANS:
                   mode: hash
                   outputColumnNames: _col0
                   Reduce Output Operator
+                    null sort order: 
                     sort order: 
                     tag: -1
                     value expressions: _col0 (type: bigint)

Reply via email to