You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by br...@apache.org on 2013/10/08 21:10:23 UTC

svn commit: r1530393 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/exec/ java/org/apache/hadoop/hive/ql/parse/ java/org/apache/hadoop/hive/ql/udf/generic/ test/queries/clientnegative/ test/results/clientnegative/

Author: brock
Date: Tue Oct  8 19:10:22 2013
New Revision: 1530393

URL: http://svn.apache.org/r1530393
Log:
HIVE-5460: invalid offsets in lag lead should return an exception (per ISO-SQL) (Edward Capriolo via Brock Noland)

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLag.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLead.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/LeadLagBuffer.java
    hive/trunk/ql/src/test/queries/clientnegative/windowing_ll_no_neg.q
    hive/trunk/ql/src/test/results/clientnegative/windowing_ll_no_neg.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/WindowingExprNodeEvaluatorFactory.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFLeadLag.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeadLag.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1530393&r1=1530392&r2=1530393&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Tue Oct  8 19:10:22 2013
@@ -128,8 +128,6 @@ import org.apache.hadoop.hive.ql.udf.UDF
 import org.apache.hadoop.hive.ql.udf.UDFWeekOfYear;
 import org.apache.hadoop.hive.ql.udf.UDFYear;
 import org.apache.hadoop.hive.ql.udf.generic.*;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLeadLag.GenericUDFLag;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLeadLag.GenericUDFLead;
 import org.apache.hadoop.hive.ql.udf.ptf.MatchPath.MatchPathResolver;
 import org.apache.hadoop.hive.ql.udf.ptf.Noop.NoopResolver;
 import org.apache.hadoop.hive.ql.udf.ptf.NoopWithMap.NoopWithMapResolver;

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/WindowingExprNodeEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/WindowingExprNodeEvaluatorFactory.java?rev=1530393&r1=1530392&r2=1530393&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/WindowingExprNodeEvaluatorFactory.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/WindowingExprNodeEvaluatorFactory.java Tue Oct  8 19:10:22 2013
@@ -26,8 +26,8 @@ import org.apache.hadoop.hive.ql.metadat
 import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
 import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLeadLag.GenericUDFLag;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLeadLag.GenericUDFLead;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLag;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLead;
 
 /*
  * When constructing the Evaluator Tree from an ExprNode Tree

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFLeadLag.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFLeadLag.java?rev=1530393&r1=1530392&r2=1530393&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFLeadLag.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFLeadLag.java Tue Oct  8 19:10:22 2013
@@ -23,7 +23,6 @@ import org.apache.commons.logging.LogFac
 import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.AggregationBuffer;
 import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
@@ -34,8 +33,7 @@ import org.apache.hadoop.hive.serde2.obj
 import org.apache.hadoop.io.IntWritable;
 
 /**
- * abstract class for Lead & lag UDAFs
- * GenericUDAFLeadLag.
+ * abstract class for Lead & lag UDAFs GenericUDAFLeadLag.
  *
  */
 public abstract class GenericUDAFLeadLag extends AbstractGenericUDAFResolver {
@@ -44,32 +42,31 @@ public abstract class GenericUDAFLeadLag
 
   @Override
   public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfo parameters)
