This is an automated email from the ASF dual-hosted git repository. jianglongtao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 877104fe07f When querying the MySQL system table, perform transparent transmission processing (#27400) 877104fe07f is described below commit 877104fe07f88dcb75d630b84438e170a4c7b15c Author: jiangML <1060319...@qq.com> AuthorDate: Mon Jul 24 14:06:35 2023 +0800 When querying the MySQL system table, perform transparent transmission processing (#27400) * Improve mysql system table query * Add class validation --- .../handler/admin/MySQLAdminExecutorCreator.java | 21 +++++++++++++++++++-- .../MySQLInformationSchemaExecutorFactory.java | 11 +++++------ ...ry.java => MySQLMySQLSchemaExecutorFactory.java} | 21 +++++++-------------- ...a => MySQLPerformanceSchemaExecutorFactory.java} | 21 +++++++-------------- ...tory.java => MySQLSysSchemaExecutorFactory.java} | 21 +++++++-------------- 5 files changed, 45 insertions(+), 50 deletions(-) diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java index acd77b954de..625c8a76584 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java @@ -63,8 +63,12 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre private static final String INFORMATION_SCHEMA = "information_schema"; + private static final String MYSQL_SCHEMA = "mysql"; + private static final String PERFORMANCE_SCHEMA = "performance_schema"; + private static final String SYS_SCHEMA = "sys"; + @Override public Optional<DatabaseAdminExecutor> create(final SQLStatementContext sqlStatementContext) { SQLStatement sqlStatement = sqlStatementContext.getSqlStatement(); @@ -110,8 +114,13 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre return MySQLInformationSchemaExecutorFactory.newInstance(selectStatement, sql, parameters); } if (isQueryPerformanceSchema(databaseName)) { - // TODO - return Optional.empty(); + return MySQLPerformanceSchemaExecutorFactory.newInstance(selectStatement, sql, parameters); + } + if (isQueryMySQLSchema(databaseName)) { + return MySQLMySQLSchemaExecutorFactory.newInstance(selectStatement, sql, parameters); + } + if (isQuerySysSchema(databaseName)) { + return MySQLSysSchemaExecutorFactory.newInstance(selectStatement, sql, parameters); } } return Optional.empty(); @@ -155,6 +164,14 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre return PERFORMANCE_SCHEMA.equalsIgnoreCase(databaseName); } + private boolean isQueryMySQLSchema(final String databaseName) { + return MYSQL_SCHEMA.equalsIgnoreCase(databaseName); + } + + private boolean isQuerySysSchema(final String databaseName) { + return SYS_SCHEMA.equalsIgnoreCase(databaseName); + } + private Optional<DatabaseAdminExecutor> mockExecutor(final String databaseName, final SelectStatement sqlStatement, final String sql) { if (hasNoResource()) { return Optional.of(new NoResourceShowExecutor(sqlStatement)); diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java index c0b7436baa2..f1bb9ba5cc4 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java @@ -19,15 +19,13 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilderRule; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor; import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information.SelectInformationSchemataExecutor; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -39,8 +37,6 @@ public final class MySQLInformationSchemaExecutorFactory { private static final String SCHEMATA_TABLE = "SCHEMATA"; - private static final Collection<String> DEFAULT_EXECUTOR_TABLES = new HashSet<>(Arrays.asList("ENGINES", "FILES", "VIEWS", "TRIGGERS", "PARTITIONS")); - /** * Create executor. * @@ -50,11 +46,14 @@ public final class MySQLInformationSchemaExecutorFactory { * @return executor */ public static Optional<DatabaseAdminExecutor> newInstance(final SelectStatement sqlStatement, final String sql, final List<Object> parameters) { + if (!(sqlStatement.getFrom() instanceof SimpleTableSegment)) { + return Optional.empty(); + } String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); if (SCHEMATA_TABLE.equalsIgnoreCase(tableName)) { return Optional.of(new SelectInformationSchemataExecutor(sqlStatement, sql, parameters)); } - if (DEFAULT_EXECUTOR_TABLES.contains(tableName.toUpperCase())) { + if (SystemSchemaBuilderRule.MYSQL_INFORMATION_SCHEMA.getTables().contains(tableName.toLowerCase())) { return Optional.of(new DefaultDatabaseMetaDataExecutor(sql, parameters)); } return Optional.empty(); diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLMySQLSchemaExecutorFactory.java similarity index 72% copy from proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java copy to proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLMySQLSchemaExecutorFactory.java index c0b7436baa2..9e93df2109d 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLMySQLSchemaExecutorFactory.java @@ -19,27 +19,20 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilderRule; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor; -import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information.SelectInformationSchemataExecutor; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Optional; /** - * Construct the information schema executor's factory. + * Construct the mysql schema executor's factory. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class MySQLInformationSchemaExecutorFactory { - - private static final String SCHEMATA_TABLE = "SCHEMATA"; - - private static final Collection<String> DEFAULT_EXECUTOR_TABLES = new HashSet<>(Arrays.asList("ENGINES", "FILES", "VIEWS", "TRIGGERS", "PARTITIONS")); +public final class MySQLMySQLSchemaExecutorFactory { /** * Create executor. @@ -50,11 +43,11 @@ public final class MySQLInformationSchemaExecutorFactory { * @return executor */ public static Optional<DatabaseAdminExecutor> newInstance(final SelectStatement sqlStatement, final String sql, final List<Object> parameters) { - String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); - if (SCHEMATA_TABLE.equalsIgnoreCase(tableName)) { - return Optional.of(new SelectInformationSchemataExecutor(sqlStatement, sql, parameters)); + if (!(sqlStatement.getFrom() instanceof SimpleTableSegment)) { + return Optional.empty(); } - if (DEFAULT_EXECUTOR_TABLES.contains(tableName.toUpperCase())) { + String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); + if (SystemSchemaBuilderRule.MYSQL_MYSQL.getTables().contains(tableName.toLowerCase())) { return Optional.of(new DefaultDatabaseMetaDataExecutor(sql, parameters)); } return Optional.empty(); diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLPerformanceSchemaExecutorFactory.java similarity index 72% copy from proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java copy to proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLPerformanceSchemaExecutorFactory.java index c0b7436baa2..450f7e40fb1 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLPerformanceSchemaExecutorFactory.java @@ -19,27 +19,20 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilderRule; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor; -import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information.SelectInformationSchemataExecutor; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Optional; /** - * Construct the information schema executor's factory. + * Construct the performance schema executor's factory. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class MySQLInformationSchemaExecutorFactory { - - private static final String SCHEMATA_TABLE = "SCHEMATA"; - - private static final Collection<String> DEFAULT_EXECUTOR_TABLES = new HashSet<>(Arrays.asList("ENGINES", "FILES", "VIEWS", "TRIGGERS", "PARTITIONS")); +public final class MySQLPerformanceSchemaExecutorFactory { /** * Create executor. @@ -50,11 +43,11 @@ public final class MySQLInformationSchemaExecutorFactory { * @return executor */ public static Optional<DatabaseAdminExecutor> newInstance(final SelectStatement sqlStatement, final String sql, final List<Object> parameters) { - String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); - if (SCHEMATA_TABLE.equalsIgnoreCase(tableName)) { - return Optional.of(new SelectInformationSchemataExecutor(sqlStatement, sql, parameters)); + if (!(sqlStatement.getFrom() instanceof SimpleTableSegment)) { + return Optional.empty(); } - if (DEFAULT_EXECUTOR_TABLES.contains(tableName.toUpperCase())) { + String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); + if (SystemSchemaBuilderRule.MYSQL_PERFORMANCE_SCHEMA.getTables().contains(tableName.toLowerCase())) { return Optional.of(new DefaultDatabaseMetaDataExecutor(sql, parameters)); } return Optional.empty(); diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLSysSchemaExecutorFactory.java similarity index 72% copy from proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java copy to proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLSysSchemaExecutorFactory.java index c0b7436baa2..2c438520c6d 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLInformationSchemaExecutorFactory.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLSysSchemaExecutorFactory.java @@ -19,27 +19,20 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilderRule; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor; import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor; -import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information.SelectInformationSchemataExecutor; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Optional; /** - * Construct the information schema executor's factory. + * Construct the sys schema executor's factory. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class MySQLInformationSchemaExecutorFactory { - - private static final String SCHEMATA_TABLE = "SCHEMATA"; - - private static final Collection<String> DEFAULT_EXECUTOR_TABLES = new HashSet<>(Arrays.asList("ENGINES", "FILES", "VIEWS", "TRIGGERS", "PARTITIONS")); +public final class MySQLSysSchemaExecutorFactory { /** * Create executor. @@ -50,11 +43,11 @@ public final class MySQLInformationSchemaExecutorFactory { * @return executor */ public static Optional<DatabaseAdminExecutor> newInstance(final SelectStatement sqlStatement, final String sql, final List<Object> parameters) { - String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); - if (SCHEMATA_TABLE.equalsIgnoreCase(tableName)) { - return Optional.of(new SelectInformationSchemataExecutor(sqlStatement, sql, parameters)); + if (!(sqlStatement.getFrom() instanceof SimpleTableSegment)) { + return Optional.empty(); } - if (DEFAULT_EXECUTOR_TABLES.contains(tableName.toUpperCase())) { + String tableName = ((SimpleTableSegment) sqlStatement.getFrom()).getTableName().getIdentifier().getValue(); + if (SystemSchemaBuilderRule.MYSQL_SYS.getTables().contains(tableName.toLowerCase())) { return Optional.of(new DefaultDatabaseMetaDataExecutor(sql, parameters)); } return Optional.empty();