Skip to content

Commit 6408fc9

Browse files
committed
Only check for DISTINCT AS together and for BigQuery
1 parent 12cba60 commit 6408fc9

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

src/parser/mod.rs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11505,28 +11505,29 @@ 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;
@@ -11535,16 +11536,7 @@ impl<'a> Parser<'a> {
1153511536
top_before_distinct = true;
1153611537
}
1153711538

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()?;
1154811540
if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
1154911541
top = Some(self.parse_top()?);
1155011542
}

0 commit comments

Comments
 (0)