You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/06/12 12:03:12 UTC

(shardingsphere) branch master updated: Refactor MySQLDescribeStatement (#35687)

This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 f042061c1b6 Refactor MySQLDescribeStatement (#35687)
f042061c1b6 is described below

commit f042061c1b692ad8a7b7bcccb1293e9d76bbe737
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 12 20:03:07 2025 +0800

    Refactor MySQLDescribeStatement (#35687)
---
 .../type/dal/ExplainStatementContext.java          |  9 ++----
 .../binder/mysql/MySQLSQLStatementExtractor.java   |  6 ++--
 .../statement/type/DorisDALStatementVisitor.java   | 21 ++++++++------
 .../statement/type/MySQLDALStatementVisitor.java   | 21 ++++++++------
 .../mysql/dal/MySQLDescribeStatement.java}         | 32 ++++++++--------------
 .../asserts/statement/dal/DALStatementAssert.java  |  6 ++--
 .../dal/impl/DescribeStatementAssert.java          | 24 +++++++---------
 7 files changed, 54 insertions(+), 65 deletions(-)

diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
index 27ada3dfeb9..c64a547d88f 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
@@ -27,11 +27,9 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -52,13 +50,10 @@ public final class ExplainStatementContext extends CommonSQLStatementContext imp
     }
     
     private Collection<SimpleTableSegment> extractTablesFromExplain(final ExplainStatement sqlStatement) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        SQLStatement explainableStatement = sqlStatement.getSqlStatement();
         TableExtractor extractor = new TableExtractor();
         // TODO extract table from declare, execute, createMaterializedView, refreshMaterializedView
-        extractor.extractTablesFromSQLStatement(explainableStatement);
-        result.addAll(extractor.getRewriteTables());
-        return result;
+        extractor.extractTablesFromSQLStatement(sqlStatement.getSqlStatement());
+        return extractor.getRewriteTables();
     }
     
     @Override
diff --git a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementExtractor.java b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementExtractor.java
index f2be807cfd6..68ae317f646 100644
--- a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementExtractor.java
+++ b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementExtractor.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.infra.binder.mysql;
 import org.apache.shardingsphere.infra.binder.context.extractor.DialectSQLStatementExtractor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DescribeStatement;
+import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.OptimizeTableStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLFlushStatement;
@@ -44,8 +44,8 @@ public final class MySQLSQLStatementExtractor implements DialectSQLStatementExtr
         if (sqlStatement instanceof OptimizeTableStatement) {
             return ((OptimizeTableStatement) sqlStatement).getTables();
         }
-        if (sqlStatement instanceof DescribeStatement) {
-            return ((DescribeStatement) sqlStatement).getTable().map(Collections::singletonList).orElse(Collections.emptyList());
+        if (sqlStatement instanceof MySQLDescribeStatement) {
+            return Collections.singletonList(((MySQLDescribeStatement) sqlStatement).getTable());
         }
         return Collections.emptyList();
     }
diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
index 164bcf80b23..53e595de4a6 100644
--- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
+++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
@@ -144,7 +144,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Datab
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.AnalyzeTableStatement;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DescribeStatement;
+import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.OptimizeTableStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.SetStatement;
@@ -497,14 +497,7 @@ public final class DorisDALStatementVisitor extends DorisStatementVisitor implem
             getExplainableSQLStatement(ctx).ifPresent(result::setSqlStatement);
             return result;
         }
-        DescribeStatement result = new DescribeStatement();
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        if (null != ctx.columnRef()) {
-            result.setColumnWild((ColumnSegment) visit(ctx.columnRef()));
-        } else if (null != ctx.textString()) {
-            result.setColumnWild((ColumnSegment) visit(ctx.textString()));
-        }
-        return result;
+        return new MySQLDescribeStatement((SimpleTableSegment) visit(ctx.tableName()), getColumnWildcard(ctx));
     }
     
     private Optional<SQLStatement> getExplainableSQLStatement(final ExplainContext ctx) {
@@ -526,6 +519,16 @@ public final class DorisDALStatementVisitor extends DorisStatementVisitor implem
         return Optional.empty();
     }
     
+    private ColumnSegment getColumnWildcard(final ExplainContext ctx) {
+        if (null != ctx.columnRef()) {
+            return (ColumnSegment) visit(ctx.columnRef());
+        }
+        if (null != ctx.textString()) {
+            return (ColumnSegment) visit(ctx.textString());
+        }
+        return null;
+    }
+    
     @Override
     public ASTNode visitExplainableStatement(final ExplainableStatementContext ctx) {
         if (null != ctx.select()) {
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
index 56cc2e1ada5..b57457b90e9 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
@@ -143,7 +143,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DescribeStatement;
+import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
 import org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLAlterResourceGroupStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.AnalyzeTableStatement;
 import org.apache.shardingsphere.sql.parser.statement.mysql.dal.replication.binlog.MySQLBinlogStatement;
@@ -510,14 +510,7 @@ public final class MySQLDALStatementVisitor extends MySQLStatementVisitor implem
             getExplainableSQLStatement(ctx).ifPresent(result::setSqlStatement);
             return result;
         }
-        DescribeStatement result = new DescribeStatement();
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        if (null != ctx.columnRef()) {
-            result.setColumnWild((ColumnSegment) visit(ctx.columnRef()));
-        } else if (null != ctx.textString()) {
-            result.setColumnWild((ColumnSegment) visit(ctx.textString()));
-        }
-        return result;
+        return new MySQLDescribeStatement((SimpleTableSegment) visit(ctx.tableName()), getColumnWildcard(ctx));
     }
     
     private Optional<SQLStatement> getExplainableSQLStatement(final ExplainContext ctx) {
@@ -539,6 +532,16 @@ public final class MySQLDALStatementVisitor extends MySQLStatementVisitor implem
         return Optional.empty();
     }
     
