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 <[email protected]>
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();