You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2015/05/05 07:54:51 UTC
hive git commit: HIVE-3404: Create quarter UDF (Alex Pivovarov via
Jason Dere)
Repository: hive
Updated Branches:
refs/heads/master ff64f1db3 -> ec12a61b1
HIVE-3404: Create quarter UDF (Alex Pivovarov via Jason Dere)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/ec12a61b
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/ec12a61b
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/ec12a61b
Branch: refs/heads/master
Commit: ec12a61b129aea416df8913acfb0212f4b09104d
Parents: ff64f1d
Author: Jason Dere <jd...@hortonworks.com>
Authored: Mon May 4 22:54:21 2015 -0700
Committer: Jason Dere <jd...@hortonworks.com>
Committed: Mon May 4 22:54:21 2015 -0700
----------------------------------------------------------------------
.../hadoop/hive/ql/exec/FunctionRegistry.java | 1 +
.../hive/ql/udf/generic/GenericUDFQuarter.java | 85 +++++++
.../ql/udf/generic/TestGenericUDFQuarter.java | 182 ++++++++++++++
.../test/queries/clientpositive/udf_quarter.q | 100 ++++++++
.../results/clientpositive/show_functions.q.out | 1 +
.../results/clientpositive/udf_quarter.q.out | 246 +++++++++++++++++++
6 files changed, 615 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
index 10a7502..bf2809c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
@@ -258,6 +258,7 @@ public final class FunctionRegistry {
system.registerUDF("day", UDFDayOfMonth.class, false);
system.registerUDF("dayofmonth", UDFDayOfMonth.class, false);
system.registerUDF("month", UDFMonth.class, false);
+ system.registerGenericUDF("quarter", GenericUDFQuarter.class);
system.registerUDF("year", UDFYear.class, false);
system.registerUDF("hour", UDFHour.class, false);
system.registerUDF("minute", UDFMinute.class, false);
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFQuarter.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFQuarter.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFQuarter.java
new file mode 100644
index 0000000..8eef947
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFQuarter.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import static org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping.DATE_GROUP;
+import static org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping.STRING_GROUP;
+import static org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping.VOID_GROUP;
+
+import java.util.Calendar;
+import java.util.Date;
+
+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.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.IntWritable;
+
+/**
+ * GenericUDFQuarter.
+ *
+ * Returns the quarter of the year for date, in the range 1 to 4.
+ *
+ */
+@Description(name = "quarter", value = "_FUNC_(date/timestamp/string) - Returns the "
+ + "quarter of the year for date, in the range 1 to 4.",
+ extended = "Example: > SELECT _FUNC_('2015-04-08');\n 2")
+public class GenericUDFQuarter extends GenericUDF {
+ private transient Converter[] converters = new Converter[1];
+ private transient PrimitiveCategory[] inputTypes = new PrimitiveCategory[1];
+ private final Calendar calendar = Calendar.getInstance();
+ private final IntWritable output = new IntWritable();
+
+ @Override
+ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+ checkArgsSize(arguments, 1, 1);
+ checkArgPrimitive(arguments, 0);
+ checkArgGroups(arguments, 0, inputTypes, STRING_GROUP, DATE_GROUP, VOID_GROUP);
+ obtainDateConverter(arguments, 0, inputTypes, converters);
+
+ ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+ return outputOI;
+ }
+
+ @Override
+ public Object evaluate(DeferredObject[] arguments) throws HiveException {
+ Date date = getDateValue(arguments, 0, inputTypes, converters);
+ if (date == null) {
+ return null;
+ }
+ calendar.setTime(date);
+ int month = calendar.get(Calendar.MONTH);
+ int quarter = (month + 3) / 3;
+
+ output.set(quarter);
+ return output;
+ }
+
+ @Override
+ protected String getFuncName() {
+ return "quarter";
+ }
+
+ @Override
+ public String getDisplayString(String[] children) {
+ return getStandardDisplayString(getFuncName(), children);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFQuarter.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFQuarter.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFQuarter.java
new file mode 100644
index 0000000..5d38fd6
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFQuarter.java
@@ -0,0 +1,182 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import java.sql.Date;
+import java.sql.Timestamp;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+
+public class TestGenericUDFQuarter extends TestCase {
+
+ public void testQuarterStr() throws HiveException {
+ GenericUDFQuarter udf = new GenericUDFQuarter();
+ ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+ ObjectInspector[] arguments = { valueOI0 };
+
+ udf.initialize(arguments);
+
+ // date str
+ runAndVerifyStr("2014-01-10", 1, udf);
+ runAndVerifyStr("2014-02-10", 1, udf);
+ runAndVerifyStr("2014-03-31", 1, udf);
+ runAndVerifyStr("2014-04-02", 2, udf);
+ runAndVerifyStr("2014-05-28", 2, udf);
+ runAndVerifyStr("2016-06-03", 2, udf);
+ runAndVerifyStr("2016-07-28", 3, udf);
+ runAndVerifyStr("2016-08-29", 3, udf);
+ runAndVerifyStr("2016-09-29", 3, udf);
+ runAndVerifyStr("2016-10-29", 4, udf);
+ runAndVerifyStr("2016-11-29", 4, udf);
+ runAndVerifyStr("2016-12-29", 4, udf);
+ // wrong date str
+ runAndVerifyStr("2016-03-35", 2, udf);
+ runAndVerifyStr("2014-01-32", 1, udf);
+ runAndVerifyStr("01/14/2014", null, udf);
+ runAndVerifyStr(null, null, udf);
+ // negative Unix time
+ runAndVerifyStr("1966-01-01", 1, udf);
+ runAndVerifyStr("1966-03-31", 1, udf);
+ runAndVerifyStr("1966-04-01", 2, udf);
+ runAndVerifyStr("1966-12-31", 4, udf);
+
+ // ts str
+ runAndVerifyStr("2014-01-01 00:00:00", 1, udf);
+ runAndVerifyStr("2014-02-10 15:23:00", 1, udf);
+ runAndVerifyStr("2014-03-31 15:23:00", 1, udf);
+ runAndVerifyStr("2014-04-02 15:23:00", 2, udf);
+ runAndVerifyStr("2014-05-28 15:23:00", 2, udf);
+ runAndVerifyStr("2016-06-03 15:23:00", 2, udf);
+ runAndVerifyStr("2016-07-28 15:23:00", 3, udf);
+ runAndVerifyStr("2016-08-29 15:23:00", 3, udf);
+ runAndVerifyStr("2016-09-29 15:23:00", 3, udf);
+ runAndVerifyStr("2016-10-29 15:23:00", 4, udf);
+ runAndVerifyStr("2016-11-29 15:23:00", 4, udf);
+ runAndVerifyStr("2016-12-31 23:59:59.999", 4, udf);
+ // wrong date str
+ runAndVerifyStr("2016-03-35 15:23:00", 2, udf);
+ runAndVerifyStr("2014-01-32 15:23:00", 1, udf);
+ runAndVerifyStr("01/14/2014 15:23:00", null, udf);
+ runAndVerifyStr(null, null, udf);
+ // negative Unix time
+ runAndVerifyStr("1966-01-01 00:00:00", 1, udf);
+ runAndVerifyStr("1966-03-31 23:59:59.999", 1, udf);
+ runAndVerifyStr("1966-04-01 00:00:00", 2, udf);
+ runAndVerifyStr("1966-12-31 23:59:59.999", 4, udf);
+ }
+
+ public void testQuarterDt() throws HiveException {
+ GenericUDFQuarter udf = new GenericUDFQuarter();
+ ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableDateObjectInspector;
+ ObjectInspector[] arguments = { valueOI0 };
+
+ udf.initialize(arguments);
+ // positive Unix time
+ runAndVerifyDt("2014-01-01", 1, udf);
+ runAndVerifyDt("2014-02-10", 1, udf);
+ runAndVerifyDt("2014-03-31", 1, udf);
+ runAndVerifyDt("2014-04-02", 2, udf);
+ runAndVerifyDt("2014-05-28", 2, udf);
+ runAndVerifyDt("2016-06-03", 2, udf);
+ runAndVerifyDt("2016-07-28", 3, udf);
+ runAndVerifyDt("2016-08-29", 3, udf);
+ runAndVerifyDt("2016-09-29", 3, udf);
+ runAndVerifyDt("2016-10-29", 4, udf);
+ runAndVerifyDt("2016-11-29", 4, udf);
+ runAndVerifyDt("2016-12-31", 4, udf);
+ // negative Unix time
+ runAndVerifyDt("1966-01-01", 1, udf);
+ runAndVerifyDt("1966-03-31", 1, udf);
+ runAndVerifyDt("1966-04-01", 2, udf);
+ runAndVerifyDt("1966-12-31", 4, udf);
+ }
+
+ public void testQuarterTs() throws HiveException {
+ GenericUDFQuarter udf = new GenericUDFQuarter();
+ ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableTimestampObjectInspector;
+ ObjectInspector[] arguments = { valueOI0 };
+
+ udf.initialize(arguments);
+ // positive Unix time
+ runAndVerifyTs("2014-01-01 00:00:00", 1, udf);
+ runAndVerifyTs("2014-02-10 15:23:00", 1, udf);
+ runAndVerifyTs("2014-03-31 15:23:00", 1, udf);
+ runAndVerifyTs("2014-04-02 15:23:00", 2, udf);
+ runAndVerifyTs("2014-05-28 15:23:00", 2, udf);
+ runAndVerifyTs("2016-06-03 15:23:00", 2, udf);
+ runAndVerifyTs("2016-07-28 15:23:00", 3, udf);
+ runAndVerifyTs("2016-08-29 15:23:00", 3, udf);
+ runAndVerifyTs("2016-09-29 15:23:00", 3, udf);
+ runAndVerifyTs("2016-10-29 15:23:00", 4, udf);
+ runAndVerifyTs("2016-11-29 15:23:00", 4, udf);
+ runAndVerifyTs("2016-12-31 23:59:59.999", 4, udf);
+ // negative Unix time
+ runAndVerifyTs("1966-01-01 00:00:00", 1, udf);
+ runAndVerifyTs("1966-03-31 23:59:59", 1, udf);
+ runAndVerifyTs("1966-04-01 00:00:00", 2, udf);
+ runAndVerifyTs("1966-12-31 23:59:59.999", 4, udf);
+ }
+
+ private void runAndVerifyStr(String str, Integer expResult, GenericUDF udf) throws HiveException {
+ DeferredObject valueObj0 = new DeferredJavaObject(str != null ? new Text(str) : null);
+ DeferredObject[] args = { valueObj0 };
+ IntWritable output = (IntWritable) udf.evaluate(args);
+ if (expResult == null) {
+ assertNull(output);
+ } else {
+ assertNotNull(output);
+ assertEquals("quarter() test ", expResult.intValue(), output.get());
+ }
+ }
+
+ private void runAndVerifyDt(String str, Integer expResult, GenericUDF udf) throws HiveException {
+ DeferredObject valueObj0 = new DeferredJavaObject(str != null ? new DateWritable(
+ Date.valueOf(str)) : null);
+ DeferredObject[] args = { valueObj0 };
+ IntWritable output = (IntWritable) udf.evaluate(args);
+ if (expResult == null) {
+ assertNull(output);
+ } else {
+ assertNotNull(output);
+ assertEquals("quarter() test ", expResult.intValue(), output.get());
+ }
+ }
+
+ private void runAndVerifyTs(String str, Integer expResult, GenericUDF udf) throws HiveException {
+ DeferredObject valueObj0 = new DeferredJavaObject(str != null ? new TimestampWritable(
+ Timestamp.valueOf(str)) : null);
+ DeferredObject[] args = { valueObj0 };
+ IntWritable output = (IntWritable) udf.evaluate(args);
+ if (expResult == null) {
+ assertNull(output);
+ } else {
+ assertNotNull(output);
+ assertEquals("quarter() test ", expResult.intValue(), output.get());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/test/queries/clientpositive/udf_quarter.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/udf_quarter.q b/ql/src/test/queries/clientpositive/udf_quarter.q
new file mode 100644
index 0000000..fe5d5cf
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/udf_quarter.q
@@ -0,0 +1,100 @@
+DESCRIBE FUNCTION quarter;
+DESC FUNCTION EXTENDED quarter;
+
+explain select quarter('2015-04-24');
+
+-- string date
+select
+quarter('2014-01-10'),
+quarter('2014-02-10'),
+quarter('2014-03-31'),
+quarter('2014-04-02'),
+quarter('2014-05-28'),
+quarter('2016-06-03'),
+quarter('2016-07-28'),
+quarter('2016-08-29'),
+quarter('2016-09-29'),
+quarter('2016-10-29'),
+quarter('2016-11-29'),
+quarter('2016-12-29'),
+-- wrong date str
+quarter('2016-03-35'),
+quarter('2014-01-32'),
+quarter('01/14/2014'),
+-- null string
+quarter(cast(null as string)),
+-- negative Unix time
+quarter('1966-01-01'),
+quarter('1966-03-31'),
+quarter('1966-04-01'),
+quarter('1966-12-31');
+
+-- string timestamp
+select
+quarter('2014-01-10 00:00:00'),
+quarter('2014-02-10 15:23:00'),
+quarter('2014-03-31 15:23:00'),
+quarter('2014-04-02 15:23:00'),
+quarter('2014-05-28 15:23:00'),
+quarter('2016-06-03 15:23:00'),
+quarter('2016-07-28 15:23:00'),
+quarter('2016-08-29 15:23:00'),
+quarter('2016-09-29 15:23:00'),
+quarter('2016-10-29 15:23:00'),
+quarter('2016-11-29 15:23:00'),
+quarter('2016-12-29 15:23:00'),
+-- wrong date str
+quarter('2016-03-35 15:23:00'),
+quarter('2014-01-32 15:23:00'),
+quarter('01/14/2014 15:23:00'),
+-- null VOID type
+quarter(null),
+-- negative Unix time
+quarter('1966-01-01 00:00:00'),
+quarter('1966-03-31 23:59:59.999'),
+quarter('1966-04-01 00:00:00'),
+quarter('1966-12-31 23:59:59.999');
+
+-- date
+select
+quarter(cast('2014-01-10' as date)),
+quarter(cast('2014-02-10' as date)),
+quarter(cast('2014-03-31' as date)),
+quarter(cast('2014-04-02' as date)),
+quarter(cast('2014-05-28' as date)),
+quarter(cast('2016-06-03' as date)),
+quarter(cast('2016-07-28' as date)),
+quarter(cast('2016-08-29' as date)),
+quarter(cast('2016-09-29' as date)),
+quarter(cast('2016-10-29' as date)),
+quarter(cast('2016-11-29' as date)),
+quarter(cast('2016-12-29' as date)),
+-- null date
+quarter(cast(null as date)),
+-- negative Unix time
+quarter(cast('1966-01-01' as date)),
+quarter(cast('1966-03-31' as date)),
+quarter(cast('1966-04-01' as date)),
+quarter(cast('1966-12-31' as date));
+
+-- timestamp
+select
+quarter(cast('2014-01-10 00:00:00' as timestamp)),
+quarter(cast('2014-02-10 15:23:00' as timestamp)),
+quarter(cast('2014-03-31 15:23:00' as timestamp)),
+quarter(cast('2014-04-02 15:23:00' as timestamp)),
+quarter(cast('2014-05-28 15:23:00' as timestamp)),
+quarter(cast('2016-06-03 15:23:00' as timestamp)),
+quarter(cast('2016-07-28 15:23:00' as timestamp)),
+quarter(cast('2016-08-29 15:23:00' as timestamp)),
+quarter(cast('2016-09-29 15:23:00' as timestamp)),
+quarter(cast('2016-10-29 15:23:00' as timestamp)),
+quarter(cast('2016-11-29 15:23:00' as timestamp)),
+quarter(cast('2016-12-29 15:23:00' as timestamp)),
+-- null timestamp
+quarter(cast(null as timestamp)),
+-- negative Unix time
+quarter(cast('1966-01-01 00:00:00' as timestamp)),
+quarter(cast('1966-03-31 23:59:59.999' as timestamp)),
+quarter(cast('1966-04-01 00:00:00' as timestamp)),
+quarter(cast('1966-12-31 23:59:59.999' as timestamp));
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/test/results/clientpositive/show_functions.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/show_functions.q.out b/ql/src/test/results/clientpositive/show_functions.q.out
index 6f3c784..ffc32c8 100644
--- a/ql/src/test/results/clientpositive/show_functions.q.out
+++ b/ql/src/test/results/clientpositive/show_functions.q.out
@@ -151,6 +151,7 @@ positive
pow
power
printf
+quarter
radians
rand
rank
http://git-wip-us.apache.org/repos/asf/hive/blob/ec12a61b/ql/src/test/results/clientpositive/udf_quarter.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/udf_quarter.q.out b/ql/src/test/results/clientpositive/udf_quarter.q.out
new file mode 100644
index 0000000..b29ba4a
--- /dev/null
+++ b/ql/src/test/results/clientpositive/udf_quarter.q.out
@@ -0,0 +1,246 @@
+PREHOOK: query: DESCRIBE FUNCTION quarter
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION quarter
+POSTHOOK: type: DESCFUNCTION
+quarter(date/timestamp/string) - Returns the quarter of the year for date, in the range 1 to 4.
+PREHOOK: query: DESC FUNCTION EXTENDED quarter
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESC FUNCTION EXTENDED quarter
+POSTHOOK: type: DESCFUNCTION
+quarter(date/timestamp/string) - Returns the quarter of the year for date, in the range 1 to 4.
+Example: > SELECT quarter('2015-04-08');
+ 2
+PREHOOK: query: explain select quarter('2015-04-24')
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select quarter('2015-04-24')
+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: 0 Data size: 1 Basic stats: PARTIAL Column stats: COMPLETE
+ Select Operator
+ expressions: 2 (type: int)
+ outputColumnNames: _col0
+ Statistics: Num rows: 0 Data size: 1 Basic stats: PARTIAL Column stats: COMPLETE
+ ListSink
+
+PREHOOK: query: -- string date
+select
+quarter('2014-01-10'),
+quarter('2014-02-10'),
+quarter('2014-03-31'),
+quarter('2014-04-02'),
+quarter('2014-05-28'),
+quarter('2016-06-03'),
+quarter('2016-07-28'),
+quarter('2016-08-29'),
+quarter('2016-09-29'),
+quarter('2016-10-29'),
+quarter('2016-11-29'),
+quarter('2016-12-29'),
+-- wrong date str
+quarter('2016-03-35'),
+quarter('2014-01-32'),
+quarter('01/14/2014'),
+-- null string
+quarter(cast(null as string)),
+-- negative Unix time
+quarter('1966-01-01'),
+quarter('1966-03-31'),
+quarter('1966-04-01'),
+quarter('1966-12-31')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: -- string date
+select
+quarter('2014-01-10'),
+quarter('2014-02-10'),
+quarter('2014-03-31'),
+quarter('2014-04-02'),
+quarter('2014-05-28'),
+quarter('2016-06-03'),
+quarter('2016-07-28'),
+quarter('2016-08-29'),
+quarter('2016-09-29'),
+quarter('2016-10-29'),
+quarter('2016-11-29'),
+quarter('2016-12-29'),
+-- wrong date str
+quarter('2016-03-35'),
+quarter('2014-01-32'),
+quarter('01/14/2014'),
+-- null string
+quarter(cast(null as string)),
+-- negative Unix time
+quarter('1966-01-01'),
+quarter('1966-03-31'),
+quarter('1966-04-01'),
+quarter('1966-12-31')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1 1 1 2 2 2 3 3 3 4 4 4 2 1 NULL NULL 1 1 2 4
+PREHOOK: query: -- string timestamp
+select
+quarter('2014-01-10 00:00:00'),
+quarter('2014-02-10 15:23:00'),
+quarter('2014-03-31 15:23:00'),
+quarter('2014-04-02 15:23:00'),
+quarter('2014-05-28 15:23:00'),
+quarter('2016-06-03 15:23:00'),
+quarter('2016-07-28 15:23:00'),
+quarter('2016-08-29 15:23:00'),
+quarter('2016-09-29 15:23:00'),
+quarter('2016-10-29 15:23:00'),
+quarter('2016-11-29 15:23:00'),
+quarter('2016-12-29 15:23:00'),
+-- wrong date str
+quarter('2016-03-35 15:23:00'),
+quarter('2014-01-32 15:23:00'),
+quarter('01/14/2014 15:23:00'),
+-- null VOID type
+quarter(null),
+-- negative Unix time
+quarter('1966-01-01 00:00:00'),
+quarter('1966-03-31 23:59:59.999'),
+quarter('1966-04-01 00:00:00'),
+quarter('1966-12-31 23:59:59.999')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: -- string timestamp
+select
+quarter('2014-01-10 00:00:00'),
+quarter('2014-02-10 15:23:00'),
+quarter('2014-03-31 15:23:00'),
+quarter('2014-04-02 15:23:00'),
+quarter('2014-05-28 15:23:00'),
+quarter('2016-06-03 15:23:00'),
+quarter('2016-07-28 15:23:00'),
+quarter('2016-08-29 15:23:00'),
+quarter('2016-09-29 15:23:00'),
+quarter('2016-10-29 15:23:00'),
+quarter('2016-11-29 15:23:00'),
+quarter('2016-12-29 15:23:00'),
+-- wrong date str
+quarter('2016-03-35 15:23:00'),
+quarter('2014-01-32 15:23:00'),
+quarter('01/14/2014 15:23:00'),
+-- null VOID type
+quarter(null),
+-- negative Unix time
+quarter('1966-01-01 00:00:00'),
+quarter('1966-03-31 23:59:59.999'),
+quarter('1966-04-01 00:00:00'),
+quarter('1966-12-31 23:59:59.999')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1 1 1 2 2 2 3 3 3 4 4 4 2 1 NULL NULL 1 1 2 4
+PREHOOK: query: -- date
+select
+quarter(cast('2014-01-10' as date)),
+quarter(cast('2014-02-10' as date)),
+quarter(cast('2014-03-31' as date)),
+quarter(cast('2014-04-02' as date)),
+quarter(cast('2014-05-28' as date)),
+quarter(cast('2016-06-03' as date)),
+quarter(cast('2016-07-28' as date)),
+quarter(cast('2016-08-29' as date)),
+quarter(cast('2016-09-29' as date)),
+quarter(cast('2016-10-29' as date)),
+quarter(cast('2016-11-29' as date)),
+quarter(cast('2016-12-29' as date)),
+-- null date
+quarter(cast(null as date)),
+-- negative Unix time
+quarter(cast('1966-01-01' as date)),
+quarter(cast('1966-03-31' as date)),
+quarter(cast('1966-04-01' as date)),
+quarter(cast('1966-12-31' as date))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: -- date
+select
+quarter(cast('2014-01-10' as date)),
+quarter(cast('2014-02-10' as date)),
+quarter(cast('2014-03-31' as date)),
+quarter(cast('2014-04-02' as date)),
+quarter(cast('2014-05-28' as date)),
+quarter(cast('2016-06-03' as date)),
+quarter(cast('2016-07-28' as date)),
+quarter(cast('2016-08-29' as date)),
+quarter(cast('2016-09-29' as date)),
+quarter(cast('2016-10-29' as date)),
+quarter(cast('2016-11-29' as date)),
+quarter(cast('2016-12-29' as date)),
+-- null date
+quarter(cast(null as date)),
+-- negative Unix time
+quarter(cast('1966-01-01' as date)),
+quarter(cast('1966-03-31' as date)),
+quarter(cast('1966-04-01' as date)),
+quarter(cast('1966-12-31' as date))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1 1 1 2 2 2 3 3 3 4 4 4 NULL 1 1 2 4
+PREHOOK: query: -- timestamp
+select
+quarter(cast('2014-01-10 00:00:00' as timestamp)),
+quarter(cast('2014-02-10 15:23:00' as timestamp)),
+quarter(cast('2014-03-31 15:23:00' as timestamp)),
+quarter(cast('2014-04-02 15:23:00' as timestamp)),
+quarter(cast('2014-05-28 15:23:00' as timestamp)),
+quarter(cast('2016-06-03 15:23:00' as timestamp)),
+quarter(cast('2016-07-28 15:23:00' as timestamp)),
+quarter(cast('2016-08-29 15:23:00' as timestamp)),
+quarter(cast('2016-09-29 15:23:00' as timestamp)),
+quarter(cast('2016-10-29 15:23:00' as timestamp)),
+quarter(cast('2016-11-29 15:23:00' as timestamp)),
+quarter(cast('2016-12-29 15:23:00' as timestamp)),
+-- null timestamp
+quarter(cast(null as timestamp)),
+-- negative Unix time
+quarter(cast('1966-01-01 00:00:00' as timestamp)),
+quarter(cast('1966-03-31 23:59:59.999' as timestamp)),
+quarter(cast('1966-04-01 00:00:00' as timestamp)),
+quarter(cast('1966-12-31 23:59:59.999' as timestamp))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: -- timestamp
+select
+quarter(cast('2014-01-10 00:00:00' as timestamp)),
+quarter(cast('2014-02-10 15:23:00' as timestamp)),
+quarter(cast('2014-03-31 15:23:00' as timestamp)),
+quarter(cast('2014-04-02 15:23:00' as timestamp)),
+quarter(cast('2014-05-28 15:23:00' as timestamp)),
+quarter(cast('2016-06-03 15:23:00' as timestamp)),
+quarter(cast('2016-07-28 15:23:00' as timestamp)),
+quarter(cast('2016-08-29 15:23:00' as timestamp)),
+quarter(cast('2016-09-29 15:23:00' as timestamp)),
+quarter(cast('2016-10-29 15:23:00' as timestamp)),
+quarter(cast('2016-11-29 15:23:00' as timestamp)),
+quarter(cast('2016-12-29 15:23:00' as timestamp)),
+-- null timestamp
+quarter(cast(null as timestamp)),
+-- negative Unix time
+quarter(cast('1966-01-01 00:00:00' as timestamp)),
+quarter(cast('1966-03-31 23:59:59.999' as timestamp)),
+quarter(cast('1966-04-01 00:00:00' as timestamp)),
+quarter(cast('1966-12-31 23:59:59.999' as timestamp))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+1 1 1 2 2 2 3 3 3 4 4 4 NULL 1 1 2 4