mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-27 07:59:11 +00:00
extract operator: add support for Postgres keywords (#427)
Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
This commit is contained in:
parent
0d1c5d1205
commit
3af3ca07b6
4 changed files with 88 additions and 0 deletions
|
@ -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",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) =>
|
||||||
|
|
|
@ -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!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue