This is an automated email from the ASF dual-hosted git repository. jianglongtao pushed a commit to branch fix-33341 in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit 0c7ed0a580d39cb0612b5cd85d7c15fda29c4661 Author: Raigor <[email protected]> AuthorDate: Mon Aug 26 15:13:30 2024 +0800 Fix No database selected exception occurs when show tables from db (#3) --- .../handler/admin/MySQLAdminExecutorCreator.java | 6 +-- .../handler/admin/executor/ShowTablesExecutor.java | 45 ++++++++++++++-------- .../admin/MySQLAdminExecutorCreatorTest.java | 2 +- .../executor/MySQLAdminExecutorFactoryTest.java | 3 +- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java index 25fda1aa9df..31c2d9feb44 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java @@ -78,9 +78,6 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre if (sqlStatement instanceof MySQLShowProcedureStatusStatement) { return Optional.of(new ShowProcedureStatusExecutor((MySQLShowProcedureStatusStatement) sqlStatement)); } - if (sqlStatement instanceof MySQLShowTablesStatement) { - return Optional.of(new ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement, sqlStatementContext.getDatabaseType())); - } return Optional.empty(); } @@ -93,6 +90,9 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre if (sqlStatement instanceof MySQLShowDatabasesStatement) { return Optional.of(new ShowDatabasesExecutor((MySQLShowDatabasesStatement) sqlStatement)); } + if (sqlStatement instanceof MySQLShowTablesStatement) { + return Optional.of(new ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement, sqlStatementContext.getDatabaseType())); + } if (sqlStatement instanceof MySQLShowProcessListStatement) { return Optional.of(new ShowProcessListExecutor(((MySQLShowProcessListStatement) sqlStatement).isFull())); } diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java index 3a0374cd8f4..092e07fcb34 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java @@ -37,8 +37,10 @@ import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement; import java.sql.Types; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -51,7 +53,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { - private final MySQLShowTablesStatement showTablesStatement; + private final MySQLShowTablesStatement sqlStatement; private final DatabaseType databaseType; @@ -63,7 +65,7 @@ public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { @Override public void execute(final ConnectionSession connectionSession) { - String databaseName = showTablesStatement.getFromSchema().map(schema -> schema.getSchema().getIdentifier().getValue()).orElseGet(connectionSession::getDatabaseName); + String databaseName = sqlStatement.getFromSchema().map(schema -> schema.getSchema().getIdentifier().getValue()).orElseGet(connectionSession::getDatabaseName); queryResultMetaData = createQueryResultMetaData(databaseName); mergedResult = new TransparentMergedResult(getQueryResult(databaseName)); } @@ -72,7 +74,7 @@ public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { List<RawQueryResultColumnMetaData> columnNames = new LinkedList<>(); String tableColumnName = String.format("Tables_in_%s", databaseName); columnNames.add(new RawQueryResultColumnMetaData("", tableColumnName, tableColumnName, Types.VARCHAR, "VARCHAR", 255, 0)); - if (showTablesStatement.isContainsFull()) { + if (sqlStatement.isContainsFull()) { columnNames.add(new RawQueryResultColumnMetaData("", "Table_type", "Table_type", Types.VARCHAR, "VARCHAR", 20, 0)); } return new RawQueryResultMetaData(columnNames); @@ -83,23 +85,32 @@ public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { if (!systemDatabase.getSystemSchemas().contains(databaseName) && !ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete()) { return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList()); } - List<MemoryQueryResultDataRow> rows = getAllTableNames(databaseName).stream().map(each -> { - List<Object> rowValues = new LinkedList<>(); - rowValues.add(each.getName()); - if (showTablesStatement.isContainsFull()) { - rowValues.add(each.getType()); - } - return new MemoryQueryResultDataRow(rowValues); - }).collect(Collectors.toList()); + List<MemoryQueryResultDataRow> rows = getTables(databaseName).stream().map(this::getRow).collect(Collectors.toList()); return new RawMemoryQueryResult(queryResultMetaData, rows); } - private Collection<ShardingSphereTable> getAllTableNames(final String databaseName) { - Collection<ShardingSphereTable> result = ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getSchema(databaseName).getTables().values(); - if (!showTablesStatement.getFilter().isPresent()) { - return result; + private MemoryQueryResultDataRow getRow(final ShardingSphereTable table) { + return sqlStatement.isContainsFull() + ? new MemoryQueryResultDataRow(Arrays.asList(table.getName(), table.getType())) + : new MemoryQueryResultDataRow(Collections.singletonList(table.getName())); + } + + private Collection<ShardingSphereTable> getTables(final String databaseName) { + Collection<ShardingSphereTable> tables = ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getSchema(databaseName).getTables().values(); + Collection<ShardingSphereTable> filteredTables = filterByLike(tables); + return filteredTables.stream().sorted(Comparator.comparing(ShardingSphereTable::getName)).collect(Collectors.toList()); + } + + private Collection<ShardingSphereTable> filterByLike(final Collection<ShardingSphereTable> tables) { + Optional<Pattern> likePattern = getLikePattern(); + return likePattern.isPresent() ? tables.stream().filter(each -> likePattern.get().matcher(each.getName()).matches()).collect(Collectors.toList()) : tables; + } + + private Optional<Pattern> getLikePattern() { + if (!sqlStatement.getFilter().isPresent()) { + return Optional.empty(); } - Optional<String> pattern = showTablesStatement.getFilter().get().getLike().map(optional -> RegexUtils.convertLikePatternToRegex(optional.getPattern())); - return pattern.isPresent() ? result.stream().filter(each -> Pattern.compile(pattern.get(), Pattern.CASE_INSENSITIVE).matcher(each.getName()).matches()).collect(Collectors.toList()) : result; + Optional<String> pattern = sqlStatement.getFilter().get().getLike().map(optional -> RegexUtils.convertLikePatternToRegex(optional.getPattern())); + return pattern.map(optional -> Pattern.compile(RegexUtils.convertLikePatternToRegex(optional), Pattern.CASE_INSENSITIVE)); } } diff --git a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java index f73f2b24eda..9944b0468e4 100644 --- a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java +++ b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java @@ -113,7 +113,7 @@ class MySQLAdminExecutorCreatorTest { @Test void assertCreateWithShowTables() { when(sqlStatementContext.getSqlStatement()).thenReturn(new MySQLShowTablesStatement()); - Optional<DatabaseAdminExecutor> actual = new MySQLAdminExecutorCreator().create(sqlStatementContext); + Optional<DatabaseAdminExecutor> actual = new MySQLAdminExecutorCreator().create(sqlStatementContext, null, null, Collections.emptyList()); assertTrue(actual.isPresent()); assertThat(actual.get(), instanceOf(ShowTablesExecutor.class)); } diff --git a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLAdminExecutorFactoryTest.java b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLAdminExecutorFactoryTest.java index bec82592355..f5bc1e7267e 100644 --- a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLAdminExecutorFactoryTest.java +++ b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLAdminExecutorFactoryTest.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement; import org.junit.jupiter.api.Test; +import java.util.Collections; import java.util.Optional; import static org.hamcrest.CoreMatchers.instanceOf; @@ -60,7 +61,7 @@ class MySQLAdminExecutorFactoryTest { MySQLShowTablesStatement statement = mock(MySQLShowTablesStatement.class); CommonSQLStatementContext statementContext = mock(CommonSQLStatementContext.class); when(statementContext.getSqlStatement()).thenReturn(statement); - Optional<DatabaseAdminExecutor> executor = new MySQLAdminExecutorCreator().create(statementContext); + Optional<DatabaseAdminExecutor> executor = new MySQLAdminExecutorCreator().create(statementContext, null, null, Collections.emptyList()); assertTrue(executor.isPresent()); assertThat(executor.get(), instanceOf(ShowTablesExecutor.class)); }
