Add TrimWhereField for parse_trim_expr (#334)

* Remove Box from `trim_where`

* Add TrimWhereField for `parse_trim_expr`

* Add negative test case
This commit is contained in:
Jiseok CHOI 2021-08-23 23:51:36 +09:00 committed by GitHub
parent 5ce67177b3
commit af1ac865b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 5 deletions

View file

@ -666,10 +666,10 @@ impl<'a> Parser<'a> {
.iter()
.any(|d| word.keyword == *d)
{
let ident = self.parse_identifier()?;
let trim_where = self.parse_trim_where()?;
let sub_expr = self.parse_expr()?;
self.expect_keyword(Keyword::FROM)?;
where_expr = Some((ident, sub_expr))
where_expr = Some((trim_where, Box::new(sub_expr)));
}
}
let expr = self.parse_expr()?;
@ -677,10 +677,22 @@ impl<'a> Parser<'a> {
Ok(Expr::Trim {
expr: Box::new(expr),
trim_where: where_expr.map(|(ident, expr)| (Box::new(ident), Box::new(expr))),
trim_where: where_expr,
})
}
pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
match self.next_token() {
Token::Word(w) => match w.keyword {
Keyword::BOTH => Ok(TrimWhereField::Both),
Keyword::LEADING => Ok(TrimWhereField::Leading),
Keyword::TRAILING => Ok(TrimWhereField::Trailing),
_ => self.expected("trim_where field", Token::Word(w))?,
},
unexpected => self.expected("trim_where field", unexpected),
}
}
/// Parse a SQL LISTAGG expression, e.g. `LISTAGG(...) WITHIN GROUP (ORDER BY ...)`.
pub fn parse_listagg_expr(&mut self) -> Result<Expr, ParserError> {
self.expect_token(&Token::LParen)?;