@@ -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()?))
@@ -5023,7 +5023,7 @@ impl<'a> Parser<'a> {
50235023 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
50245024 }
50255025 }
5026- },
5026+ }
50275027 };
50285028 Ok(owner)
50295029 }
@@ -7997,6 +7997,23 @@ impl<'a> Parser<'a> {
79977997 }
79987998 }
79997999
8000+ pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
8001+ self.expect_token(&Token::LParen)?;
8002+ let values = self.parse_comma_separated(|parser| {
8003+ let name = parser.parse_literal_string()?;
8004+ let e = if parser.consume_token(&Token::Eq) {
8005+ let value = parser.parse_number()?;
8006+ EnumMember::NamedValue(name, value)
8007+ } else {
8008+ EnumMember::Name(name)
8009+ };
8010+ Ok(e)
8011+ })?;
8012+ self.expect_token(&Token::RParen)?;
8013+
8014+ Ok(values)
8015+ }
8016+
80008017 /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
80018018 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
80028019 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
@@ -8235,7 +8252,9 @@ impl<'a> Parser<'a> {
82358252 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
82368253 self.parse_exact_number_optional_precision_scale()?,
82378254 )),
8238- Keyword::ENUM => Ok(DataType::Enum(self.parse_string_values()?)),
8255+ Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
8256+ Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
8257+ Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
82398258 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
82408259 Keyword::ARRAY => {
82418260 if dialect_of!(self is SnowflakeDialect) {
0 commit comments