Skip to content

Commit 599d75a

Browse files
authored
Merge pull request apache#8 from zhyass/main
Add tuple expression
2 parents eca5b86 + b780e7c commit 599d75a

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

src/ast/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,8 @@ pub enum Expr {
244244
},
245245
/// Nested expression e.g. `(foo > bar)` or `(1)`
246246
Nested(Box<Expr>),
247+
// Tuple expression e.g. `(foo,bar)`
248+
Tuple(Vec<Expr>),
247249
/// A literal value, such as string, number, date or NULL
248250
Value(Value),
249251
/// A constant of form `<data_type> 'value'`.
@@ -348,6 +350,7 @@ impl fmt::Display for Expr {
348350
Expr::Extract { field, expr } => write!(f, "EXTRACT({} FROM {})", field, expr),
349351
Expr::Collate { expr, collation } => write!(f, "{} COLLATE {}", expr, collation),
350352
Expr::Nested(ast) => write!(f, "({})", ast),
353+
Expr::Tuple(ast) => write!(f, "({})", display_comma_separated(ast)),
351354
Expr::Value(v) => write!(f, "{}", v),
352355
Expr::TypedString { data_type, value } => {
353356
write!(f, "{}", data_type)?;

src/parser.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,12 @@ impl<'a> Parser<'a> {
447447
self.prev_token();
448448
Expr::Subquery(Box::new(self.parse_query()?))
449449
} else {
450-
Expr::Nested(Box::new(self.parse_expr()?))
450+
let exprs = self.parse_comma_separated(Parser::parse_expr)?;
451+
if exprs.len() == 1 {
452+
Expr::Nested(Box::new(exprs[0].clone()))
453+
} else {
454+
Expr::Tuple(exprs)
455+
}
451456
};
452457
self.expect_token(&Token::RParen)?;
453458
Ok(expr)

tests/sqlparser_common.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,27 @@ fn parse_parens() {
23592359
);
23602360
}
23612361

2362+
#[test]
2363+
fn parse_tuples() {
2364+
use self::BinaryOperator::*;
2365+
use self::Expr::*;
2366+
let sql = "(a, b) = (c, d)";
2367+
assert_eq!(
2368+
BinaryOp {
2369+
left: Box::new(Tuple(vec![
2370+
Identifier(Ident::new("a")),
2371+
Identifier(Ident::new("b")),
2372+
])),
2373+
op: Eq,
2374+
right: Box::new(Tuple(vec![
2375+
Identifier(Ident::new("c")),
2376+
Identifier(Ident::new("d")),
2377+
])),
2378+
},
2379+
verified_expr(sql)
2380+
);
2381+
}
2382+
23622383
#[test]
23632384
fn parse_searched_case_expr() {
23642385
let sql = "SELECT CASE WHEN bar IS NULL THEN 'null' WHEN bar = 0 THEN '=0' WHEN bar >= 0 THEN '>=0' ELSE '<0' END FROM foo";

0 commit comments

Comments
 (0)