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();

Reply via email to