Skip to content

Commit dcf2439

Browse files
so far!
1 parent daf8efd commit dcf2439

File tree

5 files changed

+108
-6
lines changed

5 files changed

+108
-6
lines changed

crates/pgt_completions/src/context/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ pub enum WrappingClause<'a> {
3333
DropTable,
3434
PolicyName,
3535
ToRoleAssignment,
36+
SetStatement,
37+
AlterRole,
38+
DropRole,
3639
}
3740

3841
#[derive(PartialEq, Eq, Hash, Debug, Clone)]
@@ -424,7 +427,7 @@ impl<'a> CompletionContext<'a> {
424427
}
425428

426429
"where" | "update" | "select" | "delete" | "from" | "join" | "column_definitions"
427-
| "drop_table" | "alter_table" => {
430+
| "drop_table" | "alter_table" | "alter_role" | "drop_role" | "set_statement" => {
428431
self.wrapping_clause_type =
429432
self.get_wrapping_clause_from_current_node(current_node, &mut cursor);
430433
}
@@ -628,7 +631,10 @@ impl<'a> CompletionContext<'a> {
628631
"delete" => Some(WrappingClause::Delete),
629632
"from" => Some(WrappingClause::From),
630633
"drop_table" => Some(WrappingClause::DropTable),
634+
"alter_role" => Some(WrappingClause::AlterRole),
635+
"drop_role" => Some(WrappingClause::DropRole),
631636
"alter_table" => Some(WrappingClause::AlterTable),
637+
"set_statement" => Some(WrappingClause::SetStatement),
632638
"column_definitions" => Some(WrappingClause::ColumnDefinitions),
633639
"insert" => Some(WrappingClause::Insert),
634640
"join" => {

crates/pgt_completions/src/providers/roles.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,70 @@ pub fn complete_roles<'a>(ctx: &CompletionContext<'a>, builder: &mut CompletionB
2424
builder.add_item(item);
2525
}
2626
}
27+
28+
#[cfg(test)]
29+
mod tests {
30+
use crate::test_helper::{CURSOR_POS, CompletionAssertion, assert_complete_results};
31+
32+
const SETUP: &'static str = r#"
33+
do $$
34+
begin
35+
if not exists (
36+
select from pg_catalog.pg_roles
37+
where rolname = 'test'
38+
) then
39+
create role test;
40+
end if;
41+
end $$;
42+
43+
create table users (
44+
id serial primary key,
45+
email varchar,
46+
address text
47+
);
48+
"#;
49+
50+
#[tokio::test]
51+
async fn works_in_drop_role() {
52+
assert_complete_results(
53+
format!("drop role {}", CURSOR_POS).as_str(),
54+
vec![CompletionAssertion::LabelAndKind(
55+
"test".into(),
56+
crate::CompletionItemKind::Role,
57+
)],
58+
SETUP,
59+
)
60+
.await;
61+
}
62+
63+
#[tokio::test]
64+
async fn works_in_alter_role() {
65+
assert_complete_results(
66+
format!("alter role {}", CURSOR_POS).as_str(),
67+
vec![CompletionAssertion::LabelAndKind(
68+
"test".into(),
69+
crate::CompletionItemKind::Role,
70+
)],
71+
SETUP,
72+
)
73+
.await;
74+
}
75+
76+
async fn works_in_set_statement() {
77+
// set role ROLE;
78+
// set session authorization ROLE;
79+
}
80+
81+
async fn works_in_policies() {}
82+
83+
async fn works_in_grant_statements() {
84+
// grant select on my_table to ROLE;
85+
// grant ROLE to OTHER_ROLE with admin option;
86+
}
87+
88+
async fn works_in_revoke_statements() {
89+
// revoke select on my_table from ROLE;
90+
// revoke ROLE from OTHER_ROLE;
91+
// revoke admin option for ROLE from OTHER_ROLE;
92+
}
93+
}

crates/pgt_completions/src/relevance/filtering.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ impl CompletionFilter<'_> {
170170
matches!(clause, WrappingClause::PolicyName)
171171
}
172172

173-
CompletionRelevanceData::Role(_) => false,
173+
CompletionRelevanceData::Role(_) => {
174+
matches!(clause, WrappingClause::DropRole | WrappingClause::AlterRole)
175+
}
174176
}
175177
})
176178
.and_then(|is_ok| if is_ok { Some(()) } else { None })

crates/pgt_completions/src/relevance/scoring.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ impl CompletionScore<'_> {
128128
_ => -50,
129129
},
130130

131-
CompletionRelevanceData::Role(_) => 0,
131+
CompletionRelevanceData::Role(_) => match clause_type {
132+
WrappingClause::DropRole | WrappingClause::AlterRole => 25,
133+
_ => -50,
134+
},
132135
}
133136
}
134137

@@ -201,7 +204,7 @@ impl CompletionScore<'_> {
201204
CompletionRelevanceData::Column(c) => Some(c.schema_name.as_str()),
202205
CompletionRelevanceData::Schema(s) => Some(s.name.as_str()),
203206
CompletionRelevanceData::Policy(p) => Some(p.schema_name.as_str()),
204-
CompletionRelevanceData::Role(p) => None,
207+
CompletionRelevanceData::Role(_) => None,
205208
}
206209
}
207210

@@ -245,6 +248,30 @@ impl CompletionScore<'_> {
245248
}
246249

247250
fn check_is_user_defined(&mut self) {
251+
if let CompletionRelevanceData::Role(r) = self.data {
252+
match r.name.as_str() {
253+
"pg_read_all_data"
254+
| "pg_write_all_data"
255+
| "pg_read_all_settings"
256+
| "pg_read_all_stats"
257+
| "pg_stat_scan_tables"
258+
| "pg_monitor"
259+
| "pg_database_owner"
260+
| "pg_signal_backend"
261+
| "pg_read_server_files"
262+
| "pg_write_server_files"
263+
| "pg_execute_server_program"
264+
| "pg_checkpoint"
265+
| "pg_maintain"
266+
| "pg_use_reserved_connections"
267+
| "pg_create_subscription"
268+
| "postgres" => self.score -= 20,
269+
_ => {}
270+
};
271+
272+
return;
273+
}
274+
248275
let schema = match self.get_schema_name() {
249276
Some(s) => s.to_string(),
250277
None => return,

crates/pgt_schema_cache/src/roles.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ mod tests {
2727

2828
#[tokio::test]
2929
async fn loads_roles() {
30-
let test_db = get_new_test_db().await;
31-
3230
let setup = r#"
3331
do $$
3432
begin
@@ -53,6 +51,8 @@ mod tests {
5351
end $$;
5452
"#;
5553

54+
let test_db = get_new_test_db().await;
55+
5656
test_db
5757
.execute(setup)
5858
.await

0 commit comments

Comments
 (0)