mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-07-07 17:04:59 +00:00
399 lines
7.1 KiB
Rust
399 lines
7.1 KiB
Rust
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]
|
|
#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
|
|
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]
|
|
#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
|
|
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()
|
|
);
|
|
}
|