This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 1d0b7d1ecd7 [fix](auth) revoke column privs the second time failed
#34920
1d0b7d1ecd7 is described below
commit 1d0b7d1ecd74c90084953048e12a61143d0d956d
Author: camby <[email protected]>
AuthorDate: Thu May 16 06:47:19 2024 +0800
[fix](auth) revoke column privs the second time failed #34920
---
.../org/apache/doris/mysql/privilege/Role.java | 31 ++++++++++++++--------
.../authorization/column_authorization.groovy | 6 +++++
2 files changed, 26 insertions(+), 11 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Role.java
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Role.java
index ab1c55aeabc..2cea07bec0b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Role.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Role.java
@@ -790,19 +790,22 @@ public class Role implements Writable,
GsonPostProcessable {
public void revokePrivs(TablePattern tblPattern, PrivBitSet privs,
Map<ColPrivilegeKey, Set<String>> colPrivileges,
boolean errOnNonExist)
throws DdlException {
- PrivBitSet existingPriv = tblPatternToPrivs.get(tblPattern);
- if (existingPriv == null) {
- if (errOnNonExist) {
- throw new DdlException(tblPattern + " does not exist in role "
+ roleName);
+ if (!colPrivileges.isEmpty()) {
+ revokeCols(colPrivileges);
+ } else {
+ PrivBitSet existingPriv = tblPatternToPrivs.get(tblPattern);
+ if (existingPriv == null) {
+ if (errOnNonExist) {
+ throw new DdlException(tblPattern + " does not exist in
role " + roleName);
+ }
+ return;
}
- return;
- }
- existingPriv.remove(privs);
- if (existingPriv.isEmpty()) {
- tblPatternToPrivs.remove(tblPattern);
+ existingPriv.remove(privs);
+ if (existingPriv.isEmpty()) {
+ tblPatternToPrivs.remove(tblPattern);
+ }
+ revokePrivs(tblPattern, privs);
}
- revokePrivs(tblPattern, privs);
- revokeCols(colPrivileges);
}
private void revokeCols(Map<ColPrivilegeKey, Set<String>> colPrivileges) {
@@ -814,6 +817,12 @@ public class Role implements Writable, GsonPostProcessable
{
colPrivMap.get(entry.getKey()).removeAll(entry.getValue());
if (CollectionUtils.isEmpty(colPrivMap.get(entry.getKey()))) {
colPrivMap.remove(entry.getKey());
+ TablePattern tblPattern = new
TablePattern(entry.getKey().getCtl(), entry.getKey().getDb(),
+ entry.getKey().getTbl());
+ PrivBitSet existingPriv =
tblPatternToPrivs.get(tblPattern);
+ if (existingPriv != null && existingPriv.isEmpty()) {
+ tblPatternToPrivs.remove(tblPattern);
+ }
}
}
}
diff --git
a/regression-test/suites/nereids_p0/authorization/column_authorization.groovy
b/regression-test/suites/nereids_p0/authorization/column_authorization.groovy
index 9bd1c512acc..493aa032436 100644
---
a/regression-test/suites/nereids_p0/authorization/column_authorization.groovy
+++
b/regression-test/suites/nereids_p0/authorization/column_authorization.groovy
@@ -36,6 +36,12 @@ suite("column_authorization") {
sql "drop user if exists ${user1}"
sql "create user ${user1}"
+
+ sql "grant SELECT_PRIV(id) on ${db}.${baseTable} to '${user1}'@'%';"
+ sql "grant SELECT_PRIV(name) on ${db}.${baseTable} to '${user1}'@'%';"
+ sql "revoke SELECT_PRIV(name) on ${db}.${baseTable} from '${user1}'@'%';"
+ sql "revoke SELECT_PRIV(id) on ${db}.${baseTable} from '${user1}'@'%';"
+
sql "grant SELECT_PRIV(id) on ${db}.${baseTable} to '${user1}'@'%';"
//cloud-mode
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]