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

Reply via email to