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());
     }

Reply via email to