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

azexin 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 3a6dd034577 Query required variables in one SQL for 
MySQLDataSourceChecker (#25711)
3a6dd034577 is described below

commit 3a6dd034577b185346e521f4a59b8b9f71176830
Author: Hongsheng Zhong <[email protected]>
AuthorDate: Wed May 17 11:21:17 2023 +0800

    Query required variables in one SQL for MySQLDataSourceChecker (#25711)
    
    * Query required variables in one SQL for MySQLDataSourceChecker
    
    * Update unit test
    
    * Update MySQLDataSourceChecker
    
    * Update MySQLDataSourceChecker
---
 .../check/datasource/MySQLDataSourceChecker.java   | 35 +++++++++++-----------
 .../datasource/MySQLDataSourceCheckerTest.java     |  4 ++-
 2 files changed, 21 insertions(+), 18 deletions(-)

diff --git 
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
 
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
index 77d6ddc9efb..b40eecd350a 100644
--- 
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
+++ 
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
@@ -33,6 +33,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 /**
  * Data source checker for MySQL.
@@ -43,14 +44,16 @@ public final class MySQLDataSourceChecker extends 
AbstractDataSourceChecker {
     
     private static final String[][] REQUIRED_PRIVILEGES = {{"ALL PRIVILEGES", 
"ON *.*"}, {"REPLICATION SLAVE", "REPLICATION CLIENT", "ON *.*"}};
     
-    private static final String SHOW_VARIABLES_SQL = "SHOW VARIABLES LIKE ?";
-    
     private static final Map<String, String> REQUIRED_VARIABLES = new 
HashMap<>(3, 1);
     
+    private static final String SHOW_VARIABLES_SQL;
+    
     static {
         REQUIRED_VARIABLES.put("LOG_BIN", "ON");
         REQUIRED_VARIABLES.put("BINLOG_FORMAT", "ROW");
+        // It does not exist in all versions of MySQL
         REQUIRED_VARIABLES.put("BINLOG_ROW_IMAGE", "FULL");
+        SHOW_VARIABLES_SQL = String.format("SHOW VARIABLES WHERE Variable_name 
IN (%s)", REQUIRED_VARIABLES.keySet().stream().map(each -> 
"?").collect(Collectors.joining(",")));
     }
     
     @Override
@@ -89,25 +92,23 @@ public final class MySQLDataSourceChecker extends 
AbstractDataSourceChecker {
     }
     
     private void checkVariable(final DataSource dataSource) {
-        try (Connection connection = dataSource.getConnection()) {
+        try (
+                Connection connection = dataSource.getConnection();
+                PreparedStatement preparedStatement = 
connection.prepareStatement(SHOW_VARIABLES_SQL)) {
+            int parameterIndex = 1;
             for (Entry<String, String> entry : REQUIRED_VARIABLES.entrySet()) {
-                checkVariable(connection, entry.getKey(), entry.getValue());
+                preparedStatement.setString(parameterIndex++, entry.getKey());
             }
-        } catch (final SQLException ex) {
-            throw new PrepareJobWithCheckPrivilegeFailedException(ex);
-        }
-    }
-    
-    private void checkVariable(final Connection connection, final String key, 
final String toBeCheckedValue) throws SQLException {
-        try (PreparedStatement preparedStatement = 
connection.prepareStatement(SHOW_VARIABLES_SQL)) {
-            preparedStatement.setString(1, key);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
-                if (resultSet.next()) {
-                    String actualValue = resultSet.getString(2);
-                    
ShardingSpherePreconditions.checkState(toBeCheckedValue.equalsIgnoreCase(actualValue),
-                            () -> new 
PrepareJobWithInvalidSourceDataSourceException(key, toBeCheckedValue, 
actualValue));
-                }
+                resultSet.next();
+                String key = resultSet.getString(1).toUpperCase();
+                String toBeCheckedValue = REQUIRED_VARIABLES.get(key);
+                String actualValue = resultSet.getString(2);
+                
ShardingSpherePreconditions.checkState(toBeCheckedValue.equalsIgnoreCase(actualValue),
+                        () -> new 
PrepareJobWithInvalidSourceDataSourceException(key, toBeCheckedValue, 
actualValue));
             }
+        } catch (final SQLException ex) {
+            throw new PrepareJobWithCheckPrivilegeFailedException(ex);
         }
     }
     
diff --git 
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
 
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
index e72f21752c2..b930782988d 100644
--- 
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
+++ 
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
@@ -90,14 +90,16 @@ class MySQLDataSourceCheckerTest {
     @Test
     void assertCheckVariableSuccess() throws SQLException {
         when(resultSet.next()).thenReturn(true, true);
+        when(resultSet.getString(1)).thenReturn("LOG_BIN", "BINLOG_FORMAT", 
"BINLOG_ROW_IMAGE");
         when(resultSet.getString(2)).thenReturn("ON", "ROW", "FULL");
         new MySQLDataSourceChecker().checkVariable(dataSources);
-        verify(preparedStatement, times(3)).executeQuery();
+        verify(preparedStatement, times(1)).executeQuery();
     }
     
     @Test
     void assertCheckVariableWithWrongVariable() throws SQLException {
         when(resultSet.next()).thenReturn(true, true);
+        when(resultSet.getString(1)).thenReturn("LOG_BIN", "BINLOG_FORMAT");
         when(resultSet.getString(2)).thenReturn("OFF", "ROW");
         assertThrows(PrepareJobWithInvalidSourceDataSourceException.class, () 
-> new MySQLDataSourceChecker().checkVariable(dataSources));
     }

Reply via email to