-      throws SemanticException {
+          throws SemanticException {
 
     ObjectInspector[] paramOIs = parameters.getParameterObjectInspectors();
     String fNm = functionName();
 
-    if (!(paramOIs.length >= 1 && paramOIs.length <= 3) ) {
-      throw new UDFArgumentTypeException(paramOIs.length - 1,
-          "Incorrect invocation of " + fNm + ": _FUNC_(expr, amt, default)");
+    if (!(paramOIs.length >= 1 && paramOIs.length <= 3)) {
+      throw new UDFArgumentTypeException(paramOIs.length - 1, "Incorrect invocation of " + fNm
+              + ": _FUNC_(expr, amt, default)");
     }
 
     int amt = 1;
-    if ( paramOIs.length > 1 ) {
+    if (paramOIs.length > 1) {
       ObjectInspector amtOI = paramOIs[1];
 
-      if ( !ObjectInspectorUtils.isConstantObjectInspector(amtOI) ||
-          (amtOI.getCategory() != ObjectInspector.Category.PRIMITIVE) ||
-          ((PrimitiveObjectInspector)amtOI).getPrimitiveCategory() !=
-          PrimitiveObjectInspector.PrimitiveCategory.INT )
-      {
-        throw new UDFArgumentTypeException(0,
-            fNm + " amount must be a integer value "
-            + amtOI.getTypeName() + " was passed as parameter 1.");
+      if (!ObjectInspectorUtils.isConstantObjectInspector(amtOI)
+              || (amtOI.getCategory() != ObjectInspector.Category.PRIMITIVE)
+              || ((PrimitiveObjectInspector) amtOI).getPrimitiveCategory() != PrimitiveObjectInspector.PrimitiveCategory.INT) {
+        throw new UDFArgumentTypeException(1, fNm + " amount must be a integer value "
+                + amtOI.getTypeName() + " was passed as parameter 1.");
+      }
+      Object o = ((ConstantObjectInspector) amtOI).getWritableConstantValue();
+      amt = ((IntWritable) o).get();
+      if (amt < 0) {
+        throw new UDFArgumentTypeException(1, fNm + " amount can not be nagative. Specified: " + amt );
       }
-      Object o = ((ConstantObjectInspector)amtOI).
-          getWritableConstantValue();
-      amt = ((IntWritable)o).get();
     }
 
     if (paramOIs.length == 3) {
@@ -85,13 +82,6 @@ public abstract class GenericUDAFLeadLag
 
   protected abstract GenericUDAFLeadLagEvaluator createLLEvaluator();
 
-  static interface LeadLagBuffer extends AggregationBuffer {
-    void initialize(int leadAmt);
-    void addRow(Object leadExprValue, Object defaultValue) ;
-    Object terminate();
-
-  }
-
   public static abstract class GenericUDAFLeadLagEvaluator extends GenericUDAFEvaluator {
 
     private transient ObjectInspector[] inputOI;
@@ -100,24 +90,21 @@ public abstract class GenericUDAFLeadLag
     private transient Converter defaultValueConverter;
 
     @Override
-    public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException
-    {
+    public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
       super.init(m, parameters);
-      if (m != Mode.COMPLETE)
-      {
-        throw new HiveException(
-            "Only COMPLETE mode supported for " + fnName + " function");
+      if (m != Mode.COMPLETE) {
+        throw new HiveException("Only COMPLETE mode supported for " + fnName + " function");
       }
 
       inputOI = parameters;
 
       if (parameters.length == 3) {
-        defaultValueConverter = ObjectInspectorConverters.getConverter(parameters[2], parameters[0]);
+        defaultValueConverter = ObjectInspectorConverters
+                .getConverter(parameters[2], parameters[0]);
       }
 
-      return ObjectInspectorFactory.getStandardListObjectInspector(
-          ObjectInspectorUtils
-          .getStandardObjectInspector(parameters[0]));
+      return ObjectInspectorFactory.getStandardListObjectInspector(ObjectInspectorUtils
+              .getStandardObjectInspector(parameters[0]));
     }
 
     public int getAmt() {
@@ -140,24 +127,22 @@ public abstract class GenericUDAFLeadLag
 
     @Override
     public AggregationBuffer getNewAggregationBuffer() throws HiveException {
-      LeadLagBuffer lb =  getNewLLBuffer();
+      LeadLagBuffer lb = getNewLLBuffer();
       lb.initialize(amt);
       return lb;
     }
 
     @Override
     public void reset(AggregationBuffer agg) throws HiveException {
-      ((LeadLagBuffer)agg).initialize(amt);
+      ((LeadLagBuffer) agg).initialize(amt);
     }
 
     @Override
     public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException {
-      Object rowExprVal = ObjectInspectorUtils.copyToStandardObject(parameters[0],
-          inputOI[0]);
+      Object rowExprVal = ObjectInspectorUtils.copyToStandardObject(parameters[0], inputOI[0]);
       Object defaultVal = parameters.length > 2 ? ObjectInspectorUtils.copyToStandardObject(
-          defaultValueConverter.convert(parameters[2]),
-          inputOI[0]) : null;
-      ((LeadLagBuffer)agg).addRow(rowExprVal, defaultVal);
+              defaultValueConverter.convert(parameters[2]), inputOI[0]) : null;
+      ((LeadLagBuffer) agg).addRow(rowExprVal, defaultVal);
     }
 
     @Override
@@ -172,7 +157,7 @@ public abstract class GenericUDAFLeadLag
 
     @Override
     public Object terminate(AggregationBuffer agg) throws HiveException {
-      return ((LeadLagBuffer)agg).terminate();
+      return ((LeadLagBuffer) agg).terminate();
     }
 
   }

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLag.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLag.java?rev=1530393&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLag.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLag.java Tue Oct  8 19:10:22 2013
@@ -0,0 +1,23 @@
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+
+@UDFType(impliesOrder = true)
+public class GenericUDFLag extends GenericUDFLeadLag {
+  @Override
+  protected String _getFnName() {
+    return "lag";
+  }
+
+  @Override
+  protected int getIndex(int amt) {
+    return pItr.getIndex() - 1 - amt;
+  }
+
+  @Override
+  protected Object getRow(int amt) throws HiveException {
+    return pItr.lag(amt + 1);
+  }
+
+}
\ No newline at end of file

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLead.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLead.java?rev=1530393&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLead.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLead.java Tue Oct  8 19:10:22 2013
@@ -0,0 +1,24 @@
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+
+@UDFType(impliesOrder = true)
+public class GenericUDFLead extends GenericUDFLeadLag {
+
+  @Override
+  protected String _getFnName() {
+    return "lead";
+  }
+
+  @Override
+  protected int getIndex(int amt) {
+    return pItr.getIndex() - 1 + amt;
+  }
+
+  @Override
+  protected Object getRow(int amt) throws HiveException {
+    return pItr.lead(amt - 1);
+  }
+
+}
\ No newline at end of file

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeadLag.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeadLag.java?rev=1530393&r1=1530392&r2=1530393&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeadLag.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeadLag.java Tue Oct  8 19:10:22 2013
@@ -24,7 +24,6 @@ import org.apache.hadoop.hive.ql.exec.PT
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
-import org.apache.hadoop.hive.ql.udf.UDFType;
 import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
@@ -34,84 +33,73 @@ import org.apache.hadoop.hive.serde2.obj
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.io.IntWritable;
 
-public abstract class GenericUDFLeadLag extends GenericUDF
-{
-	transient ExprNodeEvaluator exprEvaluator;
-	transient PTFPartitionIterator<Object> pItr;
-	transient ObjectInspector firstArgOI;
-	transient ObjectInspector defaultArgOI;
-	transient Converter defaultValueConverter;
-	int amt;
-
-	static{
-		PTFUtils.makeTransient(GenericUDFLeadLag.class, "exprEvaluator", "pItr",
-        "firstArgOI", "defaultArgOI", "defaultValueConverter");
-	}
-
-	@Override
-	public Object evaluate(DeferredObject[] arguments) throws HiveException
-	{
+public abstract class GenericUDFLeadLag extends GenericUDF {
+  transient ExprNodeEvaluator exprEvaluator;
+  transient PTFPartitionIterator<Object> pItr;
+  transient ObjectInspector firstArgOI;
+  transient ObjectInspector defaultArgOI;
+  transient Converter defaultValueConverter;
+  int amt;
+
+  static {
+    PTFUtils.makeTransient(GenericUDFLeadLag.class, "exprEvaluator", "pItr", "firstArgOI",
+            "defaultArgOI", "defaultValueConverter");
+  }
+
+  @Override
+  public Object evaluate(DeferredObject[] arguments) throws HiveException {
     Object defaultVal = null;
-    if(arguments.length == 3){
-      defaultVal =  ObjectInspectorUtils.copyToStandardObject(
-          defaultValueConverter.convert(arguments[2].get()),
-          defaultArgOI);
+    if (arguments.length == 3) {
+      defaultVal = ObjectInspectorUtils.copyToStandardObject(
+              defaultValueConverter.convert(arguments[2].get()), defaultArgOI);
     }
 
-		int idx = pItr.getIndex() - 1;
-		int start = 0;
-		int end = pItr.getPartition().size();
-		try
-		{
-		  Object ret = null;
-		  int newIdx = getIndex(amt);
+    int idx = pItr.getIndex() - 1;
+    int start = 0;
+    int end = pItr.getPartition().size();
+    try {
+      Object ret = null;
+      int newIdx = getIndex(amt);
 
-		  if(newIdx >= end || newIdx < start) {
+      if (newIdx >= end || newIdx < start) {
         ret = defaultVal;
-		  }
-		  else {
+      } else {
         Object row = getRow(amt);
         ret = exprEvaluator.evaluate(row);
-        ret = ObjectInspectorUtils.copyToStandardObject(ret,
-            firstArgOI, ObjectInspectorCopyOption.WRITABLE);
-		  }
-			return ret;
-		}
-		finally
-		{
-			Object currRow = pItr.resetToIndex(idx);
-			// reevaluate expression on current Row, to trigger the Lazy object
-			// caches to be reset to the current row.
-			exprEvaluator.evaluate(currRow);
-		}
-
-	}
-
-	@Override
-	public ObjectInspector initialize(ObjectInspector[] arguments)
-			throws UDFArgumentException
-	{
+        ret = ObjectInspectorUtils.copyToStandardObject(ret, firstArgOI,
+                ObjectInspectorCopyOption.WRITABLE);
+      }
+      return ret;
+    } finally {
+      Object currRow = pItr.resetToIndex(idx);
+      // reevaluate expression on current Row, to trigger the Lazy object
+      // caches to be reset to the current row.
+      exprEvaluator.evaluate(currRow);
+    }
+
+  }
+
+  @Override
+  public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
     if (!(arguments.length >= 1 && arguments.length <= 3)) {
-      throw new UDFArgumentTypeException(arguments.length - 1,
-          "Incorrect invocation of " + _getFnName() + ": _FUNC_(expr, amt, default)");
+      throw new UDFArgumentTypeException(arguments.length - 1, "Incorrect invocation of "
+              + _getFnName() + ": _FUNC_(expr, amt, default)");
     }
 
     amt = 1;
-
     if (arguments.length > 1) {
       ObjectInspector amtOI = arguments[1];
-      if ( !ObjectInspectorUtils.isConstantObjectInspector(amtOI) ||
-          (amtOI.getCategory() != ObjectInspector.Category.PRIMITIVE) ||
-          ((PrimitiveObjectInspector)amtOI).getPrimitiveCategory() !=
-          PrimitiveObjectInspector.PrimitiveCategory.INT )
-      {
-        throw new UDFArgumentTypeException(0,
-            _getFnName() + " amount must be a integer value "
-            + amtOI.getTypeName() + " was passed as parameter 1.");
+      if (!ObjectInspectorUtils.isConstantObjectInspector(amtOI)
+              || (amtOI.getCategory() != ObjectInspector.Category.PRIMITIVE)
+              || ((PrimitiveObjectInspector) amtOI).getPrimitiveCategory() != PrimitiveObjectInspector.PrimitiveCategory.INT) {
+        throw new UDFArgumentTypeException(1, _getFnName() + " amount must be a integer value "
+                + amtOI.getTypeName() + " was passed as parameter 1.");
+      }
+      Object o = ((ConstantObjectInspector) amtOI).getWritableConstantValue();
+      amt = ((IntWritable) o).get();
+      if (amt < 0) {
+        throw new UDFArgumentTypeException(1,  " amount can not be nagative. Specified: " + amt);
       }
-      Object o = ((ConstantObjectInspector)amtOI).
-          getWritableConstantValue();
-      amt = ((IntWritable)o).get();
     }
 
     if (arguments.length == 3) {
@@ -123,30 +111,26 @@ public abstract class GenericUDFLeadLag 
 
     firstArgOI = arguments[0];
     return ObjectInspectorUtils.getStandardObjectInspector(firstArgOI,
-        ObjectInspectorCopyOption.WRITABLE);
-	}
+            ObjectInspectorCopyOption.WRITABLE);
+  }
+
+  public ExprNodeEvaluator getExprEvaluator() {
+    return exprEvaluator;
+  }
+
+  public void setExprEvaluator(ExprNodeEvaluator exprEvaluator) {
+    this.exprEvaluator = exprEvaluator;
+  }
+
+  public PTFPartitionIterator<Object> getpItr() {
+    return pItr;
+  }
 
-	public ExprNodeEvaluator getExprEvaluator()
-	{
-		return exprEvaluator;
-	}
-
-	public void setExprEvaluator(ExprNodeEvaluator exprEvaluator)
-	{
-		this.exprEvaluator = exprEvaluator;
-	}
-
-	public PTFPartitionIterator<Object> getpItr()
-	{
-		return pItr;
-	}
-
-	public void setpItr(PTFPartitionIterator<Object> pItr)
-	{
-		this.pItr = pItr;
-	}
+  public void setpItr(PTFPartitionIterator<Object> pItr) {
+    this.pItr = pItr;
+  }
 
-	public ObjectInspector getFirstArgOI() {
+  public ObjectInspector getFirstArgOI() {
     return firstArgOI;
   }
 
@@ -179,69 +163,22 @@ public abstract class GenericUDFLeadLag 
   }
 
   @Override
-	public String getDisplayString(String[] children)
-	{
-		assert (children.length == 2);
-		StringBuilder sb = new StringBuilder();
-		sb.append(_getFnName());
-		sb.append("(");
-		sb.append(children[0]);
-		sb.append(", ");
-		sb.append(children[1]);
-		sb.append(")");
-		return sb.toString();
-	}
-
-	protected abstract String _getFnName();
-
-	protected abstract Object getRow(int amt) throws HiveException;
-
-	protected abstract int getIndex(int amt);
-
-	@UDFType(impliesOrder = true)
-	public static class GenericUDFLead extends GenericUDFLeadLag
-	{
-
-		@Override
-		protected String _getFnName()
-		{
-			return "lead";
-		}
-
-		@Override
-		protected int getIndex(int amt) {
-		  return pItr.getIndex() - 1 + amt;
-		}
-
-		@Override
-		protected Object getRow(int amt) throws HiveException
-		{
-			return pItr.lead(amt - 1);
-		}
-
-	}
-
-	@UDFType(impliesOrder = true)
-	public static class GenericUDFLag extends GenericUDFLeadLag
-	{
-		@Override
-		protected String _getFnName()
-		{
-			return "lag";
-		}
-
-		@Override
-    protected int getIndex(int amt) {
-      return pItr.getIndex() - 1 - amt;
-    }
+  public String getDisplayString(String[] children) {
+    assert (children.length == 2);
+    StringBuilder sb = new StringBuilder();
+    sb.append(_getFnName());
+    sb.append("(");
+    sb.append(children[0]);
+    sb.append(", ");
+    sb.append(children[1]);
+    sb.append(")");
+    return sb.toString();
+  }
 
-		@Override
-		protected Object getRow(int amt) throws HiveException
-		{
-			return pItr.lag(amt + 1);
-		}
+  protected abstract String _getFnName();
 
-	}
+  protected abstract Object getRow(int amt) throws HiveException;
 
-}
+  protected abstract int getIndex(int amt);
 
+}

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/LeadLagBuffer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/LeadLagBuffer.java?rev=1530393&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/LeadLagBuffer.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/LeadLagBuffer.java Tue Oct  8 19:10:22 2013
@@ -0,0 +1,12 @@
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.AggregationBuffer;
+
+interface LeadLagBuffer extends AggregationBuffer {
+  void initialize(int leadAmt);
+
+  void addRow(Object leadExprValue, Object defaultValue);
+
+  Object terminate();
+
+}
\ No newline at end of file

Added: hive/trunk/ql/src/test/queries/clientnegative/windowing_ll_no_neg.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/windowing_ll_no_neg.q?rev=1530393&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/windowing_ll_no_neg.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/windowing_ll_no_neg.q Tue Oct  8 19:10:22 2013
@@ -0,0 +1,26 @@
+DROP TABLE IF EXISTS part;
+
+-- data setup
+CREATE TABLE part(
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+);
+
+LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part;
+
+
+select p_mfgr, p_name, p_size,
+min(p_retailprice),
+rank() over(distribute by p_mfgr sort by p_name)as r,
+dense_rank() over(distribute by p_mfgr sort by p_name) as dr,
+p_size, p_size - lag(p_size,-1,p_size) over(distribute by p_mfgr sort by p_name) as deltaSz
+from part
+group by p_mfgr, p_name, p_size
+;

Added: hive/trunk/ql/src/test/results/clientnegative/windowing_ll_no_neg.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/windowing_ll_no_neg.q.out?rev=1530393&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/windowing_ll_no_neg.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/windowing_ll_no_neg.q.out Tue Oct  8 19:10:22 2013
@@ -0,0 +1,39 @@
+PREHOOK: query: DROP TABLE IF EXISTS part
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS part
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: -- data setup
+CREATE TABLE part(
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: -- data setup
+CREATE TABLE part(
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@part
+PREHOOK: query: LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part
+PREHOOK: type: LOAD
+PREHOOK: Output: default@part
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../data/files/part_tiny.txt' overwrite into table part
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@part
+FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies.
+Underlying error: org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException: Lag amount can not be nagative. Specified: -1