This is an automated email from the ASF dual-hosted git repository.

panjuan 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 4dc5bc4c050 Make show tables from schema work in ShardingSphere-Proxy 
(#19411)
4dc5bc4c050 is described below

commit 4dc5bc4c050cde77de0f3a2f460f737a36577d5d
Author: 吴伟杰 <[email protected]>
AuthorDate: Thu Jul 21 12:56:48 2022 +0800

    Make show tables from schema work in ShardingSphere-Proxy (#19411)
---
 .../admin/mysql/executor/ShowTablesExecutor.java   | 24 +++++++++++----------
 .../mysql/executor/ShowTablesExecutorTest.java     | 25 +++++++++++++++++++++-
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
index fe44e30fe3a..7366275a379 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
@@ -48,7 +48,6 @@ import java.util.stream.Collectors;
  * Show tables executor.
  */
 @RequiredArgsConstructor
-@Getter
 public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor {
     
     private static final String TABLE_TYPE = "BASE TABLE";
@@ -57,14 +56,25 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     
     private final DatabaseType databaseType;
     
+    @Getter
     private QueryResultMetaData queryResultMetaData;
     
+    @Getter
     private MergedResult mergedResult;
     
     @Override
     public void execute(final ConnectionSession connectionSession) {
-        queryResultMetaData = 
createQueryResultMetaData(connectionSession.getDatabaseName());
-        mergedResult = new 
TransparentMergedResult(getQueryResult(connectionSession.getDatabaseName()));
+        String databaseName = showTablesStatement.getFromSchema().map(schema 
-> 
schema.getSchema().getIdentifier().getValue()).orElseGet(connectionSession::getDatabaseName);
+        queryResultMetaData = createQueryResultMetaData(databaseName);
+        mergedResult = new 
TransparentMergedResult(getQueryResult(databaseName));
+    }
+    
+    private QueryResultMetaData createQueryResultMetaData(final String 
databaseName) {
+        List<RawQueryResultColumnMetaData> columnNames = new LinkedList<>();
+        String tableColumnName = String.format("Tables_in_%s", databaseName);
+        columnNames.add(new RawQueryResultColumnMetaData("", tableColumnName, 
tableColumnName, Types.VARCHAR, "VARCHAR", 255, 0));
+        columnNames.add(new RawQueryResultColumnMetaData("", "Table_type", 
"Table_type", Types.VARCHAR, "VARCHAR", 20, 0));
+        return new RawQueryResultMetaData(columnNames);
     }
     
     private QueryResult getQueryResult(final String databaseName) {
@@ -89,12 +99,4 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
         }
         return result;
     }
-    
-    private QueryResultMetaData createQueryResultMetaData(final String 
databaseName) {
-        List<RawQueryResultColumnMetaData> columnNames = new LinkedList<>();
-        String tableColumnName = String.format("Tables_in_%s", databaseName);
-        columnNames.add(new RawQueryResultColumnMetaData("", tableColumnName, 
tableColumnName, Types.VARCHAR, "VARCHAR", 255, 0));
-        columnNames.add(new RawQueryResultColumnMetaData("", "Table_type", 
"Table_type", Types.VARCHAR, "VARCHAR", 20, 0));
-        return new RawQueryResultMetaData(columnNames);
-    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
index e65d9649462..00d31c23612 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
@@ -20,7 +20,9 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
@@ -33,8 +35,11 @@ import 
org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.backend.util.ProxyContextRestorer;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.FromSchemaSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowFilterSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowLikeSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
 import org.junit.Before;
 import org.junit.Test;
@@ -78,7 +83,12 @@ public final class ShowTablesExecutorTest extends 
ProxyContextRestorer {
         when(database.getSchemas().get(String.format(DATABASE_PATTERN, 
0))).thenReturn(schema);
         when(database.isComplete()).thenReturn(true);
         when(database.getResource().getDatabaseType()).thenReturn(new 
MySQLDatabaseType());
-        return Collections.singletonMap(String.format(DATABASE_PATTERN, 0), 
database);
+        Map<String, ShardingSphereDatabase> result = new HashMap<>(2, 1);
+        result.put(String.format(DATABASE_PATTERN, 0), database);
+        ShardingSphereDatabase uncompletedDatabase = 
mock(ShardingSphereDatabase.class);
+        when(uncompletedDatabase.isComplete()).thenReturn(false);
+        result.put("uncompleted", uncompletedDatabase);
+        return result;
     }
     
     @Test
@@ -157,6 +167,19 @@ public final class ShowTablesExecutorTest extends 
ProxyContextRestorer {
         assertFalse(showTablesExecutor.getMergedResult().next());
     }
     
+    @Test
+    public void assertShowTableFromUncompletedDatabase() throws SQLException {
+        MySQLShowTablesStatement showTablesStatement = new 
MySQLShowTablesStatement();
+        showTablesStatement.setFromSchema(new FromSchemaSegment(0, 0, new 
DatabaseSegment(0, 0, new IdentifierValue("uncompleted"))));
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
+        showTablesExecutor.execute(mockConnectionSession());
+        QueryResultMetaData actualMetaData = 
showTablesExecutor.getQueryResultMetaData();
+        assertThat(actualMetaData.getColumnCount(), is(2));
+        assertThat(actualMetaData.getColumnName(1), 
is("Tables_in_uncompleted"));
+        MergedResult actualResult = showTablesExecutor.getMergedResult();
+        assertFalse(actualResult.next());
+    }
+    
     private ConnectionSession mockConnectionSession() {
         ConnectionSession result = mock(ConnectionSession.class);
         when(result.getGrantee()).thenReturn(new Grantee("root", ""));

Reply via email to