+    private ColumnSegment getColumnWildcard(final ExplainContext ctx) {
+        if (null != ctx.columnRef()) {
+            return (ColumnSegment) visit(ctx.columnRef());
+        }
+        if (null != ctx.textString()) {
+            return (ColumnSegment) visit(ctx.textString());
+        }
+        return null;
+    }
+    
     @Override
     public ASTNode visitExplainableStatement(final ExplainableStatementContext ctx) {
         if (null != ctx.select()) {
diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/DescribeStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
similarity index 65%
rename from parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/DescribeStatement.java
rename to parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
index 44a1c310042..f783f00d753 100644
--- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/DescribeStatement.java
+++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
@@ -15,42 +15,34 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.statement.core.statement.dal;
+package org.apache.shardingsphere.sql.parser.statement.mysql.dal;
 
 import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
+import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
 import java.util.Optional;
 
 /**
- * Describe statement.
+ * Describe statement for MySQL.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public final class DescribeStatement extends AbstractSQLStatement implements DALStatement {
+public final class MySQLDescribeStatement extends AbstractSQLStatement implements DALStatement {
     
-    private SimpleTableSegment table;
+    private final SimpleTableSegment table;
     
-    private ColumnSegment columnWild;
+    private final ColumnSegment columnWildcard;
     
     /**
-     * Get table.
+     * Get column wildcard.
      *
-     * @return table
+     * @return column wildcard
      */
-    public Optional<SimpleTableSegment> getTable() {
-        return Optional.ofNullable(table);
-    }
-    
-    /**
-     * Get column segment.
-     *
-     * @return column segment
-     */
-    public Optional<ColumnSegment> getColumnWild() {
-        return Optional.ofNullable(columnWild);
+    public Optional<ColumnSegment> getColumnWildcard() {
+        return Optional.ofNullable(columnWildcard);
     }
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
index 3d4fb29fc27..f5fc4512480 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DescribeStatement;
+import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.EmptyStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.OptimizeTableStatement;
@@ -205,8 +205,8 @@ public final class DALStatementAssert {
             EmptyStatementAssert.assertIs(assertContext, (EmptyStatement) actual, (EmptyStatementTestCase) expected);
         } else if (actual instanceof ExplainStatement) {
             ExplainStatementAssert.assertIs(assertContext, (ExplainStatement) actual, (ExplainStatementTestCase) expected);
-        } else if (actual instanceof DescribeStatement) {
-            DescribeStatementAssert.assertIs(assertContext, (DescribeStatement) actual, (DescribeStatementTestCase) expected);
+        } else if (actual instanceof MySQLDescribeStatement) {
+            DescribeStatementAssert.assertIs(assertContext, (MySQLDescribeStatement) actual, (DescribeStatementTestCase) expected);
         } else if (actual instanceof ShowDatabasesStatement) {
             ShowDatabasesStatementAssert.assertIs(assertContext, (ShowDatabasesStatement) actual, (ShowDatabasesStatementTestCase) expected);
         } else if (actual instanceof ShowTablesStatement) {
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
index 5a20aa1c5f3..96aa83201df 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
@@ -19,13 +19,13 @@ package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DescribeStatement;
+import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dal.DescribeStatementTestCase;
 
-import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 /**
  * Describe statement assert.
@@ -40,22 +40,18 @@ public final class DescribeStatementAssert {
      * @param actual actual explain statement
      * @param expected expected describe statement test case
      */
-    public static void assertIs(final SQLCaseAssertContext assertContext, final DescribeStatement actual, final DescribeStatementTestCase expected) {
-        if (actual.getColumnWild().isPresent() && null != expected.getTable()) {
-            assertExplainStatementColumnWild(assertContext, actual, expected);
+    public static void assertIs(final SQLCaseAssertContext assertContext, final MySQLDescribeStatement actual, final DescribeStatementTestCase expected) {
+        TableAssert.assertIs(assertContext, actual.getTable(), expected.getTable());
+        if (actual.getColumnWildcard().isPresent()) {
+            assertDescribeColumnWild(assertContext, actual, expected);
         }
     }
     
-    private static void assertExplainStatementColumnWild(final SQLCaseAssertContext assertContext, final DescribeStatement actual, final DescribeStatementTestCase expected) {
-        if (actual.getTable().isPresent()) {
-            TableAssert.assertIs(assertContext, actual.getTable().get(), expected.getTable());
-            if (actual.getColumnWild().isPresent()) {
-                ColumnAssert.assertIs(assertContext, actual.getColumnWild().get(), expected.getColumn());
-            } else {
-                assertFalse(actual.getColumnWild().isPresent(), assertContext.getText("Actual column wild should not exist."));
-            }
+    private static void assertDescribeColumnWild(final SQLCaseAssertContext assertContext, final MySQLDescribeStatement actual, final DescribeStatementTestCase expected) {
+        if (actual.getColumnWildcard().isPresent()) {
+            ColumnAssert.assertIs(assertContext, actual.getColumnWildcard().get(), expected.getColumn());
         } else {
-            assertFalse(actual.getTable().isPresent(), assertContext.getText("Actual table should not exist."));
+            assertNull(expected.getColumn(), assertContext.getText("Actual column wild should not exist."));
         }
     }
 }