Fix logic error in MySQLDataSourceChecker (#25936)
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 a1c7d85..0150fdc 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
@@ -100,12 +100,13 @@
preparedStatement.setString(parameterIndex++, entry.getKey());
}
try (ResultSet resultSet = preparedStatement.executeQuery()) {
- 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));
+ while (resultSet.next()) {
+ String key = resultSet.getString(1).toUpperCase();
+ String expectedValue = REQUIRED_VARIABLES.get(key);
+ String actualValue = resultSet.getString(2);
+ ShardingSpherePreconditions.checkState(expectedValue.equalsIgnoreCase(actualValue),
+ () -> new PrepareJobWithInvalidSourceDataSourceException(key, expectedValue, 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 b930782..0c85a27 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
@@ -33,6 +33,7 @@
import java.util.Collection;
import java.util.Collections;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -89,18 +90,18 @@
@Test
void assertCheckVariableSuccess() throws SQLException {
- when(resultSet.next()).thenReturn(true, true);
+ when(resultSet.next()).thenReturn(true, true, true, false);
when(resultSet.getString(1)).thenReturn("LOG_BIN", "BINLOG_FORMAT", "BINLOG_ROW_IMAGE");
when(resultSet.getString(2)).thenReturn("ON", "ROW", "FULL");
- new MySQLDataSourceChecker().checkVariable(dataSources);
+ assertDoesNotThrow(() -> new MySQLDataSourceChecker().checkVariable(dataSources));
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");
+ when(resultSet.next()).thenReturn(true, true, false);
+ when(resultSet.getString(1)).thenReturn("BINLOG_FORMAT", "LOG_BIN");
+ when(resultSet.getString(2)).thenReturn("ROW", "OFF");
assertThrows(PrepareJobWithInvalidSourceDataSourceException.class, () -> new MySQLDataSourceChecker().checkVariable(dataSources));
}