diff --git a/velox/functions/prestosql/tests/DateTimeFunctionsTest.cpp b/velox/functions/prestosql/tests/DateTimeFunctionsTest.cpp index a0a590ce90a0..392c388ee3c3 100644 --- a/velox/functions/prestosql/tests/DateTimeFunctionsTest.cpp +++ b/velox/functions/prestosql/tests/DateTimeFunctionsTest.cpp @@ -148,17 +148,6 @@ class DateTimeFunctionsTest : public functions::test::FunctionBaseTest { return resultVector->as>()->valueAt(0); } - std::optional formatDatetime( - std::optional timestamp, - const std::string& format) { - auto resultVector = evaluate( - "format_datetime(c0, c1)", - makeRowVector( - {makeNullableFlatVector({timestamp}), - makeNullableFlatVector({format})})); - return resultVector->as>()->valueAt(0); - } - template std::optional evaluateWithTimestampWithTimezone( const std::string& expression, @@ -2994,6 +2983,12 @@ TEST_F(DateTimeFunctionsTest, parseDatetime) { } TEST_F(DateTimeFunctionsTest, formatDateTime) { + const auto formatDatetime = [&](std::optional timestamp, + std::optional format) { + return evaluateOnce( + "format_datetime(c0, c1)", timestamp, format); + }; + // era test cases - 'G' EXPECT_EQ("AD", formatDatetime(parseTimestamp("1970-01-01"), "G")); EXPECT_EQ("BC", formatDatetime(parseTimestamp("-100-01-01"), "G")); @@ -3248,6 +3243,12 @@ TEST_F(DateTimeFunctionsTest, formatDateTime) { parseTimestamp("1970-01-01 02:33:11.5"), "G C Y e 'asdfghjklzxcvbnmqwertyuiop' E '' y D M d a K h H k m s S 1234567890\\\"!@#$%^&*()-+`~{}[];:,./ zzzz")); + disableAdjustTimestampToTimezone(); + EXPECT_EQ( + "1970-01-01 00:00:00", + formatDatetime( + parseTimestamp("1970-01-01 00:00:00"), "YYYY-MM-dd HH:mm:ss")); + // User format errors or unsupported errors EXPECT_THROW( formatDatetime(parseTimestamp("1970-01-01"), "x"), VeloxUserError); @@ -3276,24 +3277,37 @@ TEST_F(DateTimeFunctionsTest, formatDateTimeTimezone) { format); }; - const auto zeroTs = parseTimestamp("1970-01-01"); - - // No timezone set; default to GMT. + // UTC explicitly set. EXPECT_EQ( - "1970-01-01 00:00:00", formatDatetime(zeroTs, "YYYY-MM-dd HH:mm:ss")); + "1970-01-01 00:00:00", + formatDatetimeWithTimezone( + TimestampWithTimezone(0, "UTC"), "YYYY-MM-dd HH:mm:ss")); // Check that string is adjusted to the timezone set. EXPECT_EQ( "1970-01-01 05:30:00", formatDatetimeWithTimezone( - TimestampWithTimezone(zeroTs.toMillis(), "Asia/Kolkata"), - "YYYY-MM-dd HH:mm:ss")); + TimestampWithTimezone(0, "Asia/Kolkata"), "YYYY-MM-dd HH:mm:ss")); EXPECT_EQ( "1969-12-31 16:00:00", formatDatetimeWithTimezone( - TimestampWithTimezone(zeroTs.toMillis(), "America/Los_Angeles"), + TimestampWithTimezone(0, "America/Los_Angeles"), "YYYY-MM-dd HH:mm:ss")); + + // Make sure format_datetime() works with timezone offsets. + EXPECT_EQ( + "1969-12-31 16:00:00", + formatDatetimeWithTimezone( + TimestampWithTimezone(0, "-08:00"), "YYYY-MM-dd HH:mm:ss")); + EXPECT_EQ( + "1969-12-31 23:45:00", + formatDatetimeWithTimezone( + TimestampWithTimezone(0, "-00:15"), "YYYY-MM-dd HH:mm:ss")); + EXPECT_EQ( + "1970-01-01 00:07:00", + formatDatetimeWithTimezone( + TimestampWithTimezone(0, "+00:07"), "YYYY-MM-dd HH:mm:ss")); } TEST_F(DateTimeFunctionsTest, dateFormat) {