diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java index 33fe507..e0d466a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFromUtcTimestamp.java @@ -20,6 +20,8 @@ import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.List; import java.util.TimeZone; import org.slf4j.Logger; @@ -47,6 +49,7 @@ private transient TextConverter textConverter; private transient SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private transient TimeZone tzUTC = TimeZone.getTimeZone("UTC"); + private transient List tzList = Arrays.asList(TimeZone.getAvailableIDs()); @Override public ObjectInspector initialize(ObjectInspector[] arguments) @@ -109,7 +112,13 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { Timestamp inputTs = ((TimestampWritable) converted_o0).getTimestamp(); String tzStr = textConverter.convert(o1).toString(); - TimeZone timezone = TimeZone.getTimeZone(tzStr); + TimeZone timezone; + if (tzList.contains(tzStr)) { + timezone = TimeZone.getTimeZone(tzStr); + } else { + throw new UDFArgumentException( + "Unsupported timezone : " + tzStr); + } TimeZone fromTz; TimeZone toTz; diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFFromUtcTimestamp.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFFromUtcTimestamp.java index ae4785a..c066f34 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFFromUtcTimestamp.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFFromUtcTimestamp.java @@ -21,6 +21,7 @@ import java.sql.Date; import java.sql.Timestamp; +import org.apache.hadoop.hive.ql.exec.UDFArgumentException; 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; @@ -66,6 +67,14 @@ public void testFromUtcTimestamp() throws Exception { runAndVerify(udf, new Text("2015-03-28 18:00:00.123456789"), new Text("Europe/London"), Timestamp.valueOf("2015-03-28 18:00:00.123456789")); + + try { + runAndVerify(udf, + new Text("2015-03-28 17:00:00"), new Text("XXX"), null); + fail(); + } catch (UDFArgumentException e) { + assertEquals("Unsupported timezone : XXX", e.getMessage()); + } } public void testToUtcTimestamp() throws Exception { @@ -88,5 +97,13 @@ public void testToUtcTimestamp() throws Exception { runAndVerify(udf, new Text("2015-03-28 18:00:00.123456789"), new Text("Europe/London"), Timestamp.valueOf("2015-03-28 18:00:00.123456789")); + + try { + runAndVerify(udf, + new Text("2015-03-28 17:00:00"), new Text("XXX"), null); + fail(); + } catch (UDFArgumentException e) { + assertEquals("Unsupported timezone : XXX", e.getMessage()); + } } }