Add Expr::tuple + parsing (#414)

This commit is contained in:
Andrew Lamb 2022-02-08 10:54:27 -05:00 committed by GitHub
parent 8a3544abae
commit ff558eeb61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 68 additions and 13 deletions

View file

@ -332,7 +332,6 @@ fn parse_select_distinct_two_fields() {
let sql = "SELECT DISTINCT name, id FROM customer";
let select = verified_only_select(sql);
assert!(select.distinct);
one_statement_parses_to("SELECT DISTINCT (name, id) FROM customer", sql);
assert_eq!(
&SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("name"))),
&select.projection[0]
@ -343,6 +342,19 @@ fn parse_select_distinct_two_fields() {
);
}
#[test]
fn parse_select_distinct_tuple() {
let sql = "SELECT DISTINCT (name, id) FROM customer";
let select = verified_only_select(sql);
assert_eq!(
&vec![SelectItem::UnnamedExpr(Expr::Tuple(vec![
Expr::Identifier(Ident::new("name")),
Expr::Identifier(Ident::new("id")),
]))],
&select.projection
);
}
#[test]
fn parse_select_distinct_missing_paren() {
let result = parse_sql_statements("SELECT DISTINCT (name, id FROM customer");
@ -1033,6 +1045,44 @@ fn parse_between_with_expr() {
)
}
#[test]
fn parse_tuples() {
let sql = "SELECT (1, 2), (1), ('foo', 3, baz)";
let select = verified_only_select(sql);
assert_eq!(
vec![
SelectItem::UnnamedExpr(Expr::Tuple(vec![
Expr::Value(number("1")),
Expr::Value(number("2"))
])),
SelectItem::UnnamedExpr(Expr::Nested(Box::new(Expr::Value(number("1"))))),
SelectItem::UnnamedExpr(Expr::Tuple(vec![
Expr::Value(Value::SingleQuotedString("foo".into())),
Expr::Value(number("3")),
Expr::Identifier(Ident::new("baz"))
]))
],
select.projection
);
}
#[test]
fn parse_tuple_invalid() {
let sql = "select (1";
let res = parse_sql_statements(sql);
assert_eq!(
ParserError::ParserError("Expected ), found: EOF".to_string()),
res.unwrap_err()
);
let sql = "select (), 2";
let res = parse_sql_statements(sql);
assert_eq!(
ParserError::ParserError("Expected an expression:, found: )".to_string()),
res.unwrap_err()
);
}
#[test]
fn parse_select_order_by() {
fn chk(sql: &str) {
@ -1121,6 +1171,12 @@ fn parse_select_group_by() {
],
select.group_by
);
// Tuples can also be in the set
one_statement_parses_to(
"SELECT id, fname, lname FROM customer GROUP BY (lname, fname)",
"SELECT id, fname, lname FROM customer GROUP BY (lname, fname)",
);
}
#[test]