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 3f1ca7f  Refactor MySQL show tables SQL parser. (#13842)
3f1ca7f is described below

commit 3f1ca7f190a04723b9929729c953271667286879
Author: Zonglei Dong <[email protected]>
AuthorDate: Mon Nov 29 13:56:14 2021 +0800

    Refactor MySQL show tables SQL parser. (#13842)
    
    * add ShowFilterSegment, refactor MySQL show open tables SQL parser.
    
    * add ShowFilterSegment test case, refactor MySQL show open tables SQL 
parser.
    
    * add ShowFilterSegment, refactor MySQL show tables SQL parser.
    
    * add ShowFilterSegment test case, refactor MySQL show tables SQL parser.
    
    * Merge master code, fixes code conflict.
---
 .../admin/mysql/executor/ShowTablesExecutor.java   |  7 +-
 .../impl/MySQLDALStatementSQLVisitor.java          |  8 +--
 .../mysql/dal/MySQLShowTablesStatement.java        | 24 ++-----
 .../dal/impl/ShowTablesStatementAssert.java        | 39 ++---------
 .../statement/dal/ShowTablesStatementTestCase.java | 14 ++--
 .../src/main/resources/case/dal/show.xml           | 78 +++++++++++++++++++---
 .../src/main/resources/sql/supported/dal/show.xml  |  9 ++-
 7 files changed, 101 insertions(+), 78 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
index 5e40646..3a38062 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
@@ -77,8 +77,11 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     
     private Collection<String> getAllTableNames(final String schemaName) {
         Collection<String> allTableNames = 
ProxyContext.getInstance().getMetaData(schemaName).getSchema().getAllTableNames();
-        Optional<String> pattern = showTablesStatement.getLike().map(each -> 
SQLUtil.convertLikePatternToRegex(each.getPattern()));
-        return pattern.isPresent() ? allTableNames.stream().filter(each -> 
each.matches(pattern.get())).collect(Collectors.toList()) : allTableNames;
+        if (showTablesStatement.getFilter().isPresent()) {
+            Optional<String> pattern = 
showTablesStatement.getFilter().get().getLike().map(each -> 
SQLUtil.convertLikePatternToRegex(each.getPattern()));
+            return pattern.isPresent() ? allTableNames.stream().filter(each -> 
each.matches(pattern.get())).collect(Collectors.toList()) : allTableNames;
+        }
+        return allTableNames;
     }
     
     private QueryResultMetaData createQueryResultMetaData(final String 
schemaName) {
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 d932b7c..799e52c 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
@@ -578,13 +578,9 @@ public final class MySQLDALStatementSQLVisitor extends 
MySQLStatementSQLVisitor
             result.setFromSchema((FromSchemaSegment) visit(ctx.fromSchema()));
         }
         if (null != ctx.showFilter()) {
-            if (null != ctx.showFilter().showLike()) {
-                result.setLike((ShowLikeSegment) 
visit(ctx.showFilter().showLike()));
-            }
-            if (null != ctx.showFilter().showWhereClause()) {
-                result.setWhere((WhereSegment) 
visit(ctx.showFilter().showWhereClause()));
-            }
+            result.setFilter((ShowFilterSegment) visit(ctx.showFilter()));
         }
+        result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
 
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowTablesStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowTablesStatement.java
index 7c1e312..2250138 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowTablesStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowTablesStatement.java
@@ -20,8 +20,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.dal.FromSchemaSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowLikeSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowFilterSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.DALStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
@@ -37,9 +36,7 @@ public final class MySQLShowTablesStatement extends 
AbstractSQLStatement impleme
     
     private FromSchemaSegment fromSchema;
     
-    private ShowLikeSegment like;
-    
-    private WhereSegment where;
+    private ShowFilterSegment filter;
     
     /**
      * Get from schema segment.
@@ -51,20 +48,11 @@ public final class MySQLShowTablesStatement extends 
AbstractSQLStatement impleme
     }
     
     /**
-     * Get like segment.
-     *
-     * @return like segment
-     */
-    public Optional<ShowLikeSegment> getLike() {
-        return Optional.ofNullable(like);
-    }
-    
-    /**
-     * Get where segment.
+     * Get filter segment.
      *
-     * @return where segment
+     * @return filter segment
      */
-    public Optional<WhereSegment> getWhere() {
-        return Optional.ofNullable(where);
+    public Optional<ShowFilterSegment> getFilter() {
+        return Optional.ofNullable(filter);
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowTablesStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowTablesStatementAssert.java
index d37939e..dd6045f 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowTablesStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowTablesStatementAssert.java
@@ -22,12 +22,10 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.SQLSegmentAssert;
-import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.where.WhereClauseAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.schema.SchemaAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.show.ShowFilterAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dal.ShowTablesStatementTestCase;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 /**
  * Show tables statement assert.
  */
@@ -42,35 +40,12 @@ public final class ShowTablesStatementAssert {
      * @param expected expected show tables statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final MySQLShowTablesStatement actual, final ShowTablesStatementTestCase 
expected) {
-        assertSchema(assertContext, actual, expected);
-        assertLike(assertContext, actual, expected);
-        assertWhere(assertContext, actual, expected);
-    }
-    
-    private static void assertSchema(final SQLCaseAssertContext assertContext, 
final MySQLShowTablesStatement actual, final ShowTablesStatementTestCase 
expected) {
-        if (null != expected.getSchema()) {
-            assertTrue(assertContext.getText("Actual schema should exist."), 
actual.getFromSchema().isPresent());
-            SQLSegmentAssert.assertIs(assertContext, 
actual.getFromSchema().get(), expected.getSchema());
-        } else {
-            assertFalse(assertContext.getText("Actual schema should not 
exist."), actual.getFromSchema().isPresent());
-        }
-    }
-    
-    private static void assertLike(final SQLCaseAssertContext assertContext, 
final MySQLShowTablesStatement actual, final ShowTablesStatementTestCase 
expected) {
-        if (null != expected.getLike()) {
-            assertTrue(assertContext.getText("Actual like should exist."), 
actual.getLike().isPresent());
-            SQLSegmentAssert.assertIs(assertContext, actual.getLike().get(), 
expected.getLike());
-        } else {
-            assertFalse(assertContext.getText("Actual like should not 
exist."), actual.getLike().isPresent());
+        if (actual.getFromSchema().isPresent()) {
+            SchemaAssert.assertIs(assertContext, 
actual.getFromSchema().get().getSchema(), expected.getFromSchema().getSchema());
+            SQLSegmentAssert.assertIs(assertContext, 
actual.getFromSchema().get(), expected.getFromSchema());
         }
-    }
-    
-    private static void assertWhere(final SQLCaseAssertContext assertContext, 
final MySQLShowTablesStatement actual, final ShowTablesStatementTestCase 
expected) {
-        if (null != expected.getWhere()) {
-            assertTrue(assertContext.getText("Actual where should exist."), 
actual.getWhere().isPresent());
-            WhereClauseAssert.assertIs(assertContext, actual.getWhere().get(), 
expected.getWhere());
-        } else {
-            assertFalse(assertContext.getText("Actual where should not 
exist."), actual.getWhere().isPresent());
+        if (actual.getFilter().isPresent()) {
+            ShowFilterAssert.assertIs(assertContext, actual.getFilter().get(), 
expected.getFilter());
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowTablesStatementTestCase.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowTablesStatementTestCase.java
index db9bb09..23eea99 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowTablesStatementTestCase.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowTablesStatementTestCase.java
@@ -19,9 +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.like.ExpectedLikeClause;
-import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.schema.ExpectedSchema;
-import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.where.ExpectedWhereClause;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.from.ExpectedFromSchema;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.show.ExpectedShowFilter;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
@@ -33,12 +32,9 @@ import javax.xml.bind.annotation.XmlElement;
 @Setter
 public final class ShowTablesStatementTestCase extends SQLParserTestCase {
     
-    @XmlElement
-    private ExpectedSchema schema;
-    
-    @XmlElement
-    private ExpectedLikeClause like;
+    @XmlElement(name = "from")
+    private ExpectedFromSchema fromSchema;
     
     @XmlElement
-    private ExpectedWhereClause where;
+    private ExpectedShowFilter filter;
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/show.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/show.xml
index e6e0399..abb5afd 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/show.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/show.xml
@@ -106,15 +106,6 @@
     <show sql-case-id="show_server_version" />
     <show sql-case-id="show_transaction_isolation_level" />
 
-    <show-tables sql-case-id="show_tables">
-        <schema start-delimiter="`" end-delimiter="`" start-index="17" 
stop-index="34" />
-    </show-tables>
-
-    <show-tables sql-case-id="show_tables_with_filter">
-        <schema start-delimiter="`" end-delimiter="`" start-index="17" 
stop-index="34" />
-        <like pattern="t_order" start-index="36" stop-index="49" />
-    </show-tables>
-
     <show-databases sql-case-id="show_databases" />
 
     <show-databases sql-case-id="show_schemas" />
@@ -593,4 +584,73 @@
             </where>
         </filter>
     </show-events>
+
+    <show-tables sql-case-id="show_tables" />
+
+    <show-tables sql-case-id="show_extended_full_tables" />
+
+    <show-tables sql-case-id="show_tables_from_schema">
+        <from start-index="12" stop-index="29">
+            <schema name="sharding_db" start-delimiter="`" end-delimiter="`" 
start-index="17" stop-index="29"/>
+        </from>
+    </show-tables>
+
+    <show-tables sql-case-id="show_tables_in_schema">
+        <from start-index="12" stop-index="27">
+            <schema name="sharding_db" start-delimiter="`" end-delimiter="`" 
start-index="15" stop-index="27"/>
+        </from>
+    </show-tables>
+
+
+    <show-tables sql-case-id="show_tables_with_like_pattern">
+        <from start-index="12" stop-index="29">
+            <schema name="sharding_db" start-delimiter="`" end-delimiter="`" 
start-index="17" stop-index="29"/>
+        </from>
+        <filter start-index="31" stop-index="46">
+            <like pattern="t_order_%" start-delimiter="'" end-delimiter="'" 
start-index="31" stop-index="46"/>
+        </filter>
+    </show-tables>
+
+    <show-tables sql-case-id="show_tables_with_where_expr" parameters="'BASE 
TABLE'">
+        <from start-index="26" stop-index="43">
+            <schema name="sharding_db" start-delimiter="`" end-delimiter="`" 
start-index="31" stop-index="43"/>
+        </from>
+        <filter start-index="45" stop-index="66" literal-start-index="45" 
literal-stop-index="77">
+            <where start-index="45" stop-index="66" literal-start-index="45" 
literal-stop-index="77">
+                <expr>
+                    <binary-operation-expression start-index="51" 
stop-index="66" literal-start-index="51" literal-stop-index="77">
+                        <left>
+                            <column name="table_type" start-delimiter="`" 
end-delimiter="`" start-index="51" stop-index="62" />
+                        </left>
+                        <operator>=</operator>
+                        <right>
+                            <literal-expression value="BASE TABLE" 
start-index="66" stop-index="77" />
+                            <parameter-marker-expression value="0" 
start-index="66" stop-index="66" />
+                        </right>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </filter>
+    </show-tables>
+
+    <show-tables sql-case-id="show_tables_with_where_expr_no_parameter">
+        <from start-index="26" stop-index="43">
+            <schema name="sharding_db" start-delimiter="`" end-delimiter="`" 
start-index="31" stop-index="43"/>
+        </from>
+        <filter start-index="45" stop-index="77">
+            <where start-index="45" stop-index="77">
+                <expr>
+                    <binary-operation-expression start-index="51" 
stop-index="77">
+                        <left>
+                            <column name="table_type" start-delimiter="`" 
end-delimiter="`" start-index="51" stop-index="62" />
+                        </left>
+                        <operator>=</operator>
+                        <right>
+                            <literal-expression value="BASE TABLE" 
start-index="66" stop-index="77" />
+                        </right>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </filter>
+    </show-tables>
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/show.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/show.xml
index 7fafa10..12234b9 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/show.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/show.xml
@@ -34,8 +34,6 @@
     <sql-case id="show_all" value="SHOW ALL" db-types="PostgreSQL,openGauss" />
     <sql-case id="show_server_version" value="SHOW SERVER_VERSION" 
db-types="PostgreSQL,openGauss" />
     <sql-case id="show_transaction_isolation_level" value="SHOW TRANSACTION 
ISOLATION LEVEL" db-types="PostgreSQL,openGauss" />
-    <sql-case id="show_tables" value="SHOW FULL TABLES FROM `sharding_db`" 
db-types="MySQL" />
-    <sql-case id="show_tables_with_filter" value="SHOW FULL TABLES FROM 
`sharding_db` LIKE 't_order'" db-types="MySQL" />
     <sql-case id="show_databases" value="SHOW DATABASES" db-types="MySQL" />
     <sql-case id="show_schemas" value="SHOW SCHEMAS" db-types="MySQL" />
     <sql-case id="show_databases_with_like" value="SHOW DATABASES LIKE 
'sharding_db'" db-types="MySQL" />
@@ -89,4 +87,11 @@
     <sql-case id="show_events_with_like_pattern" value="SHOW EVENTS FROM 
`sharding_db` LIKE 'sharding_%'" db-types="MySQL" />
     <sql-case id="show_events_with_where_expr" value="SHOW EVENTS FROM 
`sharding_db` WHERE db = ?" db-types="MySQL" />
     <sql-case id="show_events_with_where_expr_no_parameter" value="SHOW EVENTS 
FROM `sharding_db` WHERE db = 'sharding_db'" db-types="MySQL" />
+    <sql-case id="show_tables" value="SHOW TABLES" db-types="MySQL" />
+    <sql-case id="show_extended_full_tables" value="SHOW EXTENDED FULL TABLES" 
db-types="MySQL" />
+    <sql-case id="show_tables_from_schema" value="SHOW TABLES FROM 
`sharding_db`" db-types="MySQL" />
+    <sql-case id="show_tables_in_schema" value="SHOW TABLES IN `sharding_db`" 
db-types="MySQL" />
+    <sql-case id="show_tables_with_like_pattern" value="SHOW TABLES FROM 
`sharding_db` LIKE 't_order_%'" db-types="MySQL" />
+    <sql-case id="show_tables_with_where_expr" value="SHOW EXTENDED FULL 
TABLES FROM `sharding_db` WHERE `table_type` = ?" db-types="MySQL" />
+    <sql-case id="show_tables_with_where_expr_no_parameter" value="SHOW 
EXTENDED FULL TABLES FROM `sharding_db` WHERE `table_type` = 'BASE TABLE'" 
db-types="MySQL" />
 </sql-cases>

Reply via email to