This is an automated email from the ASF dual-hosted git repository.
sankarh pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/branch-3 by this push:
new 873c3a8c9f7 HIVE-27385: Backport of HIVE-22099: Several date related
UDFs can't handle Julian dates properly since HIVE-20007 (Adam Szita, reviewed
by Jesus Camacho Rodriguez)
873c3a8c9f7 is described below
commit 873c3a8c9f7efd596d66b768c7f6414e8d053c3c
Author: Aman Raj <[email protected]>
AuthorDate: Mon Sep 11 22:49:13 2023 +0530
HIVE-27385: Backport of HIVE-22099: Several date related UDFs can't handle
Julian dates properly since HIVE-20007 (Adam Szita, reviewed by Jesus Camacho
Rodriguez)
Signed-off-by: Sankar Hariappan <[email protected]>
Closes (#4674)
---
.../exec/vector/expressions/CastDateToString.java | 6 +--
.../expressions/VectorUDFTimestampFieldDate.java | 6 +--
.../expressions/VectorUDFTimestampFieldString.java | 5 +--
.../VectorUDFTimestampFieldTimestamp.java | 5 +--
.../apache/hadoop/hive/ql/udf/UDFDayOfMonth.java | 4 +-
.../org/apache/hadoop/hive/ql/udf/UDFMonth.java | 4 +-
.../apache/hadoop/hive/ql/udf/UDFWeekOfYear.java | 6 +--
.../org/apache/hadoop/hive/ql/udf/UDFYear.java | 4 +-
.../hive/ql/udf/generic/GenericUDFAddMonths.java | 7 ++--
.../hive/ql/udf/generic/GenericUDFDateFormat.java | 4 +-
.../ql/udf/generic/GenericUDFMonthsBetween.java | 6 +--
.../apache/hadoop/hive/ql/util/DateTimeMath.java | 13 +++++++
.../expressions/TestVectorMathFunctions.java | 8 ++++
.../vector/expressions/TestVectorTypeCasts.java | 27 +++++++++++++
.../ql/udf/generic/TestGenericUDFAddMonths.java | 2 +
.../ql/udf/generic/TestGenericUDFDateFormat.java | 16 +++++++-
.../udf/generic/TestGenericUDFMonthsBetween.java | 3 ++
ql/src/test/queries/clientpositive/udf_day.q | 3 ++
ql/src/test/queries/clientpositive/udf_month.q | 7 +++-
.../test/queries/clientpositive/udf_weekofyear.q | 4 ++
ql/src/test/queries/clientpositive/udf_year.q | 5 +++
.../llap/vectorized_timestamp_funcs.q.out | 6 +--
.../spark/vectorized_timestamp_funcs.q.out | 6 +--
ql/src/test/results/clientpositive/udf_day.q.out | 18 +++++++++
ql/src/test/results/clientpositive/udf_month.q.out | 45 +++++++++++++++-------
.../results/clientpositive/udf_weekofyear.q.out | 27 +++++++++++++
ql/src/test/results/clientpositive/udf_year.q.out | 37 ++++++++++++++++++
.../vectorized_timestamp_funcs.q.out | 6 +--
28 files changed, 234 insertions(+), 56 deletions(-)
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToString.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToString.java
index dfa9f8a00de..302fcefe107 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToString.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/CastDateToString.java
@@ -19,11 +19,11 @@
package org.apache.hadoop.hive.ql.exec.vector.expressions;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.io.DateWritableV2;
import java.sql.Date;
import java.text.SimpleDateFormat;
-import java.util.TimeZone;
public class CastDateToString extends LongToStringUnaryUDF {
private static final long serialVersionUID = 1L;
@@ -33,13 +33,13 @@ public class CastDateToString extends LongToStringUnaryUDF {
public CastDateToString() {
super();
formatter = new SimpleDateFormat("yyyy-MM-dd");
- formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ formatter.setCalendar(DateTimeMath.getProlepticGregorianCalendarUTC());
}
public CastDateToString(int inputColumn, int outputColumnNum) {
super(inputColumn, outputColumnNum);
formatter = new SimpleDateFormat("yyyy-MM-dd");
- formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ formatter.setCalendar(DateTimeMath.getProlepticGregorianCalendarUTC());
}
// The assign method will be overridden for CHAR and VARCHAR.
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldDate.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldDate.java
index 837de9d0cad..ac6519b6257 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldDate.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldDate.java
@@ -20,13 +20,13 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions;
import java.util.Arrays;
import java.util.Calendar;
-import java.util.TimeZone;
import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.io.DateWritableV2;
import
org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
@@ -34,7 +34,6 @@ import org.apache.hive.common.util.DateUtils;
import com.google.common.base.Preconditions;
-
/**
* Abstract class to return various fields from a Timestamp or Date.
*/
@@ -44,8 +43,7 @@ public abstract class VectorUDFTimestampFieldDate extends
VectorExpression {
protected final int colNum;
protected final int field;
- protected transient final Calendar calendar = Calendar.getInstance(
- TimeZone.getTimeZone("UTC"));
+ protected final transient Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
public VectorUDFTimestampFieldDate(int field, int colNum, int
outputColumnNum) {
super(outputColumnNum);
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldString.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldString.java
index 9acfa86104a..9ef90947b23 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldString.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldString.java
@@ -23,10 +23,10 @@ import
org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import java.text.ParseException;
import java.util.Calendar;
-import java.util.TimeZone;
/**
* Abstract class to return various fields from a String.
@@ -40,8 +40,7 @@ public abstract class VectorUDFTimestampFieldString extends
VectorExpression {
protected final int fieldLength;
private static final String patternMin = "0000-00-00 00:00:00.000000000";
private static final String patternMax = "9999-19-99 29:59:59.999999999";
- protected transient final Calendar calendar = Calendar.getInstance(
- TimeZone.getTimeZone("UTC"));
+ protected final transient Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
public VectorUDFTimestampFieldString(int colNum, int outputColumnNum, int
fieldStart, int fieldLength) {
super(outputColumnNum);
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldTimestamp.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldTimestamp.java
index 94e8b474873..142d05f86a9 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldTimestamp.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFTimestampFieldTimestamp.java
@@ -20,7 +20,6 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions;
import java.util.Arrays;
import java.util.Calendar;
-import java.util.TimeZone;
import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
@@ -28,6 +27,7 @@ import
org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import
org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hive.common.util.DateUtils;
@@ -44,8 +44,7 @@ public abstract class VectorUDFTimestampFieldTimestamp
extends VectorExpression
protected final int colNum;
protected final int field;
- protected transient final Calendar calendar = Calendar.getInstance(
- TimeZone.getTimeZone("UTC"));
+ protected final transient Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
public VectorUDFTimestampFieldTimestamp(int field, int colNum, int
outputColumnNum) {
super(outputColumnNum);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java
index 72fa2630b62..cbb8fd09c36 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java
@@ -30,6 +30,7 @@ import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFDayOfMonthTime
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.NDV;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
@@ -37,7 +38,6 @@ import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
import org.apache.hadoop.io.IntWritable;
import java.util.Calendar;
-import java.util.TimeZone;
/**
* UDFDayOfMonth.
@@ -60,7 +60,7 @@ public class UDFDayOfMonth extends GenericUDF {
private transient PrimitiveObjectInspector.PrimitiveCategory[] inputTypes =
new PrimitiveObjectInspector.PrimitiveCategory[1];
private final IntWritable output = new IntWritable();
- private final Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws
UDFArgumentException {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java
index 1a8b2da7a97..e55dbc4633b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java
@@ -30,6 +30,7 @@ import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMonthTimestamp
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.NDV;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
@@ -37,7 +38,6 @@ import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
import org.apache.hadoop.io.IntWritable;
import java.util.Calendar;
-import java.util.TimeZone;
/**
* UDFMonth.
@@ -60,7 +60,7 @@ public class UDFMonth extends GenericUDF {
private transient PrimitiveObjectInspector.PrimitiveCategory[] inputTypes =
new PrimitiveObjectInspector.PrimitiveCategory[1];
private final IntWritable output = new IntWritable();
- private final Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
@Override
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java
index 18ca9a7e9bf..6d64da115c2 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java
@@ -19,7 +19,6 @@
package org.apache.hadoop.hive.ql.udf;
import java.util.Calendar;
-import java.util.TimeZone;
import org.apache.hadoop.hive.common.type.Date;
import org.apache.hadoop.hive.common.type.Timestamp;
@@ -30,6 +29,7 @@ import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFWeekOfYearDate
import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFWeekOfYearString;
import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFWeekOfYearTimestamp;
import org.apache.hadoop.hive.ql.udf.generic.NDV;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.io.DateWritableV2;
import org.apache.hadoop.hive.serde2.io.TimestampWritableV2;
import org.apache.hadoop.io.IntWritable;
@@ -39,7 +39,7 @@ import org.apache.hadoop.io.Text;
* UDFWeekOfYear.
*
*/
-@Description(name = "yearweek",
+@Description(name = "weekofyear",
value = "_FUNC_(date) - Returns the week of the year of the given date. A
week "
+ "is considered to start on a Monday and week 1 is the first week with >3
days.",
extended = "Examples:\n"
@@ -52,7 +52,7 @@ public class UDFWeekOfYear extends UDF {
private final IntWritable result = new IntWritable();
- private final Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
public UDFWeekOfYear() {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java
index fcbb57f8387..8ac1dc5b9dd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java
@@ -30,6 +30,7 @@ import
org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFYearTimestamp;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.NDV;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
@@ -37,7 +38,6 @@ import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
import org.apache.hadoop.io.IntWritable;
import java.util.Calendar;
-import java.util.TimeZone;
/**
* UDFYear.
@@ -60,7 +60,7 @@ public class UDFYear extends GenericUDF {
private transient PrimitiveObjectInspector.PrimitiveCategory[] inputTypes =
new PrimitiveObjectInspector.PrimitiveCategory[1];
private final IntWritable output = new IntWritable();
- private final Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
@Override
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAddMonths.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAddMonths.java
index 6df0913de6c..7ca8dad5aaa 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAddMonths.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAddMonths.java
@@ -24,7 +24,6 @@ import static
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveO
import java.text.SimpleDateFormat;
import java.util.Calendar;
-import java.util.TimeZone;
import org.apache.hadoop.hive.common.type.Date;
import org.apache.hadoop.hive.common.type.Timestamp;
@@ -32,6 +31,7 @@ import org.apache.hadoop.hive.ql.exec.Description;
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.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
@@ -64,7 +64,7 @@ public class GenericUDFAddMonths extends GenericUDF {
private transient PrimitiveCategory[] dtInputTypes = new
PrimitiveCategory[3];
private final Text output = new Text();
private transient SimpleDateFormat formatter = null;
- private final Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar calendar =
DateTimeMath.getProlepticGregorianCalendarUTC();
private transient Integer numMonthsConst;
private transient boolean isNumMonthsConst;
@@ -82,7 +82,7 @@ public class GenericUDFAddMonths extends GenericUDF {
String fmtStr = getConstantStringValue(arguments, 2);
if (fmtStr != null) {
formatter = new SimpleDateFormat(fmtStr);
- formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ formatter.setCalendar(calendar);
}
} else {
throw new UDFArgumentTypeException(2, getFuncName() + " only takes
constant as "
@@ -92,6 +92,7 @@ public class GenericUDFAddMonths extends GenericUDF {
if (formatter == null) {
//If the DateFormat is not provided by the user or is invalid, use the
default format YYYY-MM-dd
formatter = DateUtils.getDateFormat();
+ formatter.setCalendar(calendar);
}
// the function should support both short date and full timestamp format
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateFormat.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateFormat.java
index 6d3e86f9212..a30b9160def 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateFormat.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFDateFormat.java
@@ -21,7 +21,6 @@ import static
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveO
import static
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping.STRING_GROUP;
import java.text.SimpleDateFormat;
-import java.util.TimeZone;
import org.apache.hadoop.hive.common.type.Date;
import org.apache.hadoop.hive.common.type.Timestamp;
@@ -29,6 +28,7 @@ import org.apache.hadoop.hive.ql.exec.Description;
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.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
@@ -80,7 +80,7 @@ public class GenericUDFDateFormat extends GenericUDF {
if (fmtStr != null) {
try {
formatter = new SimpleDateFormat(fmtStr);
- formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+
formatter.setCalendar(DateTimeMath.getProlepticGregorianCalendarUTC());
} catch (IllegalArgumentException e) {
// ignore
}
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFMonthsBetween.java
b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFMonthsBetween.java
index e0db417dab3..ad128d800d4 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFMonthsBetween.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFMonthsBetween.java
@@ -29,13 +29,13 @@ import static
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveO
import java.math.BigDecimal;
import java.util.Calendar;
-import java.util.TimeZone;
import org.apache.hadoop.hive.common.type.Date;
import org.apache.hadoop.hive.common.type.Timestamp;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
@@ -66,8 +66,8 @@ public class GenericUDFMonthsBetween extends GenericUDF {
private transient PrimitiveCategory[] tsInputTypes = new
PrimitiveCategory[2];
private transient Converter[] dtConverters = new Converter[2];
private transient PrimitiveCategory[] dtInputTypes = new
PrimitiveCategory[2];
- private final Calendar cal1 =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- private final Calendar cal2 =
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ private final Calendar cal1 =
DateTimeMath.getProlepticGregorianCalendarUTC();
+ private final Calendar cal2 =
DateTimeMath.getProlepticGregorianCalendarUTC();
private final DoubleWritable output = new DoubleWritable();
private boolean isRoundOffNeeded = true;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/util/DateTimeMath.java
b/ql/src/java/org/apache/hadoop/hive/ql/util/DateTimeMath.java
index 16babbf7a77..70c971f9372 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/util/DateTimeMath.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/util/DateTimeMath.java
@@ -25,6 +25,7 @@ import org.apache.hadoop.hive.serde2.io.DateWritableV2;
import org.apache.hive.common.util.DateUtils;
import java.util.Calendar;
+import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
@@ -584,4 +585,16 @@ public class DateTimeMath {
result.set(totalSeconds, nanosResult.nanos);
return true;
}
+
+ /**
+ * TODO - this is a temporary fix for handling Julian calendar dates.
+ * Returns a Gregorian calendar that can be used from year 0+ instead of
default 1582.10.15.
+ * This is desirable for some UDFs that work on dates which normally would
use Julian calendar.
+ * @return the calendar
+ */
+ public static Calendar getProlepticGregorianCalendarUTC() {
+ GregorianCalendar calendar = new
GregorianCalendar(TimeZone.getTimeZone("UTC".intern()));
+ calendar.setGregorianChange(new java.util.Date(Long.MIN_VALUE));
+ return calendar;
+ }
}
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java
index 14d13436468..11bf0b403d7 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java
@@ -118,6 +118,14 @@ public class TestVectorMathFunctions {
static int DAYS_LIMIT = 365 * 9999;
+ public static VectorizedRowBatch getVectorizedRowBatchDateInStringOut(int[]
intValues) {
+ // get date in timestamp out, and change timestamp out to string out
+ VectorizedRowBatch batch =
getVectorizedRowBatchDateInTimestampOut(intValues);
+ BytesColumnVector outV = new BytesColumnVector(intValues.length);
+ batch.cols[1] = outV;
+ return batch;
+ }
+
public static VectorizedRowBatch
getVectorizedRowBatchDateInTimestampOut(int[] intValues) {
Random r = new Random(12099);
VectorizedRowBatch batch = new VectorizedRowBatch(2);
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorTypeCasts.java
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorTypeCasts.java
index 4ed087e6be5..a8d81fc1943 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorTypeCasts.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorTypeCasts.java
@@ -23,7 +23,10 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@@ -31,6 +34,7 @@ import junit.framework.Assert;
import org.apache.hadoop.hive.common.type.DataTypePhysicalVariation;
import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.ql.util.DateTimeMath;
import org.apache.hadoop.hive.serde2.RandomTypeUtil;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector;
@@ -72,6 +76,29 @@ public class TestVectorTypeCasts {
Assert.assertEquals(1, resultV.vector[6]);
}
+ @Test
+ public void testCastDateToString() throws HiveException {
+ int[] intValues = new int[100];
+ VectorizedRowBatch b =
TestVectorMathFunctions.getVectorizedRowBatchDateInStringOut(intValues);
+ BytesColumnVector resultV = (BytesColumnVector) b.cols[1];
+ b.cols[0].noNulls = true;
+ VectorExpression expr = new CastDateToString(0, 1);
+ expr.evaluate(b);
+
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+ formatter.setCalendar(DateTimeMath.getProlepticGregorianCalendarUTC());
+
+ String expected, result;
+ for (int i = 0; i < intValues.length; i++) {
+ expected = formatter.format(new
java.sql.Date(DateWritableV2.daysToMillis(intValues[i])));
+ byte[] subbyte = Arrays.copyOfRange(resultV.vector[i], resultV.start[i],
+ resultV.start[i] + resultV.length[i]);
+ result = new String(subbyte, StandardCharsets.UTF_8);
+
+ Assert.assertEquals("Index: " + i + " Epoch day value: " + intValues[i],
expected, result);
+ }
+ }
+
@Test
public void testCastDateToTimestamp() throws HiveException {
int[] intValues = new int[500];
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFAddMonths.java
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFAddMonths.java
index 7c2ee156469..3459ad50172 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFAddMonths.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFAddMonths.java
@@ -58,6 +58,8 @@ public class TestGenericUDFAddMonths extends TestCase {
runAndVerify("2016-02-29", -12, "2015-02-28", udf);
runAndVerify("2016-01-29", 1, "2016-02-29", udf);
runAndVerify("2016-02-29", -1, "2016-01-31", udf);
+ runAndVerify("1001-10-05", 1, "1001-11-05", udf);
+ runAndVerify("1582-10-05", 1, "1582-11-05", udf);
// ts str
runAndVerify("2014-01-14 10:30:00", 1, "2014-02-14", udf);
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateFormat.java
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateFormat.java
index 6a3cdda48a3..599f7814d41 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateFormat.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateFormat.java
@@ -30,6 +30,7 @@ import
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.io.Text;
+import org.junit.Test;
public class TestGenericUDFDateFormat extends TestCase {
@@ -39,7 +40,7 @@ public class TestGenericUDFDateFormat extends TestCase {
Text fmtText = new Text("EEEE");
ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory
.getPrimitiveWritableConstantObjectInspector(TypeInfoFactory.stringTypeInfo,
fmtText);
- ObjectInspector[] arguments = { valueOI0, valueOI1 };
+ ObjectInspector[] arguments = {valueOI0, valueOI1};
udf.initialize(arguments);
@@ -146,6 +147,19 @@ public class TestGenericUDFDateFormat extends TestCase {
runAndVerifyStr("2015-04-05", fmtText, null, udf);
}
+
+ @Test
+ public void testJulianDates() throws HiveException {
+ GenericUDFDateFormat udf = new GenericUDFDateFormat();
+ ObjectInspector valueOI0 =
PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+ Text fmtText = new Text("dd---MM--yyyy");
+ ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory
+
.getPrimitiveWritableConstantObjectInspector(TypeInfoFactory.stringTypeInfo,
fmtText);
+ ObjectInspector[] arguments = { valueOI0, valueOI1 };
+ udf.initialize(arguments);
+ runAndVerifyStr("1001-01-05", fmtText, "05---01--1001", udf);
+ }
+
private void runAndVerifyStr(String str, Text fmtText, String expResult,
GenericUDF udf)
throws HiveException {
DeferredObject valueObj0 = new DeferredJavaObject(str != null ? new
Text(str) : null);
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFMonthsBetween.java
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFMonthsBetween.java
index e9f32a1397a..894738f7d36 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFMonthsBetween.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFMonthsBetween.java
@@ -122,6 +122,9 @@ public class TestGenericUDFMonthsBetween extends TestCase {
runTestStr(null, null, null, udf);
runTestStr("2003-04-23", "2002-04-24", 11.96774194, udf);
+
+ //Test for Julian vs Gregorian dates
+ runTestStr("1582-10-05", "1582-11-05", -1., udf);
}
diff --git a/ql/src/test/queries/clientpositive/udf_day.q
b/ql/src/test/queries/clientpositive/udf_day.q
index fb9b57da015..4b2ad426bf1 100644
--- a/ql/src/test/queries/clientpositive/udf_day.q
+++ b/ql/src/test/queries/clientpositive/udf_day.q
@@ -1,2 +1,5 @@
DESCRIBE FUNCTION day;
DESCRIBE FUNCTION EXTENDED day;
+
+select month('2005-01-02');
+select month('1001-01-05');
diff --git a/ql/src/test/queries/clientpositive/udf_month.q
b/ql/src/test/queries/clientpositive/udf_month.q
index 0a582ba37e3..2b4363e6d45 100644
--- a/ql/src/test/queries/clientpositive/udf_month.q
+++ b/ql/src/test/queries/clientpositive/udf_month.q
@@ -1,2 +1,5 @@
-DESCRIBE FUNCTION minute;
-DESCRIBE FUNCTION EXTENDED minute;
+DESCRIBE FUNCTION month;
+DESCRIBE FUNCTION EXTENDED month;
+
+select month('2005-01-02');
+select month('1001-01-05');
diff --git a/ql/src/test/queries/clientpositive/udf_weekofyear.q
b/ql/src/test/queries/clientpositive/udf_weekofyear.q
index abb0a2d7d2c..c6a62215c83 100644
--- a/ql/src/test/queries/clientpositive/udf_weekofyear.q
+++ b/ql/src/test/queries/clientpositive/udf_weekofyear.q
@@ -6,3 +6,7 @@ DESCRIBE FUNCTION EXTENDED weekofyear;
SELECT weekofyear('1980-01-01'), weekofyear('1980-01-06'),
weekofyear('1980-01-07'), weekofyear('1980-12-31'),
weekofyear('1984-1-1'), weekofyear('2008-02-20 00:00:00'),
weekofyear('1980-12-28 23:59:59'), weekofyear('1980-12-29 23:59:59')
FROM src tablesample (1 rows);
+
+SELECT weekofyear('1007-01-01 10:13:14');
+SELECT weekofyear('1008-01-01 10:13:14');
+SELECT weekofyear('1009-01-01 10:13:14');
diff --git a/ql/src/test/queries/clientpositive/udf_year.q
b/ql/src/test/queries/clientpositive/udf_year.q
new file mode 100644
index 00000000000..23d7313d854
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/udf_year.q
@@ -0,0 +1,5 @@
+DESCRIBE FUNCTION year;
+DESCRIBE FUNCTION EXTENDED year;
+
+select year('2005-01-02');
+select year('1001-01-05');
diff --git
a/ql/src/test/results/clientpositive/llap/vectorized_timestamp_funcs.q.out
b/ql/src/test/results/clientpositive/llap/vectorized_timestamp_funcs.q.out
index 2412607420d..027e3e678c7 100644
--- a/ql/src/test/results/clientpositive/llap/vectorized_timestamp_funcs.q.out
+++ b/ql/src/test/results/clientpositive/llap/vectorized_timestamp_funcs.q.out
@@ -415,7 +415,7 @@ POSTHOOK: Input: default@alltypesorc_string
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 NULL 1969-12-31 15:59:55.451
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 NULL 1969-12-31 15:59:58.174
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 NULL 1969-12-31 15:59:58.456
--45479202281 528 10 25 25 43 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
+-45479202281 528 10 27 27 44 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
1632453512 2021 9 24 24 38 3 18 32
NULL 2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 1319-02-02 16:31:57.778
2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 NULL 1974-10-04 17:21:03.989
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 NULL
1999-10-03 16:59:10.396903939
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 NULL
2010-04-08 02:43:35.861742727
@@ -614,7 +614,7 @@ POSTHOOK: Input: default@alltypesorc_string
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
--62018199211 4 9 24 22 39 18 26 29
+-62018199211 4 9 22 22 39 18 26 29
1365554626 2013 4 10 10 15 0 43 46
206730996125 8521 1 16 16 3 20 42 5
271176065 1978 8 5 5 31 14 41 5
@@ -969,7 +969,7 @@ ORDER BY c1
POSTHOOK: type: QUERY
POSTHOOK: Input: default@alltypesorc_wrong
#### A masked pattern was here ####
-NULL 2 12 2 NULL 49 4 40 39
+NULL 2 11 30 NULL 48 4 40 39
NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL
PREHOOK: query: EXPLAIN VECTORIZATION EXPRESSION SELECT
diff --git
a/ql/src/test/results/clientpositive/spark/vectorized_timestamp_funcs.q.out
b/ql/src/test/results/clientpositive/spark/vectorized_timestamp_funcs.q.out
index 482086c86b3..888789d688f 100644
--- a/ql/src/test/results/clientpositive/spark/vectorized_timestamp_funcs.q.out
+++ b/ql/src/test/results/clientpositive/spark/vectorized_timestamp_funcs.q.out
@@ -413,7 +413,7 @@ POSTHOOK: Input: default@alltypesorc_string
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 NULL 1969-12-31 15:59:55.451
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 NULL 1969-12-31 15:59:58.174
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 NULL 1969-12-31 15:59:58.456
--45479202281 528 10 25 25 43 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
+-45479202281 528 10 27 27 44 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
1632453512 2021 9 24 24 38 3 18 32
NULL 2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 1319-02-02 16:31:57.778
2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 NULL 1974-10-04 17:21:03.989
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 NULL
1999-10-03 16:59:10.396903939
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 NULL
2010-04-08 02:43:35.861742727
@@ -610,7 +610,7 @@ POSTHOOK: Input: default@alltypesorc_string
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
--62018199211 4 9 24 22 39 18 26 29
+-62018199211 4 9 22 22 39 18 26 29
1365554626 2013 4 10 10 15 0 43 46
206730996125 8521 1 16 16 3 20 42 5
271176065 1978 8 5 5 31 14 41 5
@@ -961,7 +961,7 @@ ORDER BY c1
POSTHOOK: type: QUERY
POSTHOOK: Input: default@alltypesorc_wrong
#### A masked pattern was here ####
-NULL 2 12 2 NULL 49 4 40 39
+NULL 2 11 30 NULL 48 4 40 39
NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL
PREHOOK: query: EXPLAIN VECTORIZATION EXPRESSION SELECT
diff --git a/ql/src/test/results/clientpositive/udf_day.q.out
b/ql/src/test/results/clientpositive/udf_day.q.out
index 48e816123e5..8e12825caee 100644
--- a/ql/src/test/results/clientpositive/udf_day.q.out
+++ b/ql/src/test/results/clientpositive/udf_day.q.out
@@ -18,3 +18,21 @@ param can be one of:
30
Function class:org.apache.hadoop.hive.ql.udf.UDFDayOfMonth
Function type:BUILTIN
+PREHOOK: query: select month('2005-01-02')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select month('2005-01-02')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1
+PREHOOK: query: select month('1001-01-05')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select month('1001-01-05')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1
diff --git a/ql/src/test/results/clientpositive/udf_month.q.out
b/ql/src/test/results/clientpositive/udf_month.q.out
index c07c98fafb9..068f2ff2f4b 100644
--- a/ql/src/test/results/clientpositive/udf_month.q.out
+++ b/ql/src/test/results/clientpositive/udf_month.q.out
@@ -1,20 +1,37 @@
-PREHOOK: query: DESCRIBE FUNCTION minute
+PREHOOK: query: DESCRIBE FUNCTION month
PREHOOK: type: DESCFUNCTION
-POSTHOOK: query: DESCRIBE FUNCTION minute
+POSTHOOK: query: DESCRIBE FUNCTION month
POSTHOOK: type: DESCFUNCTION
-minute(param) - Returns the minute component of the string/timestamp/interval
-PREHOOK: query: DESCRIBE FUNCTION EXTENDED minute
+month(param) - Returns the month component of the date/timestamp/interval
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED month
PREHOOK: type: DESCFUNCTION
-POSTHOOK: query: DESCRIBE FUNCTION EXTENDED minute
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED month
POSTHOOK: type: DESCFUNCTION
-minute(param) - Returns the minute component of the string/timestamp/interval
+month(param) - Returns the month component of the date/timestamp/interval
param can be one of:
-1. A string in the format of 'yyyy-MM-dd HH:mm:ss' or 'HH:mm:ss'.
-2. A timestamp value
-3. A day-time interval valueExample:
- > SELECT minute('2009-07-30 12:58:59') FROM src LIMIT 1;
- 58
- > SELECT minute('12:58:59') FROM src LIMIT 1;
- 58
-Function class:org.apache.hadoop.hive.ql.udf.UDFMinute
+1. A string in the format of 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'.
+2. A date value
+3. A timestamp value
+4. A year-month interval valueExample:
+ > SELECT month('2009-07-30') FROM src LIMIT 1;
+ 7
+Function class:org.apache.hadoop.hive.ql.udf.UDFMonth
Function type:BUILTIN
+PREHOOK: query: select month('2005-01-02')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select month('2005-01-02')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1
+PREHOOK: query: select month('1001-01-05')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select month('1001-01-05')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1
diff --git a/ql/src/test/results/clientpositive/udf_weekofyear.q.out
b/ql/src/test/results/clientpositive/udf_weekofyear.q.out
index 6e6c661dbf6..f003af05c7e 100644
--- a/ql/src/test/results/clientpositive/udf_weekofyear.q.out
+++ b/ql/src/test/results/clientpositive/udf_weekofyear.q.out
@@ -28,3 +28,30 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@src
#### A masked pattern was here ####
1 1 2 1 52 8 52 1
+PREHOOK: query: SELECT weekofyear('1007-01-01 10:13:14')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT weekofyear('1007-01-01 10:13:14')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1
+PREHOOK: query: SELECT weekofyear('1008-01-01 10:13:14')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT weekofyear('1008-01-01 10:13:14')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+53
+PREHOOK: query: SELECT weekofyear('1009-01-01 10:13:14')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT weekofyear('1009-01-01 10:13:14')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+52
diff --git a/ql/src/test/results/clientpositive/udf_year.q.out
b/ql/src/test/results/clientpositive/udf_year.q.out
new file mode 100644
index 00000000000..49ca05649f6
--- /dev/null
+++ b/ql/src/test/results/clientpositive/udf_year.q.out
@@ -0,0 +1,37 @@
+PREHOOK: query: DESCRIBE FUNCTION year
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION year
+POSTHOOK: type: DESCFUNCTION
+year(param) - Returns the year component of the date/timestamp/interval
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED year
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED year
+POSTHOOK: type: DESCFUNCTION
+year(param) - Returns the year component of the date/timestamp/interval
+param can be one of:
+1. A string in the format of 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'.
+2. A date value
+3. A timestamp value
+4. A year-month interval valueExample:
+ > SELECT year('2009-07-30') FROM src LIMIT 1;
+ 2009
+Function class:org.apache.hadoop.hive.ql.udf.UDFYear
+Function type:BUILTIN
+PREHOOK: query: select year('2005-01-02')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select year('2005-01-02')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+2005
+PREHOOK: query: select year('1001-01-05')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select year('1001-01-05')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1001
diff --git
a/ql/src/test/results/clientpositive/vectorized_timestamp_funcs.q.out
b/ql/src/test/results/clientpositive/vectorized_timestamp_funcs.q.out
index 193c3231499..56cbf207747 100644
--- a/ql/src/test/results/clientpositive/vectorized_timestamp_funcs.q.out
+++ b/ql/src/test/results/clientpositive/vectorized_timestamp_funcs.q.out
@@ -398,7 +398,7 @@ POSTHOOK: Input: default@alltypesorc_string
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:55.451 NULL 1969-12-31 15:59:55.451
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.174 NULL 1969-12-31 15:59:58.174
-29 1969 12 31 31 1 23 59 30 NULL
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 1319-02-02 16:31:57.778
1969-12-31 23:59:30.929 1969-12-31 15:59:58.456 NULL 1969-12-31 15:59:58.456
--45479202281 528 10 25 25 43 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
+-45479202281 528 10 27 27 44 8 15 18
true 0528-10-27 08:15:18.941718273 NULL 0528-10-27 08:15:18.941718273
2000-12-18 08:42:30.0005 0528-10-27 08:15:18.941718273 0528-10-27
08:15:18.941718273 NULL
1632453512 2021 9 24 24 38 3 18 32
NULL 2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 1319-02-02 16:31:57.778
2021-09-24 03:18:32.4 1974-10-04 17:21:03.989 NULL 1974-10-04 17:21:03.989
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 1999-10-03 16:59:10.396903939 NULL
1999-10-03 16:59:10.396903939
1632453512 2021 9 24 24 38 3 18 32
false 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 1319-02-02
16:31:57.778 2021-09-24 03:18:32.4 2010-04-08 02:43:35.861742727 NULL
2010-04-08 02:43:35.861742727
@@ -580,7 +580,7 @@ POSTHOOK: Input: default@alltypesorc_string
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
-30 1969 12 31 31 1 23 59 30
--62018199211 4 9 24 22 39 18 26 29
+-62018199211 4 9 22 22 39 18 26 29
1365554626 2013 4 10 10 15 0 43 46
206730996125 8521 1 16 16 3 20 42 5
271176065 1978 8 5 5 31 14 41 5
@@ -901,7 +901,7 @@ ORDER BY c1
POSTHOOK: type: QUERY
POSTHOOK: Input: default@alltypesorc_wrong
#### A masked pattern was here ####
-NULL 2 12 2 NULL 49 4 40 39
+NULL 2 11 30 NULL 48 4 40 39
NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL
PREHOOK: query: EXPLAIN VECTORIZATION EXPRESSION SELECT