bigquery: EXTRACT support For DAYOFWEEK, DAYOFYEAR, ISOWEEK, TIME (#980)

This commit is contained in:
Lukasz Stefaniak 2023-10-02 13:23:25 +02:00 committed by GitHub
parent 495d0a02d5
commit e718ce6c42
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 0 deletions

View file

@ -117,6 +117,8 @@ pub enum DateTimeField {
Month, Month,
Week, Week,
Day, Day,
DayOfWeek,
DayOfYear,
Date, Date,
Hour, Hour,
Minute, Minute,
@ -127,6 +129,7 @@ pub enum DateTimeField {
Doy, Doy,
Epoch, Epoch,
Isodow, Isodow,
IsoWeek,
Isoyear, Isoyear,
Julian, Julian,
Microsecond, Microsecond,
@ -138,6 +141,7 @@ pub enum DateTimeField {
Nanosecond, Nanosecond,
Nanoseconds, Nanoseconds,
Quarter, Quarter,
Time,
Timezone, Timezone,
TimezoneHour, TimezoneHour,
TimezoneMinute, TimezoneMinute,
@ -151,6 +155,8 @@ impl fmt::Display for DateTimeField {
DateTimeField::Month => "MONTH", DateTimeField::Month => "MONTH",
DateTimeField::Week => "WEEK", DateTimeField::Week => "WEEK",
DateTimeField::Day => "DAY", DateTimeField::Day => "DAY",
DateTimeField::DayOfWeek => "DAYOFWEEK",
DateTimeField::DayOfYear => "DAYOFYEAR",
DateTimeField::Date => "DATE", DateTimeField::Date => "DATE",
DateTimeField::Hour => "HOUR", DateTimeField::Hour => "HOUR",
DateTimeField::Minute => "MINUTE", DateTimeField::Minute => "MINUTE",
@ -162,6 +168,7 @@ impl fmt::Display for DateTimeField {
DateTimeField::Epoch => "EPOCH", DateTimeField::Epoch => "EPOCH",
DateTimeField::Isodow => "ISODOW", DateTimeField::Isodow => "ISODOW",
DateTimeField::Isoyear => "ISOYEAR", DateTimeField::Isoyear => "ISOYEAR",
DateTimeField::IsoWeek => "ISOWEEK",
DateTimeField::Julian => "JULIAN", DateTimeField::Julian => "JULIAN",
DateTimeField::Microsecond => "MICROSECOND", DateTimeField::Microsecond => "MICROSECOND",
DateTimeField::Microseconds => "MICROSECONDS", DateTimeField::Microseconds => "MICROSECONDS",
@ -172,6 +179,7 @@ impl fmt::Display for DateTimeField {
DateTimeField::Nanosecond => "NANOSECOND", DateTimeField::Nanosecond => "NANOSECOND",
DateTimeField::Nanoseconds => "NANOSECONDS", DateTimeField::Nanoseconds => "NANOSECONDS",
DateTimeField::Quarter => "QUARTER", DateTimeField::Quarter => "QUARTER",
DateTimeField::Time => "TIME",
DateTimeField::Timezone => "TIMEZONE", DateTimeField::Timezone => "TIMEZONE",
DateTimeField::TimezoneHour => "TIMEZONE_HOUR", DateTimeField::TimezoneHour => "TIMEZONE_HOUR",
DateTimeField::TimezoneMinute => "TIMEZONE_MINUTE", DateTimeField::TimezoneMinute => "TIMEZONE_MINUTE",

View file

@ -196,6 +196,8 @@ define_keywords!(
DATE, DATE,
DATETIME, DATETIME,
DAY, DAY,
DAYOFWEEK,
DAYOFYEAR,
DEALLOCATE, DEALLOCATE,
DEC, DEC,
DECADE, DECADE,
@ -334,6 +336,7 @@ define_keywords!(
IS, IS,
ISODOW, ISODOW,
ISOLATION, ISOLATION,
ISOWEEK,
ISOYEAR, ISOYEAR,
JAR, JAR,
JOIN, JOIN,

View file

@ -1508,6 +1508,8 @@ impl<'a> Parser<'a> {
Keyword::MONTH => Ok(DateTimeField::Month), Keyword::MONTH => Ok(DateTimeField::Month),
Keyword::WEEK => Ok(DateTimeField::Week), Keyword::WEEK => Ok(DateTimeField::Week),
Keyword::DAY => Ok(DateTimeField::Day), Keyword::DAY => Ok(DateTimeField::Day),
Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
Keyword::DATE => Ok(DateTimeField::Date), Keyword::DATE => Ok(DateTimeField::Date),
Keyword::HOUR => Ok(DateTimeField::Hour), Keyword::HOUR => Ok(DateTimeField::Hour),
Keyword::MINUTE => Ok(DateTimeField::Minute), Keyword::MINUTE => Ok(DateTimeField::Minute),
@ -1519,6 +1521,7 @@ impl<'a> Parser<'a> {
Keyword::EPOCH => Ok(DateTimeField::Epoch), Keyword::EPOCH => Ok(DateTimeField::Epoch),
Keyword::ISODOW => Ok(DateTimeField::Isodow), Keyword::ISODOW => Ok(DateTimeField::Isodow),
Keyword::ISOYEAR => Ok(DateTimeField::Isoyear), Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
Keyword::JULIAN => Ok(DateTimeField::Julian), Keyword::JULIAN => Ok(DateTimeField::Julian),
Keyword::MICROSECOND => Ok(DateTimeField::Microsecond), Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds), Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
@ -1529,6 +1532,7 @@ impl<'a> Parser<'a> {
Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond), Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds), Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
Keyword::QUARTER => Ok(DateTimeField::Quarter), Keyword::QUARTER => Ok(DateTimeField::Quarter),
Keyword::TIME => Ok(DateTimeField::Time),
Keyword::TIMEZONE => Ok(DateTimeField::Timezone), Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour), Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute), Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),

View file

@ -2069,6 +2069,8 @@ fn parse_extract() {
verified_stmt("SELECT EXTRACT(MONTH FROM d)"); verified_stmt("SELECT EXTRACT(MONTH FROM d)");
verified_stmt("SELECT EXTRACT(WEEK FROM d)"); verified_stmt("SELECT EXTRACT(WEEK FROM d)");
verified_stmt("SELECT EXTRACT(DAY FROM d)"); verified_stmt("SELECT EXTRACT(DAY FROM d)");
verified_stmt("SELECT EXTRACT(DAYOFWEEK FROM d)");
verified_stmt("SELECT EXTRACT(DAYOFYEAR FROM d)");
verified_stmt("SELECT EXTRACT(DATE FROM d)"); verified_stmt("SELECT EXTRACT(DATE FROM d)");
verified_stmt("SELECT EXTRACT(HOUR FROM d)"); verified_stmt("SELECT EXTRACT(HOUR FROM d)");
verified_stmt("SELECT EXTRACT(MINUTE FROM d)"); verified_stmt("SELECT EXTRACT(MINUTE FROM d)");
@ -2082,6 +2084,7 @@ fn parse_extract() {
verified_stmt("SELECT EXTRACT(DOY FROM d)"); verified_stmt("SELECT EXTRACT(DOY FROM d)");
verified_stmt("SELECT EXTRACT(EPOCH FROM d)"); verified_stmt("SELECT EXTRACT(EPOCH FROM d)");
verified_stmt("SELECT EXTRACT(ISODOW FROM d)"); verified_stmt("SELECT EXTRACT(ISODOW FROM d)");
verified_stmt("SELECT EXTRACT(ISOWEEK FROM d)");
verified_stmt("SELECT EXTRACT(ISOYEAR FROM d)"); verified_stmt("SELECT EXTRACT(ISOYEAR FROM d)");
verified_stmt("SELECT EXTRACT(JULIAN FROM d)"); verified_stmt("SELECT EXTRACT(JULIAN FROM d)");
verified_stmt("SELECT EXTRACT(MICROSECOND FROM d)"); verified_stmt("SELECT EXTRACT(MICROSECOND FROM d)");
@ -2094,6 +2097,7 @@ fn parse_extract() {
verified_stmt("SELECT EXTRACT(TIMEZONE FROM d)"); verified_stmt("SELECT EXTRACT(TIMEZONE FROM d)");
verified_stmt("SELECT EXTRACT(TIMEZONE_HOUR FROM d)"); verified_stmt("SELECT EXTRACT(TIMEZONE_HOUR FROM d)");
verified_stmt("SELECT EXTRACT(TIMEZONE_MINUTE FROM d)"); verified_stmt("SELECT EXTRACT(TIMEZONE_MINUTE FROM d)");
verified_stmt("SELECT EXTRACT(TIME FROM d)");
let res = parse_sql_statements("SELECT EXTRACT(JIFFY FROM d)"); let res = parse_sql_statements("SELECT EXTRACT(JIFFY FROM d)");
assert_eq!( assert_eq!(