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>