Merge pull request #25 from nickolay/master

Support "searched" CASE expressions
This commit is contained in:
Andy Grove 2018-10-16 20:03:34 -06:00 committed by GitHub
commit 70a3ae93c8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 90 additions and 1 deletions

View file

@ -109,6 +109,9 @@ impl Parser {
"NULL" => {
self.prev_token();
self.parse_sql_value()
},
"CASE" => {
self.parse_case_expression()
}
_ => return parser_err!(format!("No prefix parser for keyword {}", k)),
},
@ -196,6 +199,40 @@ impl Parser {
}
}
pub fn parse_case_expression(&mut self) -> Result<ASTNode, ParserError> {
if self.parse_keywords(vec!["WHEN"]) {
let mut conditions = vec![];
let mut results = vec![];
let mut else_result = None;
loop {
conditions.push(self.parse_expr(0)?);
self.consume_token(&Token::Keyword("THEN".to_string()))?;
results.push(self.parse_expr(0)?);
if self.parse_keywords(vec!["ELSE"]) {
else_result = Some(Box::new(self.parse_expr(0)?));
if self.parse_keywords(vec!["END"]) {
break
} else {
return parser_err!("Expecting END after a CASE..ELSE");
}
}
if self.parse_keywords(vec!["END"]) {
break
}
self.consume_token(&Token::Keyword("WHEN".to_string()))?;
}
Ok(ASTNode::SQLCase {
conditions,
results,
else_result
})
} else {
// TODO: implement "simple" case
// https://jakewheat.github.io/sql-overview/sql-2011-foundation-grammar.html#simple-case
parser_err!("Simple case not implemented")
}
}
/// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
pub fn parse_cast_expression(&mut self) -> Result<ASTNode, ParserError> {
self.consume_token(&Token::LParen)?;