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 e4b94ec  Add MySQL parse support for `DESCRIBE Statement` (#14471)
e4b94ec is described below

commit e4b94ecdc49e27eee39f95a58a3ee14bc21060ff
Author: Guocheng Tang <[email protected]>
AuthorDate: Sat Jan 1 15:26:36 2022 +0800

    Add MySQL parse support for `DESCRIBE Statement` (#14471)
---
 .../impl/MySQLDALStatementSQLVisitor.java          |  6 +++++
 .../statement/mysql/dal/MySQLExplainStatement.java | 12 +++++++++
 .../statement/dal/impl/ExplainStatementAssert.java | 18 +++++++++++++
 .../statement/dal/ExplainStatementTestCase.java    |  8 ++++++
 .../src/main/resources/case/dal/explain.xml        | 30 ++++++++++++++++++++++
 .../main/resources/sql/supported/dal/explain.xml   |  8 ++++++
 6 files changed, 82 insertions(+)

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 0f16f5f..129f7ba 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
@@ -118,6 +118,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowLikeSegme
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssignSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
+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.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
@@ -525,6 +526,11 @@ public final class MySQLDALStatementSQLVisitor extends 
MySQLStatementSQLVisitor
         MySQLExplainStatement result = new MySQLExplainStatement();
         if (null != ctx.tableName()) {
             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()));
+            }
         } else if (null != ctx.explainableStatement()) {
             result.setStatement((SQLStatement) 
visit(ctx.explainableStatement()));
         } else if (null != ctx.select()) {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLExplainStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLExplainStatement.java
index fbef10a..7a59f6a 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLExplainStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLExplainStatement.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal;
 
 import lombok.Setter;
 import lombok.ToString;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
@@ -34,6 +35,8 @@ public final class MySQLExplainStatement extends 
ExplainStatement implements MyS
     
     private SimpleTableSegment table;
     
+    private ColumnSegment columnWild;
+    
     /**
      * Get simple table segment.
      * 
@@ -42,4 +45,13 @@ public final class MySQLExplainStatement extends 
ExplainStatement implements MyS
     public Optional<SimpleTableSegment> getTable() {
         return Optional.ofNullable(table);
     }
+
+    /**
+     * Get column segment.
+     *
+     * @return column segment
+     */
+    public Optional<ColumnSegment> getColumnWild() {
+        return Optional.ofNullable(columnWild);
+    }
 }
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 5ba8deb..8b7d233 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
@@ -20,7 +20,10 @@ package 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statemen
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLExplainStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.column.ColumnAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.SQLStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dal.ExplainStatementTestCase;
 
@@ -56,8 +59,23 @@ 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()) {
+            mysqlExplainStatementAssert(assertContext, (MySQLExplainStatement) 
actual, expected);
         } else {
             assertFalse(assertContext.getText("Actual statement should not 
exist."), actual.getStatement().isPresent());
         }
     }
+    
+    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());
+            if (actual.getColumnWild().isPresent()) {
+                ColumnAssert.assertIs(assertContext, 
actual.getColumnWild().get(), expected.getColumn());
+            } else {
+                assertFalse(assertContext.getText("Actual column wild should 
not exist."), actual.getColumnWild().isPresent());
+            }
+        } else {
+            assertFalse(assertContext.getText("Actual table should not 
exist."), actual.getTable().isPresent());
+        }
+    }
 }
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 2939a43..383936c 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
@@ -19,6 +19,8 @@ package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domai
 
 import lombok.Getter;
 import lombok.Setter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.table.ExpectedSimpleTable;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.ddl.CreateTableStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.DeleteStatementTestCase;
@@ -49,4 +51,10 @@ public final class ExplainStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "create-table")
     private CreateTableStatementTestCase createTableAsSelectClause;
+    
+    @XmlElement(name = "table")
+    private ExpectedSimpleTable tableName;
+    
+    @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 b7139ef..afc5f99 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
@@ -192,4 +192,34 @@
             </select>
         </create-table>
     </describe>
+    <describe sql-case-id="desc_table">
+        <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" />
+        <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" />
+        <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" />
+        <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" />
+    </describe>
+    <describe sql-case-id="describe_table_with_col_name">
+        <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" />
+        <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" />
+        <column-wild name="u%" start-delimiter="`" end-delimiter="`" 
start-index="15" stop-index="18" />
+    </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 d65de35..78cc34f 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
@@ -25,4 +25,12 @@
     <sql-case id="explain_create_table_as_select" value="EXPLAIN CREATE TABLE 
t_order_new WITH (DISTRIBUTION = HASH(product_key), CLUSTERED COLUMNSTORE 
INDEX, PARTITION (order_date RANGE RIGHT FOR VALUES (20000101,20010101))) AS 
SELECT * FROM t_order" db-types="SQLServer" />
     <sql-case id="explain_create_table_as_select_with_explicit_column_names" 
value="EXPLAIN CREATE TABLE t_order_new (order_id_new, user_id_new) WITH 
(DISTRIBUTION = HASH(product_key), CLUSTERED COLUMNSTORE INDEX, PARTITION 
(order_date RANGE RIGHT FOR VALUES (20000101,20010101))) AS SELECT order_id, 
user_id FROM t_order" db-types="SQLServer" />
     <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="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" />
+    <sql-case id="desc_table_with_wild" value="DESC tableName `u%`" 
db-types="MySQL" />
+    <sql-case id="describe_table" value="DESCRIBE tableName" db-types="MySQL" 
/>
+    <sql-case id="describe_table_with_col_name" value="DESCRIBE tableName 
colName" db-types="MySQL" />
+    <sql-case id="describe_table_with_placeholder" value="DESC tableName ___" 
db-types="MySQL" />
+    <sql-case id="describe_table_with_wild" value="DESC tableName `u%`" 
db-types="MySQL" />
 </sql-cases>

Reply via email to