This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 d613652c999 Fix MySQL column metadata flags- #39832
d613652c999 is described below
commit d613652c999968544ed7278e8e21897353e88d5c
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 13 19:32:54 2026 +0800
Fix MySQL column metadata flags- #39832
Fix MySQL column metadata flags
---
.../metadata/data/loader/MySQLMetaDataLoader.java | 25 +++++++++++++++++-----
.../data/loader/MySQLMetaDataLoaderTest.java | 8 +++----
2 files changed, 24 insertions(+), 9 deletions(-)
diff --git
a/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoader.java
b/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoader.java
index a682daabe9c..33c1428eb08 100644
---
a/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoader.java
+++
b/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoader.java
@@ -49,6 +49,8 @@ import java.util.stream.Collectors;
*/
public final class MySQLMetaDataLoader implements DialectMetaDataLoader {
+ private static final String PRIMARY_KEY_INDEX_NAME = "PRIMARY";
+
private static final String ORDER_BY_ORDINAL_POSITION = " ORDER BY
ORDINAL_POSITION";
private static final String TABLE_META_DATA_NO_ORDER =
@@ -72,18 +74,31 @@ public final class MySQLMetaDataLoader implements
DialectMetaDataLoader {
Map<String, Collection<ColumnMetaData>> columnMetaDataMap =
loadColumnMetaDataMap(material.getDataSource(), material.getActualTableNames());
Collection<String> viewNames = columnMetaDataMap.isEmpty() ?
Collections.emptySet() : loadViewNames(material.getDataSource(),
columnMetaDataMap.keySet());
Map<String, Collection<IndexMetaData>> indexMetaDataMap =
columnMetaDataMap.isEmpty() ? Collections.emptyMap() :
loadIndexMetaData(material.getDataSource(), columnMetaDataMap.keySet());
- Map<String, Collection<ConstraintMetaData>> constraintMetaDataMap =
- columnMetaDataMap.isEmpty() ? Collections.emptyMap() :
loadConstraintMetaDataMap(material.getDataSource(), columnMetaDataMap.keySet());
+ Map<String, Collection<ConstraintMetaData>> constraintMetaDataMap =
columnMetaDataMap.isEmpty()
+ ? Collections.emptyMap()
+ : loadConstraintMetaDataMap(material.getDataSource(),
columnMetaDataMap.keySet());
for (Entry<String, Collection<ColumnMetaData>> entry :
columnMetaDataMap.entrySet()) {
Collection<IndexMetaData> indexMetaDataList =
indexMetaDataMap.getOrDefault(entry.getKey(), Collections.emptyList());
+ Collection<ColumnMetaData> columnMetaDataList =
revisePrimaryKeyColumnMetaData(entry.getValue(), indexMetaDataList);
Collection<ConstraintMetaData> constraintMetaDataList =
constraintMetaDataMap.getOrDefault(entry.getKey(), Collections.emptyList());
TableMetaData tableMetaData = new TableMetaData(
- entry.getKey(), entry.getValue(), indexMetaDataList,
constraintMetaDataList, viewNames.contains(entry.getKey()) ? TableType.VIEW :
TableType.TABLE);
+ entry.getKey(), columnMetaDataList, indexMetaDataList,
constraintMetaDataList, viewNames.contains(entry.getKey()) ? TableType.VIEW :
TableType.TABLE);
tableMetaDataList.add(tableMetaData);
}
return Collections.singletonList(new
SchemaMetaData(material.getDefaultSchemaName(), tableMetaDataList));
}
+ private Collection<ColumnMetaData> revisePrimaryKeyColumnMetaData(final
Collection<ColumnMetaData> columnMetaDataList, final Collection<IndexMetaData>
indexMetaDataList) {
+ Collection<String> primaryKeyColumns = indexMetaDataList.stream()
+ .filter(each ->
PRIMARY_KEY_INDEX_NAME.equalsIgnoreCase(each.getName())).findFirst().map(IndexMetaData::getColumns).orElse(Collections.emptyList());
+ Collection<ColumnMetaData> result = new LinkedList<>();
+ for (ColumnMetaData each : columnMetaDataList) {
+ result.add(new ColumnMetaData(each.getName(),
+ each.getDataType(),
primaryKeyColumns.contains(each.getName()), each.isGenerated(),
each.isCaseSensitive(), each.isVisible(), each.isUnsigned(),
each.isNullable()));
+ }
+ return result;
+ }
+
private Collection<String> loadViewNames(final DataSource dataSource,
final Collection<String> tableNames) throws SQLException {
Collection<String> result = new LinkedList<>();
try (
@@ -153,10 +168,10 @@ public final class MySQLMetaDataLoader implements
DialectMetaDataLoader {
String dataType = resultSet.getString("DATA_TYPE");
boolean primaryKey =
"PRI".equalsIgnoreCase(resultSet.getString("COLUMN_KEY"));
String extra = resultSet.getString("EXTRA");
- boolean generated = "auto_increment".equals(extra);
+ boolean generated = extra.contains("auto_increment");
String collationName = resultSet.getString("COLLATION_NAME");
boolean caseSensitive = null != collationName &&
!collationName.endsWith("_ci");
- boolean visible = !"INVISIBLE".equalsIgnoreCase(extra);
+ boolean visible = !extra.contains("INVISIBLE");
boolean unsigned =
resultSet.getString("COLUMN_TYPE").toUpperCase().contains("UNSIGNED");
boolean nullable = "YES".equals(resultSet.getString("IS_NULLABLE"));
return new ColumnMetaData(columnName,
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER),
primaryKey, generated, caseSensitive, visible, unsigned, nullable);
diff --git
a/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
b/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
index c4b949b0c10..a501847b056 100644
---
a/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
+++
b/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
@@ -154,7 +154,7 @@ class MySQLMetaDataLoaderTest {
when(result.getString("COLUMN_NAME")).thenReturn("id", "name", "doc",
"geo", "t_year", "pg", "mpg", "pt", "mpt");
when(result.getString("DATA_TYPE")).thenReturn("int", "varchar",
"json", "geometry", "year", "polygon", "multipolygon", "point", "multipoint");
when(result.getString("COLUMN_KEY")).thenReturn("PRI", "", "", "", "",
"", "", "", "");
- when(result.getString("EXTRA")).thenReturn("auto_increment",
"INVISIBLE", "", "", "", "", "", "", "");
+ when(result.getString("EXTRA")).thenReturn("auto_increment INVISIBLE",
"VIRTUAL GENERATED INVISIBLE", "", "", "", "", "", "", "");
when(result.getString("COLLATION_NAME")).thenReturn("utf8",
"utf8_general_ci", null, null, null, null, null, null, null);
when(result.getString("COLUMN_TYPE")).thenReturn("int", "varchar",
"json", "geometry", "year", "polygon", "multipolygon", "point", "multipoint");
when(result.getString("IS_NULLABLE")).thenReturn("NO", "YES", "YES",
"YES", "YES", "YES", "YES", "YES", "YES");
@@ -164,7 +164,7 @@ class MySQLMetaDataLoaderTest {
private ResultSet mockSimpleIndexMetaDataResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, false);
- when(result.getString("INDEX_NAME")).thenReturn("id");
+ when(result.getString("INDEX_NAME")).thenReturn("PRIMARY");
when(result.getString("TABLE_NAME")).thenReturn("tbl");
when(result.getString("COLUMN_NAME")).thenReturn("id");
when(result.getString("NON_UNIQUE")).thenReturn("0");
@@ -205,7 +205,7 @@ class MySQLMetaDataLoaderTest {
assertThat(actualTableMetaData.getName(), is("tbl"));
assertThat(actualTableMetaData.getColumns().size(), is(9));
Iterator<ColumnMetaData> columnsIterator =
actualTableMetaData.getColumns().iterator();
- assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, true, true, true, true, false, false));
+ assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("id",
Types.INTEGER, !expectedCompositeIndexExists, true, true, false, false, false));
assertColumnMetaData(columnsIterator.next(), new
ColumnMetaData("name", Types.VARCHAR, false, false, false, false, false, true));
assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("doc",
Types.LONGVARCHAR, false, false, false, true, false, true));
assertColumnMetaData(columnsIterator.next(), new ColumnMetaData("geo",
Types.BINARY, false, false, false, true, false, true));
@@ -232,7 +232,7 @@ class MySQLMetaDataLoaderTest {
private void assertIndexMetaData(final Collection<IndexMetaData>
actualIndexMetaData, final boolean expectedCompositeIndexExists) {
assertThat(actualIndexMetaData.size(), is(1));
IndexMetaData actualIndexMetaDataItem =
actualIndexMetaData.iterator().next();
- assertThat(actualIndexMetaDataItem.getName(),
is(expectedCompositeIndexExists ? "idx_composite" : "id"));
+ assertThat(actualIndexMetaDataItem.getName(),
is(expectedCompositeIndexExists ? "idx_composite" : "PRIMARY"));
assertThat(actualIndexMetaDataItem.getColumns(),
is(expectedCompositeIndexExists ? Arrays.asList("id", "name") :
Collections.singletonList("id")));
assertTrue(actualIndexMetaDataItem.isUnique());
}