diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java index 8a057d1dab..aa5a1a9d75 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java @@ -1117,34 +1117,37 @@ public static Date getDate(Object o, PrimitiveObjectInspector oi) { Date result = null; switch (oi.getPrimitiveCategory()) { case VOID: - result = null; break; case STRING: StringObjectInspector soi = (StringObjectInspector) oi; String s = soi.getPrimitiveJavaObject(o).trim(); try { - result = Date.valueOf(s); - } catch (IllegalArgumentException e) { - Timestamp ts = getTimestampFromString(s); - if (ts != null) { - result = Date.ofEpochMilli(ts.toEpochMilli()); + if (s.length() == DATE_LENGTH) { + result = Date.valueOf(s); } else { - result = null; + Timestamp ts = getTimestampFromString(s); + if (ts != null) { + result = Date.ofEpochMilli(ts.toEpochMilli()); + } } + } catch (IllegalArgumentException e) { + // Do nothing } break; case CHAR: case VARCHAR: { String val = getString(o, oi).trim(); try { - result = Date.valueOf(val); - } catch (IllegalArgumentException e) { - Timestamp ts = getTimestampFromString(val); - if (ts != null) { - result = Date.ofEpochMilli(ts.toEpochMilli()); + if (val.length() == DATE_LENGTH) { + result = Date.valueOf(val); } else { - result = null; + Timestamp ts = getTimestampFromString(val); + if (ts != null) { + result = Date.ofEpochMilli(ts.toEpochMilli()); + } } + } catch (IllegalArgumentException e) { + // Do nothing } break; } @@ -1248,26 +1251,38 @@ public static Timestamp getTimestamp(Object o, PrimitiveObjectInspector inputOI, return result; } + private final static int DATE_LENGTH = "YYYY-MM-DD".length(); + private final static int TS_LENGTH = "yyyy-mm-dd hh:mm:ss".length(); + public static Timestamp getTimestampFromString(String s) { - Timestamp result; + Timestamp result = null; s = s.trim(); - s = trimNanoTimestamp(s); + // Handle simpler cases directly avoiding exceptions try { - result = Timestamp.valueOf(s); - } catch (IllegalArgumentException e) { - // Let's try to parse it as timestamp with time zone and transform - try { - result = Timestamp.valueOf(TimestampTZUtil.parse(s).getZonedDateTime() - .toLocalDateTime().toString()); - } catch (DateTimeException e2) { - // Last try: we try to parse it as date and transform + if (s.length() == DATE_LENGTH) { + // Its a date! + return Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); + } else if (s.length() == TS_LENGTH) { + return Timestamp.valueOf(s); + } + // May have decimal places + s = trimNanoTimestamp(s); + if (s.contains("+")) { + // Timestamp with timezone + // Let's try to parse it as timestamp with time zone and transform try { - result = Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); - } catch (IllegalArgumentException e3) { - result = null; + result = Timestamp.valueOf(TimestampTZUtil.parse(s).getZonedDateTime() + .toLocalDateTime().toString()); + } catch (DateTimeException e2) { + // Do nothing } + } else { + // Last attempt + result = Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); } + } catch (IllegalArgumentException e) { + // Do nothing } return result; }