This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new a55e109e970 [pick][Improment]Add schema table
workload_group_privileges (#38436) (#39708)
a55e109e970 is described below
commit a55e109e970a6584db85eb3cacf4266c0a185741
Author: wangbo <[email protected]>
AuthorDate: Thu Aug 22 00:44:43 2024 +0800
[pick][Improment]Add schema table workload_group_privileges (#38436)
(#39708)
pick #38436
---
be/src/exec/schema_scanner.cpp | 3 +
.../schema_workload_group_privileges.cpp | 137 +++++++++++++++++++++
.../schema_workload_group_privileges.h | 52 ++++++++
.../org/apache/doris/analysis/SchemaTableType.java | 4 +-
.../java/org/apache/doris/catalog/SchemaTable.java | 8 ++
.../org/apache/doris/mysql/privilege/Auth.java | 43 +++++++
.../apache/doris/mysql/privilege/RoleManager.java | 26 ++++
.../doris/tablefunction/MetadataGenerator.java | 36 ++++++
gensrc/thrift/Descriptors.thrift | 3 +-
gensrc/thrift/FrontendService.thrift | 2 +
.../data/workload_manager_p0/test_curd_wlg.out | 49 ++++++++
.../workload_manager_p0/test_curd_wlg.groovy | 57 +++++++++
12 files changed, 418 insertions(+), 2 deletions(-)
diff --git a/be/src/exec/schema_scanner.cpp b/be/src/exec/schema_scanner.cpp
index 70011c50bb0..491e301e8a6 100644
--- a/be/src/exec/schema_scanner.cpp
+++ b/be/src/exec/schema_scanner.cpp
@@ -48,6 +48,7 @@
#include "exec/schema_scanner/schema_user_scanner.h"
#include "exec/schema_scanner/schema_variables_scanner.h"
#include "exec/schema_scanner/schema_views_scanner.h"
+#include "exec/schema_scanner/schema_workload_group_privileges.h"
#include "exec/schema_scanner/schema_workload_groups_scanner.h"
#include "exec/schema_scanner/schema_workload_sched_policy_scanner.h"
#include "olap/hll.h"
@@ -227,6 +228,8 @@ std::unique_ptr<SchemaScanner>
SchemaScanner::create(TSchemaTableType::type type
return SchemaWorkloadSchedulePolicyScanner::create_unique();
case TSchemaTableType::SCH_FILE_CACHE_STATISTICS:
return SchemaFileCacheStatisticsScanner::create_unique();
+ case TSchemaTableType::SCH_WORKLOAD_GROUP_PRIVILEGES:
+ return SchemaWorkloadGroupPrivilegesScanner::create_unique();
default:
return SchemaDummyScanner::create_unique();
break;
diff --git a/be/src/exec/schema_scanner/schema_workload_group_privileges.cpp
b/be/src/exec/schema_scanner/schema_workload_group_privileges.cpp
new file mode 100644
index 00000000000..a1d4568d905
--- /dev/null
+++ b/be/src/exec/schema_scanner/schema_workload_group_privileges.cpp
@@ -0,0 +1,137 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "exec/schema_scanner/schema_workload_group_privileges.h"
+
+#include "runtime/client_cache.h"
+#include "runtime/exec_env.h"
+#include "runtime/runtime_state.h"
+#include "util/thrift_rpc_helper.h"
+#include "vec/common/string_ref.h"
+#include "vec/core/block.h"
+#include "vec/data_types/data_type_factory.hpp"
+
+namespace doris {
+std::vector<SchemaScanner::ColumnDesc>
SchemaWorkloadGroupPrivilegesScanner::_s_tbls_columns = {
+ {"GRANTEE", TYPE_VARCHAR, sizeof(StringRef), true},
+ {"WORKLOAD_GROUP_NAME", TYPE_VARCHAR, sizeof(StringRef), true},
+ {"PRIVILEGE_TYPE", TYPE_VARCHAR, sizeof(StringRef), true},
+ {"IS_GRANTABLE", TYPE_VARCHAR, sizeof(StringRef), true},
+};
+
+SchemaWorkloadGroupPrivilegesScanner::SchemaWorkloadGroupPrivilegesScanner()
+ : SchemaScanner(_s_tbls_columns,
TSchemaTableType::SCH_WORKLOAD_GROUPS) {}
+
+SchemaWorkloadGroupPrivilegesScanner::~SchemaWorkloadGroupPrivilegesScanner()
{}
+
+Status SchemaWorkloadGroupPrivilegesScanner::start(RuntimeState* state) {
+ _block_rows_limit = state->batch_size();
+ _rpc_timeout = state->execution_timeout() * 1000;
+ return Status::OK();
+}
+
+Status
SchemaWorkloadGroupPrivilegesScanner::_get_workload_group_privs_block_from_fe()
{
+ TNetworkAddress master_addr =
ExecEnv::GetInstance()->master_info()->network_address;
+
+ TSchemaTableRequestParams schema_table_request_params;
+ for (int i = 0; i < _s_tbls_columns.size(); i++) {
+ schema_table_request_params.__isset.columns_name = true;
+
schema_table_request_params.columns_name.emplace_back(_s_tbls_columns[i].name);
+ }
+
schema_table_request_params.__set_current_user_ident(*_param->common_param->current_user_ident);
+
+ TFetchSchemaTableDataRequest request;
+
request.__set_schema_table_name(TSchemaTableName::WORKLOAD_GROUP_PRIVILEGES);
+ request.__set_schema_table_params(schema_table_request_params);
+
+ TFetchSchemaTableDataResult result;
+
+ RETURN_IF_ERROR(ThriftRpcHelper::rpc<FrontendServiceClient>(
+ master_addr.hostname, master_addr.port,
+ [&request, &result](FrontendServiceConnection& client) {
+ client->fetchSchemaTableData(result, request);
+ },
+ _rpc_timeout));
+
+ Status status(Status::create(result.status));
+ if (!status.ok()) {
+ LOG(WARNING) << "fetch workload group privileges from FE failed,
errmsg=" << status;
+ return status;
+ }
+ std::vector<TRow> result_data = result.data_batch;
+
+ _workload_groups_privs_block = vectorized::Block::create_unique();
+ for (int i = 0; i < _s_tbls_columns.size(); ++i) {
+ TypeDescriptor descriptor(_s_tbls_columns[i].type);
+ auto data_type =
vectorized::DataTypeFactory::instance().create_data_type(descriptor, true);
+ _workload_groups_privs_block->insert(vectorized::ColumnWithTypeAndName(
+ data_type->create_column(), data_type,
_s_tbls_columns[i].name));
+ }
+
+ if (result_data.size() > 0) {
+ int col_size = result_data[0].column_value.size();
+ if (col_size != _s_tbls_columns.size()) {
+ return Status::InternalError<false>(
+ "workload group privileges schema is not match for FE and
BE");
+ }
+ }
+
+ _workload_groups_privs_block->reserve(result_data.size());
+
+ for (int i = 0; i < result_data.size(); i++) {
+ TRow row = result_data[i];
+
+ for (int j = 0; j < _s_tbls_columns.size(); j++) {
+ RETURN_IF_ERROR(insert_block_column(row.column_value[j], j,
+
_workload_groups_privs_block.get(),
+ _s_tbls_columns[j].type));
+ }
+ }
+ return Status::OK();
+}
+
+Status
SchemaWorkloadGroupPrivilegesScanner::get_next_block_internal(vectorized::Block*
block,
+ bool*
eos) {
+ if (!_is_init) {
+ return Status::InternalError("Used before initialized.");
+ }
+
+ if (nullptr == block || nullptr == eos) {
+ return Status::InternalError("input pointer is nullptr.");
+ }
+
+ if (_workload_groups_privs_block == nullptr) {
+ RETURN_IF_ERROR(_get_workload_group_privs_block_from_fe());
+ _total_rows = _workload_groups_privs_block->rows();
+ }
+
+ if (_row_idx == _total_rows) {
+ *eos = true;
+ return Status::OK();
+ }
+
+ int current_batch_rows = std::min(_block_rows_limit, _total_rows -
_row_idx);
+ vectorized::MutableBlock mblock =
vectorized::MutableBlock::build_mutable_block(block);
+ RETURN_IF_ERROR(
+ mblock.add_rows(_workload_groups_privs_block.get(), _row_idx,
current_batch_rows));
+ _row_idx += current_batch_rows;
+
+ *eos = _row_idx == _total_rows;
+ return Status::OK();
+}
+
+} // namespace doris
\ No newline at end of file
diff --git a/be/src/exec/schema_scanner/schema_workload_group_privileges.h
b/be/src/exec/schema_scanner/schema_workload_group_privileges.h
new file mode 100644
index 00000000000..0a7bf1258ee
--- /dev/null
+++ b/be/src/exec/schema_scanner/schema_workload_group_privileges.h
@@ -0,0 +1,52 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#pragma once
+
+#include <vector>
+
+#include "common/status.h"
+#include "exec/schema_scanner.h"
+
+namespace doris {
+class RuntimeState;
+namespace vectorized {
+class Block;
+} // namespace vectorized
+
+class SchemaWorkloadGroupPrivilegesScanner : public SchemaScanner {
+ ENABLE_FACTORY_CREATOR(SchemaWorkloadGroupPrivilegesScanner);
+
+public:
+ SchemaWorkloadGroupPrivilegesScanner();
+ ~SchemaWorkloadGroupPrivilegesScanner() override;
+
+ Status start(RuntimeState* state) override;
+ Status get_next_block_internal(vectorized::Block* block, bool* eos)
override;
+
+ static std::vector<SchemaScanner::ColumnDesc> _s_tbls_columns;
+
+private:
+ Status _get_workload_group_privs_block_from_fe();
+
+ int _block_rows_limit = 4096;
+ int _row_idx = 0;
+ int _total_rows = 0;
+ std::unique_ptr<vectorized::Block> _workload_groups_privs_block = nullptr;
+ int _rpc_timeout = 3000;
+};
+}; // namespace doris
\ No newline at end of file
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/SchemaTableType.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SchemaTableType.java
index b83eabcaf25..ee45a9fb7cf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SchemaTableType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SchemaTableType.java
@@ -79,7 +79,9 @@ public enum SchemaTableType {
SCH_WORKLOAD_POLICY("WORKLOAD_POLICY", "WORKLOAD_POLICY",
TSchemaTableType.SCH_WORKLOAD_POLICY),
SCH_FILE_CACHE_STATISTICS("FILE_CACHE_STATISTICS", "FILE_CACHE_STATISTICS",
- TSchemaTableType.SCH_FILE_CACHE_STATISTICS);
+ TSchemaTableType.SCH_FILE_CACHE_STATISTICS),
+ SCH_WORKLOAD_GROUP_PRIVILEGES("WORKLOAD_GROUP_PRIVILEGES",
+ "WORKLOAD_GROUP_PRIVILEGES",
TSchemaTableType.SCH_WORKLOAD_GROUP_PRIVILEGES);
private static final String dbName = "INFORMATION_SCHEMA";
private static SelectList fullSelectLists;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
index e75fa18386c..d0c9c587277 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
@@ -524,6 +524,14 @@ public class SchemaTable extends Table {
.column("METRIC_NAME",
ScalarType.createVarchar(256))
.column("METRIC_VALUE",
ScalarType.createType(PrimitiveType.DOUBLE))
.build()))
+ .put("workload_group_privileges",
+ new SchemaTable(SystemIdGenerator.getNextId(),
"workload_group_privileges", TableType.SCHEMA,
+ builder().column("GRANTEE",
ScalarType.createVarchar(NAME_CHAR_LEN))
+ .column("WORKLOAD_GROUP_NAME",
ScalarType.createVarchar(256))
+ .column("PRIVILEGE_TYPE",
ScalarType.createVarchar(PRIVILEGE_TYPE_LEN))
+ .column("IS_GRANTABLE",
ScalarType.createVarchar(IS_GRANTABLE_LEN))
+ .build())
+ )
.build();
private boolean fetchAllFe = false;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
index 2c7d99d4195..325ee0ba9a0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
@@ -79,6 +79,7 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -1161,6 +1162,48 @@ public class Auth implements Writable {
return userAuthInfos;
}
+
+ public void getUserRoleWorkloadGroupPrivs(List<List<String>> result,
UserIdentity currentUserIdentity) {
+ readLock();
+ try {
+ boolean isCurrentUserAdmin = checkGlobalPriv(currentUserIdentity,
PrivPredicate.ADMIN);
+ Map<String, List<User>> nameToUsers = userManager.getNameToUsers();
+ for (List<User> users : nameToUsers.values()) {
+ for (User user : users) {
+ if (!user.isSetByDomainResolver()) {
+ if (!isCurrentUserAdmin &&
!currentUserIdentity.equals(user.getUserIdentity())) {
+ continue;
+ }
+ String isGrantable =
checkGlobalPriv(user.getUserIdentity(), PrivPredicate.ADMIN) ? "YES"
+ : "NO";
+
+ // workload group
+ for (PrivEntry entry :
getUserWorkloadGroupPrivTable(user.getUserIdentity()).entries) {
+ WorkloadGroupPrivEntry workloadGroupPrivEntry =
(WorkloadGroupPrivEntry) entry;
+ PrivBitSet savedPrivs =
workloadGroupPrivEntry.getPrivSet().copy();
+
+ List<String> row = Lists.newArrayList();
+ row.add(user.getUserIdentity().toString());
+
row.add(workloadGroupPrivEntry.getOrigWorkloadGroupName());
+ row.add(savedPrivs.toString());
+ row.add(isGrantable);
+ result.add(row);
+ }
+ }
+ }
+ }
+
+ Set<String> currentUserRole = null;
+ if (!isCurrentUserAdmin) {
+ currentUserRole =
userRoleManager.getRolesByUser(currentUserIdentity, false);
+ currentUserRole = currentUserRole == null ? new HashSet<>() :
currentUserRole;
+ }
+ roleManager.getRoleWorkloadGroupPrivs(result, currentUserRole);
+ } finally {
+ readUnlock();
+ }
+ }
+
private void getUserAuthInfo(List<List<String>> userAuthInfos,
UserIdentity userIdent) {
// AuthProcDir.TITLE_NAMES
List<String> userAuthInfo = Lists.newArrayList();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java
index bc4344c2b89..654db93f21d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java
@@ -37,6 +37,7 @@ import org.apache.doris.persist.gson.GsonUtils;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.resource.workloadgroup.WorkloadGroupMgr;
+import com.aliyuncs.utils.StringUtils;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
@@ -187,6 +188,31 @@ public class RoleManager implements Writable,
GsonPostProcessable {
}
}
+ public void getRoleWorkloadGroupPrivs(List<List<String>> result,
Set<String> limitedRole) {
+ for (Role role : roles.values()) {
+ if
(ClusterNamespace.getNameFromFullName(role.getRoleName()).startsWith(DEFAULT_ROLE_PREFIX))
{
+ continue;
+ }
+
+ if (limitedRole != null &&
!limitedRole.contains(role.getRoleName())) {
+ continue;
+ }
+ String isGrantable = role.checkGlobalPriv(PrivPredicate.ADMIN) ?
"YES" : "NO";
+
+ for (Map.Entry<WorkloadGroupPattern, PrivBitSet> entry :
role.getWorkloadGroupPatternToPrivs().entrySet()) {
+ List<String> row = Lists.newArrayList();
+ row.add(role.getRoleName());
+ row.add(entry.getKey().getworkloadGroupName());
+ if (StringUtils.isEmpty(entry.getValue().toString())) {
+ continue;
+ }
+ row.add(entry.getValue().toString());
+ row.add(isGrantable);
+ result.add(row);
+ }
+ }
+ }
+
public Role createDefaultRole(UserIdentity userIdent) throws DdlException {
String userDefaultRoleName = getUserDefaultRoleName(userIdent);
if (roles.containsKey(userDefaultRoleName)) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
index d7ae1bd64f7..7d0f348d18b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
@@ -107,6 +107,8 @@ public class MetadataGenerator {
private static final ImmutableMap<String, Integer>
WORKLOAD_SCHED_POLICY_COLUMN_TO_INDEX;
+ private static final ImmutableMap<String, Integer>
WORKLOAD_GROUP_PRIVILEGES_COLUMN_TO_INDEX;
+
static {
ImmutableMap.Builder<String, Integer> activeQueriesbuilder = new
ImmutableMap.Builder();
List<Column> activeQueriesColList =
SchemaTable.TABLE_MAP.get("active_queries").getFullSchema();
@@ -134,6 +136,12 @@ public class MetadataGenerator {
}
WORKLOAD_SCHED_POLICY_COLUMN_TO_INDEX = policyBuilder.build();
+ ImmutableMap.Builder<String, Integer> wgPrivsBuilder = new
ImmutableMap.Builder();
+ List<Column> wgPrivsColList =
SchemaTable.TABLE_MAP.get("workload_group_privileges").getFullSchema();
+ for (int i = 0; i < wgPrivsColList.size(); i++) {
+ wgPrivsBuilder.put(wgPrivsColList.get(i).getName().toLowerCase(),
i);
+ }
+ WORKLOAD_GROUP_PRIVILEGES_COLUMN_TO_INDEX = wgPrivsBuilder.build();
}
public static TFetchSchemaTableDataResult
getMetadataTable(TFetchSchemaTableDataRequest request) throws TException {
@@ -213,6 +221,10 @@ public class MetadataGenerator {
result = workloadSchedPolicyMetadataResult(schemaTableParams);
columnIndex = WORKLOAD_SCHED_POLICY_COLUMN_TO_INDEX;
break;
+ case WORKLOAD_GROUP_PRIVILEGES:
+ result = workloadGroupPrivsMetadataResult(schemaTableParams);
+ columnIndex = WORKLOAD_GROUP_PRIVILEGES_COLUMN_TO_INDEX;
+ break;
default:
return errorResult("invalid schema table name.");
}
@@ -518,6 +530,30 @@ public class MetadataGenerator {
return result;
}
+ private static TFetchSchemaTableDataResult
workloadGroupPrivsMetadataResult(TSchemaTableRequestParams params) {
+ if (!params.isSetCurrentUserIdent()) {
+ return errorResult("current user ident is not set.");
+ }
+ UserIdentity currentUserIdentity =
UserIdentity.fromThrift(params.getCurrentUserIdent());
+
+ List<List<String>> rows = new ArrayList<>();
+ Env.getCurrentEnv().getAuth().getUserRoleWorkloadGroupPrivs(rows,
currentUserIdentity);
+ List<TRow> dataBatch = Lists.newArrayList();
+ for (List<String> privRow : rows) {
+ TRow trow = new TRow();
+ String workloadGroupName = privRow.get(1);
+ trow.addToColumnValue(new TCell().setStringVal(privRow.get(0)));
// GRANTEE
+ trow.addToColumnValue(new
TCell().setStringVal(workloadGroupName)); // WORKLOAD_GROUP_NAME
+ trow.addToColumnValue(new TCell().setStringVal(privRow.get(2)));
// PRIVILEGE_TYPE
+ trow.addToColumnValue(new TCell().setStringVal(privRow.get(3)));
// IS_GRANTABLE
+ dataBatch.add(trow);
+ }
+ TFetchSchemaTableDataResult result = new TFetchSchemaTableDataResult();
+ result.setDataBatch(dataBatch);
+ result.setStatus(new TStatus(TStatusCode.OK));
+ return result;
+ }
+
private static TFetchSchemaTableDataResult
queriesMetadataResult(TSchemaTableRequestParams tSchemaTableParams,
TFetchSchemaTableDataRequest parentRequest) {
TFetchSchemaTableDataResult result = new TFetchSchemaTableDataResult();
diff --git a/gensrc/thrift/Descriptors.thrift b/gensrc/thrift/Descriptors.thrift
index 36c52e2f6e2..b6a6e204505 100644
--- a/gensrc/thrift/Descriptors.thrift
+++ b/gensrc/thrift/Descriptors.thrift
@@ -132,7 +132,8 @@ enum TSchemaTableType {
SCH_USER,
SCH_PROCS_PRIV,
SCH_WORKLOAD_POLICY,
- SCH_FILE_CACHE_STATISTICS;
+ SCH_FILE_CACHE_STATISTICS,
+ SCH_WORKLOAD_GROUP_PRIVILEGES;
}
enum THdfsCompression {
diff --git a/gensrc/thrift/FrontendService.thrift
b/gensrc/thrift/FrontendService.thrift
index 39edf990a63..17a3095ead3 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -954,6 +954,8 @@ enum TSchemaTableName {
WORKLOAD_GROUPS = 3, // db information_schema's table
ROUTINES_INFO = 4, // db information_schema's table
WORKLOAD_SCHEDULE_POLICY = 5,
+ TABLE_OPTIONS = 6,
+ WORKLOAD_GROUP_PRIVILEGES = 7,
}
struct TMetadataTableRequestParams {
diff --git a/regression-test/data/workload_manager_p0/test_curd_wlg.out
b/regression-test/data/workload_manager_p0/test_curd_wlg.out
index d675e0d7b79..e921746dd96 100644
--- a/regression-test/data/workload_manager_p0/test_curd_wlg.out
+++ b/regression-test/data/workload_manager_p0/test_curd_wlg.out
@@ -97,3 +97,52 @@ tag1_wg3 0% 80% tag1
-- !select_remote_scan_num_8 --
-1 -1
+-- !select_wgp_1 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+
+-- !select_wgp_2 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_3 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+
+-- !select_wgp_4 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_5 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_6 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+test_wg_priv_role1 test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_7 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_8 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+test_wg_priv_role1 test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_9 --
+'test_wg_priv_user1'@'%' % Usage_priv NO
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+test_wg_priv_role1 % Usage_priv NO
+test_wg_priv_role1 test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_10 --
+'test_wg_priv_user1'@'%' normal Usage_priv NO
+'test_wg_priv_user1'@'%' test_wg_priv_g1 Usage_priv NO
+test_wg_priv_role1 test_wg_priv_g1 Usage_priv NO
+
+-- !select_wgp_11 --
+'test_wg_priv_user2'@'%' normal Usage_priv NO
+
+-- !select_wgp_12 --
+
diff --git a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy
b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy
index 4b54b9224c3..70d4a550890 100644
--- a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy
+++ b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy
@@ -600,4 +600,61 @@ suite("test_crud_wlg") {
sql "drop workload group tag1_mem_wg3;"
sql "drop workload group bypass_group;"
+ // test workload group privilege table
+ sql "set workload_group=normal;"
+ sql "drop user if exists test_wg_priv_user1"
+ sql "drop user if exists test_wg_priv_user2"
+ sql "drop role if exists test_wg_priv_role1"
+ sql "drop workload group if exists test_wg_priv_g1;"
+ // 1 test grant user
+ sql "create workload group test_wg_priv_g1 properties('cpu_share'='1024')"
+
+ sql "create user test_wg_priv_user1"
+ qt_select_wgp_1 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' TO
test_wg_priv_user1;"
+ qt_select_wgp_2 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "revoke USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' from
test_wg_priv_user1;"
+ qt_select_wgp_3 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' TO
test_wg_priv_user1;"
+ qt_select_wgp_4 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+
+
+ // 2 test grant role
+ sql "create role test_wg_priv_role1;"
+ qt_select_wgp_5 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' TO role
'test_wg_priv_role1';"
+ qt_select_wgp_6 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "revoke USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' from role
'test_wg_priv_role1';"
+ qt_select_wgp_7 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP 'test_wg_priv_g1' TO role
'test_wg_priv_role1';"
+ qt_select_wgp_8 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ // 3 test grant %
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP '%' TO test_wg_priv_user1; "
+ sql "GRANT USAGE_PRIV ON WORKLOAD GROUP '%' TO role 'test_wg_priv_role1'; "
+ qt_select_wgp_9 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+ sql "revoke USAGE_PRIV ON WORKLOAD GROUP '%' from test_wg_priv_user1; "
+ sql "revoke USAGE_PRIV ON WORKLOAD GROUP '%' from role
'test_wg_priv_role1'; "
+ qt_select_wgp_10 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+
+ //4 test row filter
+ sql "create user test_wg_priv_user2"
+ sql "grant SELECT_PRIV on *.*.* to test_wg_priv_user2"
+ connect(user = 'test_wg_priv_user2', password = '', url =
context.config.jdbcUrl) {
+ qt_select_wgp_11 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+ }
+
+ sql "drop user test_wg_priv_user1"
+ sql "drop user test_wg_priv_user2"
+ sql "drop role test_wg_priv_role1"
+ qt_select_wgp_12 "select
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE from
information_schema.workload_group_privileges where grantee like
'%test_wg_priv%' order by
GRANTEE,WORKLOAD_GROUP_NAME,PRIVILEGE_TYPE,IS_GRANTABLE; "
+ sql "drop workload group test_wg_priv_g1"
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]