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