Skip to content

Commit bb6e048

Browse files
committed
Task privilege Part2
1. add function: list_task_ownerships, only list task prefix. 2. add visibility in task/task_history system table. 3. refactor showtasks, directly use select * from system.task;
1 parent 2cc926b commit bb6e048

File tree

18 files changed

+665
-308
lines changed

18 files changed

+665
-308
lines changed

src/common/cloud_control/proto/task.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ message ShowTasksRequest {// every owner has a roles list like ["role1", "role2"
119119
int32 result_limit = 4;
120120
repeated string owners = 5; // all available roles under current client
121121
repeated string task_ids = 6; // all task ids which permit to access for given user
122+
repeated string task_names = 7; // all task names which permit to access for given user
122123
}
123124

124125
message ShowTasksResponse {
@@ -170,6 +171,7 @@ message ShowTaskRunsRequest {
170171
repeated string owners = 6;
171172
repeated string task_ids = 7;
172173
string task_name = 8;
174+
repeated string task_names = 9;
173175

174176
optional int32 page_size = 90; // 100 by default
175177
optional int64 next_page_token = 91;

src/meta/app/src/principal/tenant_ownership_object_ident.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ mod tests {
253253
assert_eq!(role_grantee, parsed);
254254
}
255255

256-
// udf
256+
// task
257257
{
258258
let role_grantee = TenantOwnershipObjectIdent::new_unchecked(
259259
Tenant::new_literal("test"),

src/query/management/src/role/role_api.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use databend_common_exception::ErrorCode;
1516
use databend_common_exception::Result;
1617
use databend_common_meta_app::principal::OwnershipInfo;
1718
use databend_common_meta_app::principal::OwnershipObject;
@@ -30,6 +31,10 @@ pub trait RoleApi: Sync + Send {
3031

3132
async fn get_ownerships(&self) -> Result<Vec<SeqV<OwnershipInfo>>>;
3233

34+
async fn list_tasks_ownerships(
35+
&self,
36+
) -> std::result::Result<Vec<SeqV<OwnershipInfo>>, ErrorCode>;
37+
3338
/// General role update.
3439
///
3540
/// It fetches the role that matches the specified seq number, update it in place, then write it back with the seq it sees.

src/query/management/src/role/role_mgr.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,28 @@ impl RoleApi for RoleMgr {
217217
Ok(r)
218218
}
219219

220+
#[async_backtrace::framed]
221+
#[minitrace::trace]
222+
async fn list_tasks_ownerships(&self) -> Result<Vec<SeqV<OwnershipInfo>>, ErrorCode> {
223+
let mut task_object_owner_prefix = self.ownership_object_prefix();
224+
task_object_owner_prefix.push_str("task-by-name/");
225+
let values = self
226+
.kv_api
227+
.prefix_list_kv(task_object_owner_prefix.as_str())
228+
.await?;
229+
230+
let mut r = vec![];
231+
232+
let mut quota = Quota::new(func_name!());
233+
234+
for (key, val) in values {
235+
let u = check_and_upgrade_to_pb(&mut quota, key, &val, self.kv_api.as_ref()).await?;
236+
r.push(u);
237+
}
238+
239+
Ok(r)
240+
}
241+
220242
/// General role update.
221243
///
222244
/// It fetch the role that matches the specified seq number, update it in place, then write it back with the seq it sees.

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

Lines changed: 515 additions & 143 deletions
Large diffs are not rendered by default.

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ use crate::interpreters::interpreter_task_create::CreateTaskInterpreter;
5656
use crate::interpreters::interpreter_task_describe::DescribeTaskInterpreter;
5757
use crate::interpreters::interpreter_task_drop::DropTaskInterpreter;
5858
use crate::interpreters::interpreter_task_execute::ExecuteTaskInterpreter;
59-
use crate::interpreters::interpreter_tasks_show::ShowTasksInterpreter;
6059
use crate::interpreters::interpreter_txn_abort::AbortInterpreter;
6160
use crate::interpreters::interpreter_txn_begin::BeginInterpreter;
6261
use crate::interpreters::interpreter_txn_commit::CommitInterpreter;
@@ -546,7 +545,6 @@ impl InterpreterFactory {
546545
ctx,
547546
*p.clone(),
548547
)?)),
549-
Plan::ShowTasks(p) => Ok(Arc::new(ShowTasksInterpreter::try_create(ctx, *p.clone())?)),
550548

551549
Plan::CreateConnection(p) => Ok(Arc::new(CreateConnectionInterpreter::try_create(
552550
ctx,

src/query/service/src/interpreters/interpreter_tasks_show.rs

Lines changed: 0 additions & 96 deletions
This file was deleted.

src/query/service/src/interpreters/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ mod interpreter_task_create;
121121
mod interpreter_task_describe;
122122
mod interpreter_task_drop;
123123
mod interpreter_task_execute;
124-
mod interpreter_tasks_show;
125124
mod interpreter_txn_abort;
126125
mod interpreter_txn_begin;
127126
mod interpreter_txn_commit;

src/query/sql/src/planner/binder/binder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ impl<'a> Binder {
609609
self.bind_execute_task(stmt).await?
610610
}
611611
Statement::ShowTasks(stmt) => {
612-
self.bind_show_tasks(stmt).await?
612+
self.bind_show_tasks(bind_context, stmt).await?
613613
}
614614

615615
// Streams

src/query/sql/src/planner/binder/ddl/task.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,26 @@ use databend_common_ast::ast::DescribeTaskStmt;
2323
use databend_common_ast::ast::DropTaskStmt;
2424
use databend_common_ast::ast::ExecuteTaskStmt;
2525
use databend_common_ast::ast::ScheduleOptions;
26+
use databend_common_ast::ast::ShowLimit;
2627
use databend_common_ast::ast::ShowTasksStmt;
2728
use databend_common_ast::ast::TaskSql;
2829
use databend_common_ast::parser::parse_sql;
2930
use databend_common_ast::parser::tokenize_sql;
3031
use databend_common_ast::parser::Dialect;
3132
use databend_common_exception::ErrorCode;
3233
use databend_common_exception::Result;
34+
use log::debug;
3335

3436
use crate::plans::AlterTaskPlan;
3537
use crate::plans::CreateTaskPlan;
3638
use crate::plans::DescribeTaskPlan;
3739
use crate::plans::DropTaskPlan;
3840
use crate::plans::ExecuteTaskPlan;
3941
use crate::plans::Plan;
40-
use crate::plans::ShowTasksPlan;
42+
use crate::plans::RewriteKind;
43+
use crate::BindContext;
4144
use crate::Binder;
45+
use crate::SelectBuilder;
4246

4347
fn verify_single_statement(sql: &String) -> Result<()> {
4448
let tokens = tokenize_sql(sql.as_str()).map_err(|e| {
@@ -243,16 +247,27 @@ impl Binder {
243247
#[async_backtrace::framed]
244248
pub(in crate::planner::binder) async fn bind_show_tasks(
245249
&mut self,
250+
bind_context: &mut BindContext,
246251
stmt: &ShowTasksStmt,
247252
) -> Result<Plan> {
248253
let ShowTasksStmt { limit } = stmt;
249254

250-
let tenant = self.ctx.get_tenant();
255+
let mut select_builder = SelectBuilder::from("system.tasks");
251256

252-
let plan = ShowTasksPlan {
253-
tenant,
254-
limit: limit.clone(),
257+
let query = match limit {
258+
None => select_builder.build(),
259+
Some(ShowLimit::Like { pattern }) => {
260+
select_builder.with_filter(format!("name LIKE '{pattern}'"));
261+
select_builder.build()
262+
}
263+
Some(ShowLimit::Where { selection }) => {
264+
select_builder.with_filter(format!("({selection})"));
265+
select_builder.build()
266+
}
255267
};
256-
Ok(Plan::ShowTasks(Box::new(plan)))
268+
269+
debug!("show tasks rewrite to: {:?}", query);
270+
self.bind_rewrite_to_query(bind_context, query.as_str(), RewriteKind::ShowTasks)
271+
.await
257272
}
258273
}

0 commit comments

Comments
 (0)