You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pr...@apache.org on 2015/05/07 03:21:20 UTC

[26/52] [abbrv] hive git commit: HIVE-3404: Create quarter UDF (Alex Pivovarov via Jason Dere)

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/llap
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