@@ -148,17 +148,6 @@ class DateTimeFunctionsTest : public functions::test::FunctionBaseTest {
148
148
return resultVector->as <SimpleVector<StringView>>()->valueAt (0 );
149
149
}
150
150
151
- std::optional<std::string> formatDatetime (
152
- std::optional<Timestamp> timestamp,
153
- const std::string& format) {
154
- auto resultVector = evaluate (
155
- " format_datetime(c0, c1)" ,
156
- makeRowVector (
157
- {makeNullableFlatVector<Timestamp>({timestamp}),
158
- makeNullableFlatVector<std::string>({format})}));
159
- return resultVector->as <SimpleVector<StringView>>()->valueAt (0 );
160
- }
161
-
162
151
template <typename T>
163
152
std::optional<T> evaluateWithTimestampWithTimezone (
164
153
const std::string& expression,
@@ -2994,6 +2983,12 @@ TEST_F(DateTimeFunctionsTest, parseDatetime) {
2994
2983
}
2995
2984
2996
2985
TEST_F (DateTimeFunctionsTest, formatDateTime) {
2986
+ const auto formatDatetime = [&](std::optional<Timestamp> timestamp,
2987
+ std::optional<std::string> format) {
2988
+ return evaluateOnce<std::string>(
2989
+ " format_datetime(c0, c1)" , timestamp, format);
2990
+ };
2991
+
2997
2992
// era test cases - 'G'
2998
2993
EXPECT_EQ (" AD" , formatDatetime (parseTimestamp (" 1970-01-01" ), " G" ));
2999
2994
EXPECT_EQ (" BC" , formatDatetime (parseTimestamp (" -100-01-01" ), " G" ));
@@ -3248,6 +3243,12 @@ TEST_F(DateTimeFunctionsTest, formatDateTime) {
3248
3243
parseTimestamp (" 1970-01-01 02:33:11.5" ),
3249
3244
" G C Y e 'asdfghjklzxcvbnmqwertyuiop' E '' y D M d a K h H k m s S 1234567890\\\" !@#$%^&*()-+`~{}[];:,./ zzzz" ));
3250
3245
3246
+ disableAdjustTimestampToTimezone ();
3247
+ EXPECT_EQ (
3248
+ " 1970-01-01 00:00:00" ,
3249
+ formatDatetime (
3250
+ parseTimestamp (" 1970-01-01 00:00:00" ), " YYYY-MM-dd HH:mm:ss" ));
3251
+
3251
3252
// User format errors or unsupported errors
3252
3253
EXPECT_THROW (
3253
3254
formatDatetime (parseTimestamp (" 1970-01-01" ), " x" ), VeloxUserError);
@@ -3276,24 +3277,37 @@ TEST_F(DateTimeFunctionsTest, formatDateTimeTimezone) {
3276
3277
format);
3277
3278
};
3278
3279
3279
- const auto zeroTs = parseTimestamp (" 1970-01-01" );
3280
-
3281
- // No timezone set; default to GMT.
3280
+ // UTC explicitly set.
3282
3281
EXPECT_EQ (
3283
- " 1970-01-01 00:00:00" , formatDatetime (zeroTs, " YYYY-MM-dd HH:mm:ss" ));
3282
+ " 1970-01-01 00:00:00" ,
3283
+ formatDatetimeWithTimezone (
3284
+ TimestampWithTimezone (0 , " UTC" ), " YYYY-MM-dd HH:mm:ss" ));
3284
3285
3285
3286
// Check that string is adjusted to the timezone set.
3286
3287
EXPECT_EQ (
3287
3288
" 1970-01-01 05:30:00" ,
3288
3289
formatDatetimeWithTimezone (
3289
- TimestampWithTimezone (zeroTs.toMillis (), " Asia/Kolkata" ),
3290
- " YYYY-MM-dd HH:mm:ss" ));
3290
+ TimestampWithTimezone (0 , " Asia/Kolkata" ), " YYYY-MM-dd HH:mm:ss" ));
3291
3291
3292
3292
EXPECT_EQ (
3293
3293
" 1969-12-31 16:00:00" ,
3294
3294
formatDatetimeWithTimezone (
3295
- TimestampWithTimezone (zeroTs. toMillis () , " America/Los_Angeles" ),
3295
+ TimestampWithTimezone (0 , " America/Los_Angeles" ),
3296
3296
" YYYY-MM-dd HH:mm:ss" ));
3297
+
3298
+ // Make sure format_datetime() works with timezone offsets.
3299
+ EXPECT_EQ (
3300
+ " 1969-12-31 16:00:00" ,
3301
+ formatDatetimeWithTimezone (
3302
+ TimestampWithTimezone (0 , " -08:00" ), " YYYY-MM-dd HH:mm:ss" ));
3303
+ EXPECT_EQ (
3304
+ " 1969-12-31 23:45:00" ,
3305
+ formatDatetimeWithTimezone (
3306
+ TimestampWithTimezone (0 , " -00:15" ), " YYYY-MM-dd HH:mm:ss" ));
3307
+ EXPECT_EQ (
3308
+ " 1970-01-01 00:07:00" ,
3309
+ formatDatetimeWithTimezone (
3310
+ TimestampWithTimezone (0 , " +00:07" ), " YYYY-MM-dd HH:mm:ss" ));
3297
3311
}
3298
3312
3299
3313
TEST_F (DateTimeFunctionsTest, dateFormat) {
0 commit comments