diff --git a/src/ast/value.rs b/src/ast/value.rs index a4df8e8fe3..33262d8a6d 100644 --- a/src/ast/value.rs +++ b/src/ast/value.rs @@ -127,6 +127,21 @@ pub enum DateTimeField { Hour, Minute, Second, + Century, + Decade, + Dow, + Doy, + Epoch, + Isodow, + Isoyear, + Julian, + Microseconds, + Millenium, + Milliseconds, + Quarter, + Timezone, + TimezoneHour, + TimezoneMinute, } impl fmt::Display for DateTimeField { @@ -138,6 +153,21 @@ impl fmt::Display for DateTimeField { DateTimeField::Hour => "HOUR", DateTimeField::Minute => "MINUTE", DateTimeField::Second => "SECOND", + DateTimeField::Century => "CENTURY", + DateTimeField::Decade => "DECADE", + DateTimeField::Dow => "DOW", + DateTimeField::Doy => "DOY", + DateTimeField::Epoch => "EPOCH", + DateTimeField::Isodow => "ISODOW", + DateTimeField::Isoyear => "ISOYEAR", + DateTimeField::Julian => "JULIAN", + DateTimeField::Microseconds => "MICROSECONDS", + DateTimeField::Millenium => "MILLENIUM", + DateTimeField::Milliseconds => "MILLISECONDS", + DateTimeField::Quarter => "QUARTER", + DateTimeField::Timezone => "TIMEZONE", + DateTimeField::TimezoneHour => "TIMEZONE_HOUR", + DateTimeField::TimezoneMinute => "TIMEZONE_MINUTE", }) } } diff --git a/src/keywords.rs b/src/keywords.rs index bf7c9eff89..630a0ee4e9 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -113,6 +113,7 @@ define_keywords!( CAST, CEIL, CEILING, + CENTURY, CHAIN, CHANGE, CHAR, @@ -169,6 +170,7 @@ define_keywords!( DAY, DEALLOCATE, DEC, + DECADE, DECIMAL, DECLARE, DEFAULT, @@ -185,6 +187,8 @@ define_keywords!( DISTINCT, DISTRIBUTE, DOUBLE, + DOW, + DOY, DROP, DUPLICATE, DYNAMIC, @@ -197,6 +201,7 @@ define_keywords!( END_PARTITION, ENGINE, ENUM, + EPOCH, EQUALS, ERROR, ESCAPE, @@ -261,9 +266,12 @@ define_keywords!( INTERVAL, INTO, IS, + ISODOW, ISOLATION, + ISOYEAR, JOIN, JSONFILE, + JULIAN, KEY, LAG, LANGUAGE, @@ -293,6 +301,9 @@ define_keywords!( MERGE, METADATA, METHOD, + MICROSECONDS, + MILLENIUM, + MILLISECONDS, MIN, MINUTE, MOD, @@ -361,6 +372,7 @@ define_keywords!( PRIVILEGES, PROCEDURE, PURGE, + QUARTER, RANGE, RANK, RCFILE, @@ -460,6 +472,7 @@ define_keywords!( TIES, TIME, TIMESTAMP, + TIMEZONE, TIMEZONE_HOUR, TIMEZONE_MINUTE, TINYINT, diff --git a/src/parser.rs b/src/parser.rs index 8b332da78b..b626cc9810 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -906,6 +906,21 @@ impl<'a> Parser<'a> { Keyword::HOUR => Ok(DateTimeField::Hour), Keyword::MINUTE => Ok(DateTimeField::Minute), Keyword::SECOND => Ok(DateTimeField::Second), + Keyword::CENTURY => Ok(DateTimeField::Century), + Keyword::DECADE => Ok(DateTimeField::Decade), + Keyword::DOY => Ok(DateTimeField::Doy), + Keyword::DOW => Ok(DateTimeField::Dow), + Keyword::EPOCH => Ok(DateTimeField::Epoch), + Keyword::ISODOW => Ok(DateTimeField::Isodow), + Keyword::ISOYEAR => Ok(DateTimeField::Isoyear), + Keyword::JULIAN => Ok(DateTimeField::Julian), + Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds), + Keyword::MILLENIUM => Ok(DateTimeField::Millenium), + Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds), + Keyword::QUARTER => Ok(DateTimeField::Quarter), + Keyword::TIMEZONE => Ok(DateTimeField::Timezone), + Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour), + Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute), _ => self.expected("date/time field", Token::Word(w))?, }, unexpected => self.expected("date/time field", unexpected), @@ -948,6 +963,21 @@ impl<'a> Parser<'a> { Keyword::HOUR, Keyword::MINUTE, Keyword::SECOND, + Keyword::CENTURY, + Keyword::DECADE, + Keyword::DOW, + Keyword::DOY, + Keyword::EPOCH, + Keyword::ISODOW, + Keyword::ISOYEAR, + Keyword::JULIAN, + Keyword::MICROSECONDS, + Keyword::MILLENIUM, + Keyword::MILLISECONDS, + Keyword::QUARTER, + Keyword::TIMEZONE, + Keyword::TIMEZONE_HOUR, + Keyword::TIMEZONE_MINUTE, ] .iter() .any(|d| kw.keyword == *d) => diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index a914e15d61..360db52be2 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1367,6 +1367,21 @@ fn parse_extract() { verified_stmt("SELECT EXTRACT(HOUR FROM d)"); verified_stmt("SELECT EXTRACT(MINUTE FROM d)"); verified_stmt("SELECT EXTRACT(SECOND FROM d)"); + verified_stmt("SELECT EXTRACT(CENTURY FROM d)"); + verified_stmt("SELECT EXTRACT(DECADE FROM d)"); + verified_stmt("SELECT EXTRACT(DOW FROM d)"); + verified_stmt("SELECT EXTRACT(DOY FROM d)"); + verified_stmt("SELECT EXTRACT(EPOCH FROM d)"); + verified_stmt("SELECT EXTRACT(ISODOW FROM d)"); + verified_stmt("SELECT EXTRACT(ISOYEAR FROM d)"); + verified_stmt("SELECT EXTRACT(JULIAN FROM d)"); + verified_stmt("SELECT EXTRACT(MICROSECONDS FROM d)"); + verified_stmt("SELECT EXTRACT(MILLENIUM FROM d)"); + verified_stmt("SELECT EXTRACT(MILLISECONDS FROM d)"); + verified_stmt("SELECT EXTRACT(QUARTER FROM d)"); + verified_stmt("SELECT EXTRACT(TIMEZONE FROM d)"); + verified_stmt("SELECT EXTRACT(TIMEZONE_HOUR FROM d)"); + verified_stmt("SELECT EXTRACT(TIMEZONE_MINUTE FROM d)"); let res = parse_sql_statements("SELECT EXTRACT(MILLISECOND FROM d)"); assert_eq!(