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,
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",
})
}
}

View file

@ -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,
@ -461,6 +473,7 @@ define_keywords!(
TIES,
TIME,
TIMESTAMP,
TIMEZONE,
TIMEZONE_HOUR,
TIMEZONE_MINUTE,
TINYINT,

View file

@ -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) =>

View file

@ -1388,6 +1388,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!(