| use sqlparser::dialect::GenericDialect; |
| use sqlparser::parser::Parser; |
| |
| fn prettify(sql: &str) -> String { |
| let ast = Parser::parse_sql(&GenericDialect {}, sql).unwrap(); |
| format!("{:#}", ast[0]) |
| } |
| |
| #[test] |
| fn test_pretty_print_select() { |
| assert_eq!( |
| prettify("SELECT a, b, c FROM my_table WHERE x = 1 AND y = 2"), |
| r#" |
| SELECT |
| a, |
| b, |
| c |
| FROM |
| my_table |
| WHERE |
| x = 1 AND y = 2 |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_join() { |
| assert_eq!( |
| prettify("SELECT a FROM table1 JOIN table2 ON table1.id = table2.id"), |
| r#" |
| SELECT |
| a |
| FROM |
| table1 |
| JOIN table2 ON table1.id = table2.id |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_subquery() { |
| assert_eq!( |
| prettify("SELECT * FROM (SELECT a, b FROM my_table) AS subquery"), |
| r#" |
| SELECT |
| * |
| FROM |
| ( |
| SELECT |
| a, |
| b |
| FROM |
| my_table |
| ) AS subquery |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_union() { |
| assert_eq!( |
| prettify("SELECT a FROM table1 UNION SELECT b FROM table2"), |
| r#" |
| SELECT |
| a |
| FROM |
| table1 |
| UNION |
| SELECT |
| b |
| FROM |
| table2 |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_group_by() { |
| assert_eq!( |
| prettify("SELECT a, COUNT(*) FROM my_table GROUP BY a HAVING COUNT(*) > 1"), |
| r#" |
| SELECT |
| a, |
| COUNT(*) |
| FROM |
| my_table |
| GROUP BY |
| a |
| HAVING |
| COUNT(*) > 1 |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_cte() { |
| assert_eq!( |
| prettify("WITH cte AS (SELECT a, b FROM my_table) SELECT * FROM cte"), |
| r#" |
| WITH cte AS ( |
| SELECT |
| a, |
| b |
| FROM |
| my_table |
| ) |
| SELECT |
| * |
| FROM |
| cte |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_case_when() { |
| assert_eq!( |
| prettify("SELECT CASE WHEN x > 0 THEN 'positive' WHEN x < 0 THEN 'negative' ELSE 'zero' END FROM my_table"), |
| r#" |
| SELECT |
| CASE |
| WHEN x > 0 THEN |
| 'positive' |
| WHEN x < 0 THEN |
| 'negative' |
| ELSE |
| 'zero' |
| END |
| FROM |
| my_table |
| "#.trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_window_function() { |
| assert_eq!( |
| prettify("SELECT id, value, ROW_NUMBER() OVER (PARTITION BY category ORDER BY value DESC) as rank FROM my_table"), |
| r#" |
| SELECT |
| id, |
| value, |
| ROW_NUMBER() OVER ( |
| PARTITION BY category |
| ORDER BY value DESC |
| ) AS rank |
| FROM |
| my_table |
| "#.trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_multiline_string() { |
| assert_eq!( |
| prettify("SELECT 'multiline\nstring' AS str"), |
| r#" |
| SELECT |
| 'multiline |
| string' AS str |
| "# |
| .trim(), |
| "A literal string with a newline should be kept as is. The contents of the string should not be indented." |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_insert_values() { |
| assert_eq!( |
| prettify("INSERT INTO my_table (a, b, c) VALUES (1, 2, 3), (4, 5, 6)"), |
| r#" |
| INSERT INTO my_table (a, b, c) |
| VALUES |
| (1, 2, 3), |
| (4, 5, 6) |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_insert_select() { |
| assert_eq!( |
| prettify("INSERT INTO my_table (a, b) SELECT x, y FROM source_table RETURNING a AS id"), |
| r#" |
| INSERT INTO my_table (a, b) |
| SELECT |
| x, |
| y |
| FROM |
| source_table |
| RETURNING |
| a AS id |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_update() { |
| assert_eq!( |
| prettify("UPDATE my_table SET a = 1, b = 2 WHERE x > 0 RETURNING id, name"), |
| r#" |
| UPDATE my_table |
| SET |
| a = 1, |
| b = 2 |
| WHERE |
| x > 0 |
| RETURNING |
| id, |
| name |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_delete() { |
| assert_eq!( |
| prettify("DELETE FROM my_table WHERE x > 0 RETURNING id, name"), |
| r#" |
| DELETE FROM |
| my_table |
| WHERE |
| x > 0 |
| RETURNING |
| id, |
| name |
| "# |
| .trim() |
| ); |
| |
| assert_eq!( |
| prettify("DELETE table1, table2"), |
| r#" |
| DELETE |
| table1, |
| table2 |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_create_table() { |
| assert_eq!( |
| prettify("CREATE TABLE my_table (id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, CONSTRAINT fk_other FOREIGN KEY (id) REFERENCES other_table(id))"), |
| r#" |
| CREATE TABLE my_table ( |
| id INT PRIMARY KEY, |
| name VARCHAR(255) NOT NULL, |
| CONSTRAINT fk_other FOREIGN KEY (id) REFERENCES other_table(id) |
| ) |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| fn test_pretty_print_create_view() { |
| assert_eq!( |
| prettify("CREATE VIEW my_view AS SELECT a, b FROM my_table WHERE x > 0"), |
| r#" |
| CREATE VIEW my_view AS |
| SELECT |
| a, |
| b |
| FROM |
| my_table |
| WHERE |
| x > 0 |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_create_function() { |
| assert_eq!( |
| prettify("CREATE FUNCTION my_func() RETURNS INT BEGIN SELECT COUNT(*) INTO @count FROM my_table; RETURN @count; END"), |
| r#" |
| CREATE FUNCTION my_func() RETURNS INT |
| BEGIN |
| SELECT COUNT(*) INTO @count FROM my_table; |
| RETURN @count; |
| END |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_json_table() { |
| assert_eq!( |
| prettify("SELECT * FROM JSON_TABLE(@json, '$[*]' COLUMNS (id INT PATH '$.id', name VARCHAR(255) PATH '$.name')) AS jt"), |
| r#" |
| SELECT |
| * |
| FROM |
| JSON_TABLE( |
| @json, |
| '$[*]' COLUMNS ( |
| id INT PATH '$.id', |
| name VARCHAR(255) PATH '$.name' |
| ) |
| ) AS jt |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_transaction_blocks() { |
| assert_eq!( |
| prettify("BEGIN; UPDATE my_table SET x = 1; COMMIT;"), |
| r#" |
| BEGIN; |
| UPDATE my_table SET x = 1; |
| COMMIT; |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_control_flow() { |
| assert_eq!( |
| prettify("IF x > 0 THEN SELECT 'positive'; ELSE SELECT 'negative'; END IF;"), |
| r#" |
| IF x > 0 THEN |
| SELECT 'positive'; |
| ELSE |
| SELECT 'negative'; |
| END IF; |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_merge() { |
| assert_eq!( |
| prettify("MERGE INTO target_table t USING source_table s ON t.id = s.id WHEN MATCHED THEN UPDATE SET t.value = s.value WHEN NOT MATCHED THEN INSERT (id, value) VALUES (s.id, s.value)"), |
| r#" |
| MERGE INTO target_table t |
| USING source_table s ON t.id = s.id |
| WHEN MATCHED THEN |
| UPDATE SET t.value = s.value |
| WHEN NOT MATCHED THEN |
| INSERT (id, value) VALUES (s.id, s.value) |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_create_index() { |
| assert_eq!( |
| prettify("CREATE INDEX idx_name ON my_table (column1, column2)"), |
| r#" |
| CREATE INDEX idx_name |
| ON my_table (column1, column2) |
| "# |
| .trim() |
| ); |
| } |
| |
| #[test] |
| #[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"] |
| fn test_pretty_print_explain() { |
| assert_eq!( |
| prettify("EXPLAIN ANALYZE SELECT * FROM my_table WHERE x > 0"), |
| r#" |
| EXPLAIN ANALYZE |
| SELECT |
| * |
| FROM |
| my_table |
| WHERE |
| x > 0 |
| "# |
| .trim() |
| ); |
| } |