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."));
}
}
}