From e214a247f49344c2cc3a7b92d250a3ca730afe12 Mon Sep 17 00:00:00 2001 From: Deepesh Khandelwal Date: Wed, 15 Mar 2017 23:27:59 -0700 Subject: [PATCH] UDF Trunc support for quarter --- .../hive/ql/udf/generic/GenericUDFTrunc.java | 10 +- .../hive/ql/udf/generic/TestGenericUDFTrunc.java | 283 ++++++++++++++++ ql/src/test/queries/clientpositive/udf_trunc.q | 146 +++++++- ql/src/test/results/clientpositive/udf_trunc.q.out | 371 ++++++++++++++++++++- 4 files changed, 806 insertions(+), 4 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java index a95248f..d8368eb 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java @@ -63,12 +63,13 @@ */ @Description(name = "trunc", value = "_FUNC_(date, fmt) / _FUNC_(N,D) - Returns If input is date returns date with the time portion of the day truncated " + "to the unit specified by the format model fmt. If you omit fmt, then date is truncated to " - + "the nearest day. It now only supports 'MONTH'/'MON'/'MM' and 'YEAR'/'YYYY'/'YY' as format." + + "the nearest day. It currently only supports 'MONTH'/'MON'/'MM', 'QUARTER'/'Q' and 'YEAR'/'YYYY'/'YY' as format." + "If input is a number group returns N truncated to D decimal places. If D is omitted, then N is truncated to 0 places." + "D can be negative to truncate (make zero) D digits left of the decimal point." , extended = "date is a string in the format 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'." + " The time part of date is ignored.\n" + "Example:\n " + " > SELECT _FUNC_('2009-02-12', 'MM');\n" + "OK\n" + " '2009-02-01'" + "\n" + + " > SELECT _FUNC_('2017-03-15', 'Q');\n" + "OK\n" + " '2017-01-01'" + "\n" + " > SELECT _FUNC_('2015-10-27', 'YEAR');\n" + "OK\n" + " '2015-01-01'" + " > SELECT _FUNC_(1234567891.1234567891,4);\n" + "OK\n" + " 1234567891.1234" + "\n" + " > SELECT _FUNC_(1234567891.1234567891,-4);\n" + "OK\n" + " 1234560000" @@ -431,6 +432,13 @@ private Calendar evalDate(Date d) throws UDFArgumentException { if ("MONTH".equals(fmtInput) || "MON".equals(fmtInput) || "MM".equals(fmtInput)) { calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar; + } else if ("QUARTER".equals(fmtInput) || "Q".equals(fmtInput)) { + int month = calendar.get(Calendar.MONTH); + int quarter = month / 3; + int monthToSet = quarter * 3; + calendar.set(Calendar.MONTH, monthToSet); + calendar.set(Calendar.DAY_OF_MONTH, 1); + return calendar; } else if ("YEAR".equals(fmtInput) || "YYYY".equals(fmtInput) || "YY".equals(fmtInput)) { calendar.set(Calendar.MONTH, 0); calendar.set(Calendar.DAY_OF_MONTH, 1); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFTrunc.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFTrunc.java index 0021249..66bd7b4 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFTrunc.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFTrunc.java @@ -112,6 +112,108 @@ public void testStringToDateWithMonthFormat() throws HiveException { runAndVerify("2016-02-01", udf, initArgs, evalArgs); } + public void testStringToDateWithQuarterFormat() throws HiveException { + GenericUDFTrunc udf = new GenericUDFTrunc(); + ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector[] initArgs = { valueOI0, valueOI1}; + + DeferredObject valueObjFmt = new DeferredJavaObject(new Text("QUARTER")); + + DeferredObject valueObj0; + DeferredObject[] evalArgs; + + // test date string + valueObj0 = new DeferredJavaObject(new Text("2014-01-01")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-01-14")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-01-31")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-02-02")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-02-28")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-03")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-28")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-29")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-05-11")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-04-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-07-01")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-07-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-12-31")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-10-01", udf, initArgs, evalArgs); + + // test timestamp string + valueObj0 = new DeferredJavaObject(new Text("2014-01-01 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-01-14 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-01-31 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-02-02 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2014-02-28 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-03 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-28 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-02-29 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-05-11 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-04-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-07-01 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-07-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new Text("2016-12-31 10:30:45")); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-10-01", udf, initArgs, evalArgs); + } + public void testStringToDateWithYearFormat() throws HiveException { GenericUDFTrunc udf = new GenericUDFTrunc(); ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; @@ -284,6 +386,130 @@ public void testTimestampToDateWithMonthFormat() throws HiveException { runAndVerify("2016-02-01", udf, initArgs, evalArgs); } + public void testTimestampToDateWithQuarterFormat() throws HiveException { + GenericUDFTrunc udf = new GenericUDFTrunc(); + ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableTimestampObjectInspector; + ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector[] initArgs = { valueOI0, valueOI1}; + + DeferredObject valueObjFmt = new DeferredJavaObject(new Text("Q")); + + DeferredObject valueObj0; + DeferredObject[] evalArgs; + + // test date string + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-01 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-14 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-31 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-02-02 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-02-28 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-03 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-28 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-29 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-05-11 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-04-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-07-01 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-07-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-12-31 00:00:00"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-10-01", udf, initArgs, evalArgs); + + // test timestamp string + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-01 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-14 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-01-31 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-02-02 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2014-02-28 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-03 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-28 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-02-29 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-05-11 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-04-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-07-01 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-07-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new TimestampWritable( + Timestamp.valueOf("2016-12-31 10:30:45"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-10-01", udf, initArgs, evalArgs); + } + public void testTimestampToDateWithYearFormat() throws HiveException { GenericUDFTrunc udf = new GenericUDFTrunc(); ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableTimestampObjectInspector; @@ -423,6 +649,63 @@ public void testDateWritableToDateWithMonthFormat() throws HiveException { runAndVerify("2016-02-01", udf, initArgs, evalArgs); } + public void testDateWritableToDateWithQuarterFormat() throws HiveException { + GenericUDFTrunc udf = new GenericUDFTrunc(); + ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableDateObjectInspector; + ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector[] initArgs = { valueOI0, valueOI1}; + + DeferredObject valueObjFmt = new DeferredJavaObject(new Text("Q")); + + DeferredObject valueObj0; + DeferredObject[] evalArgs; + + // test date string + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2014-01-01"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2014-01-14"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2014-01-31"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2014-02-02"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2014-02-28"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2014-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-02-03"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-02-28"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-02-29"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-01-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-05-11"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-04-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-07-01"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-07-01", udf, initArgs, evalArgs); + + valueObj0 = new DeferredJavaObject(new DateWritable(Date.valueOf("2016-12-31"))); + evalArgs = new DeferredObject[] { valueObj0, valueObjFmt }; + runAndVerify("2016-10-01", udf, initArgs, evalArgs); + } + public void testDateWritableToDateWithYearFormat() throws HiveException { GenericUDFTrunc udf = new GenericUDFTrunc(); ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableDateObjectInspector; diff --git a/ql/src/test/queries/clientpositive/udf_trunc.q b/ql/src/test/queries/clientpositive/udf_trunc.q index 2ac40cf..e78cfcb 100644 --- a/ql/src/test/queries/clientpositive/udf_trunc.q +++ b/ql/src/test/queries/clientpositive/udf_trunc.q @@ -40,6 +40,57 @@ SELECT TRUNC('2016-02-28 10:30:45', 'MM'), TRUNC('2016-02-29 10:30:45', 'MM'); +--test string with 'Q' as format +EXPLAIN +SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q'); + + +SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q'); + --test string with 'YEAR' as format EXPLAIN SELECT @@ -119,6 +170,51 @@ SELECT TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'MM'), TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'MM'); +--test timestamp with 'Q' as format +EXPLAIN +SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q'); + + +SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q'); + --test timestamp with 'YEAR' as format EXPLAIN SELECT @@ -181,6 +277,35 @@ SELECT TRUNC(CAST('2016-02-28' AS DATE), 'MM'), TRUNC(CAST('2016-02-29' AS DATE), 'MM'); +--test date with 'Q' as format +EXPLAIN +SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q'); + + +SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q'); + --test date with 'YEAR' as format EXPLAIN SELECT @@ -224,6 +349,25 @@ SELECT TRUNC('2014-01-01', CAST(null AS STRING)); +--test misc with 'Q' as format +EXPLAIN +SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)); + +SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)); + + --test misc with 'YEAR' as format EXPLAIN SELECT @@ -240,4 +384,4 @@ SELECT TRUNC(CAST(null AS DATE), 'YEAR'), TRUNC(CAST(null AS TIMESTAMP), 'YEAR'), TRUNC('2014-01-01', 'M'), - TRUNC('2014-01-01', CAST(null AS STRING)); \ No newline at end of file + TRUNC('2014-01-01', CAST(null AS STRING)); diff --git a/ql/src/test/results/clientpositive/udf_trunc.q.out b/ql/src/test/results/clientpositive/udf_trunc.q.out index 7874d52..efd67ca 100644 --- a/ql/src/test/results/clientpositive/udf_trunc.q.out +++ b/ql/src/test/results/clientpositive/udf_trunc.q.out @@ -2,17 +2,20 @@ PREHOOK: query: DESCRIBE FUNCTION trunc PREHOOK: type: DESCFUNCTION POSTHOOK: query: DESCRIBE FUNCTION trunc POSTHOOK: type: DESCFUNCTION -trunc(date, fmt) / trunc(N,D) - Returns If input is date returns date with the time portion of the day truncated to the unit specified by the format model fmt. If you omit fmt, then date is truncated to the nearest day. It now only supports 'MONTH'/'MON'/'MM' and 'YEAR'/'YYYY'/'YY' as format.If input is a number group returns N truncated to D decimal places. If D is omitted, then N is truncated to 0 places.D can be negative to truncate (make zero) D digits left of the decimal point. +trunc(date, fmt) / trunc(N,D) - Returns If input is date returns date with the time portion of the day truncated to the unit specified by the format model fmt. If you omit fmt, then date is truncated to the nearest day. It currently only supports 'MONTH'/'MON'/'MM', 'QUARTER'/'Q' and 'YEAR'/'YYYY'/'YY' as format.If input is a number group returns N truncated to D decimal places. If D is omitted, then N is truncated to 0 places.D can be negative to truncate (make zero) D digits left of the decimal point. PREHOOK: query: DESCRIBE FUNCTION EXTENDED trunc PREHOOK: type: DESCFUNCTION POSTHOOK: query: DESCRIBE FUNCTION EXTENDED trunc POSTHOOK: type: DESCFUNCTION -trunc(date, fmt) / trunc(N,D) - Returns If input is date returns date with the time portion of the day truncated to the unit specified by the format model fmt. If you omit fmt, then date is truncated to the nearest day. It now only supports 'MONTH'/'MON'/'MM' and 'YEAR'/'YYYY'/'YY' as format.If input is a number group returns N truncated to D decimal places. If D is omitted, then N is truncated to 0 places.D can be negative to truncate (make zero) D digits left of the decimal point. +trunc(date, fmt) / trunc(N,D) - Returns If input is date returns date with the time portion of the day truncated to the unit specified by the format model fmt. If you omit fmt, then date is truncated to the nearest day. It currently only supports 'MONTH'/'MON'/'MM', 'QUARTER'/'Q' and 'YEAR'/'YYYY'/'YY' as format.If input is a number group returns N truncated to D decimal places. If D is omitted, then N is truncated to 0 places.D can be negative to truncate (make zero) D digits left of the decimal point. date is a string in the format 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'. The time part of date is ignored. Example: > SELECT trunc('2009-02-12', 'MM'); OK '2009-02-01' + > SELECT trunc('2017-03-15', 'Q'); +OK + '2017-01-01' > SELECT trunc('2015-10-27', 'YEAR'); OK '2015-01-01' > SELECT trunc(1234567891.1234567891,4); @@ -127,6 +130,127 @@ POSTHOOK: Input: _dummy_database@_dummy_table 2014-01-01 2014-01-01 2014-01-01 2014-02-01 2014-02-01 2016-02-01 2016-02-01 2016-02-01 2014-01-01 2014-01-01 2014-01-01 2014-02-01 2014-02-01 2016-02-01 2016-02-01 2016-02-01 PREHOOK: query: EXPLAIN SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q') +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q') +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: _dummy_table + Row Limit Per Split: 1 + Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE + Select Operator + expressions: '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-04-01' (type: string), '2016-07-01' (type: string), '2016-10-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-04-01' (type: string), '2016-07-01' (type: string), '2016-10-01' (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21 + Statistics: Num rows: 1 Data size: 2068 Basic stats: COMPLETE Column stats: COMPLETE + ListSink + +PREHOOK: query: SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-14', 'Q'), + TRUNC('2014-01-31', 'Q'), + TRUNC('2014-02-02', 'Q'), + TRUNC('2014-02-28', 'Q'), + TRUNC('2016-02-03', 'Q'), + TRUNC('2016-02-28', 'Q'), + TRUNC('2016-02-29', 'Q'), + TRUNC('2016-05-11', 'Q'), + TRUNC('2016-07-01', 'Q'), + TRUNC('2016-12-31', 'Q'), + TRUNC('2014-01-01 10:30:45', 'Q'), + TRUNC('2014-01-14 10:30:45', 'Q'), + TRUNC('2014-01-31 10:30:45', 'Q'), + TRUNC('2014-02-02 10:30:45', 'Q'), + TRUNC('2014-02-28 10:30:45', 'Q'), + TRUNC('2016-02-03 10:30:45', 'Q'), + TRUNC('2016-02-28 10:30:45', 'Q'), + TRUNC('2016-02-29 10:30:45', 'Q'), + TRUNC('2016-05-11 10:30:45', 'Q'), + TRUNC('2016-07-01 10:30:45', 'Q'), + TRUNC('2016-12-31 10:30:45', 'Q') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2014-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2016-01-01 2016-01-01 2016-01-01 2016-04-01 2016-07-01 2016-10-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2016-01-01 2016-01-01 2016-01-01 2016-04-01 2016-07-01 2016-10-01 +PREHOOK: query: EXPLAIN +SELECT TRUNC('2014-01-01', 'YEAR'), TRUNC('2014-01-14', 'YEAR'), TRUNC('2014-01-31', 'YEAR'), @@ -321,6 +445,115 @@ POSTHOOK: Input: _dummy_database@_dummy_table 2014-01-01 2014-01-01 2014-01-01 2014-02-01 2014-02-01 2016-02-01 2016-02-01 2016-02-01 2014-01-01 2014-01-01 2014-01-01 2014-02-01 2014-02-01 2016-02-01 2016-02-01 2016-02-01 PREHOOK: query: EXPLAIN SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q') +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q') +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: _dummy_table + Row Limit Per Split: 1 + Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE + Select Operator + expressions: '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-04-01' (type: string), '2016-07-01' (type: string), '2016-10-01' (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18 + Statistics: Num rows: 1 Data size: 1786 Basic stats: COMPLETE Column stats: COMPLETE + ListSink + +PREHOOK: query: SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT + TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 00:00:00' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-14 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-01-31 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-02 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2014-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-03 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-28 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-02-29 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-05-11 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-07-01 10:30:45' AS TIMESTAMP), 'Q'), + TRUNC(CAST('2016-12-31 10:30:45' AS TIMESTAMP), 'Q') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2014-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2016-01-01 2016-01-01 2016-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2016-01-01 2016-01-01 2016-01-01 2016-04-01 2016-07-01 2016-10-01 +PREHOOK: query: EXPLAIN +SELECT TRUNC(CAST('2014-01-01 00:00:00' AS TIMESTAMP), 'YEAR'), TRUNC(CAST('2014-01-14 00:00:00' AS TIMESTAMP), 'YEAR'), TRUNC(CAST('2014-01-31 00:00:00' AS TIMESTAMP), 'YEAR'), @@ -483,6 +716,83 @@ POSTHOOK: Input: _dummy_database@_dummy_table 2014-01-01 2014-01-01 2014-01-01 2014-02-01 2014-02-01 2016-02-01 2016-02-01 2016-02-01 PREHOOK: query: EXPLAIN SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q') +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q') +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: _dummy_table + Row Limit Per Split: 1 + Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE + Select Operator + expressions: '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2014-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-01-01' (type: string), '2016-04-01' (type: string), '2016-07-01' (type: string), '2016-10-01' (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10 + Statistics: Num rows: 1 Data size: 1034 Basic stats: COMPLETE Column stats: COMPLETE + ListSink + +PREHOOK: query: SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT + TRUNC(CAST('2014-01-01' AS DATE), 'Q'), + TRUNC(CAST('2014-01-14' AS DATE), 'Q'), + TRUNC(CAST('2014-01-31' AS DATE), 'Q'), + TRUNC(CAST('2014-02-02' AS DATE), 'Q'), + TRUNC(CAST('2014-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-03' AS DATE), 'Q'), + TRUNC(CAST('2016-02-28' AS DATE), 'Q'), + TRUNC(CAST('2016-02-29' AS DATE), 'Q'), + TRUNC(CAST('2016-05-11' AS DATE), 'Q'), + TRUNC(CAST('2016-07-01' AS DATE), 'Q'), + TRUNC(CAST('2016-12-31' AS DATE), 'Q') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2014-01-01 2014-01-01 2014-01-01 2014-01-01 2014-01-01 2016-01-01 2016-01-01 2016-01-01 2016-04-01 2016-07-01 2016-10-01 +PREHOOK: query: EXPLAIN +SELECT TRUNC(CAST('2014-01-01' AS DATE), 'YEAR'), TRUNC(CAST('2014-01-14' AS DATE), 'YEAR'), TRUNC(CAST('2014-01-31' AS DATE), 'YEAR'), @@ -605,6 +915,63 @@ POSTHOOK: Input: _dummy_database@_dummy_table 2014-02-01 NULL NULL NULL NULL NULL PREHOOK: query: EXPLAIN SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)) +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)) +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: _dummy_table + Row Limit Per Split: 1 + Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE + Select Operator + expressions: '2014-01-01' (type: string), null (type: string), null (type: string), null (type: string), '2014-01-01' (type: string), null (type: string) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5 + Statistics: Num rows: 1 Data size: 524 Basic stats: COMPLETE Column stats: COMPLETE + ListSink + +PREHOOK: query: SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT + TRUNC('2014-01-34', 'Q'), + TRUNC(CAST(null AS STRING), 'Q'), + TRUNC(CAST(null AS DATE), 'Q'), + TRUNC(CAST(null AS TIMESTAMP), 'Q'), + TRUNC('2014-01-01', 'Q'), + TRUNC('2014-01-01', CAST(null AS STRING)) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2014-01-01 NULL NULL NULL 2014-01-01 NULL +PREHOOK: query: EXPLAIN +SELECT TRUNC('2014-01-34', 'YEAR'), TRUNC(CAST(null AS STRING), 'YEAR'), TRUNC(CAST(null AS DATE), 'YEAR'), -- 2.9.3 (Apple Git-75)