You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2020/12/22 16:59:39 UTC
[shardingsphere] branch master updated: Add DatabaseAdminExecutor
(#8723)
This is an automated email from the ASF dual-hosted git repository.
menghaoran 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 3b51532 Add DatabaseAdminExecutor (#8723)
3b51532 is described below
commit 3b5153296307e4fb7ab095ed4b51eeafbca1da3d
Author: Liang Zhang <te...@163.com>
AuthorDate: Wed Dec 23 00:59:04 2020 +0800
Add DatabaseAdminExecutor (#8723)
* Refactor KernelProcessor
* Refactor ShowTablesBackendHandler
* Refactor QueryHeaderBuilder
* Refactor ShowDatabasesBackendHandler
* Refactor ShowCurrentDatabaseBackendHandler
* Add DatabaseAdminExecutor
* Fix test case
* Fix test case
* Move to executor package
* Impl process multiple columns when gen QueryHeader
* Add DatabaseAdminExecutorFactory
* Rename mysql.executor
* Refactor ShowTablesExecutor
---
.../raw/metadata/RawQueryResultColumnMetaData.java | 13 ++++
.../query/impl/raw/type/RawMemoryQueryResult.java | 6 +-
.../communication/DatabaseCommunicationEngine.java | 4 +-
.../header/query/impl/QueryHeaderBuilder.java | 43 +++++------
.../text/TextProtocolBackendHandlerFactory.java | 18 +----
.../admin/DatabaseAdminBackendHandlerFactory.java | 33 ++++++++-
....java => DatabaseAdminQueryBackendHandler.java} | 47 +++++++-----
...java => DatabaseAdminUpdateBackendHandler.java} | 32 ++++----
.../DatabaseAdminExecutor.java} | 15 +++-
.../DatabaseAdminExecutorFactory.java} | 14 ++--
.../DatabaseAdminQueryExecutor.java} | 23 +++++-
...Factory.java => MySQLAdminExecutorFactory.java} | 29 ++++----
.../ShowCurrentDatabaseExecutor.java} | 35 +++------
.../ShowDatabasesExecutor.java} | 45 +++++-------
.../admin/mysql/executor/ShowTablesExecutor.java | 68 +++++++++++++++++
.../UseDatabaseExecutor.java} | 23 +++---
.../mysql/handler/ShowTablesBackendHandler.java | 84 ---------------------
...xt.admin.executor.DatabaseAdminExecutorFactory} | 2 +-
.../TextProtocolBackendHandlerFactoryTest.java | 8 +-
.../header/query/impl/QueryHeaderBuilderTest.java | 52 ++++++-------
.../ShowDatabasesExecutorTest.java} | 34 ++++-----
.../ShowTablesExecutorTest.java} | 34 ++++-----
.../UseDatabaseExecutorTest.java} | 23 +-----
.../MySQLAdminBackendHandlerFactoryTest.java | 85 ----------------------
24 files changed, 342 insertions(+), 428 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
index 4a7da68..a6e4834 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
@@ -46,4 +46,17 @@ public final class RawQueryResultColumnMetaData {
private final boolean notNull;
private final boolean autoIncrement;
+
+ public RawQueryResultColumnMetaData(final String tableName, final String name, final String label, final int type, final String typeName, final int length, final int decimals) {
+ this.tableName = tableName;
+ this.name = name;
+ this.label = label;
+ this.type = type;
+ this.typeName = typeName;
+ this.length = length;
+ this.decimals = decimals;
+ signed = false;
+ notNull = false;
+ autoIncrement = false;
+ }
}
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
index 0c2cb35..67d542d 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
@@ -17,9 +17,9 @@
package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
import java.util.List;
@@ -28,7 +28,7 @@ import java.util.List;
*/
public final class RawMemoryQueryResult extends AbstractMemoryQueryResult {
- public RawMemoryQueryResult(final RawQueryResultMetaData metaData, final List<MemoryQueryResultDataRow> rows) {
+ public RawMemoryQueryResult(final QueryResultMetaData metaData, final List<MemoryQueryResultDataRow> rows) {
super(metaData, rows.iterator());
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index 236f86a..a8ea366 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -155,8 +155,8 @@ public final class DatabaseCommunicationEngine {
private QueryHeader createQueryHeader(final ExecutionContext executionContext,
final QueryResult queryResultSample, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
return hasSelectExpandProjections(executionContext.getSqlStatementContext())
- ? QueryHeaderBuilder.build(((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample, metaData, columnIndex)
- : QueryHeaderBuilder.build(queryResultSample, metaData, columnIndex);
+ ? QueryHeaderBuilder.build(((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), metaData, columnIndex)
+ : QueryHeaderBuilder.build(queryResultSample.getMetaData(), metaData, columnIndex);
}
private boolean hasSelectExpandProjections(final SQLStatementContext<?> sqlStatementContext) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
index 7553047..1b6dab4 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
@@ -22,7 +22,7 @@ import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
-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.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.infra.rule.type.DataNodeContainedRule;
@@ -39,33 +39,34 @@ public final class QueryHeaderBuilder {
/**
* Build query header builder.
*
- * @param queryResult query result
- * @param metaData meta data name
+ * @param queryResultMetaData query result meta data
+ * @param metaData ShardingSphere meta data
* @param columnIndex column index
* @return query header
* @throws SQLException SQL exception
*/
- public static QueryHeader build(final QueryResult queryResult, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
- return build(queryResult, metaData, queryResult.getMetaData().getColumnName(columnIndex), columnIndex);
+ public static QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
+ return build(queryResultMetaData, metaData, queryResultMetaData.getColumnName(columnIndex), columnIndex);
}
/**
* Build query header builder.
*
* @param projectionsContext projections context
- * @param queryResult query result
- * @param metaData meta data name
+ * @param queryResultMetaData query result meta data
+ * @param metaData ShardingSphere meta data
* @param columnIndex column index
* @return query header
* @throws SQLException SQL exception
*/
- public static QueryHeader build(final ProjectionsContext projectionsContext, final QueryResult queryResult, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
- return build(queryResult, metaData, getColumnName(projectionsContext, queryResult, columnIndex), columnIndex);
+ public static QueryHeader build(final ProjectionsContext projectionsContext,
+ final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
+ return build(queryResultMetaData, metaData, getColumnName(projectionsContext, queryResultMetaData, columnIndex), columnIndex);
}
- private static QueryHeader build(final QueryResult queryResult, final ShardingSphereMetaData metaData, final String columnName, final int columnIndex) throws SQLException {
+ private static QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final int columnIndex) throws SQLException {
String schemaName = metaData.getName();
- String actualTableName = queryResult.getMetaData().getTableName(columnIndex);
+ String actualTableName = queryResultMetaData.getTableName(columnIndex);
Optional<DataNodeContainedRule> dataNodeContainedRule =
metaData.getRuleMetaData().getRules().stream().filter(each -> each instanceof DataNodeContainedRule).findFirst().map(rule -> (DataNodeContainedRule) rule);
String tableName;
@@ -78,19 +79,19 @@ public final class QueryHeaderBuilder {
tableName = actualTableName;
primaryKey = false;
}
- String columnLabel = queryResult.getMetaData().getColumnLabel(columnIndex);
- int columnType = queryResult.getMetaData().getColumnType(columnIndex);
- String columnTypeName = queryResult.getMetaData().getColumnTypeName(columnIndex);
- int columnLength = queryResult.getMetaData().getColumnLength(columnIndex);
- int decimals = queryResult.getMetaData().getDecimals(columnIndex);
- boolean signed = queryResult.getMetaData().isSigned(columnIndex);
- boolean notNull = queryResult.getMetaData().isNotNull(columnIndex);
- boolean autoIncrement = queryResult.getMetaData().isAutoIncrement(columnIndex);
+ String columnLabel = queryResultMetaData.getColumnLabel(columnIndex);
+ int columnType = queryResultMetaData.getColumnType(columnIndex);
+ String columnTypeName = queryResultMetaData.getColumnTypeName(columnIndex);
+ int columnLength = queryResultMetaData.getColumnLength(columnIndex);
+ int decimals = queryResultMetaData.getDecimals(columnIndex);
+ boolean signed = queryResultMetaData.isSigned(columnIndex);
+ boolean notNull = queryResultMetaData.isNotNull(columnIndex);
+ boolean autoIncrement = queryResultMetaData.isAutoIncrement(columnIndex);
return new QueryHeader(schemaName, tableName, columnLabel, columnName, columnType, columnTypeName, columnLength, decimals, signed, primaryKey, notNull, autoIncrement);
}
- private static String getColumnName(final ProjectionsContext projectionsContext, final QueryResult queryResult, final int columnIndex) throws SQLException {
+ private static String getColumnName(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData, final int columnIndex) throws SQLException {
Projection projection = projectionsContext.getExpandProjections().get(columnIndex - 1);
- return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResult.getMetaData().getColumnName(columnIndex);
+ return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResultMetaData.getColumnName(columnIndex);
}
}
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 70cc246..ee200d3 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
@@ -22,10 +22,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
import org.apache.shardingsphere.proxy.backend.text.data.DatabaseBackendHandlerFactory;
import org.apache.shardingsphere.proxy.backend.text.distsql.DistSQLBackendHandlerFactory;
@@ -38,7 +35,6 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatemen
import java.sql.SQLException;
import java.util.Optional;
-import java.util.Properties;
/**
* Text protocol backend handler factory.
@@ -46,10 +42,6 @@ import java.util.Properties;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TextProtocolBackendHandlerFactory {
- static {
- ShardingSphereServiceLoader.register(DatabaseAdminBackendHandlerFactory.class);
- }
-
/**
* Create new instance of text protocol backend handler.
*
@@ -76,13 +68,9 @@ public final class TextProtocolBackendHandlerFactory {
if (distSQLBackendHandler.isPresent()) {
return distSQLBackendHandler.get();
}
- Optional<DatabaseAdminBackendHandlerFactory> adminBackendHandlerEngine = TypedSPIRegistry.findRegisteredService(
- DatabaseAdminBackendHandlerFactory.class, databaseType.getName(), new Properties());
- if (adminBackendHandlerEngine.isPresent()) {
- Optional<DatabaseAdminBackendHandler> databaseAdminBackendHandler = adminBackendHandlerEngine.get().newInstance(sqlStatement, backendConnection);
- if (databaseAdminBackendHandler.isPresent()) {
- return databaseAdminBackendHandler.get();
- }
+ Optional<TextProtocolBackendHandler> databaseAdminBackendHandler = DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement, backendConnection);
+ if (databaseAdminBackendHandler.isPresent()) {
+ return databaseAdminBackendHandler.get();
}
return DatabaseBackendHandlerFactory.newInstance(sqlStatement, sql, backendConnection);
}
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 b65baf3..028b5489f 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
@@ -17,23 +17,50 @@
package org.apache.shardingsphere.proxy.backend.text.admin;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.Optional;
+import java.util.Properties;
/**
* Database admin backend handler factory.
*/
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DatabaseAdminBackendHandlerFactory {
+
+ static {
+ ShardingSphereServiceLoader.register(DatabaseAdminExecutorFactory.class);
+ }
/**
* Create new instance of database admin backend handler.
*
+ * @param databaseType database type
* @param sqlStatement SQL statement
* @param backendConnection backend connection
* @return new instance of database admin backend handler
*/
- Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+ public static Optional<TextProtocolBackendHandler> newInstance(final DatabaseType databaseType, final SQLStatement sqlStatement, final BackendConnection backendConnection) {
+ 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, backendConnection, optional));
+ }
+
+ private static TextProtocolBackendHandler createTextProtocolBackendHandler(final SQLStatement sqlStatement, final BackendConnection backendConnection, final DatabaseAdminExecutor executor) {
+ return executor instanceof DatabaseAdminQueryExecutor
+ ? new DatabaseAdminQueryBackendHandler(backendConnection, (DatabaseAdminQueryExecutor) executor) : new DatabaseAdminUpdateBackendHandler(backendConnection, sqlStatement, executor);
+ }
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
similarity index 51%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
index 2121777..ec37956 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
@@ -15,49 +15,52 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
+import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeaderBuilder;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
import java.sql.SQLException;
-import java.sql.Types;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedList;
-import java.util.Optional;
+import java.util.List;
/**
- * Show databases backend handler.
+ * Database admin query backend handler.
*/
@RequiredArgsConstructor
-public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHandler {
+public final class DatabaseAdminQueryBackendHandler implements TextProtocolBackendHandler {
private final BackendConnection backendConnection;
+ private final DatabaseAdminQueryExecutor executor;
+
+ private QueryResultMetaData queryResultMetaData;
+
private MergedResult mergedResult;
@Override
- public ResponseHeader execute() {
- mergedResult = new SingleLocalDataMergedResult(getSchemaNames());
- return new QueryResponseHeader(Collections.singletonList(
- new QueryHeader("information_schema", "SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
+ public ResponseHeader execute() throws SQLException {
+ executor.execute(backendConnection);
+ queryResultMetaData = executor.getQueryResultMetaData();
+ mergedResult = executor.getMergedResult();
+ return new QueryResponseHeader(createResponseHeader());
}
- private Collection<Object> getSchemaNames() {
- Collection<Object> result = new LinkedList<>(ProxyContext.getInstance().getAllSchemaNames());
- Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
- Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
- if (!authorizedSchemas.isEmpty()) {
- result.retainAll(authorizedSchemas);
+ private List<QueryHeader> createResponseHeader() throws SQLException {
+ List<QueryHeader> result = new ArrayList<>(queryResultMetaData.getColumnCount());
+ for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
+ result.add(QueryHeaderBuilder.build(queryResultMetaData, ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()), columnIndex));
}
return result;
}
@@ -69,6 +72,10 @@ public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHa
@Override
public Collection<Object> getRowData() throws SQLException {
- return Collections.singletonList(mergedResult.getValue(1, Object.class));
+ Collection<Object> result = new LinkedList<>();
+ for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
+ result.add(mergedResult.getValue(columnIndex, Object.class));
+ }
+ return result;
}
}
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/DatabaseAdminUpdateBackendHandler.java
similarity index 55%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminUpdateBackendHandler.java
index b65baf3..efc6b4a 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/DatabaseAdminUpdateBackendHandler.java
@@ -17,23 +17,29 @@
package org.apache.shardingsphere.proxy.backend.text.admin;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import java.util.Optional;
-
/**
- * Database admin backend handler factory.
+ * Database admin update backend handler.
*/
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+@RequiredArgsConstructor
+public final class DatabaseAdminUpdateBackendHandler implements TextProtocolBackendHandler {
+
+ private final BackendConnection backendConnection;
+
+ private final SQLStatement sqlStatement;
+
+ private final DatabaseAdminExecutor executor;
- /**
- * Create new instance of database admin backend handler.
- *
- * @param sqlStatement SQL statement
- * @param backendConnection backend connection
- * @return new instance of database admin backend handler
- */
- Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+ @Override
+ public ResponseHeader execute() {
+ executor.execute(backendConnection);
+ return new UpdateResponseHeader(sqlStatement);
+ }
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
similarity index 67%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
index d7f905a..7ad5481 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
@@ -15,12 +15,19 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
-import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
/**
- * Database admin backend handler.
+ * Database admin executor.
*/
-public interface DatabaseAdminBackendHandler extends TextProtocolBackendHandler {
+public interface DatabaseAdminExecutor {
+
+ /**
+ * Execute.
+ *
+ * @param backendConnection backend connection
+ */
+ void execute(BackendConnection backendConnection);
}
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/executor/DatabaseAdminExecutorFactory.java
similarity index 65%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
index b65baf3..cbeab09 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/executor/DatabaseAdminExecutorFactory.java
@@ -15,25 +15,23 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.Optional;
/**
- * Database admin backend handler factory.
+ * Database admin executor factory.
*/
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+public interface DatabaseAdminExecutorFactory extends TypedSPI {
/**
- * Create new instance of database admin backend handler.
+ * New instance of database admin executor.
*
* @param sqlStatement SQL statement
- * @param backendConnection backend connection
- * @return new instance of database admin backend handler
+ * @return instance of database admin executor
*/
- Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+ Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement);
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
similarity index 57%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
index d7f905a..7254dfd 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
@@ -15,12 +15,27 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
-import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
/**
- * Database admin backend handler.
+ * Database admin query executor.
*/
-public interface DatabaseAdminBackendHandler extends TextProtocolBackendHandler {
+public interface DatabaseAdminQueryExecutor extends DatabaseAdminExecutor {
+
+ /**
+ * Get query result meta data.
+ *
+ * @return query result meta data
+ */
+ QueryResultMetaData getQueryResultMetaData();
+
+ /**
+ * Get merged result.
+ *
+ * @return merged result
+ */
+ MergedResult getMergedResult();
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
similarity index 66%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
index 7c37c41..0a2bbcd 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
@@ -17,13 +17,12 @@
package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowCurrentDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowTablesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowCurrentDatabaseExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowDatabasesExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowTablesExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.UseDatabaseExecutor;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -35,26 +34,26 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
import java.util.Optional;
/**
- * MySQL admin backend handler factory.
+ * Admin executor factory for MySQL.
*/
-public final class MySQLAdminBackendHandlerFactory implements DatabaseAdminBackendHandlerFactory {
+public final class MySQLAdminExecutorFactory implements DatabaseAdminExecutorFactory {
@Override
- public Optional<DatabaseAdminBackendHandler> newInstance(final SQLStatement sqlStatement, final BackendConnection backendConnection) {
+ public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement sqlStatement) {
if (sqlStatement instanceof MySQLUseStatement) {
- return Optional.of(new UseDatabaseBackendHandler((MySQLUseStatement) sqlStatement, backendConnection));
+ return Optional.of(new UseDatabaseExecutor((MySQLUseStatement) sqlStatement));
}
if (sqlStatement instanceof MySQLShowDatabasesStatement) {
- return Optional.of(new ShowDatabasesBackendHandler(backendConnection));
+ return Optional.of(new ShowDatabasesExecutor());
}
if (sqlStatement instanceof MySQLShowTablesStatement) {
- return Optional.of(new ShowTablesBackendHandler(backendConnection));
+ return Optional.of(new ShowTablesExecutor());
}
if (sqlStatement instanceof SelectStatement) {
ProjectionSegment firstProjection = ((SelectStatement) sqlStatement).getProjections().getProjections().iterator().next();
if (firstProjection instanceof ExpressionProjectionSegment
- && ShowCurrentDatabaseBackendHandler.FUNCTION_NAME.equalsIgnoreCase(((ExpressionProjectionSegment) firstProjection).getText())) {
- return Optional.of(new ShowCurrentDatabaseBackendHandler(backendConnection));
+ && ShowCurrentDatabaseExecutor.FUNCTION_NAME.equalsIgnoreCase(((ExpressionProjectionSegment) firstProjection).getText())) {
+ return Optional.of(new ShowCurrentDatabaseExecutor());
}
}
return Optional.empty();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
similarity index 54%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
index 0bd01ac..ec1b80c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
@@ -15,48 +15,37 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
-import lombok.RequiredArgsConstructor;
+import lombok.Getter;
+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;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
-import java.sql.SQLException;
import java.sql.Types;
-import java.util.Collection;
import java.util.Collections;
/**
- * Show current database backend handler.
+ * Show current database executor.
*/
-@RequiredArgsConstructor
-public final class ShowCurrentDatabaseBackendHandler implements DatabaseAdminBackendHandler {
+@Getter
+public final class ShowCurrentDatabaseExecutor implements DatabaseAdminQueryExecutor {
public static final String FUNCTION_NAME = "DATABASE()";
- private final BackendConnection backendConnection;
-
private MergedResult mergedResult;
@Override
- public ResponseHeader execute() {
+ public void execute(final BackendConnection backendConnection) {
mergedResult = new SingleLocalDataMergedResult(Collections.singleton(backendConnection.getSchemaName()));
- return new QueryResponseHeader(Collections.singletonList(new QueryHeader(
- "information_schema", "SCHEMATA", FUNCTION_NAME, FUNCTION_NAME, Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
- }
-
- @Override
- public boolean next() throws SQLException {
- return mergedResult.next();
}
@Override
- public Collection<Object> getRowData() throws SQLException {
- return Collections.singletonList(mergedResult.getValue(1, Object.class));
+ public QueryResultMetaData getQueryResultMetaData() {
+ return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("SCHEMATA", FUNCTION_NAME, FUNCTION_NAME, Types.VARCHAR, "VARCHAR", 100, 0)));
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
similarity index 63%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
index 2121777..a68f6b9 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
@@ -15,20 +15,19 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
-import lombok.RequiredArgsConstructor;
+import lombok.Getter;
import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
+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;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
-import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.Collections;
@@ -36,23 +35,25 @@ import java.util.LinkedList;
import java.util.Optional;
/**
- * Show databases backend handler.
+ * Show databases executor.
*/
-@RequiredArgsConstructor
-public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHandler {
-
- private final BackendConnection backendConnection;
+@Getter
+public final class ShowDatabasesExecutor implements DatabaseAdminQueryExecutor {
private MergedResult mergedResult;
@Override
- public ResponseHeader execute() {
- mergedResult = new SingleLocalDataMergedResult(getSchemaNames());
- return new QueryResponseHeader(Collections.singletonList(
- new QueryHeader("information_schema", "SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
+ public void execute(final BackendConnection backendConnection) {
+ mergedResult = new SingleLocalDataMergedResult(getSchemaNames(backendConnection));
}
- private Collection<Object> getSchemaNames() {
+ @Override
+ public QueryResultMetaData getQueryResultMetaData() {
+ return new RawQueryResultMetaData(
+ Collections.singletonList(new RawQueryResultColumnMetaData("SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 255, 0)));
+ }
+
+ private Collection<Object> getSchemaNames(final BackendConnection backendConnection) {
Collection<Object> result = new LinkedList<>(ProxyContext.getInstance().getAllSchemaNames());
Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
@@ -61,14 +62,4 @@ public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHa
}
return result;
}
-
- @Override
- public boolean next() throws SQLException {
- return mergedResult.next();
- }
-
- @Override
- public Collection<Object> getRowData() throws SQLException {
- return Collections.singletonList(mergedResult.getValue(1, Object.class));
- }
}
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
new file mode 100644
index 0000000..7c4d48e
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
@@ -0,0 +1,68 @@
+/*
+ * 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;
+
+import lombok.Getter;
+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;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
+
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Show tables executor.
+ */
+@Getter
+public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor {
+
+ private QueryResultMetaData queryResultMetaData;
+
+ private MergedResult mergedResult;
+
+ @Override
+ public void execute(final BackendConnection backendConnection) {
+ queryResultMetaData = createQueryResultMetaData(backendConnection.getSchemaName());
+ mergedResult = new TransparentMergedResult(getQueryResult(backendConnection.getSchemaName()));
+ }
+
+ private QueryResult getQueryResult(final String schemaName) {
+ if (!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
+ return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
+ }
+ Collection<String> allTableNames = ProxyContext.getInstance().getMetaData(schemaName).getSchema().getAllTableNames();
+ List<MemoryQueryResultDataRow> rows = allTableNames.stream().map(each -> new MemoryQueryResultDataRow(Collections.singletonList(each))).collect(Collectors.toList());
+ return new RawMemoryQueryResult(queryResultMetaData, rows);
+ }
+
+ private QueryResultMetaData createQueryResultMetaData(final String schemaName) {
+ String columnName = String.format("Tables_in_%s", schemaName);
+ return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("", columnName, columnName, Types.VARCHAR, "VARCHAR", 255, 0)));
+ }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
similarity index 71%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
index 470a5a8..5e771ac 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
@@ -15,16 +15,14 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
@@ -33,26 +31,23 @@ import java.util.Collections;
import java.util.Optional;
/**
- * Use database backend handler.
+ * Use database executor.
*/
@RequiredArgsConstructor
-public final class UseDatabaseBackendHandler implements DatabaseAdminBackendHandler {
+public final class UseDatabaseExecutor implements DatabaseAdminExecutor {
private final MySQLUseStatement useStatement;
- private final BackendConnection backendConnection;
-
@Override
- public ResponseHeader execute() {
+ public void execute(final BackendConnection backendConnection) {
String schema = SQLUtil.getExactlyValue(useStatement.getSchema());
- if (ProxyContext.getInstance().schemaExists(schema) && isAuthorizedSchema(schema)) {
- backendConnection.setCurrentSchema(schema);
- return new UpdateResponseHeader(useStatement);
+ if (!ProxyContext.getInstance().schemaExists(schema) && isAuthorizedSchema(backendConnection, schema)) {
+ throw new UnknownDatabaseException(schema);
}
- throw new UnknownDatabaseException(schema);
+ backendConnection.setCurrentSchema(schema);
}
- private boolean isAuthorizedSchema(final String schema) {
+ private boolean isAuthorizedSchema(final BackendConnection backendConnection, final String schema) {
Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
return authorizedSchemas.isEmpty() || authorizedSchemas.contains(schema);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java
deleted file mode 100644
index 447beed..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.handler;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
-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;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeaderBuilder;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Backend handler for show tables.
- */
-@RequiredArgsConstructor
-public final class ShowTablesBackendHandler implements DatabaseAdminBackendHandler {
-
- private final BackendConnection backendConnection;
-
- private QueryResult queryResult;
-
- @Override
- public ResponseHeader execute() throws SQLException {
- RawQueryResultMetaData queryResultMetaData = createQueryResultMetaData();
- ShardingSphereMetaData metaData = ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName());
- if (ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()).isComplete()) {
- Collection<String> allTableNames = ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()).getSchema().getAllTableNames();
- List<MemoryQueryResultDataRow> rows = allTableNames.stream().map(each -> new MemoryQueryResultDataRow(Collections.singletonList(each))).collect(Collectors.toList());
- queryResult = new RawMemoryQueryResult(queryResultMetaData, rows);
- } else {
- queryResult = new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
- }
- return new QueryResponseHeader(Collections.singletonList(QueryHeaderBuilder.build(queryResult, metaData, 1)));
- }
-
- private RawQueryResultMetaData createQueryResultMetaData() {
- String column = String.format("Tables_in_%s", backendConnection.getSchemaName());
- return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("", column, column, Types.VARCHAR, "VARCHAR", 255, 0, false, false, false)));
- }
-
- @Override
- public boolean next() throws SQLException {
- return queryResult.next();
- }
-
- @Override
- public Collection<Object> getRowData() throws SQLException {
- Collection<Object> result = new LinkedList<>();
- for (int columnIndex = 1; columnIndex <= queryResult.getMetaData().getColumnCount(); columnIndex++) {
- result.add(queryResult.getValue(columnIndex, Object.class));
- }
- return result;
- }
-}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
similarity index 97%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
index 4ef4a04..3913edc 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
@@ -15,4 +15,4 @@
# limitations under the License.
#
-org.apache.shardingsphere.proxy.backend.text.admin.mysql.MySQLAdminBackendHandlerFactory
+org.apache.shardingsphere.proxy.backend.text.admin.mysql.MySQLAdminExecutorFactory
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
index d424d1c..8a00254 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
@@ -24,11 +24,11 @@ import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.Bac
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminQueryBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminUpdateBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.data.impl.BroadcastDatabaseBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.data.impl.SchemaAssignedDatabaseBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.data.impl.UnicastDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.sctl.set.ShardingCTLSetBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.sctl.show.ShardingCTLShowBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.skip.SkipBackendHandler;
@@ -150,14 +150,14 @@ public final class TextProtocolBackendHandlerFactoryTest {
public void assertNewInstanceWithUse() throws SQLException {
String sql = "use sharding_db";
TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection);
- assertThat(actual, instanceOf(UseDatabaseBackendHandler.class));
+ assertThat(actual, instanceOf(DatabaseAdminUpdateBackendHandler.class));
}
@Test
public void assertNewInstanceWithShowDatabase() throws SQLException {
String sql = "show databases";
TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection);
- assertThat(actual, instanceOf(ShowDatabasesBackendHandler.class));
+ assertThat(actual, instanceOf(DatabaseAdminQueryBackendHandler.class));
}
@Test
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
index 68eb354..8cc5339 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
@@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.binder.segment.select.projection.Projecti
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ExpressionProjection;
import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-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.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
@@ -48,79 +48,79 @@ public final class QueryHeaderBuilderTest {
@Test
public void assertQueryHeaderSchema() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getSchema(), is("sharding_schema"));
}
@Test
public void assertQueryHeaderTable() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getTable(), is("t_logic_order"));
}
@Test
public void assertQueryHeaderColumnLabel() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getColumnLabel(), is("order_id"));
}
@Test
public void assertQueryHeaderColumnNameWithoutProjectionsContext() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getColumnName(), is("order_id"));
}
@Test
public void assertQueryHeaderColumnNameFromProjectionsContext() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getColumnName(), is("order_id"));
}
@Test
public void assertQueryHeaderColumnNameFromMetaData() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResult(), createMetaData(), 2);
+ QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), createMetaData(), 2);
assertThat(header.getColumnName(), is("expr"));
}
@Test
public void assertQueryHeaderColumnLength() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getColumnLength(), is(1));
}
@Test
public void assertQueryHeaderColumnType() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getColumnType(), is(Types.INTEGER));
}
@Test
public void assertQueryHeaderDecimals() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertThat(header.getDecimals(), is(1));
}
@Test
public void assertQueryHeaderSigned() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertTrue(header.isSigned());
}
@Test
public void assertQueryHeaderPrimaryKey() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertTrue(header.isPrimaryKey());
}
@Test
public void assertQueryHeaderNotNull() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertTrue(header.isNotNull());
}
@Test
public void assertQueryHeaderAutoIncrement() throws SQLException {
- QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+ QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
assertTrue(header.isAutoIncrement());
}
@@ -144,18 +144,18 @@ public final class QueryHeaderBuilderTest {
return new ProjectionsContext(0, 0, false, Arrays.asList(new ColumnProjection("o", "order_id", "id"), new ExpressionProjection("o.order_id + 1", "expr")));
}
- private QueryResult createQueryResult() throws SQLException {
- QueryResult result = mock(QueryResult.class, RETURNS_DEEP_STUBS);
- when(result.getMetaData().getTableName(1)).thenReturn("t_order");
- when(result.getMetaData().getColumnLabel(1)).thenReturn("order_id");
- when(result.getMetaData().getColumnName(1)).thenReturn("order_id");
- when(result.getMetaData().getColumnName(2)).thenReturn("expr");
- when(result.getMetaData().getColumnType(1)).thenReturn(Types.INTEGER);
- when(result.getMetaData().isSigned(1)).thenReturn(true);
- when(result.getMetaData().isAutoIncrement(1)).thenReturn(true);
- when(result.getMetaData().getColumnLength(1)).thenReturn(1);
- when(result.getMetaData().getDecimals(1)).thenReturn(1);
- when(result.getMetaData().isNotNull(1)).thenReturn(true);
+ private QueryResultMetaData createQueryResultMetaData() throws SQLException {
+ QueryResultMetaData result = mock(QueryResultMetaData.class);
+ when(result.getTableName(1)).thenReturn("t_order");
+ when(result.getColumnLabel(1)).thenReturn("order_id");
+ when(result.getColumnName(1)).thenReturn("order_id");
+ when(result.getColumnName(2)).thenReturn("expr");
+ when(result.getColumnType(1)).thenReturn(Types.INTEGER);
+ when(result.isSigned(1)).thenReturn(true);
+ when(result.isAutoIncrement(1)).thenReturn(true);
+ when(result.getColumnLength(1)).thenReturn(1);
+ when(result.getDecimals(1)).thenReturn(1);
+ when(result.isNotNull(1)).thenReturn(true);
return result;
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
similarity index 78%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
index 2c1a7be..450a1b1 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -28,7 +28,6 @@ import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,24 +41,21 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class ShowDatabasesBackendHandlerTest {
+public final class ShowDatabasesExecutorTest {
private static final String SCHEMA_PATTERN = "schema_%s";
- private ShowDatabasesBackendHandler showDatabasesBackendHandler;
+ private ShowDatabasesExecutor showDatabasesExecutor;
@Before
public void setUp() throws IllegalAccessException, NoSuchFieldException {
- BackendConnection backendConnection = mock(BackendConnection.class);
- when(backendConnection.getUsername()).thenReturn("root");
- showDatabasesBackendHandler = new ShowDatabasesBackendHandler(backendConnection);
+ showDatabasesExecutor = new ShowDatabasesExecutor();
Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
metaDataContexts.setAccessible(true);
metaDataContexts.set(ProxyContext.getInstance(),
@@ -85,17 +81,19 @@ public final class ShowDatabasesBackendHandlerTest {
}
@Test
- public void assertExecuteShowDatabaseBackendHandler() {
- QueryResponseHeader actual = (QueryResponseHeader) showDatabasesBackendHandler.execute();
- assertThat(actual, instanceOf(QueryResponseHeader.class));
- assertThat(actual.getQueryHeaders().size(), is(1));
+ public void assertExecute() throws SQLException {
+ showDatabasesExecutor.execute(mockBackendConnection());
+ assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
+ int count = 0;
+ while (showDatabasesExecutor.getMergedResult().next()) {
+ assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(SCHEMA_PATTERN, count)));
+ count++;
+ }
}
- @Test
- public void assertShowDatabaseUsingStream() throws SQLException {
- showDatabasesBackendHandler.execute();
- while (showDatabasesBackendHandler.next()) {
- assertThat(showDatabasesBackendHandler.getRowData().size(), is(1));
- }
+ private BackendConnection mockBackendConnection() {
+ BackendConnection result = mock(BackendConnection.class);
+ when(result.getUsername()).thenReturn("root");
+ return result;
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
similarity index 75%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
index c95007e..c57006f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
import org.junit.Before;
import org.junit.Test;
@@ -36,26 +35,22 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-public final class ShowTablesBackendHandlerTest {
+public final class ShowTablesExecutorTest {
private static final String SCHEMA_PATTERN = "schema_%s";
- private ShowTablesBackendHandler tablesBackendHandler;
+ private ShowTablesExecutor showTablesExecutor;
@Before
public void setUp() throws NoSuchFieldException, IllegalAccessException {
- BackendConnection backendConnection = mock(BackendConnection.class);
- when(backendConnection.getUsername()).thenReturn("root");
- tablesBackendHandler = new ShowTablesBackendHandler(backendConnection);
+ showTablesExecutor = new ShowTablesExecutor();
Map<String, ShardingSphereMetaData> metaDataMap = getMetaDataMap();
- when(backendConnection.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN, 0));
Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
metaDataContexts.setAccessible(true);
metaDataContexts.set(ProxyContext.getInstance(), new StandardMetaDataContexts(metaDataMap, mock(ExecutorEngine.class), getAuthentication(), new ConfigurationProperties(new Properties())));
@@ -79,17 +74,18 @@ public final class ShowTablesBackendHandlerTest {
}
@Test
- public void assertExecuteShowTablesBackendHandler() throws SQLException {
- QueryResponseHeader actual = (QueryResponseHeader) tablesBackendHandler.execute();
- assertThat(actual, instanceOf(QueryResponseHeader.class));
- assertThat(actual.getQueryHeaders().size(), is(1));
+ public void assertExecute() throws SQLException {
+ showTablesExecutor.execute(mockBackendConnection());
+ assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
+ while (showTablesExecutor.getMergedResult().next()) {
+ assertThat(showTablesExecutor.getMergedResult().getValue(1, Object.class), is(1));
+ }
}
- @Test
- public void assertShowTablesUsingStream() throws SQLException {
- tablesBackendHandler.execute();
- while (tablesBackendHandler.next()) {
- assertThat(tablesBackendHandler.getRowData().size(), is(1));
- }
+ private BackendConnection mockBackendConnection() {
+ BackendConnection result = mock(BackendConnection.class);
+ when(result.getUsername()).thenReturn("root");
+ when(result.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN, 0));
+ return result;
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
similarity index 78%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
index e400b44..09e2f7c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -28,9 +28,6 @@ import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
import org.junit.Before;
import org.junit.Test;
@@ -44,15 +41,13 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class UseDatabaseBackendHandlerTest {
+public final class UseDatabaseExecutorTest {
private static final String SCHEMA_PATTERN = "schema_%s";
@@ -61,7 +56,6 @@ public final class UseDatabaseBackendHandlerTest {
@Before
public void setUp() throws NoSuchFieldException, IllegalAccessException {
backendConnection = mock(BackendConnection.class);
- when(backendConnection.getUsername()).thenReturn("root");
Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
metaDataContexts.setAccessible(true);
metaDataContexts.set(ProxyContext.getInstance(),
@@ -90,17 +84,8 @@ public final class UseDatabaseBackendHandlerTest {
public void assertExecuteUseStatementBackendHandler() {
MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
when(useStatement.getSchema()).thenReturn(String.format(SCHEMA_PATTERN, 0));
- UseDatabaseBackendHandler useSchemaBackendHandler = new UseDatabaseBackendHandler(useStatement, backendConnection);
- ResponseHeader actual = useSchemaBackendHandler.execute();
+ UseDatabaseExecutor useSchemaBackendHandler = new UseDatabaseExecutor(useStatement);
+ useSchemaBackendHandler.execute(backendConnection);
verify(backendConnection).setCurrentSchema(anyString());
- assertThat(actual, instanceOf(UpdateResponseHeader.class));
- }
-
- @Test(expected = UnknownDatabaseException.class)
- public void assertExecuteUseStatementNotExist() {
- MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
- when(useStatement.getSchema()).thenReturn("not_exist");
- UseDatabaseBackendHandler useSchemaBackendHandler = new UseDatabaseBackendHandler(useStatement, backendConnection);
- useSchemaBackendHandler.execute();
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java
deleted file mode 100644
index e8a5710..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.schema;
-
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowCurrentDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowTablesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.Optional;
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public final class MySQLAdminBackendHandlerFactoryTest {
-
- private final DatabaseAdminBackendHandlerFactory databaseAdminBackendHandlerFactory = TypedSPIRegistry.getRegisteredService(DatabaseAdminBackendHandlerFactory.class, "MySQL", new Properties());
-
- @BeforeClass
- public static void setUp() {
- ShardingSphereServiceLoader.register(DatabaseAdminBackendHandlerFactory.class);
- }
-
- @Test
- public void assertUseDatabase() {
- Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLUseStatement.class), mock(BackendConnection.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), instanceOf(UseDatabaseBackendHandler.class));
- }
-
- @Test
- public void assertShowDatabases() {
- Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLShowDatabasesStatement.class), mock(BackendConnection.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), instanceOf(ShowDatabasesBackendHandler.class));
- }
-
- @Test
- public void assertShowCurrentDatabase() {
- SelectStatement sqlStatement = mock(SelectStatement.class, RETURNS_DEEP_STUBS);
- when(sqlStatement.getProjections().getProjections().iterator().next()).thenReturn(new ExpressionProjectionSegment(0, 0, ShowCurrentDatabaseBackendHandler.FUNCTION_NAME));
- Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(sqlStatement, mock(BackendConnection.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), instanceOf(ShowCurrentDatabaseBackendHandler.class));
- }
-
- @Test
- public void assertShowTables() {
- Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLShowTablesStatement.class), mock(BackendConnection.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), instanceOf(ShowTablesBackendHandler.class));
- }
-}