extract operator: add support for Postgres keywords (#427)

Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
This commit is contained in:
Maciej Obuchowski 2022-03-07 16:03:28 +01:00 committed by GitHub
parent 0d1c5d1205
commit 3af3ca07b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 0 deletions

View file

@ -127,6 +127,21 @@ pub enum DateTimeField {
Hour, Hour,
Minute, Minute,
Second, Second,
Century,
Decade,
Dow,
Doy,
Epoch,
Isodow,
Isoyear,
Julian,
Microseconds,
Millenium,
Milliseconds,
Quarter,
Timezone,
TimezoneHour,
TimezoneMinute,
} }
impl fmt::Display for DateTimeField { impl fmt::Display for DateTimeField {
@ -138,6 +153,21 @@ impl fmt::Display for DateTimeField {
DateTimeField::Hour => "HOUR", DateTimeField::Hour => "HOUR",
DateTimeField::Minute => "MINUTE", DateTimeField::Minute => "MINUTE",
DateTimeField::Second => "SECOND", 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",
}) })
} }
} }

View file

@ -113,6 +113,7 @@ define_keywords!(
CAST, CAST,
CEIL, CEIL,
CEILING, CEILING,
CENTURY,
CHAIN, CHAIN,
CHANGE, CHANGE,
CHAR, CHAR,
@ -169,6 +170,7 @@ define_keywords!(
DAY, DAY,
DEALLOCATE, DEALLOCATE,
DEC, DEC,
DECADE,
DECIMAL, DECIMAL,
DECLARE, DECLARE,
DEFAULT, DEFAULT,
@ -185,6 +187,8 @@ define_keywords!(
DISTINCT, DISTINCT,
DISTRIBUTE, DISTRIBUTE,
DOUBLE, DOUBLE,
DOW,
DOY,
DROP, DROP,
DUPLICATE, DUPLICATE,
DYNAMIC, DYNAMIC,
@ -197,6 +201,7 @@ define_keywords!(
END_PARTITION, END_PARTITION,
ENGINE, ENGINE,
ENUM, ENUM,
EPOCH,
EQUALS, EQUALS,
ERROR, ERROR,
ESCAPE, ESCAPE,
@ -261,9 +266,12 @@ define_keywords!(
INTERVAL, INTERVAL,
INTO, INTO,
IS, IS,
ISODOW,
ISOLATION, ISOLATION,
ISOYEAR,
JOIN, JOIN,
JSONFILE, JSONFILE,
JULIAN,
KEY, KEY,
LAG, LAG,
LANGUAGE, LANGUAGE,
@ -293,6 +301,9 @@ define_keywords!(
MERGE, MERGE,
METADATA, METADATA,
METHOD, METHOD,
MICROSECONDS,
MILLENIUM,
MILLISECONDS,
MIN, MIN,
MINUTE, MINUTE,
MOD, MOD,
@ -361,6 +372,7 @@ define_keywords!(
PRIVILEGES, PRIVILEGES,
PROCEDURE, PROCEDURE,
PURGE, PURGE,
QUARTER,
RANGE, RANGE,
RANK, RANK,
RCFILE, RCFILE,
@ -461,6 +473,7 @@ define_keywords!(
TIES, TIES,
TIME, TIME,
TIMESTAMP, TIMESTAMP,
TIMEZONE,
TIMEZONE_HOUR, TIMEZONE_HOUR,
TIMEZONE_MINUTE, TIMEZONE_MINUTE,
TINYINT, TINYINT,

View file

@ -906,6 +906,21 @@ impl<'a> Parser<'a> {
Keyword::HOUR => Ok(DateTimeField::Hour), Keyword::HOUR => Ok(DateTimeField::Hour),
Keyword::MINUTE => Ok(DateTimeField::Minute), Keyword::MINUTE => Ok(DateTimeField::Minute),
Keyword::SECOND => Ok(DateTimeField::Second), 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))?, _ => self.expected("date/time field", Token::Word(w))?,
}, },
unexpected => self.expected("date/time field", unexpected), unexpected => self.expected("date/time field", unexpected),
@ -948,6 +963,21 @@ impl<'a> Parser<'a> {
Keyword::HOUR, Keyword::HOUR,
Keyword::MINUTE, Keyword::MINUTE,
Keyword::SECOND, 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() .iter()
.any(|d| kw.keyword == *d) => .any(|d| kw.keyword == *d) =>

View file

@ -1388,6 +1388,21 @@ fn parse_extract() {
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)");
verified_stmt("SELECT EXTRACT(SECOND 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)"); let res = parse_sql_statements("SELECT EXTRACT(MILLISECOND FROM d)");
assert_eq!( assert_eq!(