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

jianglongtao 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 09f2f4e  Fix the problem that schemas without permissions are 
displayed (#13925)
09f2f4e is described below

commit 09f2f4ec72cc7b6c976d83f51f3936c382f9d872
Author: lanchengx <[email protected]>
AuthorDate: Tue Dec 7 16:42:35 2021 +0800

    Fix the problem that schemas without permissions are displayed (#13925)
    
    * Fix the problem that schemas without permissions are displayed
    
    * update comment
    
    * Add authority test.
    
    * Add blank line.
    
    * Adjustment format.
    
    * Merge conflict.
---
 .../executor/AbstractDatabaseMetadataExecutor.java | 31 ++++++++--
 .../SelectInformationSchemataExecutor.java         |  5 +-
 .../executor/SelectDatabaseExecutor.java           |  5 +-
 .../postgresql/executor/SelectTableExecutor.java   |  5 +-
 .../executor/fixture/AuthorityCheckerFixture.java  | 66 ++++++++++++++++++++++
 .../information/SelectInformationExecutorTest.java | 39 ++++++++++---
 .../executor/SelectDatabaseExecutorTest.java       | 18 ++++--
 ....shardingsphere.infra.executor.check.SQLChecker | 18 ++++++
 8 files changed, 165 insertions(+), 22 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
index e4838c8..109edbd 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.executor;
 
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultColumnMetaData;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
@@ -27,6 +28,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.me
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.exception.DatabaseNotExistedException;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -39,6 +42,7 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Types;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -65,7 +69,7 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
     
     @Override
     public final void execute(final ConnectionSession connectionSession) 
throws SQLException {
-        List<String> schemaNames = getSchemaNames();
+        List<String> schemaNames = getSchemaNames(connectionSession);
         for (String schemaName : schemaNames) {
             initSchemaData(schemaName);
             getSourceData(schemaName, resultSet -> handleResultSet(schemaName, 
resultSet));
@@ -103,7 +107,7 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
      *
      * @return schema names
      */
-    protected abstract List<String> getSchemaNames();
+    protected abstract List<String> getSchemaNames(ConnectionSession 
connectionSession);
     
     /**
      * Add default row data.
@@ -152,6 +156,24 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
     }
     
     /**
+     * Determine whether there is authority.
+     *
+     * @param schemaName schema name
+     * @param grantee grantee
+     * @return has authority or not
+     */
+    protected static boolean hasAuthority(final String schemaName, final 
Grantee grantee) {
+        return SQLCheckEngine.check(schemaName, getRules(schemaName), grantee);
+    }
+    
+    private static Collection<ShardingSphereRule> getRules(final String 
schemaName) {
+        Collection<ShardingSphereRule> result;
+        result = new 
LinkedList<>(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(schemaName).getRuleMetaData().getRules());
+        
result.addAll(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getGlobalRuleMetaData().getRules());
+        return result;
+    }
+    
+    /**
      * Default database metadata executor, execute sql directly in the 
database to obtain the result source data.
      */
     @Slf4j
@@ -174,8 +196,9 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
          * @return schema names
          */
         @Override
-        protected List<String> getSchemaNames() {
-            String schema = 
ProxyContext.getInstance().getAllSchemaNames().stream().filter(AbstractDatabaseMetadataExecutor::hasDatasource).findFirst().orElseThrow(DatabaseNotExistedException::new);
+        protected List<String> getSchemaNames(final ConnectionSession 
connectionSession) {
+            String schema = 
ProxyContext.getInstance().getAllSchemaNames().stream().filter(each -> 
hasAuthority(each, connectionSession.getGrantee()))
+                    
.filter(AbstractDatabaseMetadataExecutor::hasDatasource).findFirst().orElseThrow(DatabaseNotExistedException::new);
             return Collections.singletonList(schema);
         }
         
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
index 5690aab..5dbfe47 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.inform
 
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
@@ -81,8 +82,8 @@ public final class SelectInformationSchemataExecutor extends 
DefaultDatabaseMeta
     }
     
     @Override
-    protected List<String> getSchemaNames() {
-        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames();
+    protected List<String> getSchemaNames(final ConnectionSession 
connectionSession) {
+        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames().stream().filter(each -> 
hasAuthority(each, 
connectionSession.getGrantee())).collect(Collectors.toList());
         SCHEMA_WITHOUT_DATA_SOURCE.addAll(schemaNames.stream().filter(each -> 
!AbstractDatabaseMetadataExecutor.hasDatasource(each)).collect(Collectors.toSet()));
         List<String> result = 
schemaNames.stream().filter(AbstractDatabaseMetadataExecutor::hasDatasource).collect(Collectors.toList());
         if (!SCHEMA_WITHOUT_DATA_SOURCE.isEmpty()) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
index eeff69f..47681f0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor;
 
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
@@ -79,8 +80,8 @@ public final class SelectDatabaseExecutor extends 
DefaultDatabaseMetadataExecuto
     }
     
     @Override
-    protected List<String> getSchemaNames() {
-        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames();
+    protected List<String> getSchemaNames(final ConnectionSession 
connectionSession) {
+        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames().stream().filter(each -> 
hasAuthority(each, 
connectionSession.getGrantee())).collect(Collectors.toList());
         return 
schemaNames.stream().filter(AbstractDatabaseMetadataExecutor::hasDatasource).collect(Collectors.toList());
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
index d28914b..bdd3098 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor;
 
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
 
@@ -55,8 +56,8 @@ public final class SelectTableExecutor extends 
DefaultDatabaseMetadataExecutor {
     }
     
     @Override
-    protected List<String> getSchemaNames() {
-        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames();
+    protected List<String> getSchemaNames(final ConnectionSession 
connectionSession) {
+        Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames().stream().filter(each -> 
hasAuthority(each, 
connectionSession.getGrantee())).collect(Collectors.toList());
         return 
schemaNames.stream().filter(AbstractDatabaseMetadataExecutor::hasDatasource).collect(Collectors.toList());
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/fixture/AuthorityCheckerFixture.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/fixture/AuthorityCheckerFixture.java
new file mode 100644
index 0000000..ee469af
--- /dev/null
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/fixture/AuthorityCheckerFixture.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.fixture;
+
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
+import org.apache.shardingsphere.infra.executor.check.SQLCheckResult;
+import org.apache.shardingsphere.infra.executor.check.SQLChecker;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiPredicate;
+
+/**
+ * Authority checker fixture.
+ */
+public final class AuthorityCheckerFixture implements 
SQLChecker<AuthorityRule> {
+    
+    @Override
+    public boolean check(final String schemaName, final Grantee grantee, final 
AuthorityRule authorityRule) {
+        return !"test".equals(schemaName);
+    }
+    
+    @Override
+    public SQLCheckResult check(final SQLStatement sqlStatement, final 
List<Object> parameters, final Grantee grantee,
+                                final String currentSchema, final Map<String, 
ShardingSphereMetaData> metaDataMap, final AuthorityRule authorityRule) {
+        return new SQLCheckResult(true, "");
+    }
+    
+    @Override
+    public boolean check(final Grantee grantee, final AuthorityRule 
authorityRule) {
+        return true;
+    }
+    
+    @Override
+    public boolean check(final Grantee grantee, final BiPredicate<Object, 
Object> validator, final Object cipher, final AuthorityRule authorityRule) {
+        return true;
+    }
+    
+    @Override
+    public int getOrder() {
+        return 501;
+    }
+    
+    @Override
+    public Class<AuthorityRule> getTypeClass() {
+        return AuthorityRule.class;
+    }
+}
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
index 2723767..d931f04 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
@@ -18,16 +18,19 @@
 package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.information;
 
 import com.zaxxer.hikari.pool.HikariProxyResultSet;
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
+import org.apache.shardingsphere.infra.executor.check.SQLChecker;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
+import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.CachedDatabaseMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -37,6 +40,7 @@ import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigu
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCConnectionSession;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import org.junit.Before;
@@ -50,6 +54,7 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -66,10 +71,16 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public final class SelectInformationExecutorTest {
     
+    static {
+        ShardingSphereServiceLoader.register(SQLChecker.class);
+    }
+    
     private static final ResultSet RESULT_SET = 
mock(HikariProxyResultSet.class);
 
     private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
     
+    private final JDBCConnectionSession connectionSession = 
mock(JDBCConnectionSession.class);
+    
     @Before
     public void setUp() throws IllegalAccessException, NoSuchFieldException, 
SQLException {
         Field contextManagerField = 
ProxyContext.getInstance().getClass().getDeclaredField("contextManager");
@@ -79,6 +90,7 @@ public final class SelectInformationExecutorTest {
                 mock(ExecutorEngine.class), new ConfigurationProperties(new 
Properties()), mock(OptimizerContext.class));
         
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.getInstance().init(contextManager);
+        when(connectionSession.getGrantee()).thenReturn(new Grantee("root", 
"127.0.0.1"));
     }
     
     private void mockResultSet(final Map<String, String> mockMap, final 
Boolean... values) throws SQLException {
@@ -95,9 +107,20 @@ public final class SelectInformationExecutorTest {
     }
     
     private ShardingSphereMetaData getMetaData() throws SQLException {
+        ShardingSphereRuleMetaData metaData = 
mock(ShardingSphereRuleMetaData.class);
+        
when(metaData.getRules()).thenReturn(Collections.singletonList(mock(AuthorityRule.class,
 RETURNS_DEEP_STUBS)));
         return new ShardingSphereMetaData("sharding_db",
                 new ShardingSphereResource(mockDatasourceMap(), 
mockDataSourcesMetaData(), mock(CachedDatabaseMetaData.class), 
mock(MySQLDatabaseType.class)),
-                mock(ShardingSphereRuleMetaData.class), 
mock(ShardingSphereSchema.class)
+                metaData, mock(ShardingSphereSchema.class)
+        );
+    }
+    
+    private ShardingSphereMetaData getEmptyMetaData(final String schemaName) 
throws SQLException {
+        ShardingSphereRuleMetaData metaData = 
mock(ShardingSphereRuleMetaData.class);
+        
when(metaData.getRules()).thenReturn(Collections.singletonList(mock(AuthorityRule.class,
 RETURNS_DEEP_STUBS)));
+        return new ShardingSphereMetaData(schemaName,
+                new ShardingSphereResource(Collections.emptyMap(), 
mockDataSourcesMetaData(), mock(CachedDatabaseMetaData.class), 
mock(MySQLDatabaseType.class)),
+                metaData, mock(ShardingSphereSchema.class)
         );
     }
     
@@ -126,9 +149,9 @@ public final class SelectInformationExecutorTest {
         mockResultSet(mockResultSetMap, true, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
         metaDataMap.put("sharding_db", getMetaData());
-        metaDataMap.put("test", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("test", getEmptyMetaData("test"));
         SelectInformationSchemataExecutor selectSchemataExecutor = new 
SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
-        selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
+        selectSchemataExecutor.execute(connectionSession);
         
assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), 
is(mockResultSetMap.size()));
         int count = 0;
         while (selectSchemataExecutor.getMergedResult().next()) {
@@ -143,7 +166,7 @@ public final class SelectInformationExecutorTest {
                 fail("expected : `sharding_db` or `test`");
             }
         }
-        assertThat(count, is(2));
+        assertThat(count, is(1));
     }
     
     @Test
@@ -157,7 +180,7 @@ public final class SelectInformationExecutorTest {
         mockResultSetMap.put("DEFAULT_ENCRYPTION", "NO");
         mockResultSet(mockResultSetMap, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
-        metaDataMap.put("sharding_db", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("sharding_db", getEmptyMetaData("sharding_db"));
         SelectInformationSchemataExecutor selectSchemataExecutor = new 
SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
         
assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), 
is(mockResultSetMap.size()));
@@ -174,7 +197,7 @@ public final class SelectInformationExecutorTest {
         final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
         final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", sqlParserRule).parse(sql, false);
         SelectInformationSchemataExecutor selectSchemataExecutor = new 
SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
-        selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
+        selectSchemataExecutor.execute(connectionSession);
         
assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), 
is(0));
     }
 
@@ -187,7 +210,7 @@ public final class SelectInformationExecutorTest {
         mockResultSet(mockResultSetMap, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
         metaDataMap.put("demo_ds_0", getMetaData());
-        metaDataMap.put("test", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("test", getEmptyMetaData("test"));
         DefaultDatabaseMetadataExecutor selectExecutor = new 
DefaultDatabaseMetadataExecutor(sql);
         selectExecutor.execute(mock(JDBCConnectionSession.class));
         assertThat(selectExecutor.getRows().get(0).get("sn"), is("demo_ds_0"));
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
index 6831074..c1cfd64 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
@@ -21,13 +21,13 @@ import com.zaxxer.hikari.pool.HikariProxyResultSet;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
+import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.CachedDatabaseMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -49,6 +49,7 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -100,6 +101,15 @@ public final class SelectDatabaseExecutorTest {
         );
     }
     
+    private ShardingSphereMetaData getEmptyMetaData(final String schemaName) 
throws SQLException {
+        ShardingSphereRuleMetaData metaData = 
mock(ShardingSphereRuleMetaData.class);
+        when(metaData.getRules()).thenReturn(Collections.emptyList());
+        return new ShardingSphereMetaData(schemaName,
+                new ShardingSphereResource(Collections.emptyMap(), 
mockDataSourcesMetaData(), mock(CachedDatabaseMetaData.class), 
mock(MySQLDatabaseType.class)),
+                metaData, mock(ShardingSphereSchema.class)
+        );
+    }
+    
     private Map<String, DataSource> mockDatasourceMap() throws SQLException {
         DataSource dataSource = mock(DataSource.class, RETURNS_DEEP_STUBS);
         
when(dataSource.getConnection().prepareStatement(any(String.class)).executeQuery()).thenReturn(RESULT_SET);
@@ -128,7 +138,7 @@ public final class SelectDatabaseExecutorTest {
         mockResultSet(mockResultSetMap, true, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
         metaDataMap.put("sharding_db", getMetaData());
-        metaDataMap.put("test", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("test", getEmptyMetaData("test"));
         SelectDatabaseExecutor selectSchemataExecutor = new 
SelectDatabaseExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
         
assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), 
is(mockResultSetMap.size()));
@@ -161,7 +171,7 @@ public final class SelectDatabaseExecutorTest {
         mockResultSetMap.put("datctype", "en_US.utf8");
         mockResultSet(mockResultSetMap, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
-        metaDataMap.put("sharding_db", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("sharding_db", getEmptyMetaData("sharding_db"));
         SelectDatabaseExecutor selectSchemataExecutor = new 
SelectDatabaseExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
         while (selectSchemataExecutor.getMergedResult().next()) {
@@ -180,7 +190,7 @@ public final class SelectDatabaseExecutorTest {
         mockResultSetMap.put("datctype", "en_US.utf8");
         mockResultSet(mockResultSetMap, false);
         Map<String, ShardingSphereMetaData> metaDataMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap();
-        metaDataMap.put("sharding_db", mock(ShardingSphereMetaData.class));
+        metaDataMap.put("sharding_db", getEmptyMetaData("sharding_db"));
         SelectDatabaseExecutor selectSchemataExecutor = new 
SelectDatabaseExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(mock(JDBCConnectionSession.class));
         while (selectSchemataExecutor.getMergedResult().next()) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
new file mode 100644
index 0000000..6fe0eaf
--- /dev/null
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.fixture.AuthorityCheckerFixture

Reply via email to