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

duanzhengqiang 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 74f7a2f  Add MySQL parse support for `EXPLAIN TABLE Statement` (#14677)
74f7a2f is described below

commit 74f7a2fd6e861654ea73ddff2e4faa64fe59f5e9
Author: Guocheng Tang <[email protected]>
AuthorDate: Tue Jan 11 10:30:45 2022 +0800

    Add MySQL parse support for `EXPLAIN TABLE Statement` (#14677)
    
    * Add MySQL parse support for `EXPLAIN TABLE Statement`
    
    * adjust `desc`
---
 .../src/main/antlr4/imports/mysql/DALStatement.g4  |  5 ++---
 .../impl/MySQLDALStatementSQLVisitor.java          |  4 +++-
 .../impl/MySQLDMLStatementSQLVisitor.java          | 14 ------------
 .../statement/impl/MySQLStatementSQLVisitor.java   | 10 +++++++++
 .../statement/dal/impl/ExplainStatementAssert.java |  9 +++++---
 .../statement/dal/ExplainStatementTestCase.java    | 10 ++++++---
 .../src/main/resources/case/dal/explain.xml        | 26 +++++++++++++++-------
 .../main/resources/sql/supported/dal/explain.xml   |  1 +
 8 files changed, 47 insertions(+), 32 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
index c33e836..4e4be9f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
@@ -408,10 +408,9 @@ shutdown
 explainType
     : FORMAT EQ_ formatName
     ;
-
-// TODO support table statement
+    
 explainableStatement
-    : select | delete | insert | replace | update
+    : table | select | delete | insert | replace | update
     ;
 
 formatName
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDALStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDALStatementSQLVisitor.java
index 27db3cf..2d54060 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDALStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDALStatementSQLVisitor.java
@@ -542,7 +542,9 @@ public final class MySQLDALStatementSQLVisitor extends 
MySQLStatementSQLVisitor
     
     @Override
     public ASTNode visitExplainableStatement(final ExplainableStatementContext 
ctx) {
-        if (null != ctx.select()) {
+        if (null != ctx.table()) {
+            return visit(ctx.table());
+        } else if (null != ctx.select()) {
             return visit(ctx.select());
         } else if (null != ctx.delete()) {
             return visit(ctx.delete());
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDMLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDMLStatementSQLVisitor.java
index 964dc3c..1d44635 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDMLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDMLStatementSQLVisitor.java
@@ -23,14 +23,9 @@ import 
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVi
 import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CallContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DoStatementContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableContext;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLCallStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDoStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLTableStatement;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -57,13 +52,4 @@ public final class MySQLDMLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
     public ASTNode visitDoStatement(final DoStatementContext ctx) {
         return new MySQLDoStatement();
     }
-    
-    @Override
-    public ASTNode visitTable(final TableContext ctx) {
-        MySQLTableStatement result = new MySQLTableStatement();
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setColumn((ColumnSegment) visit(ctx.columnName()));
-        result.setLimit((LimitSegment) visit(ctx.limitClause()));
-        return result;
-    }
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
index c86e386..831e304 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
@@ -200,6 +200,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.value.parametermarker.Par
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLUpdateStatement;
 
 import java.util.Collection;
@@ -1573,6 +1574,15 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerValue) 
visit(ctx.parameterMarker())).getValue());
     }
     
+    @Override
+    public ASTNode visitTable(final MySQLStatementParser.TableContext ctx) {
+        MySQLTableStatement result = new MySQLTableStatement();
+        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        result.setColumn((ColumnSegment) visit(ctx.columnName()));
+        result.setLimit((LimitSegment) visit(ctx.limitClause()));
+        return result;
+    }
+    
     /**
      * Get original text.
      *
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ExplainStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ExplainStatementAssert.java
index 8b7d233..267089c 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ExplainStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ExplainStatementAssert.java
@@ -44,7 +44,10 @@ public final class ExplainStatementAssert {
      * @param expected expected explain statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final ExplainStatement actual, final ExplainStatementTestCase expected) {
-        if (null != expected.getSelectClause()) {
+        if (null != expected.getTableClause()) {
+            assertTrue(assertContext.getText("Actual statement should 
exist."), actual.getStatement().isPresent());
+            SQLStatementAssert.assertIs(assertContext, 
actual.getStatement().get(), expected.getTableClause());
+        } else if (null != expected.getSelectClause()) {
             assertTrue(assertContext.getText("Actual statement should 
exist."), actual.getStatement().isPresent());
             SQLStatementAssert.assertIs(assertContext, 
actual.getStatement().get(), expected.getSelectClause());
         } else if (null != expected.getUpdateClause()) {
@@ -59,7 +62,7 @@ public final class ExplainStatementAssert {
         } else if (null != expected.getCreateTableAsSelectClause()) {
             assertTrue(assertContext.getText("Actual statement should 
exist."), actual.getStatement().isPresent());
             SQLStatementAssert.assertIs(assertContext, 
actual.getStatement().get(), expected.getCreateTableAsSelectClause());
-        } else if (actual instanceof MySQLExplainStatement && null != 
expected.getTableName()) {
+        } else if (actual instanceof MySQLExplainStatement && null != 
expected.getTable()) {
             mysqlExplainStatementAssert(assertContext, (MySQLExplainStatement) 
actual, expected);
         } else {
             assertFalse(assertContext.getText("Actual statement should not 
exist."), actual.getStatement().isPresent());
@@ -68,7 +71,7 @@ public final class ExplainStatementAssert {
     
     private static void mysqlExplainStatementAssert(final SQLCaseAssertContext 
assertContext, final MySQLExplainStatement actual, final 
ExplainStatementTestCase expected) {
         if (actual.getTable().isPresent()) {
-            TableAssert.assertIs(assertContext, actual.getTable().get(), 
expected.getTableName());
+            TableAssert.assertIs(assertContext, actual.getTable().get(), 
expected.getTable());
             if (actual.getColumnWild().isPresent()) {
                 ColumnAssert.assertIs(assertContext, 
actual.getColumnWild().get(), expected.getColumn());
             } else {
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ExplainStatementTestCase.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ExplainStatementTestCase.java
index 383936c..1269c2d 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ExplainStatementTestCase.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ExplainStatementTestCase.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.DeleteStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.InsertStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.SelectStatementTestCase;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.TableStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.UpdateStatementTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
@@ -36,7 +37,10 @@ import javax.xml.bind.annotation.XmlElement;
 @Getter
 @Setter
 public final class ExplainStatementTestCase extends SQLParserTestCase {
-
+    
+    @XmlElement(name = "table")
+    private TableStatementTestCase tableClause;
+    
     @XmlElement(name = "select")
     private SelectStatementTestCase selectClause;
 
@@ -52,8 +56,8 @@ public final class ExplainStatementTestCase extends 
SQLParserTestCase {
     @XmlElement(name = "create-table")
     private CreateTableStatementTestCase createTableAsSelectClause;
     
-    @XmlElement(name = "table")
-    private ExpectedSimpleTable tableName;
+    @XmlElement(name = "simple-table")
+    private ExpectedSimpleTable table;
     
     @XmlElement(name = "column-wild")
     private ExpectedColumn column;
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
index 78d42f2..b9dfb31 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
@@ -239,33 +239,43 @@
         </select>
     </describe>
     <describe sql-case-id="desc_table">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
     </describe>
     <describe sql-case-id="desc_table_with_col_name">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
         <column-wild name="colName" start-index="15" stop-index="21" />
     </describe>
     <describe sql-case-id="desc_table_with_placeholder">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
         <column-wild name="___" start-index="15" stop-index="17" />
     </describe>
     <describe sql-case-id="desc_table_with_wild">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
         <column-wild name="u%" start-delimiter="`" end-delimiter="`" 
start-index="15" stop-index="18" />
     </describe>
     <describe sql-case-id="describe_table">
-        <table name="tableName" start-index="9" stop-index="17" />
+        <simple-table name="tableName" start-index="9" stop-index="17" />
     </describe>
     <describe sql-case-id="describe_table_with_col_name">
-        <table name="tableName" start-index="9" stop-index="17" />
+        <simple-table name="tableName" start-index="9" stop-index="17" />
         <column-wild name="colName" start-index="19" stop-index="25" />
     </describe>
     <describe sql-case-id="describe_table_with_placeholder">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
         <column-wild name="___" start-index="15" stop-index="17" />
     </describe>
     <describe sql-case-id="describe_table_with_wild">
-        <table name="tableName" start-index="5" stop-index="13" />
+        <simple-table name="tableName" start-index="5" stop-index="13" />
         <column-wild name="u%" start-delimiter="`" end-delimiter="`" 
start-index="15" stop-index="18" />
     </describe>
+    <describe sql-case-id="explain_table">
+        <table>
+            <simple-table name="t_order" start-index="14" stop-index="20" />
+            <column name="order_id" start-index="31" stop-index="38"/>
+            <limit literal-start-index="40" literal-stop-index="55">
+                <offset value="2" literal-start-index="55" 
literal-stop-index="55" />
+                <row-count value="1" literal-start-index="46" 
literal-stop-index="46" />
+            </limit>
+        </table>
+    </describe>
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
index 0416f0c..f2ad824 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
@@ -27,6 +27,7 @@
     <sql-case id="explain_create_remote_table_as_select" value="EXPLAIN CREATE 
REMOTE TABLE t_order_new AT ('Data Source = ds_0, 3306; User ID = ROOT; 
Password = 123456;') AS SELECT i.* FROM t_order_item i JOIN t_order o ON 
i.order_id = o.order_id" db-types="SQLServer" />
     <sql-case id="explain_with_analyze" value="EXPLAIN ANALYZE SELECT * FROM 
t_order WHERE order_id > 8" db-types="MySQL" />
     <sql-case id="explain_with_analyze_format" value="EXPLAIN ANALYZE FORMAT = 
TREE SELECT * FROM t_order WHERE order_id > 8" db-types="MySQL" />
+    <sql-case id="explain_table" value="EXPLAIN TABLE t_order ORDER BY 
order_id LIMIT 1 OFFSET 2" db-types="MySQL" />
     <sql-case id="desc_table" value="DESC tableName" db-types="MySQL" />
     <sql-case id="desc_table_with_col_name" value="DESC tableName colName" 
db-types="MySQL" />
     <sql-case id="desc_table_with_placeholder" value="DESC tableName ___" 
db-types="MySQL" />

Reply via email to