This is an automated email from the ASF dual-hosted git repository.

sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new f67605e69e4 Support ALL PRIVILEGES ON `DB`.* in 
MySQLDatabasePrivilegeChecker (#34037)
f67605e69e4 is described below

commit f67605e69e42eaed528ffb773c276d28e69e5105
Author: Raigor <[email protected]>
AuthorDate: Fri Dec 13 13:25:42 2024 +0800

    Support ALL PRIVILEGES ON `DB`.* in MySQLDatabasePrivilegeChecker (#34037)
    
    * Support ALL PRIVILEGES ON `DB`.* in MySQLDatabasePrivilegeChecker
    
    * Update RELEASE-NOTES.md
---
 RELEASE-NOTES.md                                   |  1 +
 .../checker/MySQLDatabasePrivilegeChecker.java     |  3 +-
 .../checker/MySQLDatabasePrivilegeCheckerTest.java | 56 ++++++++++++++++++++--
 3 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 6416bae3536..dcc167c9503 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -54,6 +54,7 @@
 1. Sharding: Fixes avg, sum, min, max function return empty data when no query 
result return - [#33449](https://github.com/apache/shardingsphere/pull/33449)
 1. Encrypt: Fixes merge exception without encrypt rule in database - 
[#33708](https://github.com/apache/shardingsphere/pull/33708)
 1. SQL Binder: Fixes the expression segment cannot find the outer table when 
binding - [#34015](https://github.com/apache/shardingsphere/pull/34015)
+1. Proxy: Fixes "ALL PRIVILEGES ON `DB`.*" is not recognized during SELECT 
privilege verification for MySQL - 
[#34037](https://github.com/apache/shardingsphere/pull/34037)
 
 ### Change Logs
 
diff --git 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeChecker.java
 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeChecker.java
index 61a2614637a..2fdfe09656d 100644
--- 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeChecker.java
+++ 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeChecker.java
@@ -98,7 +98,8 @@ public final class MySQLDatabasePrivilegeChecker implements 
DialectDatabasePrivi
     }
     
     private String[][] getSelectRequiredPrivilege(final Connection connection) 
throws SQLException {
-        return new String[][]{{"ALL PRIVILEGES", "ON *.*"}, {"SELECT", "ON 
*.*"}, {"SELECT", String.format("ON `%s`.*", 
connection.getCatalog()).toUpperCase()}};
+        String onCatalog = String.format("ON `%s`.*", 
connection.getCatalog().toUpperCase());
+        return new String[][]{{"ALL PRIVILEGES", "ON *.*"}, {"SELECT", "ON 
*.*"}, {"ALL PRIVILEGES", onCatalog}, {"SELECT", onCatalog}};
     }
     
     private boolean matchPrivileges(final String grantedPrivileges, final 
String[][] requiredPrivileges) {
diff --git 
a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeCheckerTest.java
 
b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeCheckerTest.java
index 160223f5e57..4da2b2dce5f 100644
--- 
a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeCheckerTest.java
+++ 
b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/checker/MySQLDatabasePrivilegeCheckerTest.java
@@ -56,7 +56,7 @@ class MySQLDatabasePrivilegeCheckerTest {
     }
     
     @Test
-    void assertCheckPrivilegeWithParticularSuccess() throws SQLException {
+    void assertCheckPipelinePrivilegeWithParticularSuccess() throws 
SQLException {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         when(resultSet.next()).thenReturn(true);
         when(resultSet.getString(1)).thenReturn("GRANT REPLICATION SLAVE, 
REPLICATION CLIENT ON *.* TO '%'@'%'");
@@ -65,22 +65,22 @@ class MySQLDatabasePrivilegeCheckerTest {
     }
     
     @Test
-    void assertCheckPrivilegeWithAllSuccess() throws SQLException {
+    void assertCheckPipelinePrivilegeWithAllSuccess() throws SQLException {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         when(resultSet.next()).thenReturn(true);
-        when(resultSet.getString(1)).thenReturn("GRANT ALL PRIVILEGES CLIENT 
ON *.* TO '%'@'%'");
+        when(resultSet.getString(1)).thenReturn("GRANT ALL PRIVILEGES ON *.* 
TO '%'@'%'");
         new MySQLDatabasePrivilegeChecker().check(dataSource, 
PrivilegeCheckType.PIPELINE);
         verify(preparedStatement).executeQuery();
     }
     
     @Test
-    void assertCheckPrivilegeLackPrivileges() throws SQLException {
+    void assertCheckPipelinePrivilegeWithLackPrivileges() throws SQLException {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         assertThrows(MissingRequiredPrivilegeException.class, () -> new 
MySQLDatabasePrivilegeChecker().check(dataSource, PrivilegeCheckType.PIPELINE));
     }
     
     @Test
-    void assertCheckPrivilegeFailure() throws SQLException {
+    void assertCheckPipelinePrivilegeFailure() throws SQLException {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         when(resultSet.next()).thenThrow(new SQLException(""));
         assertThrows(CheckDatabaseEnvironmentFailedException.class, () -> new 
MySQLDatabasePrivilegeChecker().check(dataSource, PrivilegeCheckType.PIPELINE));
@@ -127,4 +127,50 @@ class MySQLDatabasePrivilegeCheckerTest {
         when(resultSet.next()).thenThrow(new SQLException(""));
         assertThrows(CheckDatabaseEnvironmentFailedException.class, () -> new 
MySQLDatabasePrivilegeChecker().check(dataSource, PrivilegeCheckType.XA));
     }
+    
+    @Test
+    void assertCheckSelectWithSelectPrivileges() throws SQLException {
+        when(dataSource.getConnection().getCatalog()).thenReturn("foo_db");
+        when(preparedStatement.executeQuery()).thenReturn(resultSet);
+        when(resultSet.next()).thenReturn(true);
+        when(resultSet.getString(1)).thenReturn("GRANT SELECT ON *.* TO 
'%'@'%'");
+        new MySQLDatabasePrivilegeChecker().check(dataSource, 
PrivilegeCheckType.SELECT);
+        verify(preparedStatement).executeQuery();
+    }
+    
+    @Test
+    void assertCheckSelectWithSelectOnDatabasePrivileges() throws SQLException 
{
+        when(dataSource.getConnection().getCatalog()).thenReturn("foo_db");
+        when(preparedStatement.executeQuery()).thenReturn(resultSet);
+        when(resultSet.next()).thenReturn(true);
+        when(resultSet.getString(1)).thenReturn("GRANT SELECT ON `FOO_DB`.* TO 
'%'@'%'");
+        new MySQLDatabasePrivilegeChecker().check(dataSource, 
PrivilegeCheckType.SELECT);
+        verify(preparedStatement).executeQuery();
+    }
+    
+    @Test
+    void assertCheckSelectWithAllPrivileges() throws SQLException {
+        when(dataSource.getConnection().getCatalog()).thenReturn("foo_db");
+        when(preparedStatement.executeQuery()).thenReturn(resultSet);
+        when(resultSet.next()).thenReturn(true);
+        when(resultSet.getString(1)).thenReturn("GRANT ALL PRIVILEGES ON *.* 
TO '%'@'%'");
+        new MySQLDatabasePrivilegeChecker().check(dataSource, 
PrivilegeCheckType.SELECT);
+        verify(preparedStatement).executeQuery();
+    }
+    
+    @Test
+    void assertCheckSelectWithAllPrivilegesOnDatabase() throws SQLException {
+        when(dataSource.getConnection().getCatalog()).thenReturn("foo_db");
+        when(preparedStatement.executeQuery()).thenReturn(resultSet);
+        when(resultSet.next()).thenReturn(true);
+        when(resultSet.getString(1)).thenReturn("GRANT ALL PRIVILEGES ON 
`FOO_DB`.* TO '%'@'%'");
+        new MySQLDatabasePrivilegeChecker().check(dataSource, 
PrivilegeCheckType.SELECT);
+        verify(preparedStatement).executeQuery();
+    }
+    
+    @Test
+    void assertCheckSelectWithLackPrivileges() throws SQLException {
+        when(preparedStatement.executeQuery()).thenReturn(resultSet);
+        assertThrows(MissingRequiredPrivilegeException.class, () -> new 
MySQLDatabasePrivilegeChecker().check(dataSource, PrivilegeCheckType.SELECT));
+    }
 }

Reply via email to