This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 216ca48 Adjust proxy mysql admin executor to support system table
query (#16373)
216ca48 is described below
commit 216ca485877579a39c26c7e3837e94716595649b
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat Mar 26 11:09:59 2022 +0800
Adjust proxy mysql admin executor to support system table query (#16373)
* Adjust proxy mysql admin executor to support system table query
* Fix build error
* Fix unit test
* Fix integration test for show databases
---
.../dal/impl/fixture/TestStatementContext.java | 7 +++++++
...ableAvailableAndSqlStatementContextFixture.java | 7 +++++++
.../binder/statement/SQLStatementContext.java | 8 ++++++++
.../sql/context/ExecutionContextBuilder.java | 7 +++++--
.../table/FilterableTableScanExecutor.java | 2 +-
.../mode/metadata/MetaDataContextsBuilder.java | 14 ++++++++-----
.../jdbc/JDBCDatabaseCommunicationEngine.java | 10 ++++++----
.../text/TextProtocolBackendHandlerFactory.java | 8 ++++----
.../admin/DatabaseAdminBackendHandlerFactory.java | 23 +++++++++++-----------
.../executor/DatabaseAdminExecutorFactory.java | 10 +++++-----
.../admin/mysql/MySQLAdminExecutorFactory.java | 13 +++++++-----
.../admin/mysql/executor/ShowTablesExecutor.java | 5 ++++-
.../postgresql/PostgreSQLAdminExecutorFactory.java | 6 ++++--
.../impl/SchemaAssignedDatabaseBackendHandler.java | 5 +++--
...QLStatementContextInstanceOfTableAvailable.java | 9 ++++++++-
.../admin/mysql/MySQLAdminExecutorFactoryTest.java | 22 +++++++++++++++++----
.../mysql/executor/ShowTablesExecutorTest.java | 13 ++++++------
.../PostgreSQLAdminExecutorFactoryTest.java | 19 ++++++++++++------
.../SchemaAssignedDatabaseBackendHandlerTest.java | 5 ++++-
.../cases/dal/dataset/db/mysql/show_databases.xml | 4 ++++
.../mysql/show_databases.xml | 4 ++++
.../mysql/show_databases.xml | 4 ++++
.../dal/dataset/encrypt/mysql/show_databases.xml | 4 ++++
.../readwrite_splitting/mysql/show_databases.xml | 4 ++++
.../sharding_governance/mysql/show_databases.xml | 4 ++++
.../cases/dal/dataset/tbl/mysql/show_databases.xml | 4 ++++
26 files changed, 161 insertions(+), 60 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
index 11dfba7..143469a 100644
---
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
+++
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
@@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -49,4 +51,9 @@ public final class TestStatementContext implements
SQLStatementContext<SQLStatem
public TablesContext getTablesContext() {
return tablesContext;
}
+
+ @Override
+ public DatabaseType getDatabaseType() {
+ return DatabaseTypeRegistry.getDefaultDatabaseType();
+ }
}
diff --git
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
index cf088a8..b6b318c 100644
---
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
+++
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.encrypt.merge.dql.fixture;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -41,4 +43,9 @@ public final class
TableAvailableAndSqlStatementContextFixture implements TableA
public TablesContext getTablesContext() {
return null;
}
+
+ @Override
+ public DatabaseType getDatabaseType() {
+ return DatabaseTypeRegistry.getDefaultDatabaseType();
+ }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
index dbe536a..da0ca9e 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.binder.statement;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
/**
@@ -40,4 +41,11 @@ public interface SQLStatementContext<T extends SQLStatement>
{
* @return tables context
*/
TablesContext getTablesContext();
+
+ /**
+ * Get database type.
+ *
+ * @return database type
+ */
+ DatabaseType getDatabaseType();
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
index 227acc5..980cd6e 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
@@ -57,8 +57,11 @@ public final class ExecutionContextBuilder {
}
private static Collection<ExecutionUnit> build(final
ShardingSphereMetaData metaData, final GenericSQLRewriteResult
sqlRewriteResult, final SQLStatementContext<?> sqlStatementContext) {
- String dataSourceName =
metaData.getResource().getDataSourcesMetaData().getAllInstanceDataSourceNames().iterator().next();
- return Collections.singletonList(new ExecutionUnit(dataSourceName,
+ Collection<String> instanceDataSourceNames =
metaData.getResource().getDataSourcesMetaData().getAllInstanceDataSourceNames();
+ if (instanceDataSourceNames.isEmpty()) {
+ return Collections.emptyList();
+ }
+ return Collections.singletonList(new
ExecutionUnit(instanceDataSourceNames.iterator().next(),
new SQLUnit(sqlRewriteResult.getSqlRewriteUnit().getSql(),
sqlRewriteResult.getSqlRewriteUnit().getParameters(),
getGenericTableRouteMappers(sqlStatementContext))));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
index 7d0ce4c..5a4aedf 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
@@ -139,7 +139,7 @@ public final class FilterableTableScanExecutor {
LogicSQL logicSQL = createLogicSQL(federationContext.getMetaDataMap(),
sqlString, databaseType);
ShardingSphereMetaData metaData =
federationContext.getMetaDataMap().get(schemaName);
ExecutionContext context = new
KernelProcessor().generateExecutionContext(logicSQL, metaData,
executorContext.getProps());
- if (federationContext.isPreview()) {
+ if (federationContext.isPreview() ||
databaseType.containsSystemSchema(schemaName)) {
federationContext.getExecutionUnits().addAll(context.getExecutionUnits());
return createEmptyEnumerable();
}
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 c9c7887..c91ff37 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
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.infra.config.RuleConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.schema.SchemaConfiguration;
+import
org.apache.shardingsphere.infra.config.schema.impl.DataSourceProvidedSchemaConfiguration;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory;
@@ -37,6 +38,7 @@ import
org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
import java.sql.SQLException;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -118,11 +120,13 @@ public final class MetaDataContextsBuilder {
}
private Map<String, ShardingSphereMetaData> getMetaDataMap() throws
SQLException {
- Map<String, ShardingSphereMetaData> result = new
HashMap<>(schemaConfigMap.size(), 1);
- for (Entry<String, ? extends SchemaConfiguration> entry :
schemaConfigMap.entrySet()) {
- String schemaName = entry.getKey();
- // TODO support database configuration
- result.put(schemaName, ShardingSphereMetaData.create(schemaName,
databaseMap.get(schemaName).getSchemas(), entry.getValue(),
schemaRulesMap.get(schemaName)));
+ Map<String, ShardingSphereMetaData> result = new
HashMap<>(databaseMap.size(), 1);
+ for (Entry<String, ShardingSphereDatabase> entry :
databaseMap.entrySet()) {
+ String databaseName = entry.getKey();
+ // TODO support database and schema configuration separately
+ SchemaConfiguration schemaConfig =
schemaConfigMap.getOrDefault(databaseName, new
DataSourceProvidedSchemaConfiguration(Collections.emptyMap(),
Collections.emptyList()));
+ Collection<ShardingSphereRule> rules =
schemaRulesMap.getOrDefault(databaseName, Collections.emptyList());
+ result.put(databaseName,
ShardingSphereMetaData.create(databaseName, entry.getValue().getSchemas(),
schemaConfig, rules));
}
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 cfad42f..a3e3657 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
@@ -115,12 +115,14 @@ public final class JDBCDatabaseCommunicationEngine
extends DatabaseCommunication
@SuppressWarnings({"unchecked", "rawtypes"})
@SneakyThrows(SQLException.class)
public ResponseHeader execute() {
- ExecutionContext executionContext = getKernelProcessor()
- .generateExecutionContext(getLogicSQL(), getMetaData(),
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getProps());
+ LogicSQL logicSQL = getLogicSQL();
+ ExecutionContext executionContext =
getKernelProcessor().generateExecutionContext(
+ logicSQL, getMetaData(),
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getProps());
// TODO move federation route logic to binder
- if (executionContext.getRouteContext().isFederated()) {
+ if (executionContext.getRouteContext().isFederated()
+ ||
logicSQL.getSqlStatementContext().getDatabaseType().containsSystemSchema(backendConnection.getConnectionSession().getSchemaName()))
{
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
- ResultSet resultSet = doExecuteFederation(getLogicSQL(),
metaDataContexts);
+ ResultSet resultSet = doExecuteFederation(logicSQL,
metaDataContexts);
return processExecuteFederation(resultSet, metaDataContexts);
}
if (executionContext.getExecutionUnits().isEmpty()) {
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index ad3eb0d..4b425ff 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -94,12 +94,12 @@ public final class TextProtocolBackendHandlerFactory {
if (sqlStatement instanceof DistSQLStatement) {
return DistSQLBackendHandlerFactory.newInstance(databaseType,
(DistSQLStatement) sqlStatement, connectionSession);
}
- Optional<TextProtocolBackendHandler> backendHandler =
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement,
connectionSession, sql);
+ SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap(),
+ sqlStatement, connectionSession.getDefaultSchemaName());
+ Optional<TextProtocolBackendHandler> backendHandler =
DatabaseAdminBackendHandlerFactory.newInstance(databaseType,
sqlStatementContext, connectionSession, sql);
if (backendHandler.isPresent()) {
return backendHandler.get();
}
- SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap(),
- sqlStatement, connectionSession.getDefaultSchemaName());
// TODO optimize SQLStatementSchemaHolder
if (sqlStatementContext instanceof TableAvailable) {
((TableAvailable)
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementSchemaHolder::set);
@@ -119,7 +119,7 @@ public final class TextProtocolBackendHandlerFactory {
if (sqlStatement instanceof TCLStatement) {
return
TransactionBackendHandlerFactory.newInstance((SQLStatementContext<TCLStatement>)
sqlStatementContext, sql, connectionSession);
}
- backendHandler =
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement,
connectionSession);
+ backendHandler =
DatabaseAdminBackendHandlerFactory.newInstance(databaseType,
sqlStatementContext, connectionSession);
return backendHandler.orElseGet(() ->
DatabaseBackendHandlerFactory.newInstance(sqlStatementContext, sql,
connectionSession));
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
index 76f7d3d..85d24c0 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.proxy.backend.text.admin;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
@@ -29,7 +30,6 @@ import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseSetCh
import
org.apache.shardingsphere.proxy.backend.text.encoding.DatabaseSetCharsetBackendHandler;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.Optional;
import java.util.Properties;
@@ -49,45 +49,46 @@ public final class DatabaseAdminBackendHandlerFactory {
* and this handler requires a connection containing a schema to be used.
*
* @param databaseType database type
- * @param sqlStatement SQL statement
+ * @param sqlStatementContext SQL statement context
* @param connectionSession connection session
* @return new instance of database admin backend handler
*/
- public static Optional<TextProtocolBackendHandler> newInstance(final
DatabaseType databaseType, final SQLStatement sqlStatement, final
ConnectionSession connectionSession) {
+ public static Optional<TextProtocolBackendHandler> newInstance(final
DatabaseType databaseType, final SQLStatementContext<?> sqlStatementContext,
final ConnectionSession connectionSession) {
Optional<DatabaseAdminExecutorFactory> executorFactory =
TypedSPIRegistry.findRegisteredService(DatabaseAdminExecutorFactory.class,
databaseType.getName(), new Properties());
if (!executorFactory.isPresent()) {
return Optional.empty();
}
- Optional<DatabaseAdminExecutor> executor =
executorFactory.get().newInstance(sqlStatement);
- return executor.map(optional ->
createTextProtocolBackendHandler(sqlStatement, connectionSession, optional));
+ Optional<DatabaseAdminExecutor> executor =
executorFactory.get().newInstance(sqlStatementContext);
+ return executor.map(optional ->
createTextProtocolBackendHandler(sqlStatementContext, connectionSession,
optional));
}
/**
* Create new instance of database admin backend handler.
*
* @param databaseType database type
- * @param sqlStatement SQL statement
+ * @param sqlStatementContext SQL statement context
* @param connectionSession connection session
* @param sql SQL being executed
* @return new instance of database admin backend handler
*/
- public static Optional<TextProtocolBackendHandler> newInstance(final
DatabaseType databaseType, final SQLStatement sqlStatement,
+ public static Optional<TextProtocolBackendHandler> newInstance(final
DatabaseType databaseType, final SQLStatementContext<?> sqlStatementContext,
final
ConnectionSession connectionSession, final String sql) {
Optional<DatabaseAdminExecutorFactory> executorFactory =
TypedSPIRegistry.findRegisteredService(DatabaseAdminExecutorFactory.class,
databaseType.getName(), new Properties());
if (!executorFactory.isPresent()) {
return Optional.empty();
}
- Optional<DatabaseAdminExecutor> executor =
executorFactory.get().newInstance(sqlStatement, sql,
Optional.ofNullable(connectionSession.getSchemaName()));
- return executor.map(optional ->
createTextProtocolBackendHandler(sqlStatement, connectionSession, optional));
+ Optional<DatabaseAdminExecutor> executor =
executorFactory.get().newInstance(sqlStatementContext, sql,
connectionSession.getSchemaName());
+ return executor.map(optional ->
createTextProtocolBackendHandler(sqlStatementContext, connectionSession,
optional));
}
- private static TextProtocolBackendHandler
createTextProtocolBackendHandler(final SQLStatement sqlStatement, final
ConnectionSession connectionSession, final DatabaseAdminExecutor executor) {
+ private static TextProtocolBackendHandler
createTextProtocolBackendHandler(final SQLStatementContext<?>
sqlStatementContext,
+
final ConnectionSession connectionSession, final DatabaseAdminExecutor
executor) {
if (executor instanceof DatabaseAdminQueryExecutor) {
return new DatabaseAdminQueryBackendHandler(connectionSession,
(DatabaseAdminQueryExecutor) executor);
}
if (executor instanceof DatabaseSetCharsetExecutor) {
return new DatabaseSetCharsetBackendHandler(connectionSession,
(DatabaseSetCharsetExecutor) executor);
}
- return new DatabaseAdminUpdateBackendHandler(connectionSession,
sqlStatement, executor);
+ return new DatabaseAdminUpdateBackendHandler(connectionSession,
sqlStatementContext.getSqlStatement(), executor);
}
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
index 99106d7..76ed8af 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
@@ -17,8 +17,8 @@
package org.apache.shardingsphere.proxy.backend.text.admin.executor;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.spi.typed.TypedSPI;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.Optional;
@@ -31,18 +31,18 @@ public interface DatabaseAdminExecutorFactory extends
TypedSPI {
* Create an instance of database admin executor,
* and this executor requires a connection containing a schema to be used.
*
- * @param sqlStatement SQL statement
+ * @param sqlStatementContext SQL statement context
* @return instance of database admin executor
*/
- Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement);
+ Optional<DatabaseAdminExecutor> newInstance(SQLStatementContext<?>
sqlStatementContext);
/**
* Create an executor of database admin executor.
*
- * @param sqlStatement SQL statement
+ * @param sqlStatementContext SQL statement context
* @param sql SQL
* @param schemaName schema name
* @return instance of database admin executor
*/
- Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement,
String sql, Optional<String> schemaName);
+ Optional<DatabaseAdminExecutor> newInstance(SQLStatementContext<?>
sqlStatementContext, String sql, String schemaName);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
index ffeb95f..dcb9d80 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
@@ -68,7 +69,8 @@ public final class MySQLAdminExecutorFactory implements
DatabaseAdminExecutorFac
private static final String PERFORMANCE_SCHEMA = "performance_schema";
@Override
- public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement
sqlStatement) {
+ public Optional<DatabaseAdminExecutor> newInstance(final
SQLStatementContext<?> sqlStatementContext) {
+ SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
if (sqlStatement instanceof MySQLShowFunctionStatusStatement) {
return Optional.of(new
ShowFunctionStatusExecutor((MySQLShowFunctionStatusStatement) sqlStatement));
}
@@ -76,7 +78,7 @@ public final class MySQLAdminExecutorFactory implements
DatabaseAdminExecutorFac
return Optional.of(new
ShowProcedureStatusExecutor((MySQLShowProcedureStatusStatement) sqlStatement));
}
if (sqlStatement instanceof MySQLShowTablesStatement) {
- return Optional.of(new
ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement));
+ return Optional.of(new
ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement,
sqlStatementContext.getDatabaseType()));
}
if (sqlStatement instanceof MySQLShowTableStatusStatement) {
return Optional.of(new
ShowTablesStatusExecutor((MySQLShowTableStatusStatement) sqlStatement));
@@ -85,7 +87,8 @@ public final class MySQLAdminExecutorFactory implements
DatabaseAdminExecutorFac
}
@Override
- public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement
sqlStatement, final String sql, final Optional<String> schemaName) {
+ public Optional<DatabaseAdminExecutor> newInstance(final
SQLStatementContext<?> sqlStatementContext, final String sql, final String
schemaName) {
+ SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
if (sqlStatement instanceof UseStatement) {
return Optional.of(new UseDatabaseExecutor((UseStatement)
sqlStatement));
}
@@ -159,8 +162,8 @@ public final class MySQLAdminExecutorFactory implements
DatabaseAdminExecutorFac
return ((SimpleTableSegment) tableSegment).getOwner().isPresent() &&
specialSchemaName.equalsIgnoreCase(((SimpleTableSegment)
tableSegment).getOwner().get().getIdentifier().getValue());
}
- private DatabaseAdminExecutor mockExecutor(final Optional<String>
schemaName, final SelectStatement sqlStatement, final String sql) {
- boolean isNotUseSchema = !schemaName.isPresent() &&
sqlStatement.getFrom() == null;
+ private DatabaseAdminExecutor mockExecutor(final String schemaName, final
SelectStatement sqlStatement, final String sql) {
+ boolean isNotUseSchema = !Optional.ofNullable(schemaName).isPresent()
&& sqlStatement.getFrom() == null;
if (isNotUseSchema) {
if (!hasSchemas() || !hasResources()) {
return new NoResourceShowExecutor(sqlStatement);
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 9167303..d037dab 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
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
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;
@@ -53,6 +54,8 @@ public final class ShowTablesExecutor implements
DatabaseAdminQueryExecutor {
private final MySQLShowTablesStatement showTablesStatement;
+ private final DatabaseType databaseType;
+
private QueryResultMetaData queryResultMetaData;
private MergedResult mergedResult;
@@ -64,7 +67,7 @@ public final class ShowTablesExecutor implements
DatabaseAdminQueryExecutor {
}
private QueryResult getQueryResult(final String schemaName) {
- if (!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
+ if (!databaseType.containsSystemSchema(schemaName) &&
!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
return new RawMemoryQueryResult(queryResultMetaData,
Collections.emptyList());
}
List<MemoryQueryResultDataRow> rows =
getAllTableNames(schemaName).stream().map(each -> {
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
index 6337f33..f401f5b 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.admin.postgresql;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
@@ -57,12 +58,13 @@ public final class PostgreSQLAdminExecutorFactory
implements DatabaseAdminExecut
private static final String PG_PREFIX = "pg_";
@Override
- public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement
sqlStatement) {
+ public Optional<DatabaseAdminExecutor> newInstance(final
SQLStatementContext<?> sqlStatementContext) {
return Optional.empty();
}
@Override
- public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement
sqlStatement, final String sql, final Optional<String> schemaName) {
+ public Optional<DatabaseAdminExecutor> newInstance(final
SQLStatementContext<?> sqlStatementContext, final String sql, final String
schemaName) {
+ SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
if (sqlStatement instanceof SelectStatement) {
Collection<String> selectedTableNames =
getSelectedTableNames((SelectStatement) sqlStatement);
if (selectedTableNames.contains(PG_DATABASE)) {
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 71da564..94d74fc 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
@@ -68,10 +68,11 @@ public final class SchemaAssignedDatabaseBackendHandler
implements DatabaseBacke
}
private void prepareDatabaseCommunicationEngine() throws
RequiredResourceMissedException {
- if
(!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).hasDataSource())
{
+ boolean isSystemSchema =
sqlStatementContext.getDatabaseType().containsSystemSchema(connectionSession.getSchemaName());
+ if (!isSystemSchema &&
!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).hasDataSource())
{
throw new
RequiredResourceMissedException(connectionSession.getSchemaName());
}
- if
(!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).isComplete())
{
+ if (!isSystemSchema &&
!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).isComplete())
{
throw new RuleNotExistedException();
}
databaseCommunicationEngine =
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatementContext,
sql, connectionSession.getBackendConnection());
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
index 5ca6df6..f229773 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
@@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -44,7 +46,12 @@ public final class
TestSQLStatementContextInstanceOfTableAvailable implements SQ
public TablesContext getTablesContext() {
return tablesContext;
}
-
+
+ @Override
+ public DatabaseType getDatabaseType() {
+ return DatabaseTypeRegistry.getDefaultDatabaseType();
+ }
+
@Override
public Collection<SimpleTableSegment> getAllTables() {
return allTables;
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
index e8a9321..dc7997e 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
+import
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
import
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowFunctionStatusExecutor;
import
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowProcedureStatusExecutor;
@@ -34,6 +35,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public final class MySQLAdminExecutorFactoryTest {
@@ -41,28 +43,40 @@ public final class MySQLAdminExecutorFactoryTest {
@Test
public void assertNewInstanceWithMySQLShowFunctionStatusStatement() {
- Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowFunctionStatusStatement.class));
+ MySQLShowFunctionStatusStatement statement =
mock(MySQLShowFunctionStatusStatement.class);
+ CommonSQLStatementContext statementContext =
mock(CommonSQLStatementContext.class);
+ when(statementContext.getSqlStatement()).thenReturn(statement);
+ Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(statementContext);
assertTrue(executorOptional.isPresent());
assertThat(executorOptional.get(),
instanceOf(ShowFunctionStatusExecutor.class));
}
@Test
public void assertNewInstanceWithMySQLShowProcedureStatusStatement() {
- Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowProcedureStatusStatement.class));
+ MySQLShowProcedureStatusStatement statement =
mock(MySQLShowProcedureStatusStatement.class);
+ CommonSQLStatementContext statementContext =
mock(CommonSQLStatementContext.class);
+ when(statementContext.getSqlStatement()).thenReturn(statement);
+ Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(statementContext);
assertTrue(executorOptional.isPresent());
assertThat(executorOptional.get(),
instanceOf(ShowProcedureStatusExecutor.class));
}
@Test
public void assertNewInstanceWithMySQLShowTablesStatement() {
- Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowTablesStatement.class));
+ MySQLShowTablesStatement statement =
mock(MySQLShowTablesStatement.class);
+ CommonSQLStatementContext statementContext =
mock(CommonSQLStatementContext.class);
+ when(statementContext.getSqlStatement()).thenReturn(statement);
+ Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(statementContext);
assertTrue(executorOptional.isPresent());
assertThat(executorOptional.get(),
instanceOf(ShowTablesExecutor.class));
}
@Test
public void assertNewInstanceWithMySQLShowTableStatusStatement() {
- Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowTableStatusStatement.class));
+ MySQLShowTableStatusStatement statement =
mock(MySQLShowTableStatusStatement.class);
+ CommonSQLStatementContext statementContext =
mock(CommonSQLStatementContext.class);
+ when(statementContext.getSqlStatement()).thenReturn(statement);
+ Optional<DatabaseAdminExecutor> executorOptional =
mySQLAdminExecutorFactory.newInstance(statementContext);
assertTrue(executorOptional.isPresent());
assertThat(executorOptional.get(),
instanceOf(ShowTablesStatusExecutor.class));
}
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 be22501..0f33eb2 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
@@ -18,6 +18,7 @@
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.DatabaseTypeRegistry;
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;
@@ -84,7 +85,7 @@ public final class ShowTablesExecutorTest {
@Test
public void assertShowTablesExecutorWithoutFilter() throws SQLException {
- ShowTablesExecutor showTablesExecutor = new ShowTablesExecutor(new
MySQLShowTablesStatement());
+ ShowTablesExecutor showTablesExecutor = new ShowTablesExecutor(new
MySQLShowTablesStatement(), DatabaseTypeRegistry.getDefaultDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
showTablesExecutor.getMergedResult().next();
@@ -104,7 +105,7 @@ public final class ShowTablesExecutorTest {
ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
when(showFilterSegment.getLike()).thenReturn(Optional.of(new
ShowLikeSegment(0, 10, "t_account%")));
showTablesStatement.setFilter(showFilterSegment);
- ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement);
+ ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
showTablesExecutor.getMergedResult().next();
@@ -122,7 +123,7 @@ public final class ShowTablesExecutorTest {
ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
when(showFilterSegment.getLike()).thenReturn(Optional.of(new
ShowLikeSegment(0, 10, "t_account")));
showTablesStatement.setFilter(showFilterSegment);
- ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement);
+ ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
showTablesExecutor.getMergedResult().next();
@@ -136,7 +137,7 @@ public final class ShowTablesExecutorTest {
ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
when(showFilterSegment.getLike()).thenReturn(Optional.of(new
ShowLikeSegment(0, 10, "T_TEST")));
showTablesStatement.setFilter(showFilterSegment);
- ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement);
+ ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
showTablesExecutor.getMergedResult().next();
@@ -150,7 +151,7 @@ public final class ShowTablesExecutorTest {
ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
when(showFilterSegment.getLike()).thenReturn(Optional.of(new
ShowLikeSegment(0, 10, "t_test")));
showTablesStatement.setFilter(showFilterSegment);
- ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement);
+ ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
assertFalse(showTablesExecutor.getMergedResult().next());
@@ -162,7 +163,7 @@ public final class ShowTablesExecutorTest {
ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
when(showFilterSegment.getLike()).thenReturn(Optional.of(new
ShowLikeSegment(0, 10, "T_ACCOUNT")));
showTablesStatement.setFilter(showFilterSegment);
- ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement);
+ ShowTablesExecutor showTablesExecutor = new
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
showTablesExecutor.execute(mockConnectionSession());
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
assertFalse(showTablesExecutor.getMergedResult().next());
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
index 2baa5a9..979df9c 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
@@ -17,6 +17,9 @@
package org.apache.shardingsphere.proxy.backend.text.admin.postgresql;
+import
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
import
org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor.PostgreSQLSetCharsetExecutor;
@@ -25,7 +28,6 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssig
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.SetStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -54,7 +56,9 @@ public final class PostgreSQLAdminExecutorFactoryTest {
SimpleTableSegment tableSegment = mock(SimpleTableSegment.class);
when(tableSegment.getTableName()).thenReturn(new TableNameSegment(0,
0, new IdentifierValue("pg_database")));
when(statement.getFrom()).thenReturn(tableSegment);
- Optional<DatabaseAdminExecutor> executorOptional =
postgreSQLAdminExecutorFactory.newInstance(statement, "", Optional.empty());
+ SelectStatementContext statementContext =
mock(SelectStatementContext.class);
+ when(statementContext.getSqlStatement()).thenReturn(statement);
+ Optional<DatabaseAdminExecutor> executorOptional =
postgreSQLAdminExecutorFactory.newInstance(statementContext, "", null);
assertTrue(executorOptional.isPresent());
assertThat(executorOptional.get(),
instanceOf(SelectDatabaseExecutor.class));
}
@@ -66,7 +70,7 @@ public final class PostgreSQLAdminExecutorFactoryTest {
@Test
public void assertNewInstanceWithUnknownStatement() {
-
assertFalse(postgreSQLAdminExecutorFactory.newInstance(mock(SQLStatement.class),
null, Optional.empty()).isPresent());
+
assertFalse(postgreSQLAdminExecutorFactory.newInstance(mock(SQLStatementContext.class),
null, null).isPresent());
}
@Test
@@ -77,7 +81,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
@Test
public void assertNewInstanceWithSetClientEncoding() {
SetStatement setStatement = createSetStatement("client_encoding");
- Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(setStatement, null,
Optional.empty());
+ CommonSQLStatementContext<SetStatement> statementContext = new
CommonSQLStatementContext<>(setStatement);
+ Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
assertTrue(actual.isPresent());
assertTrue(actual.get() instanceof PostgreSQLSetCharsetExecutor);
}
@@ -85,7 +90,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
@Test
public void assertNewInstanceWithSetExtraFloatDigits() throws SQLException
{
SetStatement setStatement = createSetStatement("extra_float_digits");
- Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(setStatement, null,
Optional.empty());
+ CommonSQLStatementContext<SetStatement> statementContext = new
CommonSQLStatementContext<>(setStatement);
+ Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
assertTrue(actual.isPresent());
ConnectionSession connectionSession = mock(ConnectionSession.class);
actual.get().execute(connectionSession);
@@ -95,7 +101,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
@Test
public void assertNewInstanceWithSetApplicationName() throws SQLException {
SetStatement setStatement = createSetStatement("application_name");
- Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(setStatement, null,
Optional.empty());
+ CommonSQLStatementContext<SetStatement> statementContext = new
CommonSQLStatementContext<>(setStatement);
+ Optional<DatabaseAdminExecutor> actual =
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
assertTrue(actual.isPresent());
ConnectionSession connectionSession = mock(ConnectionSession.class);
actual.get().execute(connectionSession);
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
index 0f0d41b..8d27c93 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
@@ -21,6 +21,7 @@ import lombok.SneakyThrows;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
+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;
@@ -86,7 +87,9 @@ public final class SchemaAssignedDatabaseBackendHandlerTest {
contextManagerField.set(ProxyContext.getInstance(), contextManager);
when(connectionSession.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN,
0));
mockDatabaseCommunicationEngine(new
UpdateResponseHeader(mock(SQLStatement.class)));
- schemaAssignedDatabaseBackendHandler = new
SchemaAssignedDatabaseBackendHandler(mock(SQLStatementContext.class),
EXECUTE_SQL, connectionSession);
+ SQLStatementContext sqlStatementContext =
mock(SQLStatementContext.class);
+ when(sqlStatementContext.getDatabaseType()).thenReturn(new
MySQLDatabaseType());
+ schemaAssignedDatabaseBackendHandler = new
SchemaAssignedDatabaseBackendHandler(sqlStatementContext, EXECUTE_SQL,
connectionSession);
setBackendHandlerFactory(schemaAssignedDatabaseBackendHandler);
}
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
index 8010153..43751a0 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="db" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
index 3072f58..7c09a1a 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="dbtbl_with_readwrite_splitting" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
index 7b09185..8f71dab 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="dbtbl_with_readwrite_splitting_and_encrypt" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
index 84ccc33..a1b882c 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="encrypt" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
index 54bcc1c..948283a 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="readwrite_splitting" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
index e9dc0f8..314e6df 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="sharding_governance" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
index e294b78..b7eb1af 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
@@ -20,4 +20,8 @@
<column name="schema_name" />
</metadata>
<row values="tbl" />
+ <row values="mysql" />
+ <row values="information_schema" />
+ <row values="performance_schema" />
+ <row values="sys" />
</dataset>