@@ -814,7 +814,9 @@ impl<'a> Parser<'a> {
814814
815815 pub fn parse_extract_expr ( & mut self ) -> Result < Expr , ParserError > {
816816 self . expect_token ( & Token :: LParen ) ?;
817- let field = self . parse_date_time_field ( ) ?;
817+ let field_parsable_as_string =
818+ dialect_of ! ( self is GenericDialect | PostgreSqlDialect | RedshiftSqlDialect ) ;
819+ let field = self . parse_date_time_field ( field_parsable_as_string) ?;
818820 self . expect_keyword ( Keyword :: FROM ) ?;
819821 let expr = self . parse_expr ( ) ?;
820822 self . expect_token ( & Token :: RParen ) ?;
@@ -975,34 +977,45 @@ impl<'a> Parser<'a> {
975977 // operator and interval qualifiers. EXTRACT supports a wider set of
976978 // date/time fields than interval qualifiers, so this function may need to
977979 // be split in two.
978- pub fn parse_date_time_field ( & mut self ) -> Result < DateTimeField , ParserError > {
979- match self . next_token ( ) {
980- Token :: Word ( w) => match w. keyword {
981- Keyword :: YEAR => Ok ( DateTimeField :: Year ) ,
982- Keyword :: MONTH => Ok ( DateTimeField :: Month ) ,
983- Keyword :: WEEK => Ok ( DateTimeField :: Week ) ,
984- Keyword :: DAY => Ok ( DateTimeField :: Day ) ,
985- Keyword :: HOUR => Ok ( DateTimeField :: Hour ) ,
986- Keyword :: MINUTE => Ok ( DateTimeField :: Minute ) ,
987- Keyword :: SECOND => Ok ( DateTimeField :: Second ) ,
988- Keyword :: CENTURY => Ok ( DateTimeField :: Century ) ,
989- Keyword :: DECADE => Ok ( DateTimeField :: Decade ) ,
990- Keyword :: DOY => Ok ( DateTimeField :: Doy ) ,
991- Keyword :: DOW => Ok ( DateTimeField :: Dow ) ,
992- Keyword :: EPOCH => Ok ( DateTimeField :: Epoch ) ,
993- Keyword :: ISODOW => Ok ( DateTimeField :: Isodow ) ,
994- Keyword :: ISOYEAR => Ok ( DateTimeField :: Isoyear ) ,
995- Keyword :: JULIAN => Ok ( DateTimeField :: Julian ) ,
996- Keyword :: MICROSECONDS => Ok ( DateTimeField :: Microseconds ) ,
997- Keyword :: MILLENIUM => Ok ( DateTimeField :: Millenium ) ,
998- Keyword :: MILLISECONDS => Ok ( DateTimeField :: Milliseconds ) ,
999- Keyword :: QUARTER => Ok ( DateTimeField :: Quarter ) ,
1000- Keyword :: TIMEZONE => Ok ( DateTimeField :: Timezone ) ,
1001- Keyword :: TIMEZONE_HOUR => Ok ( DateTimeField :: TimezoneHour ) ,
1002- Keyword :: TIMEZONE_MINUTE => Ok ( DateTimeField :: TimezoneMinute ) ,
1003- _ => self . expected ( "date/time field" , Token :: Word ( w) ) ?,
980+ pub fn parse_date_time_field (
981+ & mut self ,
982+ parsable_as_str : bool ,
983+ ) -> Result < DateTimeField , ParserError > {
984+ let token = self . next_token ( ) ;
985+
986+ let date_time_field = match & token {
987+ Token :: Word ( w) => w. keyword ,
988+ Token :: SingleQuotedString ( s) if parsable_as_str => match Token :: make_keyword ( s) {
989+ Token :: Word ( w) => w. keyword ,
990+ _ => self . expected ( "date/time field" , token. clone ( ) ) ?,
1004991 } ,
1005- unexpected => self . expected ( "date/time field" , unexpected) ,
992+ _ => self . expected ( "date/time field" , token. clone ( ) ) ?,
993+ } ;
994+
995+ match date_time_field {
996+ Keyword :: YEAR => Ok ( DateTimeField :: Year ) ,
997+ Keyword :: MONTH => Ok ( DateTimeField :: Month ) ,
998+ Keyword :: WEEK => Ok ( DateTimeField :: Week ) ,
999+ Keyword :: DAY => Ok ( DateTimeField :: Day ) ,
1000+ Keyword :: HOUR => Ok ( DateTimeField :: Hour ) ,
1001+ Keyword :: MINUTE => Ok ( DateTimeField :: Minute ) ,
1002+ Keyword :: SECOND => Ok ( DateTimeField :: Second ) ,
1003+ Keyword :: CENTURY => Ok ( DateTimeField :: Century ) ,
1004+ Keyword :: DECADE => Ok ( DateTimeField :: Decade ) ,
1005+ Keyword :: DOY => Ok ( DateTimeField :: Doy ) ,
1006+ Keyword :: DOW => Ok ( DateTimeField :: Dow ) ,
1007+ Keyword :: EPOCH => Ok ( DateTimeField :: Epoch ) ,
1008+ Keyword :: ISODOW => Ok ( DateTimeField :: Isodow ) ,
1009+ Keyword :: ISOYEAR => Ok ( DateTimeField :: Isoyear ) ,
1010+ Keyword :: JULIAN => Ok ( DateTimeField :: Julian ) ,
1011+ Keyword :: MICROSECONDS => Ok ( DateTimeField :: Microseconds ) ,
1012+ Keyword :: MILLENIUM => Ok ( DateTimeField :: Millenium ) ,
1013+ Keyword :: MILLISECONDS => Ok ( DateTimeField :: Milliseconds ) ,
1014+ Keyword :: QUARTER => Ok ( DateTimeField :: Quarter ) ,
1015+ Keyword :: TIMEZONE => Ok ( DateTimeField :: Timezone ) ,
1016+ Keyword :: TIMEZONE_HOUR => Ok ( DateTimeField :: TimezoneHour ) ,
1017+ Keyword :: TIMEZONE_MINUTE => Ok ( DateTimeField :: TimezoneMinute ) ,
1018+ _ => self . expected ( "date/time field" , token) ?,
10061019 }
10071020 }
10081021
@@ -1067,7 +1080,7 @@ impl<'a> Parser<'a> {
10671080 . iter ( )
10681081 . any ( |d| kw. keyword == * d) =>
10691082 {
1070- Some ( self . parse_date_time_field ( ) ?)
1083+ Some ( self . parse_date_time_field ( false ) ?)
10711084 }
10721085 _ => None ,
10731086 } ;
@@ -1085,7 +1098,7 @@ impl<'a> Parser<'a> {
10851098 } else {
10861099 let leading_precision = self . parse_optional_precision ( ) ?;
10871100 if self . parse_keyword ( Keyword :: TO ) {
1088- let last_field = Some ( self . parse_date_time_field ( ) ?) ;
1101+ let last_field = Some ( self . parse_date_time_field ( false ) ?) ;
10891102 let fsec_precision = if last_field == Some ( DateTimeField :: Second ) {
10901103 self . parse_optional_precision ( ) ?
10911104 } else {
0 commit comments