This is an automated email from the ASF dual-hosted git repository.
totalo 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 5f5253ef08a Support use customize system database (#17956)
5f5253ef08a is described below
commit 5f5253ef08adde8ab1ed5e7c0fa37a9d4e700be3
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu May 26 12:04:10 2022 +0800
Support use customize system database (#17956)
---
.../database/schema/util/SystemSchemaUtil.java | 17 ++++++++------
.../database/schema/util/SystemSchemaUtilTest.java | 26 ++++++++++++++++++----
.../mode/metadata/MetaDataContextsBuilder.java | 6 +++--
.../jdbc/JDBCDatabaseCommunicationEngine.java | 6 ++---
.../impl/SchemaAssignedDatabaseBackendHandler.java | 9 ++++----
5 files changed, 44 insertions(+), 20 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
index bee443f370e..29ccf4429ac 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.infra.metadata.database.schema.util;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import java.util.Collection;
@@ -31,19 +32,21 @@ public class SystemSchemaUtil {
/**
* Judge whether sql statement contains system schema or not.
- *
+ *
* @param databaseType databaseType
* @param schemaNames schema names
- * @param sessionDatabaseName session database name
+ * @param databaseMetaData database meta data
* @return whether sql statement contains system schema or not
*/
- public static boolean containsSystemSchema(final DatabaseType
databaseType, final Collection<String> schemaNames, final String
sessionDatabaseName) {
+ public static boolean containsSystemSchema(final DatabaseType
databaseType, final Collection<String> schemaNames, final
ShardingSphereDatabase databaseMetaData) {
+ if (databaseMetaData.isComplete()) {
+ return false;
+ }
for (String each : schemaNames) {
- if (!databaseType.getSystemSchemas().contains(each)) {
- continue;
+ if (databaseType.getSystemSchemas().contains(each)) {
+ return true;
}
- return true;
}
- return databaseType.getSystemSchemas().contains(sessionDatabaseName);
+ return
databaseType.getSystemSchemas().contains(databaseMetaData.getName());
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
index 428469340b8..8354ece50ea 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.infra.metadata.database.schema.util;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.junit.Test;
import java.util.Arrays;
@@ -26,18 +27,35 @@ import java.util.Collections;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public final class SystemSchemaUtilTest {
@Test
public void assertContainsSystemSchemaForPostgreSQL() {
- assertTrue(SystemSchemaUtil.containsSystemSchema(new
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"),
"information_schema"));
- assertFalse(SystemSchemaUtil.containsSystemSchema(new
PostgreSQLDatabaseType(), Collections.singletonList("sharding_db"),
"sharding_db"));
+ ShardingSphereDatabase informationSchemaDatabase =
mockShardingSphereDatabase("information_schema", false);
+ assertTrue(SystemSchemaUtil.containsSystemSchema(new
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"),
informationSchemaDatabase));
+ ShardingSphereDatabase shardingSchemaDatabase =
mockShardingSphereDatabase("sharding_db", false);
+ assertFalse(SystemSchemaUtil.containsSystemSchema(new
PostgreSQLDatabaseType(), Collections.singletonList("sharding_db"),
shardingSchemaDatabase));
+ ShardingSphereDatabase customizedInformationSchemaDatabase =
mockShardingSphereDatabase("information_schema", true);
+ assertFalse(SystemSchemaUtil.containsSystemSchema(new
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"),
customizedInformationSchemaDatabase));
}
@Test
public void assertContainsSystemSchemaForMySQL() {
- assertTrue(SystemSchemaUtil.containsSystemSchema(new
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"),
"information_schema"));
- assertFalse(SystemSchemaUtil.containsSystemSchema(new
MySQLDatabaseType(), Collections.singletonList("sharding_db"), "sharding_db"));
+ ShardingSphereDatabase informationSchemaDatabase =
mockShardingSphereDatabase("information_schema", false);
+ assertTrue(SystemSchemaUtil.containsSystemSchema(new
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"),
informationSchemaDatabase));
+ ShardingSphereDatabase shardingSchemaDatabase =
mockShardingSphereDatabase("sharding_db", false);
+ assertFalse(SystemSchemaUtil.containsSystemSchema(new
MySQLDatabaseType(), Collections.singletonList("sharding_db"),
shardingSchemaDatabase));
+ ShardingSphereDatabase customizedInformationSchemaDatabase =
mockShardingSphereDatabase("information_schema", true);
+ assertFalse(SystemSchemaUtil.containsSystemSchema(new
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"),
customizedInformationSchemaDatabase));
+ }
+
+ private ShardingSphereDatabase mockShardingSphereDatabase(final String
databaseName, final boolean isComplete) {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+ when(result.getName()).thenReturn(databaseName);
+ when(result.isComplete()).thenReturn(isComplete);
+ return result;
}
}
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
index b96dd9551fa..d2daead8af8 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
@@ -75,7 +75,7 @@ public final class MetaDataContextsBuilder {
Map<String, ShardingSphereDatabase> result = new
HashMap<>(databaseConfigMap.size(), 1);
for (Entry<String, DatabaseConfiguration> entry :
databaseConfigMap.entrySet()) {
String databaseName = entry.getKey();
- if (!protocolType.getSystemSchemas().contains(databaseName)) {
+ if (!entry.getValue().getDataSources().isEmpty() ||
!protocolType.getSystemSchemas().contains(databaseName)) {
result.put(databaseName,
ShardingSphereDatabase.create(databaseName, protocolType, storageType,
entry.getValue(), props));
}
}
@@ -85,7 +85,9 @@ public final class MetaDataContextsBuilder {
private Map<String, ShardingSphereDatabase> getSystemDatabaseMap(final
DatabaseType protocolType) throws SQLException {
Map<String, ShardingSphereDatabase> result = new
HashMap<>(protocolType.getSystemDatabaseSchemaMap().size(), 1);
for (String each : protocolType.getSystemDatabaseSchemaMap().keySet())
{
- result.put(each, ShardingSphereDatabase.create(each,
protocolType));
+ if (!databaseConfigMap.containsKey(each)) {
+ result.put(each, ShardingSphereDatabase.create(each,
protocolType));
+ }
}
return result;
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index 455045fa9f1..ff30a4c32b3 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -125,10 +125,10 @@ public final class JDBCDatabaseCommunicationEngine
extends DatabaseCommunication
logicSQL, getDatabase(),
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps());
// TODO move federation route logic to binder
SQLStatementContext<?> sqlStatementContext =
logicSQL.getSqlStatementContext();
- String defaultDatabaseName =
backendConnection.getConnectionSession().getDatabaseName();
+ MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+ ShardingSphereDatabase databaseMetaData =
metaDataContexts.getDatabaseMetaData(backendConnection.getConnectionSession().getDatabaseName());
if (executionContext.getRouteContext().isFederated() ||
(sqlStatementContext instanceof SelectStatementContext
- &&
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(),
sqlStatementContext.getTablesContext().getSchemaNames(), defaultDatabaseName)))
{
- MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+ &&
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(),
sqlStatementContext.getTablesContext().getSchemaNames(), databaseMetaData))) {
ResultSet resultSet = doExecuteFederation(logicSQL,
metaDataContexts);
return processExecuteFederation(resultSet, metaDataContexts);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
index bba7a5bbde8..556759b5616 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
@@ -21,6 +21,7 @@ import io.vertx.core.Future;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.distsql.exception.resource.RequiredResourceMissedException;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtil;
import
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
import
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
@@ -69,12 +70,12 @@ public final class SchemaAssignedDatabaseBackendHandler
implements DatabaseBacke
}
private void prepareDatabaseCommunicationEngine() throws
RequiredResourceMissedException {
- boolean isSystemSchema = SystemSchemaUtil.containsSystemSchema(
- sqlStatementContext.getDatabaseType(),
sqlStatementContext.getTablesContext().getSchemaNames(),
connectionSession.getDatabaseName());
- if (!isSystemSchema &&
!ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName()).hasDataSource())
{
+ ShardingSphereDatabase databaseMetaData =
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
+ boolean isSystemSchema =
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(),
sqlStatementContext.getTablesContext().getSchemaNames(), databaseMetaData);
+ if (!isSystemSchema && !databaseMetaData.hasDataSource()) {
throw new
RequiredResourceMissedException(connectionSession.getDatabaseName());
}
- if (!isSystemSchema &&
!ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName()).isComplete())
{
+ if (!isSystemSchema && !databaseMetaData.isComplete()) {
throw new RuleNotExistedException();
}
databaseCommunicationEngine =
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatementContext,
sql, connectionSession.getBackendConnection());