From 00d071286b2d0beab2a7951f9bece2574e2d8383 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Mon, 10 Apr 2023 09:48:23 -0400 Subject: [PATCH] Move tests from parser.rs to appropriate parse_XX tests (#845) * Move tests from parser.rs to appropriate parse_XX tests * move to postgres tests * move more tests --- src/parser.rs | 59 ----------------------------- tests/sqlparser_common.rs | 64 +++----------------------------- tests/sqlparser_mysql.rs | 1 + tests/sqlparser_postgres.rs | 74 ++++++++++++++++++++++++++++++++++++- 4 files changed, 79 insertions(+), 119 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index bdd5169f..b06e6bd2 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -6912,40 +6912,6 @@ mod tests { }); } - #[test] - fn test_parse_limit() { - let sql = "SELECT * FROM user LIMIT 1"; - all_dialects().run_parser_method(sql, |parser| { - let ast = parser.parse_query().unwrap(); - assert_eq!(ast.to_string(), sql.to_string()); - }); - - let sql = "SELECT * FROM user LIMIT $1 OFFSET $2"; - let dialects = TestedDialects { - dialects: vec![ - Box::new(PostgreSqlDialect {}), - Box::new(ClickHouseDialect {}), - Box::new(GenericDialect {}), - Box::new(MsSqlDialect {}), - Box::new(SnowflakeDialect {}), - ], - }; - - dialects.run_parser_method(sql, |parser| { - let ast = parser.parse_query().unwrap(); - assert_eq!(ast.to_string(), sql.to_string()); - }); - - let sql = "SELECT * FROM user LIMIT ? OFFSET ?"; - let dialects = TestedDialects { - dialects: vec![Box::new(MySqlDialect {})], - }; - dialects.run_parser_method(sql, |parser| { - let ast = parser.parse_query().unwrap(); - assert_eq!(ast.to_string(), sql.to_string()); - }); - } - #[cfg(test)] mod test_parse_data_type { use crate::ast::{ @@ -7402,24 +7368,6 @@ mod tests { ); } - #[test] - fn test_update_has_keyword() { - let sql = r#"UPDATE test SET name=$1, - value=$2, - where=$3, - create=$4, - is_default=$5, - classification=$6, - sort=$7 - WHERE id=$8"#; - let pg_dialect = PostgreSqlDialect {}; - let ast = Parser::parse_sql(&pg_dialect, sql).unwrap(); - assert_eq!( - ast[0].to_string(), - r#"UPDATE test SET name = $1, value = $2, where = $3, create = $4, is_default = $5, classification = $6, sort = $7 WHERE id = $8"# - ); - } - #[test] fn test_tokenizer_error_loc() { let sql = "foo '"; @@ -7458,11 +7406,4 @@ mod tests { )) ); } - - #[test] - fn test_update_in_with_subquery() { - let sql = r#"WITH "result" AS (UPDATE "Hero" SET "name" = 'Captain America', "number_of_movies" = "number_of_movies" + 1 WHERE "secret_identity" = 'Sam Wilson' RETURNING "id", "name", "secret_identity", "number_of_movies") SELECT * FROM "result""#; - let ast = Parser::parse_sql(&GenericDialect, sql).unwrap(); - assert_eq!(ast[0].to_string(), sql); - } } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 814c3fe0..55350e5a 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -513,6 +513,11 @@ fn parse_simple_select() { assert_eq!(Some(Expr::Value(number("5"))), select.limit); } +#[test] +fn parse_limit() { + verified_stmt("SELECT * FROM user LIMIT 1"); +} + #[test] fn parse_limit_is_not_an_alias() { // In dialects supporting LIMIT it shouldn't be parsed as a table alias @@ -1559,65 +1564,6 @@ fn parse_select_group_by() { ); } -#[test] -fn parse_select_group_by_grouping_sets() { - let dialects = TestedDialects { - dialects: vec![Box::new(GenericDialect {}), Box::new(PostgreSqlDialect {})], - }; - let sql = - "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, GROUPING SETS ((brand), (size), ())"; - let select = dialects.verified_only_select(sql); - assert_eq!( - vec![ - Expr::Identifier(Ident::new("size")), - Expr::GroupingSets(vec![ - vec![Expr::Identifier(Ident::new("brand"))], - vec![Expr::Identifier(Ident::new("size"))], - vec![], - ]), - ], - select.group_by - ); -} - -#[test] -fn parse_select_group_by_rollup() { - let dialects = TestedDialects { - dialects: vec![Box::new(GenericDialect {}), Box::new(PostgreSqlDialect {})], - }; - let sql = "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, ROLLUP (brand, size)"; - let select = dialects.verified_only_select(sql); - assert_eq!( - vec![ - Expr::Identifier(Ident::new("size")), - Expr::Rollup(vec![ - vec![Expr::Identifier(Ident::new("brand"))], - vec![Expr::Identifier(Ident::new("size"))], - ]), - ], - select.group_by - ); -} - -#[test] -fn parse_select_group_by_cube() { - let dialects = TestedDialects { - dialects: vec![Box::new(GenericDialect {}), Box::new(PostgreSqlDialect {})], - }; - let sql = "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, CUBE (brand, size)"; - let select = dialects.verified_only_select(sql); - assert_eq!( - vec![ - Expr::Identifier(Ident::new("size")), - Expr::Cube(vec![ - vec![Expr::Identifier(Ident::new("brand"))], - vec![Expr::Identifier(Ident::new("size"))], - ]), - ], - select.group_by - ); -} - #[test] fn parse_select_having() { let sql = "SELECT foo FROM bar GROUP BY foo HAVING COUNT(*) > 1"; diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 04c86cb1..ca2a979d 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -1134,6 +1134,7 @@ fn parse_limit_my_sql_syntax() { "SELECT id, fname, lname FROM customer LIMIT 5, 10", "SELECT id, fname, lname FROM customer LIMIT 10 OFFSET 5", ); + mysql_and_generic().verified_stmt("SELECT * FROM user LIMIT ? OFFSET ?"); } #[test] diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 359889aa..47142121 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2427,7 +2427,27 @@ fn parse_delimited_identifiers() { pg().verified_stmt(r#"CREATE TABLE "foo" ("bar" "int")"#); pg().verified_stmt(r#"ALTER TABLE foo ADD CONSTRAINT "bar" PRIMARY KEY (baz)"#); - //TODO verified_stmt(r#"UPDATE foo SET "bar" = 5"#); + pg().verified_stmt(r#"UPDATE foo SET "bar" = 5"#); +} + +#[test] +fn parse_update_has_keyword() { + pg().one_statement_parses_to( + r#"UPDATE test SET name=$1, + value=$2, + where=$3, + create=$4, + is_default=$5, + classification=$6, + sort=$7 + WHERE id=$8"#, + r#"UPDATE test SET name = $1, value = $2, where = $3, create = $4, is_default = $5, classification = $6, sort = $7 WHERE id = $8"# + ); +} + +#[test] +fn parse_update_in_with_subquery() { + pg_and_generic().verified_stmt(r#"WITH "result" AS (UPDATE "Hero" SET "name" = 'Captain America', "number_of_movies" = "number_of_movies" + 1 WHERE "secret_identity" = 'Sam Wilson' RETURNING "id", "name", "secret_identity", "number_of_movies") SELECT * FROM "result""#); } #[test] @@ -2789,3 +2809,55 @@ fn parse_incorrect_dollar_quoted_string() { let sql = "SELECT $$$"; assert!(pg().parse_sql_statements(sql).is_err()); } + +#[test] +fn parse_select_group_by_grouping_sets() { + let select = pg_and_generic().verified_only_select( + "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, GROUPING SETS ((brand), (size), ())" + ); + assert_eq!( + vec![ + Expr::Identifier(Ident::new("size")), + Expr::GroupingSets(vec![ + vec![Expr::Identifier(Ident::new("brand"))], + vec![Expr::Identifier(Ident::new("size"))], + vec![], + ]), + ], + select.group_by + ); +} + +#[test] +fn parse_select_group_by_rollup() { + let select = pg_and_generic().verified_only_select( + "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, ROLLUP (brand, size)", + ); + assert_eq!( + vec![ + Expr::Identifier(Ident::new("size")), + Expr::Rollup(vec![ + vec![Expr::Identifier(Ident::new("brand"))], + vec![Expr::Identifier(Ident::new("size"))], + ]), + ], + select.group_by + ); +} + +#[test] +fn parse_select_group_by_cube() { + let select = pg_and_generic().verified_only_select( + "SELECT brand, size, sum(sales) FROM items_sold GROUP BY size, CUBE (brand, size)", + ); + assert_eq!( + vec![ + Expr::Identifier(Ident::new("size")), + Expr::Cube(vec![ + vec![Expr::Identifier(Ident::new("brand"))], + vec![Expr::Identifier(Ident::new("size"))], + ]), + ], + select.group_by + ); +}