@@ -11505,28 +11505,29 @@ impl<'a> Parser<'a> {
11505
11505
}
11506
11506
11507
11507
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]) {
11512
11510
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)
11518
11512
} 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)
11524
11522
} else {
11525
11523
self.expected("VALUE or STRUCT", self.peek_token())?
11526
11524
}
11527
11525
} else {
11528
11526
None
11529
- };
11527
+ }
11528
+ } else {
11529
+ None
11530
+ };
11530
11531
11531
11532
let mut top_before_distinct = false;
11532
11533
let mut top = None;
@@ -11535,16 +11536,7 @@ impl<'a> Parser<'a> {
11535
11536
top_before_distinct = true;
11536
11537
}
11537
11538
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
- };
11539
+ let distinct = self.parse_all_or_distinct()?;
11548
11540
if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
11549
11541
top = Some(self.parse_top()?);
11550
11542
}
0 commit comments