You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2021/11/22 03:47:10 UTC

[shardingsphere] branch master updated: Refactor MySQL show databases SQL parser. (#13717)

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 6b6bc46  Refactor MySQL show databases SQL parser. (#13717)
6b6bc46 is described below

commit 6b6bc46271740d2b83af4da80c27debdfd5c6e87
Author: Zonglei Dong <do...@apache.org>
AuthorDate: Mon Nov 22 11:46:25 2021 +0800

    Refactor MySQL show databases SQL parser. (#13717)
    
    * add ShowFilterSegment test case, refactor MySQL show databases SQL parser.
    
    * add ShowFilterSegment test case, refactor MySQL show databases SQL parser.
    
    * Fixes MySQL show databases SQL parser.
---
 .../mysql/executor/ShowDatabasesExecutor.java      |  7 +++-
 .../mysql/executor/ShowDatabasesExecutorTest.java  | 17 +++++++--
 .../impl/MySQLDALStatementSQLVisitor.java          |  5 +--
 .../mysql/dal/MySQLShowDatabasesStatement.java     | 12 +++---
 .../dal/impl/ShowDatabasesStatementAssert.java     |  4 ++
 .../dal/ShowDatabasesStatementTestCase.java        |  8 ++++
 .../src/main/resources/case/dal/show.xml           | 43 +++++++++++++++++++++-
 .../src/main/resources/sql/supported/dal/show.xml  |  3 ++
 8 files changed, 83 insertions(+), 16 deletions(-)

diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
index 101d26f..7253943 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
@@ -65,8 +65,11 @@ public final class ShowDatabasesExecutor implements DatabaseAdminQueryExecutor {
     }
     
     private boolean checkLikePattern(final String schemaName) {
-        Optional<String> pattern = showDatabasesStatement.getLike().map(each -> SQLUtil.convertLikePatternToRegex(each.getPattern()));
-        return !pattern.isPresent() || schemaName.matches(pattern.get());
+        if (showDatabasesStatement.getFilter().isPresent()) {
+            Optional<String> pattern = showDatabasesStatement.getFilter().get().getLike().map(each -> SQLUtil.convertLikePatternToRegex(each.getPattern()));
+            return !pattern.isPresent() || schemaName.matches(pattern.get());
+        }
+        return true;
     }
     
     private Collection<ShardingSphereRule> getRules(final String schemaName) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
index e0d3504..2a6abb5 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
@@ -29,6 +29,7 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowFilterSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.ShowLikeSegment;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import org.junit.Before;
@@ -93,8 +94,10 @@ public final class ShowDatabasesExecutorTest {
     @Test
     public void assertExecuteWithPrefixLike() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
+        ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
         ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema%");
-        showDatabasesStatement.setLike(showLikeSegment);
+        showFilterSegment.setLike(showLikeSegment);
+        showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
         showDatabasesExecutor.execute(mockBackendConnection());
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
@@ -109,8 +112,10 @@ public final class ShowDatabasesExecutorTest {
     @Test
     public void assertExecuteWithSuffixLike() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
+        ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
         ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "%_1");
-        showDatabasesStatement.setLike(showLikeSegment);
+        showFilterSegment.setLike(showLikeSegment);
+        showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
         showDatabasesExecutor.execute(mockBackendConnection());
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
@@ -125,8 +130,10 @@ public final class ShowDatabasesExecutorTest {
     @Test
     public void assertExecuteWithPreciseLike() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
+        ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
         ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema_9");
-        showDatabasesStatement.setLike(showLikeSegment);
+        showFilterSegment.setLike(showLikeSegment);
+        showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
         showDatabasesExecutor.execute(mockBackendConnection());
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
@@ -141,8 +148,10 @@ public final class ShowDatabasesExecutorTest {
     @Test
     public void assertExecuteWithLikeMatchNone() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
+        ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
         ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema_not_exist");
-        showDatabasesStatement.setLike(showLikeSegment);
+        showFilterSegment.setLike(showLikeSegment);
+        showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
         showDatabasesExecutor.execute(mockBackendConnection());
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
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 7dc463f..00794c1 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
@@ -535,10 +535,9 @@ public final class MySQLDALStatementSQLVisitor extends MySQLStatementSQLVisitor
     public ASTNode visitShowDatabases(final ShowDatabasesContext ctx) {
         MySQLShowDatabasesStatement result = new MySQLShowDatabasesStatement();
         if (null != ctx.showFilter()) {
-            if (null != ctx.showFilter().showLike()) {
-                result.setLike((ShowLikeSegment) visit(ctx.showFilter().showLike()));
-            }
+            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/MySQLShowDatabasesStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowDatabasesStatement.java
index e0bdf7d..b681c72 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowDatabasesStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dal/MySQLShowDatabasesStatement.java
@@ -19,7 +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.dal.ShowLikeSegment;
+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;
@@ -33,14 +33,14 @@ import java.util.Optional;
 @ToString
 public final class MySQLShowDatabasesStatement extends AbstractSQLStatement implements DALStatement, MySQLStatement {
     
-    private ShowLikeSegment like;
+    private ShowFilterSegment filter;
     
     /**
-     * Get like segment.
+     * Get filter segment.
      *
-     * @return like segment
+     * @return filter segment
      */
-    public Optional<ShowLikeSegment> getLike() {
-        return Optional.ofNullable(like);
+    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/ShowDatabasesStatementAssert.java b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowDatabasesStatementAssert.java
index 1f2582d..2b82ace 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowDatabasesStatementAssert.java
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dal/impl/ShowDatabasesStatementAssert.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
+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.ShowDatabasesStatementTestCase;
 
 /**
@@ -37,5 +38,8 @@ public final class ShowDatabasesStatementAssert {
      * @param expected expected show databases statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final MySQLShowDatabasesStatement actual, final ShowDatabasesStatementTestCase expected) {
+        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/ShowDatabasesStatementTestCase.java b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowDatabasesStatementTestCase.java
index ceab4a3..473373b 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowDatabasesStatementTestCase.java
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dal/ShowDatabasesStatementTestCase.java
@@ -17,10 +17,18 @@
 
 package org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dal;
 
+import lombok.Getter;
+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;
+
 /**
  * Show databases statement test case.
  */
+@Getter
 public final class ShowDatabasesStatementTestCase extends SQLParserTestCase {
+    
+    @XmlElement
+    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 a32690e..94fac34 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
@@ -118,8 +118,49 @@
 
     <show-databases sql-case-id="show_databases" />
 
+    <show-databases sql-case-id="show_schemas" />
+
     <show-databases sql-case-id="show_databases_with_like">
-        <like pattern="sharding_db" start-index="15" stop-index="32" />
+        <filter start-index="15" stop-index="32">
+            <like pattern="sharding_db" start-delimiter="'" end-delimiter="'" start-index="15" stop-index="32"/>
+        </filter>
+    </show-databases>
+
+    <show-databases sql-case-id="show_databases_with_where_expr" parameters="'sharding_db'">
+        <filter start-index="15" stop-index="34" literal-stop-index="46">
+            <where start-index="15" stop-index="34" literal-stop-index="46">
+                <expr>
+                    <binary-operation-expression start-index="21" stop-index="34" literal-stop-index="46">
+                        <left>
+                            <column name="database" start-delimiter="`" end-delimiter="`" start-index="21" stop-index="30" />
+                        </left>
+                        <operator>=</operator>
+                        <right>
+                            <literal-expression value="sharding_db" start-index="34" stop-index="46" />
+                            <parameter-marker-expression value="0" start-index="34" stop-index="34" />
+                        </right>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </filter>
+    </show-databases>
+
+    <show-databases sql-case-id="show_databases_with_where_expr_no_parameter">
+        <filter start-index="15" stop-index="34" literal-stop-index="46">
+            <where start-index="15" stop-index="34" literal-stop-index="46">
+                <expr>
+                    <binary-operation-expression start-index="21" stop-index="34" literal-stop-index="46">
+                        <left>
+                            <column name="database" start-delimiter="`" end-delimiter="`" start-index="21" stop-index="30" />
+                        </left>
+                        <operator>=</operator>
+                        <right>
+                            <literal-expression value="sharding_db" start-index="34" stop-index="46" />
+                        </right>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </filter>
     </show-databases>
 
     <show-function-status sql-case-id="show_function_status" />
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 146c2e0..f3b9ede 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
@@ -38,7 +38,10 @@
     <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" />
+    <sql-case id="show_databases_with_where_expr" value="SHOW DATABASES where `database` = ?" db-types="MySQL" />
+    <sql-case id="show_databases_with_where_expr_no_parameter" value="SHOW DATABASES where `database` = 'sharding_db'" db-types="MySQL" />
     <sql-case id="show_function_status" value="SHOW FUNCTION STATUS" db-types="MySQL" />
     <sql-case id="show_procedure_status" value="SHOW PROCEDURE STATUS" db-types="MySQL" />
     <sql-case id="show_replicas" value="SHOW REPLICAS" db-types="MySQL" />