Skip to content

Commit 9144ea1

Browse files
fix(splitter): split grant stmts (#425)
1 parent ad22ef5 commit 9144ea1

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

crates/pgt_statement_splitter/src/lib.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ mod tests {
4545
assert_eq!(
4646
self.parse.ranges.len(),
4747
expected.len(),
48-
"Expected {} statements, got {}: {:?}",
48+
"Expected {} statements for input {}, got {}: {:?}",
4949
expected.len(),
50+
self.input,
5051
self.parse.ranges.len(),
5152
self.parse
5253
.ranges
@@ -114,10 +115,24 @@ mod tests {
114115

115116
#[test]
116117
fn grant() {
117-
Tester::from("GRANT SELECT ON TABLE \"public\".\"my_table\" TO \"my_role\";")
118-
.expect_statements(vec![
119-
"GRANT SELECT ON TABLE \"public\".\"my_table\" TO \"my_role\";",
120-
]);
118+
let stmts = vec![
119+
"GRANT SELECT ON TABLE \"public\".\"my_table\" TO \"my_role\";",
120+
"GRANT UPDATE ON TABLE \"public\".\"my_table\" TO \"my_role\";",
121+
"GRANT DELETE ON TABLE \"public\".\"my_table\" TO \"my_role\";",
122+
"GRANT INSERT ON TABLE \"public\".\"my_table\" TO \"my_role\";",
123+
"GRANT CREATE ON SCHEMA \"public\" TO \"my_role\";",
124+
"GRANT ALL PRIVILEGES ON DATABASE \"my_database\" TO \"my_role\";",
125+
"GRANT USAGE ON SCHEMA \"public\" TO \"my_role\";",
126+
"GRANT EXECUTE ON FUNCTION \"public\".\"my_function\"() TO \"my_role\";",
127+
"GRANT REFERENCES ON TABLE \"public\".\"my_table\" TO \"my_role\";",
128+
"GRANT SELECT, UPDATE ON ALL TABLES IN SCHEMA \"public\" TO \"my_role\";",
129+
"GRANT SELECT, INSERT ON public.users TO anon WITH GRANT OPION GRANTED BY owner;",
130+
"GRANT owner, admin to anon WITH ADMIN;",
131+
];
132+
133+
for stmt in stmts {
134+
Tester::from(stmt).expect_statements(vec![stmt]);
135+
}
121136
}
122137

123138
#[test]

crates/pgt_statement_splitter/src/parser/common.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ pub(crate) fn unknown(p: &mut Parser, exclude: &[SyntaxKind]) {
217217
SyntaxKind::Except,
218218
// for grant
219219
SyntaxKind::Grant,
220+
SyntaxKind::Ascii44,
220221
]
221222
.iter()
222223
.all(|x| Some(x) != prev.as_ref())
@@ -246,6 +247,7 @@ pub(crate) fn unknown(p: &mut Parser, exclude: &[SyntaxKind]) {
246247
SyntaxKind::Instead,
247248
// for grant
248249
SyntaxKind::Grant,
250+
SyntaxKind::Ascii44,
249251
]
250252
.iter()
251253
.all(|x| Some(x) != prev.as_ref())
@@ -263,6 +265,10 @@ pub(crate) fn unknown(p: &mut Parser, exclude: &[SyntaxKind]) {
263265
SyntaxKind::Check,
264266
// TIMESTAMP WITH TIME ZONE should not start a new statement
265267
SyntaxKind::Time,
268+
SyntaxKind::Grant,
269+
SyntaxKind::Admin,
270+
SyntaxKind::Inherit,
271+
SyntaxKind::Set,
266272
]
267273
.iter()
268274
.all(|x| Some(x) != next.as_ref())
@@ -271,6 +277,22 @@ pub(crate) fn unknown(p: &mut Parser, exclude: &[SyntaxKind]) {
271277
}
272278
p.advance();
273279
}
280+
281+
Some(SyntaxKind::Create) => {
282+
let prev = p.look_back().map(|t| t.kind);
283+
if [
284+
// for grant
285+
SyntaxKind::Grant,
286+
SyntaxKind::Ascii44,
287+
]
288+
.iter()
289+
.all(|x| Some(x) != prev.as_ref())
290+
{
291+
break;
292+
}
293+
294+
p.advance();
295+
}
274296
Some(_) => {
275297
break;
276298
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
GRANT CREATE ON SCHEMA public TO anon;
2+
3+
GRANT SELECT, INSERT ON public.users TO anon WITH GRANT OPTION GRANTED BY Owner;
4+
5+
GRANT read_access, write_access TO user_role
6+
WITH INHERIT TRUE
7+
GRANTED BY security_admin;
8+
9+
GRANT manager_role TO employee_role
10+
WITH ADMIN OPTION
11+
GRANTED BY admin_role;

0 commit comments

Comments
 (0)