mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-09 15:40:32 +00:00
Support DISTINCT
for SetOperator (#689)
* Update SetOperation field all to op_option * Implement parse_set_operator_option cargo fmt Fix parse_set_operator_option after next_token * Add test for parsing union distinct * Rename to SetQualifier and fix fmt space * Add None to SetQualifier * Update parse method * Rename to SetQuantifier * Rename parse_set_operator_option parse_set_operator * Fix test to parse union, except, intersect * Add some comments to SetQuantifier * Fix comment
This commit is contained in:
parent
0f7e144890
commit
f7817bc7c2
5 changed files with 65 additions and 9 deletions
|
@ -4199,10 +4199,11 @@ impl<'a> Parser<'a> {
|
|||
break;
|
||||
}
|
||||
self.next_token(); // skip past the set operator
|
||||
let set_quantifier = self.parse_set_quantifier(&op);
|
||||
expr = SetExpr::SetOperation {
|
||||
left: Box::new(expr),
|
||||
op: op.unwrap(),
|
||||
all: self.parse_keyword(Keyword::ALL),
|
||||
set_quantifier,
|
||||
right: Box::new(self.parse_query_body(next_precedence)?),
|
||||
};
|
||||
}
|
||||
|
@ -4219,6 +4220,30 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
|
||||
match op {
|
||||
Some(SetOperator::Union) => {
|
||||
if self.parse_keyword(Keyword::ALL) {
|
||||
SetQuantifier::All
|
||||
} else if self.parse_keyword(Keyword::DISTINCT) {
|
||||
SetQuantifier::Distinct
|
||||
} else {
|
||||
SetQuantifier::None
|
||||
}
|
||||
}
|
||||
Some(SetOperator::Except) | Some(SetOperator::Intersect) => {
|
||||
if self.parse_keyword(Keyword::ALL) {
|
||||
SetQuantifier::All
|
||||
} else if self.parse_keyword(Keyword::DISTINCT) {
|
||||
SetQuantifier::Distinct
|
||||
} else {
|
||||
SetQuantifier::None
|
||||
}
|
||||
}
|
||||
_ => SetQuantifier::None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
|
||||
/// assuming the initial `SELECT` was already consumed
|
||||
pub fn parse_select(&mut self) -> Result<Select, ParserError> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue