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 979d36f357a Fix JDBC fallback view metadata type loading (#39830)
979d36f357a is described below

commit 979d36f357a1abff7c844f6ee04f5a3a32fca7d9
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 13 16:08:46 2026 +0800

    Fix JDBC fallback view metadata type loading (#39830)
---
 .../data/loader/type/TableMetaDataLoader.java         | 19 +++++++++++++------
 .../data/loader/type/TableMetaDataLoaderTest.java     | 16 +++++++++++++++-
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoader.java
 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoader.java
index 70df9f44555..71138cd185b 100644
--- 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoader.java
+++ 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoader.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.loader.MetaDataLoaderConnection;
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
 import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
 import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierNormalizeEngine;
 import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
@@ -83,16 +84,22 @@ public final class TableMetaDataLoader {
     private static Optional<TableMetaData> loadTableMetaData(final DataSource 
dataSource, final String tableName,
                                                              final String 
tableNamePattern, final DatabaseType databaseType) throws SQLException {
         try (MetaDataLoaderConnection connection = new 
MetaDataLoaderConnection(databaseType, dataSource.getConnection())) {
-            return isTableExist(connection, tableNamePattern)
-                    ? Optional.of(new TableMetaData(tableName, 
ColumnMetaDataLoader.load(
-                            connection, tableNamePattern, databaseType), 
IndexMetaDataLoader.load(connection, tableNamePattern), 
Collections.emptyList()))
-                    : Optional.empty();
+            Optional<TableType> tableType = loadTableType(connection, 
tableNamePattern);
+            if (!tableType.isPresent()) {
+                return Optional.empty();
+            }
+            return Optional.of(new TableMetaData(tableName, 
ColumnMetaDataLoader.load(connection, tableNamePattern, databaseType),
+                    IndexMetaDataLoader.load(connection, tableNamePattern), 
Collections.emptyList(), tableType.get()));
         }
     }
     
-    private static boolean isTableExist(final Connection connection, final 
String tableNamePattern) throws SQLException {
+    private static Optional<TableType> loadTableType(final Connection 
connection, final String tableNamePattern) throws SQLException {
         try (ResultSet resultSet = 
connection.getMetaData().getTables(connection.getCatalog(), 
connection.getSchema(), tableNamePattern, null)) {
-            return resultSet.next();
+            if (!resultSet.next()) {
+                return Optional.empty();
+            }
+            String tableType = resultSet.getString("TABLE_TYPE");
+            return Optional.of(TableType.VIEW.name().equals(tableType) || 
"SYSTEM VIEW".equals(tableType) ? TableType.VIEW : TableType.TABLE);
         }
     }
 }
diff --git 
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoaderTest.java
 
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoaderTest.java
index 2b279dd6869..2aff4a074fa 100644
--- 
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoaderTest.java
+++ 
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/TableMetaDataLoaderTest.java
@@ -23,11 +23,14 @@ import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.Col
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -91,6 +94,7 @@ class TableMetaDataLoaderTest {
         when(dataSource.getConnection().getCatalog()).thenReturn(TEST_CATALOG);
         when(dataSource.getConnection().getMetaData().getTables(TEST_CATALOG, 
null, TEST_TABLE, null)).thenReturn(tableExistResultSet);
         when(tableExistResultSet.next()).thenReturn(true);
+        when(tableExistResultSet.getString("TABLE_TYPE")).thenReturn("TABLE");
         when(dataSource.getConnection().getMetaData().getTables(TEST_CATALOG, 
null, NOT_EXISTED_TABLE, null)).thenReturn(mock(ResultSet.class));
         when(dataSource.getConnection().getMetaData().getColumns(TEST_CATALOG, 
null, TEST_TABLE, "%")).thenReturn(columnResultSet);
         when(columnResultSet.next()).thenReturn(true, true, false);
@@ -127,10 +131,20 @@ class TableMetaDataLoaderTest {
     }
     
     @Test
-    void assertLoadNormalizedTableName() throws SQLException {
+    void assertLoadNormalizedTable() throws SQLException {
         Optional<TableMetaData> actual = 
TableMetaDataLoader.loadNormalized(dataSource, TEST_TABLE, databaseType);
         assertTrue(actual.isPresent());
         assertThat(actual.get().getName(), is(TEST_TABLE));
+        assertThat(actual.get().getType(), is(TableType.TABLE));
+    }
+    
+    @ParameterizedTest(name = "{0}")
+    @ValueSource(strings = {"VIEW", "SYSTEM VIEW"})
+    void assertLoadNormalizedView(final String tableType) throws SQLException {
+        
when(tableExistResultSet.getString("TABLE_TYPE")).thenReturn(tableType);
+        Optional<TableMetaData> actual = 
TableMetaDataLoader.loadNormalized(dataSource, TEST_TABLE, databaseType);
+        assertTrue(actual.isPresent());
+        assertThat(actual.get().getType(), is(TableType.VIEW));
     }
     
     private void assertColumnMetaData(final ColumnMetaData actual, final 
String name, final int dataType, final boolean primaryKey, final boolean 
caseSensitive) {

Reply via email to