@@ -11505,46 +11505,37 @@ impl<'a> Parser<'a> {
1150511505 }
1150611506
1150711507 let select_token = self.expect_keyword(Keyword::SELECT)?;
11508- let distinct_pre_as = self.parse_all_or_distinct()?;
11509-
11510- let value_table_mode =
11511- if dialect_of!(self is BigQueryDialect) && self.parse_keyword(Keyword::AS) {
11508+ let value_table_mode = if dialect_of!(self is BigQueryDialect) {
11509+ if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS]) {
1151211510 if self.parse_keyword(Keyword::VALUE) {
11513- if distinct_pre_as.is_some() {
11514- Some(ValueTableMode::DistinctAsValue)
11515- } else {
11516- Some(ValueTableMode::AsValue)
11517- }
11511+ Some(ValueTableMode::DistinctAsValue)
1151811512 } else if self.parse_keyword(Keyword::STRUCT) {
11519- if distinct_pre_as.is_some() {
11520- Some(ValueTableMode::DistinctAsStruct)
11521- } else {
11522- Some(ValueTableMode::AsStruct)
11523- }
11513+ Some(ValueTableMode::DistinctAsStruct)
11514+ } else {
11515+ self.expected("VALUE or STRUCT", self.peek_token())?
11516+ }
11517+ } else if self.parse_keyword(Keyword::AS) {
11518+ if self.parse_keyword(Keyword::VALUE) {
11519+ Some(ValueTableMode::AsValue)
11520+ } else if self.parse_keyword(Keyword::STRUCT) {
11521+ Some(ValueTableMode::AsStruct)
1152411522 } else {
1152511523 self.expected("VALUE or STRUCT", self.peek_token())?
1152611524 }
1152711525 } else {
1152811526 None
11529- };
11527+ }
11528+ } else {
11529+ None
11530+ };
1153011531
1153111532 let mut top_before_distinct = false;
1153211533 let mut top = None;
1153311534 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
1153411535 top = Some(self.parse_top()?);
1153511536 top_before_distinct = true;
1153611537 }
11537-
11538- // If we parsed a `DISTINCT` value before checking `ValueTableMode` and it is set to some,
11539- // but we didn't have an `AS`, this is the initial `DISTINCT` value in the `SELECT` and
11540- // should be re-used.
11541- // If we don't have a `DISTINCT` parsed or if it was consumed for the `ValueTableMode` we
11542- // look for `DISTINCT` again.
11543- let distinct = if value_table_mode.is_none() && distinct_pre_as.is_some() {
11544- distinct_pre_as
11545- } else {
11546- self.parse_all_or_distinct()?
11547- };
11538+ let distinct = self.parse_all_or_distinct()?;
1154811539 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
1154911540 top = Some(self.parse_top()?);
1155011541 }
0 commit comments