Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /