Skip to content

Commit 6f992cd

Browse files
committed
chore: add back tests for statement splitter
1 parent 4812459 commit 6f992cd

File tree

5 files changed

+136
-2
lines changed

5 files changed

+136
-2
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/pg_statement_splitter/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ pg_lexer.workspace = true
88
text-size = "1.1.1"
99

1010
[dev-dependencies]
11-
insta = "1.31.0"
11+
pg_query = "0.8"
1212

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
select id, name, test1231234123, unknown from co;
2+
3+
select 14433313331333
4+
5+
alter table test drop column id;
6+
7+
select lower('test');
8+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
brin
2+
brin_bloom
3+
brin_multi
4+
collate.icu.utf8
5+
collate.linux.utf8
6+
collate
7+
copy2
8+
create_table_like
9+
drop_operator
10+
replica_identity
11+
unicode
12+
xmlmap
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
use std::fs::{self};
2+
3+
const DATA_DIR_PATH: &str = "tests/data/";
4+
const POSTGRES_REGRESS_PATH: &str = "../../libpg_query/test/sql/postgres_regress/";
5+
const SKIPPED_REGRESS_TESTS: &str = include_str!("skipped.txt");
6+
7+
#[test]
8+
fn test_postgres_regress() {
9+
// all postgres regress tests are valid and complete statements, so we can use `split_with_parser` and compare with our own splitter
10+
11+
let mut paths: Vec<_> = fs::read_dir(POSTGRES_REGRESS_PATH)
12+
.unwrap()
13+
.map(|r| r.unwrap())
14+
.collect();
15+
paths.sort_by_key(|dir| dir.path());
16+
17+
for f in paths.iter() {
18+
let path = f.path();
19+
20+
let test_name = path.file_stem().unwrap().to_str().unwrap();
21+
22+
// these require fixes in the parser
23+
if SKIPPED_REGRESS_TESTS
24+
.lines()
25+
.collect::<Vec<_>>()
26+
.contains(&test_name)
27+
{
28+
continue;
29+
}
30+
31+
// remove \commands because pg_query doesn't support them
32+
let contents = fs::read_to_string(&path)
33+
.unwrap()
34+
.lines()
35+
.filter(|l| !l.starts_with("\\") && !l.ends_with("\\gset"))
36+
.collect::<Vec<_>>()
37+
.join(" ");
38+
39+
let libpg_query_split = pg_query::split_with_parser(&contents).unwrap();
40+
41+
let parser_split = pg_statement_splitter::split(&contents);
42+
43+
assert_eq!(
44+
parser_split.errors.len(),
45+
0,
46+
"Unexpected errors when parsing file {}:\n{:#?}",
47+
test_name,
48+
parser_split.errors
49+
);
50+
51+
assert_eq!(
52+
libpg_query_split.len(),
53+
parser_split.ranges.len(),
54+
"Mismatch in statement count for file {}: Expected {} statements, got {}",
55+
test_name,
56+
libpg_query_split.len(),
57+
parser_split.ranges.len()
58+
);
59+
60+
for (libpg_query_stmt, parser_range) in
61+
libpg_query_split.iter().zip(parser_split.ranges.iter())
62+
{
63+
let parser_stmt = &contents[parser_range.clone()].trim();
64+
65+
let libpg_query_stmt = if libpg_query_stmt.ends_with(';') {
66+
libpg_query_stmt.to_string()
67+
} else {
68+
format!("{};", libpg_query_stmt.trim())
69+
};
70+
71+
let libpg_query_stmt_trimmed = libpg_query_stmt.trim();
72+
let parser_stmt_trimmed = parser_stmt.trim();
73+
74+
assert_eq!(
75+
libpg_query_stmt_trimmed, parser_stmt_trimmed,
76+
"Mismatch in statement {}:\nlibg_query: '{}'\nsplitter: '{}'",
77+
test_name, libpg_query_stmt_trimmed, parser_stmt_trimmed
78+
);
79+
}
80+
}
81+
}
82+
83+
#[test]
84+
fn test_statement_splitter() {
85+
let mut paths: Vec<_> = fs::read_dir(DATA_DIR_PATH)
86+
.unwrap()
87+
.map(|r| r.unwrap())
88+
.collect();
89+
paths.sort_by_key(|dir| dir.path());
90+
91+
for f in paths.iter() {
92+
let path = f.path();
93+
let test_name = path.file_stem().unwrap().to_str().unwrap();
94+
let expected_count = test_name
95+
.split("__")
96+
.last()
97+
.unwrap()
98+
.parse::<usize>()
99+
.unwrap();
100+
101+
let contents = fs::read_to_string(&path).unwrap();
102+
103+
let split = pg_statement_splitter::split(&contents);
104+
105+
assert_eq!(
106+
split.ranges.len(),
107+
expected_count,
108+
"Mismatch in statement count for file {}: Expected {} statements, got {}",
109+
test_name,
110+
expected_count,
111+
split.ranges.len()
112+
);
113+
}
114+
}

0 commit comments

Comments
 (0)