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 38527d1b84f Collect table type for H2 and SQLServer meta data loaders
(#39509)
38527d1b84f is described below
commit 38527d1b84f36f66ccf6651fb3f6d95ffcb2c6a8
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Aug 19 00:40:20 2026 +0800
Collect table type for H2 and SQLServer meta data loaders (#39509)
- Load view names in H2MetaDataLoader from INFORMATION_SCHEMA.TABLES and
mark views with TableType.VIEW
- Load view names in SQLServerMetaDataLoader from sys.objects and mark
views with TableType.VIEW
- Map TableType.TABLE to BASE TABLE in MySQLShowTablesExecutor to align
SHOW FULL TABLES output with native MySQL
Signed-off-by: zhangliang <[email protected]>
---
.../h2/metadata/data/loader/H2MetaDataLoader.java | 26 +++++++++++-
.../metadata/data/loader/H2MetaDataLoaderTest.java | 47 +++++++++++++++++++++
.../data/loader/SQLServerMetaDataLoader.java | 25 ++++++++++-
.../data/loader/SQLServerMetaDataLoaderTest.java | 49 ++++++++++++++++++++++
.../executor/show/MySQLShowTablesExecutor.java | 5 ++-
.../executor/show/MySQLShowTablesExecutorTest.java | 17 +++++++-
6 files changed, 165 insertions(+), 4 deletions(-)
diff --git
a/database/connector/dialect/h2/src/main/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoader.java
b/database/connector/dialect/h2/src/main/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoader.java
index bb673128943..b5ab19aec3f 100644
---
a/database/connector/dialect/h2/src/main/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoader.java
+++
b/database/connector/dialect/h2/src/main/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoader.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Ind
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.datatype.DataTypeRegistry;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -65,20 +66,43 @@ public final class H2MetaDataLoader implements
DialectMetaDataLoader {
private static final String GENERATED_INFO_SQL_IN_TABLES =
GENERATED_INFO_SQL + " AND UPPER(C.TABLE_NAME) IN (%s)";
+ private static final String VIEW_META_DATA_SQL = "SELECT TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES"
+ + " WHERE TABLE_CATALOG=? AND TABLE_SCHEMA=? AND TABLE_TYPE='VIEW'
AND UPPER(TABLE_NAME) IN (%s)";
+
@Override
public Collection<SchemaMetaData> load(final MetaDataLoaderMaterial
material) throws SQLException {
Collection<TableMetaData> tableMetaDataList = new LinkedList<>();
try (Connection connection = material.getDataSource().getConnection())
{
Map<String, Collection<ColumnMetaData>> columnMetaDataMap =
loadColumnMetaDataMap(connection, material.getActualTableNames());
+ Collection<String> viewNames = columnMetaDataMap.isEmpty() ?
Collections.emptySet() : loadViewNames(connection, columnMetaDataMap.keySet());
Map<String, Collection<IndexMetaData>> indexMetaDataMap =
columnMetaDataMap.isEmpty() ? Collections.emptyMap() :
loadIndexMetaData(connection, columnMetaDataMap.keySet());
for (Entry<String, Collection<ColumnMetaData>> entry :
columnMetaDataMap.entrySet()) {
Collection<IndexMetaData> indexMetaDataList =
indexMetaDataMap.getOrDefault(entry.getKey(), Collections.emptyList());
- tableMetaDataList.add(new TableMetaData(entry.getKey(),
entry.getValue(), indexMetaDataList, Collections.emptyList()));
+ tableMetaDataList.add(new TableMetaData(entry.getKey(),
entry.getValue(), indexMetaDataList, Collections.emptyList(),
+ viewNames.contains(entry.getKey()) ? TableType.VIEW :
TableType.TABLE));
}
}
return Collections.singleton(new
SchemaMetaData(material.getDefaultSchemaName(), tableMetaDataList));
}
+ private Collection<String> loadViewNames(final Connection connection,
final Collection<String> tableNames) throws SQLException {
+ Collection<String> result = new LinkedList<>();
+ try (PreparedStatement preparedStatement =
connection.prepareStatement(getViewMetaDataSQL(tableNames))) {
+ preparedStatement.setString(1, connection.getCatalog());
+ preparedStatement.setString(2, "PUBLIC");
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ result.add(resultSet.getString("TABLE_NAME"));
+ }
+ }
+ }
+ return result;
+ }
+
+ private String getViewMetaDataSQL(final Collection<String> tableNames) {
+ return String.format(VIEW_META_DATA_SQL, tableNames.stream().map(each
-> String.format("'%s'", each).toUpperCase()).collect(Collectors.joining(",")));
+ }
+
private Map<String, Collection<ColumnMetaData>>
loadColumnMetaDataMap(final Connection connection, final Collection<String>
tables) throws SQLException {
Map<String, Collection<ColumnMetaData>> result = new HashMap<>();
try (PreparedStatement preparedStatement =
connection.prepareStatement(getTableMetaDataSQL(tables))) {
diff --git
a/database/connector/dialect/h2/src/test/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoaderTest.java
b/database/connector/dialect/h2/src/test/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoaderTest.java
index 663bd834b95..bea9f853a03 100644
---
a/database/connector/dialect/h2/src/test/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoaderTest.java
+++
b/database/connector/dialect/h2/src/test/java/org/apache/shardingsphere/database/connector/h2/metadata/data/loader/H2MetaDataLoaderTest.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Ind
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.datatype.DataTypeRegistry;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -33,9 +34,12 @@ import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.Optional;
import static org.hamcrest.Matchers.is;
@@ -100,6 +104,31 @@ class H2MetaDataLoaderTest {
assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new
MetaDataLoaderMaterial(Collections.singletonList("tbl"), "foo_ds", dataSource,
databaseType, "sharding_db")));
}
+ @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
+ @Test
+ void assertLoadWithView() throws SQLException {
+ DataSource dataSource = mockDataSource();
+ ResultSet resultSet = mockTableAndViewMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(
+ "SELECT TABLE_CATALOG, TABLE_NAME, COLUMN_NAME, DATA_TYPE,
ORDINAL_POSITION, COALESCE(IS_VISIBLE, FALSE) IS_VISIBLE, IS_NULLABLE FROM
INFORMATION_SCHEMA.COLUMNS"
+ + " WHERE TABLE_CATALOG=? AND TABLE_SCHEMA=? AND
UPPER(TABLE_NAME) IN ('TBL','TBL_VIEW') ORDER BY ORDINAL_POSITION")
+ .executeQuery()).thenReturn(resultSet);
+ ResultSet viewResultSet = mockViewMetaDataResultSet();
+ when(dataSource.getConnection().prepareStatement(
+ "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_CATALOG=? AND TABLE_SCHEMA=? AND TABLE_TYPE='VIEW' AND UPPER(TABLE_NAME)
IN ('TBL_VIEW','TBL')")
+ .executeQuery()).thenReturn(viewResultSet);
+ DataTypeRegistry.load(dataSource, "H2");
+ Collection<SchemaMetaData> schemaMetaDataList =
getDialectTableMetaDataLoader().load(
+ new MetaDataLoaderMaterial(Arrays.asList("tbl", "tbl_view"),
"foo_ds", dataSource, databaseType, "sharding_db"));
+ assertThat(schemaMetaDataList.size(), is(1));
+ Map<String, TableType> actualTableTypes = new HashMap<>();
+ for (TableMetaData each :
schemaMetaDataList.iterator().next().getTables()) {
+ actualTableTypes.put(each.getName(), each.getType());
+ }
+ assertThat(actualTableTypes.get("tbl"), is(TableType.TABLE));
+ assertThat(actualTableTypes.get("tbl_view"), is(TableType.VIEW));
+ }
+
@SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
private DataSource mockDataSource() throws SQLException {
DataSource result = mock(DataSource.class, RETURNS_DEEP_STUBS);
@@ -129,6 +158,24 @@ class H2MetaDataLoaderTest {
return result;
}
+ private ResultSet mockTableAndViewMetaDataResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, true, false);
+ when(result.getString("TABLE_NAME")).thenReturn("tbl", "tbl_view");
+ when(result.getString("COLUMN_NAME")).thenReturn("id", "id");
+ when(result.getString("DATA_TYPE")).thenReturn("int", "int");
+ when(result.getBoolean("IS_VISIBLE")).thenReturn(true);
+ when(result.getString("IS_NULLABLE")).thenReturn("NO");
+ return result;
+ }
+
+ private ResultSet mockViewMetaDataResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, false);
+ when(result.getString("TABLE_NAME")).thenReturn("tbl_view");
+ return result;
+ }
+
private ResultSet mockPrimaryKeysMetaDataResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, false);
diff --git
a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
index 71162780945..6099edc291a 100644
---
a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
+++
b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Ind
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.datatype.DataTypeRegistry;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import javax.sql.DataSource;
import java.sql.Connection;
@@ -61,6 +62,8 @@ public final class SQLServerMetaDataLoader implements
DialectMetaDataLoader {
+ " LEFT JOIN sys.columns col ON obj.object_id = col.object_id"
+ " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN (%s) ORDER
BY idx.index_id";
+ private static final String VIEW_META_DATA_SQL = "SELECT name AS
TABLE_NAME FROM sys.objects WHERE type = 'V' AND name IN (%s)";
+
private static final int HIDDEN_COLUMN_START_MAJOR_VERSION = 15;
@Override
@@ -68,15 +71,35 @@ public final class SQLServerMetaDataLoader implements
DialectMetaDataLoader {
Collection<TableMetaData> tableMetaDataList = new LinkedList<>();
Map<String, Collection<ColumnMetaData>> columnMetaDataMap =
loadColumnMetaDataMap(material.getDataSource(), material.getActualTableNames());
if (!columnMetaDataMap.isEmpty()) {
+ Collection<String> viewNames =
loadViewNames(material.getDataSource(), columnMetaDataMap.keySet());
Map<String, Collection<IndexMetaData>> indexMetaDataMap =
loadIndexMetaData(material.getDataSource(), columnMetaDataMap.keySet());
for (Entry<String, Collection<ColumnMetaData>> entry :
columnMetaDataMap.entrySet()) {
Collection<IndexMetaData> indexMetaDataList =
indexMetaDataMap.getOrDefault(entry.getKey(), Collections.emptyList());
- tableMetaDataList.add(new TableMetaData(entry.getKey(),
entry.getValue(), indexMetaDataList, Collections.emptyList()));
+ tableMetaDataList.add(new TableMetaData(entry.getKey(),
entry.getValue(), indexMetaDataList, Collections.emptyList(),
+ viewNames.contains(entry.getKey()) ? TableType.VIEW :
TableType.TABLE));
}
}
return Collections.singleton(new
SchemaMetaData(material.getDefaultSchemaName(), tableMetaDataList));
}
+ private Collection<String> loadViewNames(final DataSource dataSource,
final Collection<String> tableNames) throws SQLException {
+ Collection<String> result = new LinkedList<>();
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement =
connection.prepareStatement(getViewMetaDataSQL(tableNames))) {
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ result.add(resultSet.getString("TABLE_NAME"));
+ }
+ }
+ }
+ return result;
+ }
+
+ private String getViewMetaDataSQL(final Collection<String> tableNames) {
+ return String.format(VIEW_META_DATA_SQL, tableNames.stream().map(each
-> String.format("'%s'", each)).collect(Collectors.joining(",")));
+ }
+
private Map<String, Collection<ColumnMetaData>>
loadColumnMetaDataMap(final DataSource dataSource, final Collection<String>
tables) throws SQLException {
Map<String, Collection<ColumnMetaData>> result = new HashMap<>();
try (
diff --git
a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
index d0a10d133ce..0994de993f6 100644
---
a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
+++
b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Ind
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.datatype.DataTypeRegistry;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -40,7 +41,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -72,6 +75,15 @@ class SQLServerMetaDataLoaderTest {
+ " LEFT JOIN sys.columns col ON obj.object_id = col.object_id"
+ " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN ('tbl')
ORDER BY idx.index_id";
+ private static final String LOAD_COLUMN_META_DATA_WITH_VIEW = "SELECT
obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, t.name AS DATA_TYPE,"
+ + " col.collation_name AS COLLATION_NAME, col.column_id,
is_identity AS IS_IDENTITY, col.is_nullable AS IS_NULLABLE,"
+ + " (SELECT TOP 1 ind.is_primary_key FROM sys.index_columns ic
LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id"
+ + " AND ic.index_id = ind.index_id AND ind.name LIKE 'PK_%' WHERE
ic.object_id = obj.object_id AND ic.column_id = col.column_id) AS
IS_PRIMARY_KEY"
+ + " FROM sys.objects obj INNER JOIN sys.columns col ON
obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id =
col.user_type_id"
+ + " WHERE obj.name IN ('tbl','tbl_view') ORDER BY col.column_id";
+
+ private static final String LOAD_VIEW_META_DATA = "SELECT name AS
TABLE_NAME FROM sys.objects WHERE type = 'V' AND name IN ('tbl_view','tbl')";
+
private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "SQLServer");
private final DialectMetaDataLoader dialectMetaDataLoader =
DatabaseTypedSPILoader.getService(DialectMetaDataLoader.class, databaseType);
@@ -107,6 +119,27 @@ class SQLServerMetaDataLoaderTest {
assertTableMetaData(actual, expectedSecondColumnVisible,
expectedIndexColumns);
}
+ @SuppressWarnings({"JDBCResourceOpenedButNotSafelyClosed", "resource"})
+ @Test
+ void assertLoadWithView() throws SQLException {
+ DataSource dataSource = mockDataSource();
+ ResultSet tableMetaDataResultSet = mockTableAndViewMetaDataResultSet();
+
when(dataSource.getConnection().prepareStatement(LOAD_COLUMN_META_DATA_WITH_VIEW).executeQuery()).thenReturn(tableMetaDataResultSet);
+ ResultSet viewMetaDataResultSet = mockViewMetaDataResultSet();
+
when(dataSource.getConnection().prepareStatement(LOAD_VIEW_META_DATA).executeQuery()).thenReturn(viewMetaDataResultSet);
+
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(14);
+ DataTypeRegistry.load(dataSource, "SQLServer");
+ Collection<SchemaMetaData> schemaMetaDataList =
dialectMetaDataLoader.load(
+ new MetaDataLoaderMaterial(Arrays.asList("tbl", "tbl_view"),
"foo_ds", dataSource, databaseType, "sharding_db"));
+ assertThat(schemaMetaDataList.size(), is(1));
+ Map<String, TableType> actualTableTypes = new HashMap<>();
+ for (TableMetaData each :
schemaMetaDataList.iterator().next().getTables()) {
+ actualTableTypes.put(each.getName(), each.getType());
+ }
+ assertThat(actualTableTypes.get("tbl"), is(TableType.TABLE));
+ assertThat(actualTableTypes.get("tbl_view"), is(TableType.VIEW));
+ }
+
@SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
private DataSource mockDataSource() throws SQLException {
DataSource result = mock(DataSource.class, RETURNS_DEEP_STUBS);
@@ -137,6 +170,22 @@ class SQLServerMetaDataLoaderTest {
return result;
}
+ private ResultSet mockTableAndViewMetaDataResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, true, false);
+ when(result.getString("TABLE_NAME")).thenReturn("tbl", "tbl_view");
+ when(result.getString("COLUMN_NAME")).thenReturn("id", "id");
+ when(result.getString("DATA_TYPE")).thenReturn("int", "int");
+ return result;
+ }
+
+ private ResultSet mockViewMetaDataResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, false);
+ when(result.getString("TABLE_NAME")).thenReturn("tbl_view");
+ return result;
+ }
+
private ResultSet mockSimpleIndexMetaDataResultSet() throws SQLException {
ResultSet result = mock(ResultSet.class);
when(result.next()).thenReturn(true, false);
diff --git
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutor.java
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutor.java
index 4202199f664..983dbfb6e59 100644
---
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutor.java
+++
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutor.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sho
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import
org.apache.shardingsphere.database.connector.core.metadata.database.system.SystemDatabase;
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.UnknownDatabaseException;
import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
@@ -109,6 +110,8 @@ public final class MySQLShowTablesExecutor implements
DatabaseAdminQueryExecutor
}
private LocalDataQueryResultRow getQueryResultRow(final
ShardingSphereTable table) {
- return sqlStatement.isContainsFull() ? new
LocalDataQueryResultRow(table.getName(), table.getType()) : new
LocalDataQueryResultRow(table.getName());
+ return sqlStatement.isContainsFull()
+ ? new LocalDataQueryResultRow(table.getName(), TableType.VIEW
== table.getType() ? "VIEW" : "BASE TABLE")
+ : new LocalDataQueryResultRow(table.getName());
}
}
diff --git
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutorTest.java
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutorTest.java
index 0e903a8c3a3..624b8656826 100644
---
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutorTest.java
+++
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/show/MySQLShowTablesExecutorTest.java
@@ -18,6 +18,7 @@
package
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.show;
import org.apache.shardingsphere.authority.rule.AuthorityRule;
+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.config.props.ConfigurationProperties;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
@@ -85,8 +86,18 @@ class MySQLShowTablesExecutorTest {
void assertShowTablesExecutorWithFull() throws SQLException {
MySQLShowTablesStatement sqlStatement = new
MySQLShowTablesStatement(databaseType, null, mock(), true);
MySQLShowTablesExecutor executor = new
MySQLShowTablesExecutor(sqlStatement);
- executor.execute(mockConnectionSession(),
mockMetaData(mockDatabases()));
+ Collection<ShardingSphereTable> tables = new LinkedList<>();
+ tables.add(new ShardingSphereTable("t_account",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
+ tables.add(new ShardingSphereTable("v_account",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList(),
TableType.VIEW));
+ executor.execute(mockConnectionSession(),
mockMetaData(mockDatabases(tables)));
assertThat(executor.getQueryResultMetaData().getColumnCount(), is(2));
+ executor.getMergedResult().next();
+ assertThat(executor.getMergedResult().getValue(1, Object.class),
is("t_account"));
+ assertThat(executor.getMergedResult().getValue(2, Object.class),
is("BASE TABLE"));
+ executor.getMergedResult().next();
+ assertThat(executor.getMergedResult().getValue(1, Object.class),
is("v_account"));
+ assertThat(executor.getMergedResult().getValue(2, Object.class),
is("VIEW"));
+ assertFalse(executor.getMergedResult().next());
}
@Test
@@ -167,6 +178,10 @@ class MySQLShowTablesExecutorTest {
tables.add(new ShardingSphereTable("t_account_bak",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
tables.add(new ShardingSphereTable("t_account_detail",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
tables.add(new ShardingSphereTable("T_TEST", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList()));
+ return mockDatabases(tables);
+ }
+
+ private Collection<ShardingSphereDatabase> mockDatabases(final
Collection<ShardingSphereTable> tables) {
ShardingSphereSchema schema = new ShardingSphereSchema("foo_db",
databaseType, tables, Collections.emptyList());
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(database.getName()).thenReturn(String.format(DATABASE_PATTERN,
0));