Skip to content

Commit d450a1a

Browse files
authored
feat(query): add show_roles table function (#17517)
* feat(query): add show_roles table function * show users/stages/roles support where/like expr * delete Plan::ShowRoles
1 parent c0e80b1 commit d450a1a

File tree

28 files changed

+699
-284
lines changed

28 files changed

+699
-284
lines changed

src/query/ast/src/ast/statements/statement.rs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,9 @@ pub enum Statement {
217217
ShowVirtualColumns(ShowVirtualColumnsStmt),
218218

219219
// User
220-
ShowUsers,
220+
ShowUsers {
221+
show_options: Option<ShowOptions>,
222+
},
221223
DescribeUser {
222224
user: UserIdentity,
223225
},
@@ -227,7 +229,9 @@ pub enum Statement {
227229
if_exists: bool,
228230
user: UserIdentity,
229231
},
230-
ShowRoles,
232+
ShowRoles {
233+
show_options: Option<ShowOptions>,
234+
},
231235
CreateRole {
232236
if_not_exists: bool,
233237
role_name: String,
@@ -254,7 +258,9 @@ pub enum Statement {
254258

255259
// Stages
256260
CreateStage(CreateStageStmt),
257-
ShowStages,
261+
ShowStages {
262+
show_options: Option<ShowOptions>,
263+
},
258264
DropStage {
259265
if_exists: bool,
260266
stage_name: String,
@@ -458,12 +464,12 @@ impl Statement {
458464
| Statement::RefreshInvertedIndex(..)
459465
| Statement::RefreshVirtualColumn(..)
460466
| Statement::ShowVirtualColumns(..)
461-
| Statement::ShowUsers
467+
| Statement::ShowUsers { .. }
462468
| Statement::DescribeUser { .. }
463-
| Statement::ShowRoles
469+
| Statement::ShowRoles { .. }
464470
| Statement::ShowGrants { .. }
465471
| Statement::ShowObjectPrivileges(..)
466-
| Statement::ShowStages
472+
| Statement::ShowStages { .. }
467473
| Statement::DescribeStage { .. }
468474
| Statement::RemoveStage { .. }
469475
| Statement::ListStage { .. }
@@ -807,9 +813,19 @@ impl Display for Statement {
807813
Statement::DropVirtualColumn(stmt) => write!(f, "{stmt}")?,
808814
Statement::RefreshVirtualColumn(stmt) => write!(f, "{stmt}")?,
809815
Statement::ShowVirtualColumns(stmt) => write!(f, "{stmt}")?,
810-
Statement::ShowUsers => write!(f, "SHOW USERS")?,
816+
Statement::ShowUsers { show_options } => {
817+
write!(f, "SHOW USERS")?;
818+
if let Some(show_options) = show_options {
819+
write!(f, " {show_options}")?;
820+
}
821+
}
811822
Statement::DescribeUser { user } => write!(f, "DESCRIBE USER {user}")?,
812-
Statement::ShowRoles => write!(f, "SHOW ROLES")?,
823+
Statement::ShowRoles { show_options } => {
824+
write!(f, "SHOW ROLES")?;
825+
if let Some(show_options) = show_options {
826+
write!(f, " {show_options}")?;
827+
}
828+
}
813829
Statement::CreateUser(stmt) => write!(f, "{stmt}")?,
814830
Statement::AlterUser(stmt) => write!(f, "{stmt}")?,
815831
Statement::DropUser { if_exists, user } => {
@@ -873,7 +889,12 @@ impl Display for Statement {
873889
write!(f, " PATTERN = '{pattern}'")?;
874890
}
875891
}
876-
Statement::ShowStages => write!(f, "SHOW STAGES")?,
892+
Statement::ShowStages { show_options } => {
893+
write!(f, "SHOW STAGES")?;
894+
if let Some(show_options) = show_options {
895+
write!(f, " {show_options}")?;
896+
}
897+
}
877898
Statement::DropStage {
878899
if_exists,
879900
stage_name,

src/query/ast/src/parser/statement.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,12 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
317317
},
318318
|(_, _, show_options)| Statement::ShowVariables { show_options },
319319
);
320-
let show_stages = value(Statement::ShowStages, rule! { SHOW ~ STAGES });
320+
let show_stages = map(
321+
rule! {
322+
SHOW ~ STAGES ~ #show_options?
323+
},
324+
|(_, _, show_options)| Statement::ShowStages { show_options },
325+
);
321326
let show_process_list = map(
322327
rule! {
323328
SHOW ~ PROCESSLIST ~ #show_options?
@@ -1524,7 +1529,13 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
15241529
},
15251530
);
15261531

1527-
let show_users = value(Statement::ShowUsers, rule! { SHOW ~ USERS });
1532+
let show_users = map(
1533+
rule! {
1534+
SHOW ~ USERS ~ #show_options?
1535+
},
1536+
|(_, _, show_options)| Statement::ShowUsers { show_options },
1537+
);
1538+
15281539
let describe_user = map(
15291540
rule! {
15301541
( DESC | DESCRIBE ) ~ USER ~ ^#user_identity
@@ -1592,7 +1603,12 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
15921603
user,
15931604
},
15941605
);
1595-
let show_roles = value(Statement::ShowRoles, rule! { SHOW ~ ROLES });
1606+
let show_roles = map(
1607+
rule! {
1608+
SHOW ~ ROLES ~ #show_options?
1609+
},
1610+
|(_, _, show_options)| Statement::ShowRoles { show_options },
1611+
);
15961612
let create_role = map(
15971613
rule! {
15981614
CREATE ~ ROLE ~ ( IF ~ ^NOT ~ ^EXISTS )? ~ #role_name

src/query/ast/tests/it/parser.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ fn test_statement() {
9292
r#"show drop databases like 'db%'"#,
9393
r#"show databases format TabSeparatedWithNamesAndTypes;"#,
9494
r#"show tables"#,
95+
r#"show stages like '%a'"#,
96+
r#"show users where name='root'"#,
97+
r#"show roles where name='public'"#,
9598
r#"show drop tables"#,
9699
r#"show drop tables like 't%'"#,
97100
r#"show drop tables where name='t'"#,

src/query/ast/tests/it/testdata/stmt.txt

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,127 @@ ShowTables(
7676
)
7777

7878

79+
---------- Input ----------
80+
show stages like '%a'
81+
---------- Output ---------
82+
SHOW STAGES LIKE '%a'
83+
---------- AST ------------
84+
ShowStages {
85+
show_options: Some(
86+
ShowOptions {
87+
show_limit: Some(
88+
Like {
89+
pattern: "%a",
90+
},
91+
),
92+
limit: None,
93+
},
94+
),
95+
}
96+
97+
98+
---------- Input ----------
99+
show users where name='root'
100+
---------- Output ---------
101+
SHOW USERS WHERE name = 'root'
102+
---------- AST ------------
103+
ShowUsers {
104+
show_options: Some(
105+
ShowOptions {
106+
show_limit: Some(
107+
Where {
108+
selection: BinaryOp {
109+
span: Some(
110+
21..22,
111+
),
112+
op: Eq,
113+
left: ColumnRef {
114+
span: Some(
115+
17..21,
116+
),
117+
column: ColumnRef {
118+
database: None,
119+
table: None,
120+
column: Name(
121+
Identifier {
122+
span: Some(
123+
17..21,
124+
),
125+
name: "name",
126+
quote: None,
127+
ident_type: None,
128+
},
129+
),
130+
},
131+
},
132+
right: Literal {
133+
span: Some(
134+
22..28,
135+
),
136+
value: String(
137+
"root",
138+
),
139+
},
140+
},
141+
},
142+
),
143+
limit: None,
144+
},
145+
),
146+
}
147+
148+
149+
---------- Input ----------
150+
show roles where name='public'
151+
---------- Output ---------
152+
SHOW ROLES WHERE name = 'public'
153+
---------- AST ------------
154+
ShowRoles {
155+
show_options: Some(
156+
ShowOptions {
157+
show_limit: Some(
158+
Where {
159+
selection: BinaryOp {
160+
span: Some(
161+
21..22,
162+
),
163+
op: Eq,
164+
left: ColumnRef {
165+
span: Some(
166+
17..21,
167+
),
168+
column: ColumnRef {
169+
database: None,
170+
table: None,
171+
column: Name(
172+
Identifier {
173+
span: Some(
174+
17..21,
175+
),
176+
name: "name",
177+
quote: None,
178+
ident_type: None,
179+
},
180+
),
181+
},
182+
},
183+
right: Literal {
184+
span: Some(
185+
22..30,
186+
),
187+
value: String(
188+
"public",
189+
),
190+
},
191+
},
192+
},
193+
),
194+
limit: None,
195+
},
196+
),
197+
}
198+
199+
79200
---------- Input ----------
80201
show drop tables
81202
---------- Output ---------

src/query/catalog/src/table_context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ pub trait TableContext: Send + Sync {
221221
privilege: UserPrivilegeType,
222222
check_current_role_only: bool,
223223
) -> Result<()>;
224-
async fn get_available_roles(&self) -> Result<Vec<RoleInfo>>;
224+
async fn get_all_available_roles(&self) -> Result<Vec<RoleInfo>>;
225225
async fn get_visibility_checker(
226226
&self,
227227
ignore_ownership: bool,

src/query/service/src/interpreters/access/management_mode_access.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ impl AccessChecker for ManagementModeAccess {
9696
| Plan::DescUser(_)
9797

9898
// Roles.
99-
| Plan::ShowRoles(_)
10099
| Plan::CreateRole(_)
101100
| Plan::DropRole(_)
102101

src/query/service/src/interpreters/access/privilege_access.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1302,7 +1302,6 @@ impl AccessChecker for PrivilegeAccess {
13021302
// SET ROLE & SHOW ROLES is a session-local statement (have same semantic with the SET ROLE in postgres), no need to check privileges
13031303
Plan::SetRole(_) => {}
13041304
Plan::SetSecondaryRoles(_) => {}
1305-
Plan::ShowRoles(_) => {}
13061305
Plan::Presign(plan) => {
13071306
let privilege = match &plan.action {
13081307
PresignAction::Upload => UserPrivilegeType::Write,

src/query/service/src/interpreters/interpreter_factory.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ use crate::interpreters::interpreter_procedure_drop::DropProcedureInterpreter;
6565
use crate::interpreters::interpreter_rename_warehouse::RenameWarehouseInterpreter;
6666
use crate::interpreters::interpreter_rename_warehouse_cluster::RenameWarehouseClusterInterpreter;
6767
use crate::interpreters::interpreter_resume_warehouse::ResumeWarehouseInterpreter;
68-
use crate::interpreters::interpreter_role_show::ShowRolesInterpreter;
6968
use crate::interpreters::interpreter_set_priority::SetPriorityInterpreter;
7069
use crate::interpreters::interpreter_show_online_nodes::ShowOnlineNodesInterpreter;
7170
use crate::interpreters::interpreter_show_warehouses::ShowWarehousesInterpreter;
@@ -503,8 +502,6 @@ impl InterpreterFactory {
503502
SetSecondaryRolesInterpreter::try_create(ctx, *set_secondary_roles.clone())?,
504503
)),
505504

506-
Plan::ShowRoles(_show_roles) => Ok(Arc::new(ShowRolesInterpreter::try_create(ctx)?)),
507-
508505
// Stages
509506
Plan::CreateStage(create_stage) => Ok(Arc::new(
510507
CreateUserStageInterpreter::try_create(ctx, *create_stage.clone())?,

0 commit comments

Comments
 (0)