@@ -1049,18 +1049,18 @@ impl<'a> Parser<'a> {
10491049 | Keyword::CURRENT_USER
10501050 | Keyword::SESSION_USER
10511051 | Keyword::USER
1052- if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1053- {
1054- Ok(Some(Expr::Function(Function {
1055- name: ObjectName(vec![w.to_ident(w_span)]),
1056- parameters: FunctionArguments::None,
1057- args: FunctionArguments::None,
1058- null_treatment: None,
1059- filter: None,
1060- over: None,
1061- within_group: vec![],
1062- })))
1063- }
1052+ if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1053+ {
1054+ Ok(Some(Expr::Function(Function {
1055+ name: ObjectName(vec![w.to_ident(w_span)]),
1056+ parameters: FunctionArguments::None,
1057+ args: FunctionArguments::None,
1058+ null_treatment: None,
1059+ filter: None,
1060+ over: None,
1061+ within_group: vec![],
1062+ })))
1063+ }
10641064 Keyword::CURRENT_TIMESTAMP
10651065 | Keyword::CURRENT_TIME
10661066 | Keyword::CURRENT_DATE
@@ -1075,18 +1075,18 @@ impl<'a> Parser<'a> {
10751075 Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
10761076 Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
10771077 Keyword::EXISTS
1078- // Support parsing Databricks has a function named `exists`.
1079- if !dialect_of!(self is DatabricksDialect)
1080- || matches!(
1078+ // Support parsing Databricks has a function named `exists`.
1079+ if !dialect_of!(self is DatabricksDialect)
1080+ || matches!(
10811081 self.peek_nth_token(1).token,
10821082 Token::Word(Word {
10831083 keyword: Keyword::SELECT | Keyword::WITH,
10841084 ..
10851085 })
10861086 ) =>
1087- {
1088- Ok(Some(self.parse_exists_expr(false)?))
1089- }
1087+ {
1088+ Ok(Some(self.parse_exists_expr(false)?))
1089+ }
10901090 Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
10911091 Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
10921092 Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
@@ -1103,22 +1103,22 @@ impl<'a> Parser<'a> {
11031103 Ok(Some(self.parse_array_expr(true)?))
11041104 }
11051105 Keyword::ARRAY
1106- if self.peek_token() == Token::LParen
1107- && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1108- {
1109- self.expect_token(&Token::LParen)?;
1110- let query = self.parse_query()?;
1111- self.expect_token(&Token::RParen)?;
1112- Ok(Some(Expr::Function(Function {
1113- name: ObjectName(vec![w.to_ident(w_span)]),
1114- parameters: FunctionArguments::None,
1115- args: FunctionArguments::Subquery(query),
1116- filter: None,
1117- null_treatment: None,
1118- over: None,
1119- within_group: vec![],
1120- })))
1121- }
1106+ if self.peek_token() == Token::LParen
1107+ && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1108+ {
1109+ self.expect_token(&Token::LParen)?;
1110+ let query = self.parse_query()?;
1111+ self.expect_token(&Token::RParen)?;
1112+ Ok(Some(Expr::Function(Function {
1113+ name: ObjectName(vec![w.to_ident(w_span)]),
1114+ parameters: FunctionArguments::None,
1115+ args: FunctionArguments::Subquery(query),
1116+ filter: None,
1117+ null_treatment: None,
1118+ over: None,
1119+ within_group: vec![],
1120+ })))
1121+ }
11221122 Keyword::NOT => Ok(Some(self.parse_not()?)),
11231123 Keyword::MATCH if dialect_of!(self is MySqlDialect | GenericDialect) => {
11241124 Ok(Some(self.parse_match_against()?))
@@ -5022,7 +5022,7 @@ impl<'a> Parser<'a> {
50225022 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
50235023 }
50245024 }
5025- },
5025+ }
50265026 };
50275027 Ok(owner)
50285028 }
@@ -7979,6 +7979,27 @@ impl<'a> Parser<'a> {
79797979 }
79807980 }
79817981
7982+ pub fn parse_enum_values(&mut self) -> Result<Vec<EnumValue>, ParserError> {
7983+ self.expect_token(&Token::LParen)?;
7984+ let values = self.parse_comma_separated(Parser::parse_enum_value)?;
7985+ self.expect_token(&Token::RParen)?;
7986+ Ok(values)
7987+ }
7988+
7989+ pub fn parse_enum_value(&mut self) -> Result<EnumValue, ParserError> {
7990+ let str = self.parse_literal_string()?;
7991+ let value = match self.peek_token().token {
7992+ Token::Eq => {
7993+ // Consume the `=` token
7994+ self.next_token();
7995+ let value = self.parse_number_value()?;
7996+ EnumValue::Pair(str, value)
7997+ }
7998+ _ => EnumValue::String(str),
7999+ };
8000+ Ok(value)
8001+ }
8002+
79828003 /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
79838004 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
79848005 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
@@ -8204,7 +8225,9 @@ impl<'a> Parser<'a> {
82048225 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
82058226 self.parse_exact_number_optional_precision_scale()?,
82068227 )),
8207- Keyword::ENUM => Ok(DataType::Enum(self.parse_string_values()?)),
8228+ Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
8229+ Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
8230+ Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
82088231 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
82098232 Keyword::ARRAY => {
82108233 if dialect_of!(self is SnowflakeDialect) {
0 commit comments