diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperators.java b/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperators.java index fca45db2e4e99..0f3dfd00b6171 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperators.java @@ -14,10 +14,25 @@ package com.facebook.presto.type; +import com.facebook.presto.Session; +import com.facebook.presto.operator.scalar.FunctionAssertions; +import com.facebook.presto.spi.type.SqlTime; +import com.facebook.presto.spi.type.SqlTimeWithTimeZone; +import com.facebook.presto.spi.type.Type; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.facebook.presto.spi.type.TimeType.TIME; +import static com.facebook.presto.spi.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; +import static com.facebook.presto.spi.type.TimeZoneKey.getTimeZoneKey; import static com.facebook.presto.spi.type.TimestampType.TIMESTAMP; import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimestampOf; +import static com.facebook.presto.testing.TestingSession.testSessionBuilder; +import static com.google.common.base.Verify.verify; public class TestDateTimeOperators extends TestDateTimeOperatorsBase @@ -102,4 +117,98 @@ public void testDaylightTimeSaving() TIMESTAMP, sqlTimestampOf(2013, 10, 27, 1, 5, 0, 0, TIME_ZONE, TIME_ZONE_KEY, session.toConnectorSession())); } + + @Test + public void testTimeWithTimeZoneRepresentation() + { + // PST -> PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT -> PST date + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PST date + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + } + + @Test + public void testTimeRepresentation() + { + // PST -> PDT date + testTimeRepresentationOnDate(new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '02:30:00.000'", TIME, new SqlTime(9000000)); + testTimeRepresentationOnDate(new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '03:30:00.000'", TIME, new SqlTime(12600000)); + + // PDT -> PST date + testTimeRepresentationOnDate(new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '02:30:00.000'", TIME, new SqlTime(9000000)); + testTimeRepresentationOnDate(new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '03:30:00.000'", TIME, new SqlTime(12600000)); + + // PDT date + testTimeRepresentationOnDate(new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '02:30:00.000'", TIME, new SqlTime(9000000)); + testTimeRepresentationOnDate(new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '03:30:00.000'", TIME, new SqlTime(12600000)); + + // PST date + testTimeRepresentationOnDate(new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '02:30:00.000'", TIME, new SqlTime(9000000)); + testTimeRepresentationOnDate(new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), "TIME '03:30:00.000'", TIME, new SqlTime(12600000)); + } + + private void testTimeRepresentationOnDate(DateTime date, String timeLiteral, Type expectedType, Object expected) + { + Session localSession = testSessionBuilder() + .setTimeZoneKey(getTimeZoneKey("America/Los_Angeles")) + .setStartTime(date.getMillis()) + .setSystemProperty("legacy_timestamp", "false") + .build(); + + try (FunctionAssertions localAssertions = new FunctionAssertions(localSession)) { + localAssertions.assertFunction(timeLiteral, expectedType, expected); + localAssertions.assertFunctionString(timeLiteral, expectedType, valueFromLiteral(timeLiteral)); + } + } + + private static String valueFromLiteral(String literal) + { + Pattern p = Pattern.compile("'(.*)'"); + Matcher m = p.matcher(literal); + verify(m.find()); + return m.group(1); + } } diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperatorsLegacy.java b/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperatorsLegacy.java index 7674f5e254d69..ac17ac3c718bc 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperatorsLegacy.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestDateTimeOperatorsLegacy.java @@ -14,11 +14,25 @@ package com.facebook.presto.type; +import com.facebook.presto.Session; +import com.facebook.presto.operator.scalar.FunctionAssertions; +import com.facebook.presto.spi.type.SqlTime; +import com.facebook.presto.spi.type.SqlTimeWithTimeZone; +import com.facebook.presto.spi.type.Type; import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.facebook.presto.spi.type.TimeType.TIME; +import static com.facebook.presto.spi.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; +import static com.facebook.presto.spi.type.TimeZoneKey.getTimeZoneKey; import static com.facebook.presto.spi.type.TimestampType.TIMESTAMP; import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimestampOf; +import static com.facebook.presto.testing.TestingSession.testSessionBuilder; +import static com.google.common.base.Verify.verify; import static java.util.concurrent.TimeUnit.HOURS; public class TestDateTimeOperatorsLegacy @@ -105,4 +119,130 @@ public void testDaylightTimeSaving() TIMESTAMP, sqlTimestampOf(2013, 10, 27, 2, 5, 0, 0, TIME_ZONE, TIME_ZONE_KEY, session)); } + + @Test + public void testTimeWithTimeZoneRepresentation() + { + // PST -> PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT -> PST date + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PST date + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000 America/Los_Angeles'", + TIME_WITH_TIME_ZONE, + new SqlTimeWithTimeZone(41400000, getTimeZoneKey("America/Los_Angeles"))); + } + + @Test + public void testTimeRepresentation() + { + // PST -> PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000'", + TIME, + new SqlTime(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 3, 12, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000'", + TIME, + new SqlTime(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT -> PST date + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000'", + TIME, + new SqlTime(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 10, 4, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000'", + TIME, + new SqlTime(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PDT date + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000'", + TIME, + new SqlTime(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 6, 6, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000'", + TIME, + new SqlTime(41400000, getTimeZoneKey("America/Los_Angeles"))); + + // PST date + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '02:30:00.000'", + TIME, + new SqlTime(37800000, getTimeZoneKey("America/Los_Angeles"))); + testTimeRepresentationOnDate( + new DateTime(2017, 11, 1, 10, 0, 0, 0, DateTimeZone.UTC), + "TIME '03:30:00.000'", + TIME, + new SqlTime(41400000, getTimeZoneKey("America/Los_Angeles"))); + } + + private void testTimeRepresentationOnDate(DateTime date, String timeLiteral, Type expectedType, Object expected) + { + Session localSession = testSessionBuilder() + .setTimeZoneKey(getTimeZoneKey("America/Los_Angeles")) + .setStartTime(date.getMillis()) + .setSystemProperty("legacy_timestamp", "true") + .build(); + + try (FunctionAssertions localAssertions = new FunctionAssertions(localSession)) { + localAssertions.assertFunction(timeLiteral, expectedType, expected); + localAssertions.assertFunctionString(timeLiteral, expectedType, valueFromLiteral(timeLiteral)); + } + } + + private String valueFromLiteral(String literal) + { + Pattern p = Pattern.compile("'(.*)'"); + Matcher m = p.matcher(literal); + verify(m.find()); + return m.group(1); + } }