@@ -116,7 +116,8 @@ struct TimestampWithTimezoneSupport {
116
116
bool asGMT = false ) {
117
117
auto timestamp = unpackTimestampUtc (timestampWithTimezone);
118
118
if (!asGMT) {
119
- timestamp.toTimezone (unpackZoneKeyId (timestampWithTimezone));
119
+ timestamp.toTimezone (
120
+ *tz::locateZone (unpackZoneKeyId (timestampWithTimezone)));
120
121
}
121
122
122
123
return timestamp;
@@ -129,7 +130,7 @@ struct TimestampWithTimezoneSupport {
129
130
Timestamp inputTimeStamp = this ->toTimestamp (timestampWithTimezone);
130
131
// Create a copy of inputTimeStamp and convert it to GMT
131
132
auto gmtTimeStamp = inputTimeStamp;
132
- gmtTimeStamp.toGMT (unpackZoneKeyId (timestampWithTimezone));
133
+ gmtTimeStamp.toGMT (* tz::locateZone ( unpackZoneKeyId (timestampWithTimezone) ));
133
134
134
135
// Get offset in seconds with GMT and convert to hour
135
136
return (inputTimeStamp.getSeconds () - gmtTimeStamp.getSeconds ());
@@ -1166,7 +1167,7 @@ struct DateTruncFunction : public TimestampWithTimezoneSupport<T> {
1166
1167
adjustDateTime (dateTime, unit);
1167
1168
timestamp =
1168
1169
Timestamp::fromMillis (Timestamp::calendarUtcToEpoch (dateTime) * 1000 );
1169
- timestamp.toGMT (unpackZoneKeyId (timestampWithTimezone));
1170
+ timestamp.toGMT (* tz::locateZone ( unpackZoneKeyId (timestampWithTimezone) ));
1170
1171
1171
1172
result = pack (timestamp, unpackZoneKeyId (timestampWithTimezone));
1172
1173
}
@@ -1472,7 +1473,7 @@ struct FromIso8601Timestamp {
1472
1473
const arg_type<Varchar>* /* input*/ ) {
1473
1474
auto sessionTzName = config.sessionTimezone ();
1474
1475
if (!sessionTzName.empty ()) {
1475
- sessionTzID_ = tz::getTimeZoneID (sessionTzName);
1476
+ sessionTimeZone_ = tz::locateZone (sessionTzName);
1476
1477
}
1477
1478
}
1478
1479
@@ -1485,27 +1486,29 @@ struct FromIso8601Timestamp {
1485
1486
return castResult.error ();
1486
1487
}
1487
1488
1488
- auto [ts, tzID ] = castResult.value ();
1489
+ auto [ts, timeZone ] = castResult.value ();
1489
1490
// Input string may not contain a timezone - if so, it is interpreted in
1490
1491
// session timezone.
1491
- if (tzID == - 1 ) {
1492
- tzID = sessionTzID_ ;
1492
+ if (timeZone == nullptr ) {
1493
+ timeZone = sessionTimeZone_ ;
1493
1494
}
1494
- ts.toGMT (tzID );
1495
- result = pack (ts, tzID );
1495
+ ts.toGMT (*timeZone );
1496
+ result = pack (ts, timeZone-> id () );
1496
1497
return Status::OK ();
1497
1498
}
1498
1499
1499
1500
private:
1500
- int16_t sessionTzID_{ 0 };
1501
+ const tz::TimeZone* sessionTimeZone_{ tz::locateZone ( 0 )}; // default to GMT.
1501
1502
};
1502
1503
1503
1504
template <typename T>
1504
1505
struct DateParseFunction {
1505
1506
VELOX_DEFINE_FUNCTION_TYPES (T);
1506
1507
1507
1508
std::shared_ptr<DateTimeFormatter> format_;
1508
- std::optional<int64_t > sessionTzID_;
1509
+
1510
+ // By default, assume 0 (GMT).
1511
+ const tz::TimeZone* sessionTimeZone_{tz::locateZone (0 )};
1509
1512
bool isConstFormat_ = false ;
1510
1513
1511
1514
FOLLY_ALWAYS_INLINE void initialize (
@@ -1521,7 +1524,7 @@ struct DateParseFunction {
1521
1524
1522
1525
auto sessionTzName = config.sessionTimezone ();
1523
1526
if (!sessionTzName.empty ()) {
1524
- sessionTzID_ = tz::getTimeZoneID (sessionTzName);
1527
+ sessionTimeZone_ = tz::locateZone (sessionTzName);
1525
1528
}
1526
1529
}
1527
1530
@@ -1539,10 +1542,7 @@ struct DateParseFunction {
1539
1542
return dateTimeResult.error ();
1540
1543
}
1541
1544
1542
- // Since MySql format has no timezone specifier, simply check if session
1543
- // timezone was provided. If not, fallback to 0 (GMT).
1544
- int16_t timezoneId = sessionTzID_.value_or (0 );
1545
- dateTimeResult->timestamp .toGMT (timezoneId);
1545
+ dateTimeResult->timestamp .toGMT (*sessionTimeZone_);
1546
1546
result = dateTimeResult->timestamp ;
1547
1547
return Status::OK ();
1548
1548
}
@@ -1623,7 +1623,7 @@ struct ParseDateTimeFunction {
1623
1623
VELOX_DEFINE_FUNCTION_TYPES (T);
1624
1624
1625
1625
std::shared_ptr<DateTimeFormatter> format_;
1626
- std::optional< int64_t > sessionTzID_;
1626
+ const tz::TimeZone* sessionTimeZone_{ tz::locateZone ( 0 )}; // GMT
1627
1627
bool isConstFormat_ = false ;
1628
1628
1629
1629
FOLLY_ALWAYS_INLINE void initialize (
@@ -1639,7 +1639,7 @@ struct ParseDateTimeFunction {
1639
1639
1640
1640
auto sessionTzName = config.sessionTimezone ();
1641
1641
if (!sessionTzName.empty ()) {
1642
- sessionTzID_ = tz::getTimeZoneID (sessionTzName);
1642
+ sessionTimeZone_ = tz::locateZone (sessionTzName);
1643
1643
}
1644
1644
}
1645
1645
@@ -1659,11 +1659,11 @@ struct ParseDateTimeFunction {
1659
1659
1660
1660
// If timezone was not parsed, fallback to the session timezone. If there's
1661
1661
// no session timezone, fallback to 0 (GMT).
1662
- int16_t timezoneId = dateTimeResult->timezoneId != -1
1663
- ? dateTimeResult->timezoneId
1664
- : sessionTzID_. value_or ( 0 ) ;
1665
- dateTimeResult->timestamp .toGMT (timezoneId );
1666
- result = pack (dateTimeResult->timestamp , timezoneId );
1662
+ const auto * timeZone = dateTimeResult->timezoneId != -1
1663
+ ? tz::locateZone ( dateTimeResult->timezoneId )
1664
+ : sessionTimeZone_ ;
1665
+ dateTimeResult->timestamp .toGMT (*timeZone );
1666
+ result = pack (dateTimeResult->timestamp , timeZone-> id () );
1667
1667
return Status::OK ();
1668
1668
}
1669
1669
};
0 commit comments