Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Throw for zzzz (and beyond) in parse_datetime #11331

Closed

Conversation

kevinwilfong
Copy link
Contributor

Summary:
This diff throws a user exception for JODA's zzzz (or more) patterns (all equivalent) in
Presto's parse_datetime function.

JODA does not support parsing time zone long names (specified by the pattern zzzz)
so neither should Velox to be consistent. Previously we were treating any number of
'z's as representing a time zone abbreviation in the pattern which is completely
wrong.

Differential Revision: D64797504

@facebook-github-bot facebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Oct 22, 2024
Copy link

netlify bot commented Oct 22, 2024

Deploy Preview for meta-velox canceled.

Name Link
🔨 Latest commit 1d48ef6
🔍 Latest deploy log https://app.netlify.com/sites/meta-velox/deploys/67210fc7339d6c0008510973

@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D64797504

@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D64797504

kevinwilfong pushed a commit to kevinwilfong/velox that referenced this pull request Oct 24, 2024
Summary:
Pull Request resolved: facebookincubator#11331

This diff throws a user exception for JODA's zzzz (or more) patterns (all equivalent) in
Presto's parse_datetime function.

JODA does not support parsing time zone long names (specified by the pattern zzzz)
so neither should Velox to be consistent.  Previously we were treating any number of
'z's as representing a time zone abbreviation in the pattern which is completely
wrong.

Reviewed By: amitkdutta

Differential Revision: D64797504
@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D64797504

kevinwilfong pushed a commit to kevinwilfong/velox that referenced this pull request Oct 24, 2024
Summary:
Pull Request resolved: facebookincubator#11331

This diff throws a user exception for JODA's zzzz (or more) patterns (all equivalent) in
Presto's parse_datetime function.

JODA does not support parsing time zone long names (specified by the pattern zzzz)
so neither should Velox to be consistent.  Previously we were treating any number of
'z's as representing a time zone abbreviation in the pattern which is completely
wrong.

Reviewed By: amitkdutta

Differential Revision: D64797504
CMakeLists.txt Outdated
Comment on lines 484 to 485
set_source(ICU)
resolve_dependency(ICU COMPONENTS i18n)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my comment in #11330 please move this to the root cmake file and keep all components that are used in the boost file (these calls are cached).

Kevin Wilfong added 5 commits October 29, 2024 09:39
…or#11283)

Summary:

The format_datetime currently outptus the time zone id if for 3 or fewer 'z' characters
in the format string.  However, the JODA library, which this is based on, does this for
3 or more 'Z' characters.

This diff fixes this, as well as adds support for a single 'Z' (which outputs the same
thing as 'ZZ' just without the colon).  So 'Z' is fully supported for any number of
characters.

To be more explicit:

https://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html

From the JODA docs:
`'Z' outputs offset without a colon (-0800), 'ZZ' outputs the offset with a 
colon(-08:00), 'ZZZ' or more outputs the zone id(America/Los_Angeles).`

And not clearly explained in the docs, but from experimentation:
`'z', 'zz', or 'zzz' outputs the abbreviation of the time zone(PDT), and 'zzzz' or more 
outputs the time zone name(Pacific Daylight Time)`

Currently DateTimeFormatter treats 'zzzz' or more like JODA treats 'ZZZ' or more.
This diff marks 'zzzz' or more as unsupported (we can implement that in a future
change), and moves that logic under 'ZZZ' or more to be consistent.

It also implements 'Z' (previously only 'ZZ' was implemented in DateTimeFormatter).

Reviewed By: bikramSingh91

Differential Revision: D64500193
Summary:

This diff adds support for JODA's ZZZ pattern in Presto's parse_datetime function.

This is used to parse time zone IDs (called "time zone names" in the tz library, but this 
means something else in JODA).

I borrowed the algorithm from JODA to ensure it matches Presto Java's behavior.  The
idea is to greedily consume the longest substring that matches a known time zone.  I
borrowed their algorithm which is to break the set of known time zones into a list of
those without a prefix (without the '/' character) and lists of suffixes for those with
prefixes.  This limits the number of strings that need to be compared.  I modified it
slightly to pre-sort these lists by size descending, so we don't have to necessarily 
compare every string, but can stop early if we find a match.

One other change is I added a get_time_zone_names function to our copy of the tz
library.  I tried calling get_tzdb() from DateTimeFormatter directly and accessing its
zones member to get the names, but for some reason after get_tzdb() returns every
time_zone in zones (except the first one) has a string name_ that has nullptr for its
data after get_tzdb() returns. I spent a good amount of time trying to figure out why,
but couldn't figure it out, so I gave up and added this helper method (for whatever
reason everything is fine as long as it's done in the tz.cpp file).  If anyone has pointers
as to what's going on I'm happy to investigate further, I'd much rather use the existing
get_tzdb function if I can.

Reviewed By: bikramSingh91

Differential Revision: D64708598
Summary:

This diff adds support for JODA's z, zz, zzz patterns (all equivalent) in Presto's
forma_datetime function.

This is used to format time zone abbreviations.

Reviewed By: pedroerp

Differential Revision: D64774281
…or#11330)

Summary:

This diff adds support for JODA's zzzz (or more) patterns (all equivalent) in Presto's
format_datetime function.

This is used to format long time zone names.

Long time zone names are not available from the IANA time zone database, so we
can't use the tz library to generate these.  Fortunately, unicode provides some
utilities to generate these.

Reviewed By: pedroerp

Differential Revision: D64795407
Summary:

This diff throws a user exception for JODA's zzzz (or more) patterns (all equivalent) in
Presto's parse_datetime function.

JODA does not support parsing time zone long names (specified by the pattern zzzz)
so neither should Velox to be consistent.  Previously we were treating any number of
'z's as representing a time zone abbreviation in the pattern which is completely
wrong.

Reviewed By: amitkdutta, pedroerp

Differential Revision: D64797504
@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D64797504

@facebook-github-bot
Copy link
Contributor

This pull request has been merged in 3bcc5f3.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported Merged
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants