This is an automated email from the ASF dual-hosted git repository.
RaigorJiang 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 4eda7ab28fe Refine DistSQL quoted text handling for identifiers and
strings (#38687)
4eda7ab28fe is described below
commit 4eda7ab28fea4660fe152160517ae712f4ac9226
Author: Raigor <[email protected]>
AuthorDate: Tue May 12 12:56:32 2026 +0800
Refine DistSQL quoted text handling for identifiers and strings (#38687)
* Support quoted identifiers for SHOW/REFRESH TABLE METADATA
* Refactor distSQLIdentifier and distSQLString
---
.../syntax/ral/refresh-table-metadata.cn.md | 24 +++++++----
.../syntax/ral/refresh-table-metadata.en.md | 22 ++++++----
.../distsql/syntax/ral/show-table-metadata.cn.md | 22 ++++++----
.../distsql/syntax/ral/show-table-metadata.en.md | 28 ++++++++-----
.../mode/manager/ContextManager.java | 34 ++++++++++++---
.../mode/manager/ContextManagerTest.java | 16 +++++++
.../engine/src/main/antlr4/imports/BaseRule.g4 | 26 ++++++++----
.../engine/src/main/antlr4/imports/Literals.g4 | 9 ++--
.../engine/src/main/antlr4/imports/RALStatement.g4 | 14 +++----
.../engine/src/main/antlr4/imports/RDLStatement.g4 | 10 ++---
.../engine/src/main/antlr4/imports/RQLStatement.g4 | 2 +-
.../core/kernel/KernelDistSQLStatementVisitor.java | 8 ++--
.../queryable/show/ShowTableMetaDataStatement.java | 5 ++-
.../updatable/RefreshTableMetaDataStatement.java | 9 ++--
.../export/ShowTableMetaDataExecutor.java | 7 ++--
.../refresh/RefreshTableMetaDataExecutor.java | 26 ++++++------
.../DistSQLQueryProxyBackendHandlerTest.java | 2 +-
.../DistSQLUpdateProxyBackendHandlerTest.java | 18 ++++----
.../export/ShowTableMetaDataExecutorTest.java | 49 +++++++++++++++++++++-
.../refresh/RefreshTableMetaDataExecutorTest.java | 36 +++++++++-------
.../ShowTableMetaDataStatementAssert.java | 26 ++++++++++--
.../RefreshTableMetaDataStatementAssert.java | 14 ++++++-
.../impl/identifier/ExpectedIdentifier.java | 22 ++++------
.../ral/RefreshTableMetaDataStatementTestCase.java | 10 +++--
.../ral/ShowTableMetaDataStatementTestCase.java | 3 +-
.../src/main/resources/case/ral/queryable.xml | 12 +++++-
.../src/main/resources/case/ral/updatable.xml | 29 +++++++++++--
.../parser/src/main/resources/case/rdl/alter.xml | 8 ++++
.../parser/src/main/resources/case/rdl/create.xml | 8 ++++
.../main/resources/sql/supported/ral/queryable.xml | 3 ++
.../main/resources/sql/supported/ral/updatable.xml | 4 ++
.../src/main/resources/sql/supported/rdl/alter.xml | 2 +
.../main/resources/sql/supported/rdl/create.xml | 2 +
.../main/resources/sql/unsupported/unsupported.xml | 2 +
34 files changed, 369 insertions(+), 143 deletions(-)
diff --git
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.cn.md
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.cn.md
index 22048b63a33..1acbec25aba 100644
---
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.cn.md
+++
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.cn.md
@@ -16,13 +16,19 @@ RefreshTableMetadata ::=
'REFRESH' 'TABLE' 'METADATA' (tableName | tableName 'FROM' 'STORAGE' 'UNIT'
storageUnitName ('SCHEMA' schemaName)?)?
tableName ::=
- identifier
+ distSQLIdentifier
storageUnitName ::=
- identifier
+ distSQLIdentifier
schemaName ::=
- identifier
+ distSQLIdentifier
+
+distSQLIdentifier ::=
+ identifier | quotedIdentifier
+
+quotedIdentifier ::=
+ '`' identifier '`' | '"' identifier '"'
```
{{% /tab %}}
{{% tab name="铁路图" %}}
@@ -38,30 +44,32 @@ schemaName ::=
- 如果 `SCHEMA` 中不存在表,则会删除该 `SCHEMA`。
+- `tableName`、`storageUnitName` 和 `schemaName`
可以写成不带引号的标识符、反引号包裹的标识符或双引号包裹的标识符。
+
### 示例
- 刷新指定存储单元中指定 `SCHEMA` 中指定表的元数据
```sql
-REFRESH TABLE METADATA t_order FROM STORAGE UNIT ds_1 SCHEMA db_schema;
+REFRESH TABLE METADATA `t_order` FROM STORAGE UNIT "ds_1" SCHEMA `db_schema`;
```
- 刷新指定存储单元中指定 `SCHEMA` 中所有表的元数据
```sql
-REFRESH TABLE METADATA FROM STORAGE UNIT ds_1 SCHEMA db_schema;
+REFRESH TABLE METADATA FROM STORAGE UNIT `ds_1` SCHEMA "db_schema";
```
- 刷新指定存储单元中指定表的元数据
```sql
-REFRESH TABLE METADATA t_order FROM STORAGE UNIT ds_1;
+REFRESH TABLE METADATA "t_order" FROM STORAGE UNIT ds_1;
```
- 刷新指定表的元数据
```sql
-REFRESH TABLE METADATA t_order;
+REFRESH TABLE METADATA `t_order`;
```
- 刷新所有表的元数据
@@ -76,4 +84,4 @@ REFRESH TABLE METADATA;
### 相关链接
-- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
\ No newline at end of file
+- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
diff --git
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.en.md
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.en.md
index 7fb04c3f1aa..58767094eab 100644
---
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.en.md
+++
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-table-metadata.en.md
@@ -16,13 +16,19 @@ RefreshTableMetadata ::=
'REFRESH' 'TABLE' 'METADATA' (tableName | tableName 'FROM' 'STORAGE' 'UNIT'
storageUnitName ('SCHEMA' schemaName)?)?
tableName ::=
- identifier
+ distSQLIdentifier
storageUnitName ::=
- identifier
+ distSQLIdentifier
schemaName ::=
- identifier
+ distSQLIdentifier
+
+distSQLIdentifier ::=
+ identifier | quotedIdentifier
+
+quotedIdentifier ::=
+ '`' identifier '`' | '"' identifier '"'
```
{{% /tab %}}
{{% tab name="Railroad diagram" %}}
@@ -38,31 +44,33 @@ schemaName ::=
- If there are no tables in the schema, the schema will be deleted.
+- `tableName`, `storageUnitName`, and `schemaName` can be unquoted
identifiers, backtick-quoted identifiers, or double-quoted identifiers.
+
### Example
- Refresh specified table's metadata in specified schema of a specified
storage unit
```sql
-REFRESH TABLE METADATA t_order FROM STORAGE UNIT ds_1 SCHEMA db_schema;
+REFRESH TABLE METADATA `t_order` FROM STORAGE UNIT "ds_1" SCHEMA `db_schema`;
```
- Refresh all tables' metadata in specified schema of a specified storage unit
```sql
-REFRESH TABLE METADATA FROM STORAGE UNIT ds_1 SCHEMA db_schema;
+REFRESH TABLE METADATA FROM STORAGE UNIT `ds_1` SCHEMA "db_schema";
```
- Refresh metadata for specified table in specified storage unit
```sql
-REFRESH TABLE METADATA t_order FROM STORAGE UNIT ds_1;
+REFRESH TABLE METADATA "t_order" FROM STORAGE UNIT ds_1;
```
- Refresh metadata for specified table
```sql
-REFRESH TABLE METADATA t_order;
+REFRESH TABLE METADATA `t_order`;
```
- Refresh all table metadata
diff --git
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.cn.md
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.cn.md
index 36e0c9aee26..a90db9c13b3 100644
---
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.cn.md
+++
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.cn.md
@@ -16,10 +16,16 @@ ShowTableMetadata ::=
'SHOW' 'TABLE' 'METADATA' tableName (',' tableName)* ('FROM' databaseName)?
tableName ::=
- identifier
+ distSQLIdentifier
databaseName ::=
- identifier
+ distSQLIdentifier
+
+distSQLIdentifier ::=
+ identifier | quotedIdentifier
+
+quotedIdentifier ::=
+ '`' identifier '`' | '"' identifier '"'
```
{{% /tab %}}
{{% tab name="铁路图" %}}
@@ -40,12 +46,14 @@ databaseName ::=
- 未指定 `databaseName` 时,默认是当前使用的 `DATABASE。` 如果也未使用 `DATABASE` 则会提示 `No
database selected`。
+- `tableName` 和 `databaseName` 可以写成不带引号的标识符、反引号包裹的标识符或双引号包裹的标识符。
+
### 示例
- 查询指定逻辑库中多个表的元数据
```sql
-SHOW TABLE METADATA t_order, t_order_1 FROM sharding_db;
+SHOW TABLE METADATA t_order, `t_order_1` FROM "sharding_db";
```
```sql
@@ -68,7 +76,7 @@ mysql> SHOW TABLE METADATA t_order, t_order_1 FROM
sharding_db;
- 查询指定逻辑库中单个表的元数据
```sql
-SHOW TABLE METADATA t_order FROM sharding_db;
+SHOW TABLE METADATA "t_order" FROM `sharding_db`;
```
```sql
@@ -87,7 +95,7 @@ mysql> SHOW TABLE METADATA t_order FROM sharding_db;
- 查询当前逻辑库中多个表的元数据
```sql
-SHOW TABLE METADATA t_order, t_order_1;
+SHOW TABLE METADATA `t_order`, "t_order_1";
```
```sql
@@ -110,7 +118,7 @@ mysql> SHOW TABLE METADATA t_order, t_order_1;
- 查询当前逻辑库中单个表的元数据
```sql
-SHOW TABLE METADATA t_order;
+SHOW TABLE METADATA "t_order";
```
```sql
@@ -132,4 +140,4 @@ mysql> SHOW TABLE METADATA t_order;
### 相关链接
-- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
\ No newline at end of file
+- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
diff --git
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.en.md
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.en.md
index ea4fcddc376..e7a5c1f0d0c 100644
---
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.en.md
+++
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/show-table-metadata.en.md
@@ -16,10 +16,16 @@ ShowTableMetadata ::=
'SHOW' 'TABLE' 'METADATA' tableName (',' tableName)* ('FROM' databaseName)?
tableName ::=
- identifier
+ distSQLIdentifier
databaseName ::=
- identifier
+ distSQLIdentifier
+
+distSQLIdentifier ::=
+ identifier | quotedIdentifier
+
+quotedIdentifier ::=
+ '`' identifier '`' | '"' identifier '"'
```
{{% /tab %}}
{{% tab name="Railroad diagram" %}}
@@ -40,16 +46,18 @@ databaseName ::=
- When `databaseName` is not specified, the default is the currently used
`DATABASE`. If `DATABASE` is not used, `No database selected` will be prompted.
+- `tableName` and `databaseName` can be unquoted identifiers, backtick-quoted
identifiers, or double-quoted identifiers.
+
### Example
- Query matadata of multiple tables from specified database
```sql
-SHOW TABLE METADATA t_order, t_order_1 FROM sharding_db;
+SHOW TABLE METADATA t_order, `t_order_1` FROM "sharding_db";
```
```sql
-mysql> SHOW TABLE METADATA t_order, t_order_1 FROM sharding_db;
+mysql> SHOW TABLE METADATA t_order, `t_order_1` FROM "sharding_db";
+-------------------+------------+--------+----------+
| schema_name | table_name | type | name |
+-------------------+------------+--------+----------+
@@ -68,11 +76,11 @@ mysql> SHOW TABLE METADATA t_order, t_order_1 FROM
sharding_db;
- Query metadata of one table from specified database
```sql
-SHOW TABLE METADATA t_order FROM sharding_db;
+SHOW TABLE METADATA "t_order" FROM `sharding_db`;
```
```sql
-mysql> SHOW TABLE METADATA t_order FROM sharding_db;
+mysql> SHOW TABLE METADATA "t_order" FROM `sharding_db`;
+-------------------+------------+--------+----------+
| schema_name | table_name | type | name |
+-------------------+------------+--------+----------+
@@ -87,11 +95,11 @@ mysql> SHOW TABLE METADATA t_order FROM sharding_db;
- Query metadata of multiple tables from current database
```sql
-SHOW TABLE METADATA t_order, t_order_1;
+SHOW TABLE METADATA `t_order`, "t_order_1";
```
```sql
-mysql> SHOW TABLE METADATA t_order, t_order_1;
+mysql> SHOW TABLE METADATA `t_order`, "t_order_1";
+-------------------+------------+--------+----------+
| schema_name | table_name | type | name |
+-------------------+------------+--------+----------+
@@ -110,11 +118,11 @@ mysql> SHOW TABLE METADATA t_order, t_order_1;
- Query metadata of one table from current database
```sql
-SHOW TABLE METADATA t_order;
+SHOW TABLE METADATA "t_order";
```
```sql
-mysql> SHOW TABLE METADATA t_order;
+mysql> SHOW TABLE METADATA "t_order";
+-------------------+------------+--------+----------+
| schema_name | table_name | type | name |
+-------------+------------+--------+----------+
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index f9a3e975623..a0c59c67756 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -51,6 +51,7 @@ import
org.apache.shardingsphere.mode.metadata.manager.resource.SwitchingResourc
import org.apache.shardingsphere.mode.persist.PersistServiceFacade;
import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
import org.apache.shardingsphere.mode.state.StateContext;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.sql.SQLException;
import java.util.Collection;
@@ -216,13 +217,24 @@ public final class ContextManager implements
AutoCloseable {
* @param tableName to be reloaded table name
*/
public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final String tableName) {
+ reloadTable(database, schemaName, new IdentifierValue(tableName));
+ }
+
+ /**
+ * Reload table.
+ *
+ * @param database database
+ * @param schemaName schema name
+ * @param tableName to be reloaded table name
+ */
+ public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final IdentifierValue tableName) {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(
database.getResourceMetaData().getStorageUnits(),
database.getRuleMetaData().getRules(),
metaDataContexts.getMetaData().getProps(), schemaName,
database.getIdentifierContext());
try {
persistTable(database, schemaName, tableName, material);
} catch (final SQLException ex) {
- log.error("Reload table: {} meta data of database: {} schema: {}
failed", tableName, database.getName(), schemaName, ex);
+ log.error("Reload table: {} meta data of database: {} schema: {}
failed", tableName.getValue(), database.getName(), schemaName, ex);
}
}
@@ -235,6 +247,18 @@ public final class ContextManager implements AutoCloseable
{
* @param tableName to be reloaded table name
*/
public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final String dataSourceName, final String tableName) {
+ reloadTable(database, schemaName, dataSourceName, new
IdentifierValue(tableName));
+ }
+
+ /**
+ * Reload table from single data source.
+ *
+ * @param database database
+ * @param schemaName schema name
+ * @param dataSourceName data source name
+ * @param tableName to be reloaded table name
+ */
+ public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final String dataSourceName, final IdentifierValue
tableName) {
StorageUnit storageUnit =
database.getResourceMetaData().getStorageUnits().get(dataSourceName);
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(
Collections.singletonMap(dataSourceName, storageUnit),
database.getRuleMetaData().getRules(),
metaDataContexts.getMetaData().getProps(), schemaName,
@@ -242,17 +266,17 @@ public final class ContextManager implements
AutoCloseable {
try {
persistTable(database, schemaName, tableName, material);
} catch (final SQLException ex) {
- log.error("Reload table: {} meta data of database: {} schema: {}
with data source: {} failed", tableName, database.getName(), schemaName,
dataSourceName, ex);
+ log.error("Reload table: {} meta data of database: {} schema: {}
with data source: {} failed", tableName.getValue(), database.getName(),
schemaName, dataSourceName, ex);
}
}
- private void persistTable(final ShardingSphereDatabase database, final
String schemaName, final String tableName, final GenericSchemaBuilderMaterial
material) throws SQLException {
- ShardingSphereSchema schema =
GenericSchemaBuilder.build(Collections.singleton(tableName),
database.getProtocolType(), material)
+ private void persistTable(final ShardingSphereDatabase database, final
String schemaName, final IdentifierValue tableName, final
GenericSchemaBuilderMaterial material) throws SQLException {
+ ShardingSphereSchema schema =
GenericSchemaBuilder.build(Collections.singleton(tableName.getValue()),
database.getProtocolType(), material)
.getOrDefault(schemaName, new ShardingSphereSchema(schemaName,
database.getProtocolType()));
if (schema.containsTable(tableName)) {
persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getTable().persist(database.getName(),
schemaName, Collections.singleton(schema.getTable(tableName)));
} else {
-
persistServiceFacade.getModeFacade().getMetaDataManagerService().dropTables(database,
schemaName, Collections.singleton(tableName));
+
persistServiceFacade.getModeFacade().getMetaDataManagerService().dropTables(database,
schemaName, Collections.singleton(tableName.getValue()));
}
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 0b2133a7158..8aa4128c616 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -53,6 +53,7 @@ import
org.apache.shardingsphere.mode.metadata.manager.resource.SwitchingResourc
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
import org.apache.shardingsphere.mode.persist.PersistServiceFacade;
import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -283,6 +284,21 @@ class ContextManagerTest {
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getTable()).persist("foo_db",
"foo_schema", Collections.singleton(table));
}
+ @Test
+ void assertReloadTableWithQuotedIdentifier() {
+ PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+ setPersistServiceFacade(persistServiceFacade);
+ ShardingSphereTable table = mock(ShardingSphereTable.class);
+ when(table.getName()).thenReturn("FOO_TBL");
+ ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
databaseType, Collections.singleton(table), Collections.emptyList());
+ try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock =
mockStatic(GenericSchemaBuilder.class)) {
+ schemaBuilderMock.when(() -> GenericSchemaBuilder.build(anySet(),
any(DatabaseType.class), any(GenericSchemaBuilderMaterial.class)))
+ .thenReturn(Collections.singletonMap("foo_schema",
schema));
+ contextManager.reloadTable(database, "foo_schema", new
IdentifierValue("\"FOO_TBL\""));
+ }
+
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getTable()).persist("foo_db",
"foo_schema", Collections.singleton(table));
+ }
+
@Test
void assertReloadTableWithDataSourceName() {
PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
diff --git a/parser/distsql/engine/src/main/antlr4/imports/BaseRule.g4
b/parser/distsql/engine/src/main/antlr4/imports/BaseRule.g4
index 9e699151ed6..5f1f6d973b5 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/BaseRule.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/BaseRule.g4
@@ -20,7 +20,7 @@ grammar BaseRule;
import Symbol, Keyword, Literals;
literal
- : STRING_ | (MINUS_)? INT_ | TRUE | FALSE
+ : distSQLString | (MINUS_)? INT_ | TRUE | FALSE
;
algorithmDefinition
@@ -28,7 +28,7 @@ algorithmDefinition
;
algorithmTypeName
- : STRING_
+ : distSQLString
;
propertiesDefinition
@@ -40,29 +40,37 @@ properties
;
property
- : key=STRING_ EQ_ value=literal
+ : key=distSQLString EQ_ value=literal
;
databaseName
- : IDENTIFIER_
+ : distSQLIdentifier
;
schemaName
- : IDENTIFIER_
+ : distSQLIdentifier
;
tableName
- : IDENTIFIER_
+ : distSQLIdentifier
;
resourceName
- : IDENTIFIER_
+ : distSQLIdentifier
;
storageUnitName
- : IDENTIFIER_
+ : distSQLIdentifier
;
metadata
- : STRING_
+ : distSQLString
+ ;
+
+distSQLIdentifier
+ : IDENTIFIER_ | DOUBLE_QUOTED_TEXT
+ ;
+
+distSQLString
+ : SINGLE_QUOTED_TEXT | DOUBLE_QUOTED_TEXT
;
diff --git a/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
b/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
index 68f6a1b07ed..5edbf3ccc77 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
@@ -24,9 +24,12 @@ IDENTIFIER_
| BQ_ ~'`'+ BQ_
;
-STRING_
- : (DQ_ ('\\'. | '""' | ~('"' | '\\'))* DQ_)
- | (SQ_ ('\\'. | '\'\'' | ~('\'' | '\\'))* SQ_)
+DOUBLE_QUOTED_TEXT
+ : DQ_ ('\\'. | '""' | ~('"' | '\\'))* DQ_
+ ;
+
+SINGLE_QUOTED_TEXT
+ : SQ_ ('\\'. | '\'\'' | ~('\'' | '\\'))* SQ_
;
INT_
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
index 9eff44ac377..47b6cb55325 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
@@ -120,19 +120,19 @@ showLoadBalanceAlgorithmPlugins
;
confPath
- : STRING_
+ : distSQLString
;
filePath
- : STRING_
+ : distSQLString
;
metaDataValue
- : STRING_
+ : distSQLString
;
variableName
- : IDENTIFIER_ | STRING_
+ : IDENTIFIER_ | distSQLString
;
variableValues
@@ -144,7 +144,7 @@ variableValue
;
instanceId
- : IDENTIFIER_ | STRING_
+ : IDENTIFIER_ | distSQLString
;
refreshScope
@@ -168,9 +168,9 @@ showLike
;
likePattern
- : STRING_
+ : distSQLString
;
pluginClass
- : STRING_
+ : distSQLString
;
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
b/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
index 5dfb4f7a0bd..10ca410f931 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
@@ -48,7 +48,7 @@ urlSource
;
hostname
- : STRING_
+ : distSQLString
;
port
@@ -56,19 +56,19 @@ port
;
dbName
- : STRING_
+ : distSQLString
;
url
- : STRING_
+ : distSQLString
;
user
- : STRING_
+ : distSQLString
;
password
- : STRING_
+ : distSQLString
;
ignoreTables
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
b/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
index 3a8be149365..b488c1ae74d 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
@@ -36,5 +36,5 @@ showLike
;
likePattern
- : STRING_
+ : distSQLString
;
diff --git
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index 442e0bdc269..9f46b76bb38 100644
---
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -135,7 +135,7 @@ public final class KernelDistSQLStatementVisitor extends
KernelDistSQLStatementB
@Override
public ASTNode visitShowTableMetadata(final ShowTableMetadataContext ctx) {
- Collection<String> tableNames =
ctx.tableName().stream().map(IdentifierValueUtils::getValue).collect(Collectors.toSet());
+ Collection<IdentifierValue> tableNames =
ctx.tableName().stream().map(each -> new
IdentifierValue(each.getText())).collect(Collectors.toSet());
return new ShowTableMetaDataStatement(tableNames, null ==
ctx.databaseName()
? null
: new
FromDatabaseSegment(ctx.FROM().getSymbol().getStartIndex(), (DatabaseSegment)
visit(ctx.databaseName())));
@@ -263,12 +263,12 @@ public final class KernelDistSQLStatementVisitor extends
KernelDistSQLStatementB
return new RefreshTableMetaDataStatement();
}
String storageUnitName = null;
- String schemaName = null;
- String tableName =
IdentifierValueUtils.getValue(ctx.refreshScope().tableName());
+ IdentifierValue schemaName = null;
+ IdentifierValue tableName = null == ctx.refreshScope().tableName() ?
null : new IdentifierValue(ctx.refreshScope().tableName().getText());
if (null != ctx.refreshScope().fromSegment()) {
FromSegmentContext fromSegment = ctx.refreshScope().fromSegment();
storageUnitName =
IdentifierValueUtils.getValue(fromSegment.storageUnitName());
- schemaName = null == fromSegment.schemaName() ? null :
IdentifierValueUtils.getValue(fromSegment.schemaName());
+ schemaName = null == fromSegment.schemaName() ? null : new
IdentifierValue(fromSegment.schemaName().getText());
}
return new RefreshTableMetaDataStatement(tableName, storageUnitName,
schemaName);
}
diff --git
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/queryable/show/ShowTableMetaDataStatement.java
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/queryable/show/ShowTableMetaDataStatement.java
index 1fdce2dc3c1..780f55d462c 100644
---
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/queryable/show/ShowTableMetaDataStatement.java
+++
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/queryable/show/ShowTableMetaDataStatement.java
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.distsql.statement.type.ral.queryable.QueryableR
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.util.Collection;
@@ -31,13 +32,13 @@ import java.util.Collection;
@Getter
public final class ShowTableMetaDataStatement extends QueryableRALStatement {
- private final Collection<String> tableNames;
+ private final Collection<IdentifierValue> tableNames;
private final FromDatabaseSegment fromDatabase;
private final SQLStatementAttributes attributes;
- public ShowTableMetaDataStatement(final Collection<String> tableNames,
final FromDatabaseSegment fromDatabase) {
+ public ShowTableMetaDataStatement(final Collection<IdentifierValue>
tableNames, final FromDatabaseSegment fromDatabase) {
this.tableNames = tableNames;
this.fromDatabase = fromDatabase;
attributes = new SQLStatementAttributes(new
FromDatabaseSQLStatementAttribute(fromDatabase));
diff --git
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/updatable/RefreshTableMetaDataStatement.java
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/updatable/RefreshTableMetaDataStatement.java
index d72a38d4615..d884ec260fe 100644
---
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/updatable/RefreshTableMetaDataStatement.java
+++
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/type/ral/updatable/RefreshTableMetaDataStatement.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.distsql.statement.type.ral.updatable;
import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.util.Optional;
@@ -27,11 +28,11 @@ import java.util.Optional;
@RequiredArgsConstructor
public final class RefreshTableMetaDataStatement extends UpdatableRALStatement
{
- private final String tableName;
+ private final IdentifierValue tableName;
private final String storageUnitName;
- private final String schemaName;
+ private final IdentifierValue schemaName;
public RefreshTableMetaDataStatement() {
this(null, null, null);
@@ -42,7 +43,7 @@ public final class RefreshTableMetaDataStatement extends
UpdatableRALStatement {
*
* @return table name
*/
- public Optional<String> getTableName() {
+ public Optional<IdentifierValue> getTableName() {
return Optional.ofNullable(tableName);
}
@@ -60,7 +61,7 @@ public final class RefreshTableMetaDataStatement extends
UpdatableRALStatement {
*
* @return schema name
*/
- public Optional<String> getSchemaName() {
+ public Optional<IdentifierValue> getSchemaName() {
return Optional.ofNullable(schemaName);
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutor.java
index 1f3d2e58af4..90d23128a9f 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutor.java
@@ -29,6 +29,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.util.Arrays;
import java.util.Collection;
@@ -56,11 +57,11 @@ public final class ShowTableMetaDataExecutor implements
DistSQLQueryExecutor<Sho
.filter(schema::containsTable).map(each ->
buildTableRows(database.getName(), schema,
each)).flatMap(Collection::stream).collect(Collectors.toList());
}
- private Collection<LocalDataQueryResultRow> buildTableRows(final String
databaseName, final ShardingSphereSchema schema, final String tableName) {
+ private Collection<LocalDataQueryResultRow> buildTableRows(final String
databaseName, final ShardingSphereSchema schema, final IdentifierValue
tableName) {
Collection<LocalDataQueryResultRow> result = new LinkedList<>();
ShardingSphereTable table = schema.getTable(tableName);
- result.addAll(table.getAllColumns().stream().map(each ->
buildColumnRow(databaseName, tableName, each)).collect(Collectors.toList()));
- result.addAll(table.getAllIndexes().stream().map(each ->
buildIndexRow(databaseName, tableName, each)).collect(Collectors.toList()));
+ result.addAll(table.getAllColumns().stream().map(each ->
buildColumnRow(databaseName, table.getName(),
each)).collect(Collectors.toList()));
+ result.addAll(table.getAllIndexes().stream().map(each ->
buildIndexRow(databaseName, table.getName(),
each)).collect(Collectors.toList()));
return result;
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutor.java
index c6aa70961f4..1e326acd776 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutor.java
@@ -30,6 +30,7 @@ import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storag
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.util.Collections;
import java.util.Map;
@@ -44,28 +45,29 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
@Override
public void executeUpdate(final RefreshTableMetaDataStatement
sqlStatement, final ContextManager contextManager) {
- String schemaName = getSchemaName(sqlStatement);
+ IdentifierValue schemaName = getSchemaName(sqlStatement);
checkBeforeUpdate(sqlStatement, schemaName);
if (sqlStatement.getStorageUnitName().isPresent()) {
+ String actualSchemaName = database.getSchema(schemaName).getName();
if (sqlStatement.getTableName().isPresent()) {
- contextManager.reloadTable(database, schemaName,
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
+ contextManager.reloadTable(database, actualSchemaName,
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
} else {
- contextManager.reloadSchema(database, schemaName,
sqlStatement.getStorageUnitName().get());
+ contextManager.reloadSchema(database, actualSchemaName,
sqlStatement.getStorageUnitName().get());
}
return;
}
if (sqlStatement.getTableName().isPresent()) {
- contextManager.reloadTable(database, schemaName,
sqlStatement.getTableName().get());
+ contextManager.reloadTable(database,
database.getSchema(schemaName).getName(), sqlStatement.getTableName().get());
} else {
contextManager.reloadDatabase(database);
}
}
- private String getSchemaName(final RefreshTableMetaDataStatement
sqlStatement) {
- return sqlStatement.getSchemaName().isPresent() ?
sqlStatement.getSchemaName().get() : new
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName());
+ private IdentifierValue getSchemaName(final RefreshTableMetaDataStatement
sqlStatement) {
+ return sqlStatement.getSchemaName().orElseGet(() -> new
IdentifierValue(new
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName())));
}
- private void checkBeforeUpdate(final RefreshTableMetaDataStatement
sqlStatement, final String schemaName) {
+ private void checkBeforeUpdate(final RefreshTableMetaDataStatement
sqlStatement, final IdentifierValue schemaName) {
checkStorageUnit(database.getResourceMetaData().getStorageUnits(),
sqlStatement);
checkSchema(schemaName);
checkTable(sqlStatement, schemaName);
@@ -79,14 +81,14 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
}
}
- private void checkSchema(final String schemaName) {
-
ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), ()
-> new SchemaNotFoundException(schemaName));
+ private void checkSchema(final IdentifierValue schemaName) {
+
ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), ()
-> new SchemaNotFoundException(schemaName.getValue()));
}
- private void checkTable(final RefreshTableMetaDataStatement sqlStatement,
final String schemaName) {
+ private void checkTable(final RefreshTableMetaDataStatement sqlStatement,
final IdentifierValue schemaName) {
if (sqlStatement.getTableName().isPresent()) {
- String tableName = sqlStatement.getTableName().get();
-
ShardingSpherePreconditions.checkState(database.getSchema(schemaName).containsTable(tableName),
() -> new TableNotFoundException(tableName));
+ IdentifierValue tableName = sqlStatement.getTableName().get();
+
ShardingSpherePreconditions.checkState(database.getSchema(schemaName).containsTable(tableName),
() -> new TableNotFoundException(tableName.getValue()));
}
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryProxyBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryProxyBackendHandlerTest.java
index 26d31c804ab..95928ca0740 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryProxyBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryProxyBackendHandlerTest.java
@@ -117,7 +117,7 @@ class DistSQLQueryProxyBackendHandlerTest {
}
private ShowTableMetaDataStatement createSqlStatement() {
- return new
ShowTableMetaDataStatement(Collections.singleton("t_order"), new
FromDatabaseSegment(0, new DatabaseSegment(0, 0, new
IdentifierValue("foo_db"))));
+ return new ShowTableMetaDataStatement(Collections.singleton(new
IdentifierValue("t_order")), new FromDatabaseSegment(0, new DatabaseSegment(0,
0, new IdentifierValue("foo_db"))));
}
@SuppressWarnings("unchecked")
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateProxyBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateProxyBackendHandlerTest.java
index 38e14e32925..3e1b1cbf2c6 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateProxyBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateProxyBackendHandlerTest.java
@@ -17,10 +17,9 @@
package org.apache.shardingsphere.proxy.backend.handler.distsql;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.distsql.statement.type.ral.updatable.RefreshTableMetaDataStatement;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
@@ -35,6 +34,7 @@ import
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Answers;
@@ -48,7 +48,7 @@ import java.util.Properties;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isA;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -83,7 +83,7 @@ class DistSQLUpdateProxyBackendHandlerTest {
ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
databaseType, resourceMetaData, ruleMetaData,
Collections.emptyList(), new ConfigurationProperties(new
Properties()));
when(contextManager.getDatabase("foo_db")).thenReturn(database);
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement("t_order", "ds_1", null);
+ RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(new IdentifierValue("t_order"), "ds_1", null);
DistSQLUpdateProxyBackendHandler backendHandler = new
DistSQLUpdateProxyBackendHandler(sqlStatement, mockQueryContext(),
mockConnectionSession(), contextManager);
assertThrows(MissingRequiredStorageUnitsException.class,
backendHandler::execute);
}
@@ -98,7 +98,7 @@ class DistSQLUpdateProxyBackendHandlerTest {
ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
databaseType, resourceMetaData, ruleMetaData,
Collections.emptyList(), new ConfigurationProperties(new
Properties()));
when(contextManager.getDatabase("foo_db")).thenReturn(database);
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement("t_order", "ds_0", "bar_db");
+ RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(new IdentifierValue("t_order"), "ds_0", new
IdentifierValue("bar_db"));
DistSQLUpdateProxyBackendHandler backendHandler = new
DistSQLUpdateProxyBackendHandler(sqlStatement, mockQueryContext(),
mockConnectionSession(), contextManager);
assertThrows(SchemaNotFoundException.class, backendHandler::execute);
}
@@ -109,11 +109,11 @@ class DistSQLUpdateProxyBackendHandlerTest {
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
- when(database.containsSchema("foo_db")).thenReturn(true);
- when(database.getSchema("foo_db")).thenReturn(schema);
+ when(database.containsSchema(new
IdentifierValue("foo_db"))).thenReturn(true);
+ when(database.getSchema(new
IdentifierValue("foo_db"))).thenReturn(schema);
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
when(contextManager.getDatabase("foo_db")).thenReturn(database);
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement("t_order", "ds_0", "foo_db");
+ RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(new IdentifierValue("t_order"), "ds_0", new
IdentifierValue("foo_db"));
DistSQLUpdateProxyBackendHandler backendHandler = new
DistSQLUpdateProxyBackendHandler(sqlStatement, mockQueryContext(),
mockConnectionSession(), contextManager);
assertThrows(TableNotFoundException.class, backendHandler::execute);
}
@@ -123,7 +123,7 @@ class DistSQLUpdateProxyBackendHandlerTest {
ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
- when(database.containsSchema(nullable(String.class))).thenReturn(true);
+
when(database.containsSchema(any(IdentifierValue.class))).thenReturn(true);
when(database.getProtocolType()).thenReturn(databaseType);
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
when(contextManager.getDatabase("foo_db")).thenReturn(database);
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutorTest.java
index 63e3eb8833f..c2914c61b22 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/export/ShowTableMetaDataExecutorTest.java
@@ -19,8 +19,12 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ex
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.distsql.statement.type.ral.queryable.show.ShowTableMetaDataStatement;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -37,9 +41,11 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Properties;
-import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -70,6 +76,31 @@ class ShowTableMetaDataExecutorTest {
assertThat(row.getCell(5),
is("{\"name\":\"primary\",\"columns\":[],\"unique\":false}"));
}
+ @Test
+ void assertExecuteWithPostgreSQLQuotedUpperCaseTable() {
+ ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
+ executor.setDatabase(createDatabase("foo_db", "PostgreSQL", "public",
"T_USER_UPPER"));
+ Collection<LocalDataQueryResultRow> actual = executor.getRows(new
ShowTableMetaDataStatement(Collections.singleton(new
IdentifierValue("\"T_USER_UPPER\"")), null), mock(ContextManager.class));
+ assertThat(actual.size(), is(2));
+ assertThat(actual.iterator().next().getCell(2), is("T_USER_UPPER"));
+ }
+
+ @Test
+ void assertExecuteWithPostgreSQLUnquotedUpperCaseTable() {
+ ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
+ executor.setDatabase(createDatabase("foo_db", "PostgreSQL", "public",
"T_USER_UPPER"));
+ assertTrue(executor.getRows(new
ShowTableMetaDataStatement(Collections.singleton(new
IdentifierValue("T_USER_UPPER")), null), mock(ContextManager.class)).isEmpty());
+ }
+
+ @Test
+ void assertExecuteWithMySQLUpperCaseTable() {
+ ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
+ executor.setDatabase(createDatabase("foo_db", "MySQL", "foo_db",
"T_USER_UPPER"));
+ Collection<LocalDataQueryResultRow> actual = executor.getRows(new
ShowTableMetaDataStatement(Collections.singleton(new
IdentifierValue("t_user_upper")), null), mock(ContextManager.class));
+ assertThat(actual.size(), is(2));
+ assertThat(actual.iterator().next().getCell(2), is("T_USER_UPPER"));
+ }
+
private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
@@ -84,7 +115,21 @@ class ShowTableMetaDataExecutorTest {
return Collections.singleton(new ShardingSphereTable("t_order",
columns, indexes, Collections.emptyList()));
}
+ private Collection<ShardingSphereTable> createTables(final String
tableName) {
+ Collection<ShardingSphereColumn> columns =
Collections.singletonList(new ShardingSphereColumn("order_id", 0, false, false,
false, true, false, false));
+ Collection<ShardingSphereIndex> indexes =
Collections.singletonList(new ShardingSphereIndex("primary",
Collections.emptyList(), false));
+ return Collections.singleton(new ShardingSphereTable(tableName,
columns, indexes, Collections.emptyList()));
+ }
+
+ private ShardingSphereDatabase createDatabase(final String databaseName,
final String databaseType, final String schemaName, final String tableName) {
+ DatabaseType type = TypedSPILoader.getService(DatabaseType.class,
databaseType);
+ StorageUnit storageUnit = mock(StorageUnit.class);
+ when(storageUnit.getStorageType()).thenReturn(type);
+ return new ShardingSphereDatabase(databaseName, type, new
ResourceMetaData(Collections.emptyMap(), Collections.singletonMap("foo_ds",
storageUnit)), mock(RuleMetaData.class),
+ Collections.singleton(new ShardingSphereSchema(schemaName,
type, createTables(tableName), Collections.emptyList())), new
ConfigurationProperties(new Properties()));
+ }
+
private ShowTableMetaDataStatement createSqlStatement() {
- return new
ShowTableMetaDataStatement(Collections.singleton("t_order"), new
FromDatabaseSegment(0, new DatabaseSegment(0, 0, new
IdentifierValue("foo_db"))));
+ return new ShowTableMetaDataStatement(Collections.singleton(new
IdentifierValue("t_order")), new FromDatabaseSegment(0, new DatabaseSegment(0,
0, new IdentifierValue("foo_db"))));
}
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
index c7ee3889802..a320aa71757 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
@@ -34,6 +34,7 @@ import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
@@ -41,6 +42,7 @@ import java.util.Collections;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
@@ -58,40 +60,44 @@ class RefreshTableMetaDataExecutorTest {
void assertExecuteUpdateWithReloadTableWithStorageUnit() {
ShardingSphereDatabase database = mockDatabase(true);
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
- when(schema.containsTable("t_order")).thenReturn(true);
- when(database.getSchema("logic_schema")).thenReturn(schema);
+ when(schema.getName()).thenReturn("logic_schema");
+ when(schema.containsTable(new
IdentifierValue("t_order"))).thenReturn(true);
+ when(database.getSchema(new
IdentifierValue("logic_schema"))).thenReturn(schema);
ContextManager contextManager = mock(ContextManager.class);
executor.setDatabase(database);
- executor.executeUpdate(new RefreshTableMetaDataStatement("t_order",
"ds_0", "logic_schema"), contextManager);
- verify(contextManager).reloadTable(database, "logic_schema", "ds_0",
"t_order");
+ executor.executeUpdate(new RefreshTableMetaDataStatement(new
IdentifierValue("t_order"), "ds_0", new IdentifierValue("logic_schema")),
contextManager);
+ verify(contextManager).reloadTable(database, "logic_schema", "ds_0",
new IdentifierValue("t_order"));
}
@Test
void assertExecuteUpdateWithReloadSchemaWithStorageUnit() {
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(null, "ds_0", "logic_schema");
ShardingSphereDatabase database = mockDatabase(true);
+ ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+ when(schema.getName()).thenReturn("logic_schema");
+ when(database.getSchema(new
IdentifierValue("logic_schema"))).thenReturn(schema);
ContextManager contextManager = mock(ContextManager.class);
executor.setDatabase(database);
- executor.executeUpdate(sqlStatement, contextManager);
+ executor.executeUpdate(new RefreshTableMetaDataStatement(null, "ds_0",
new IdentifierValue("logic_schema")), contextManager);
verify(contextManager).reloadSchema(database, "logic_schema", "ds_0");
}
@Test
void assertExecuteUpdateWithReloadTableWithoutStorageUnit() {
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement("t_order", null, null);
+ RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(new IdentifierValue("t_order"), null, null);
ShardingSphereDatabase database = mockDatabase(true);
when(database.getProtocolType()).thenReturn(databaseType);
DialectDatabaseMetaData dialectDatabaseMetaData =
mockDialectDatabaseMetaData();
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
- when(schema.containsTable("t_order")).thenReturn(true);
- when(database.getSchema("public")).thenReturn(schema);
+ when(schema.getName()).thenReturn("public");
+ when(schema.containsTable(new
IdentifierValue("t_order"))).thenReturn(true);
+ when(database.getSchema(new
IdentifierValue("public"))).thenReturn(schema);
ContextManager contextManager = mock(ContextManager.class);
executor.setDatabase(database);
try (MockedStatic<DatabaseTypedSPILoader> mockedStatic =
mockStatic(DatabaseTypedSPILoader.class)) {
mockedStatic.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
executor.executeUpdate(sqlStatement, contextManager);
}
- verify(contextManager).reloadTable(database, "public", "t_order");
+ verify(contextManager).reloadTable(database, "public", new
IdentifierValue("t_order"));
}
@Test
@@ -140,7 +146,7 @@ class RefreshTableMetaDataExecutorTest {
@Test
void assertExecuteUpdateWhenSchemaMissing() {
- RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(null, null, "absent_schema");
+ RefreshTableMetaDataStatement sqlStatement = new
RefreshTableMetaDataStatement(null, null, new IdentifierValue("absent_schema"));
ShardingSphereDatabase database = mockDatabase(false);
executor.setDatabase(database);
assertThrows(SchemaNotFoundException.class, () ->
executor.executeUpdate(sqlStatement, mock(ContextManager.class)));
@@ -150,10 +156,11 @@ class RefreshTableMetaDataExecutorTest {
void assertExecuteUpdateWhenTableMissing() {
ShardingSphereDatabase database = mockDatabase(true);
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
- when(schema.containsTable("missing_table")).thenReturn(false);
- when(database.getSchema("logic_schema")).thenReturn(schema);
+ when(schema.containsTable(new
IdentifierValue("missing_table"))).thenReturn(false);
+ when(database.getSchema(new
IdentifierValue("logic_schema"))).thenReturn(schema);
executor.setDatabase(database);
- assertThrows(TableNotFoundException.class, () ->
executor.executeUpdate(new RefreshTableMetaDataStatement("missing_table", null,
"logic_schema"), mock(ContextManager.class)));
+ assertThrows(TableNotFoundException.class,
+ () -> executor.executeUpdate(new
RefreshTableMetaDataStatement(new IdentifierValue("missing_table"), null, new
IdentifierValue("logic_schema")), mock(ContextManager.class)));
}
private ShardingSphereDatabase mockDatabase(final boolean schemaExists) {
@@ -161,6 +168,7 @@ class RefreshTableMetaDataExecutorTest {
when(result.getName()).thenReturn("logic_db");
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
mock(StorageUnit.class)));
when(result.containsSchema(anyString())).thenReturn(schemaExists);
+
when(result.containsSchema(any(IdentifierValue.class))).thenReturn(schemaExists);
return result;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/queryable/ShowTableMetaDataStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/queryable/ShowTableMetaDataStatementAssert.java
index ca55ec213cd..0f259346c60 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/queryable/ShowTableMetaDataStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/queryable/ShowTableMetaDataStatementAssert.java
@@ -20,13 +20,18 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.distsql.statement.type.ral.queryable.show.ShowTableMetaDataStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.database.DatabaseAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ExistingAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.identifier.ExpectedIdentifier;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ShowTableMetaDataStatementTestCase;
-import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Show table meta data statement assert.
@@ -43,8 +48,23 @@ public final class ShowTableMetaDataStatementAssert {
*/
public static void assertIs(final SQLCaseAssertContext assertContext,
final ShowTableMetaDataStatement actual, final
ShowTableMetaDataStatementTestCase expected) {
if (ExistingAssert.assertIs(assertContext, actual, expected)) {
- DatabaseAssert.assertIs(assertContext,
actual.getFromDatabase().getDatabase(), expected.getDatabase());
- assertThat(assertContext.getText("Table assertion error:"),
actual.getTableNames(), is(expected.getTableNames()));
+ if (null == expected.getDatabase()) {
+ assertNull(actual.getFromDatabase(),
assertContext.getText("From database assertion error:"));
+ } else {
+ DatabaseAssert.assertIs(assertContext,
actual.getFromDatabase().getDatabase(), expected.getDatabase());
+ }
+ assertNotNull(actual.getTableNames(), assertContext.getText("Table
assertion error:"));
+ assertNotNull(expected.getTableNames(),
assertContext.getText("Table assertion error:"));
+ assertThat(assertContext.getText("Table assertion error:"),
actual.getTableNames().size(), is(expected.getTableNames().size()));
+ for (ExpectedIdentifier each : expected.getTableNames()) {
+ IdentifierValue actualTableName = findTableName(actual, each);
+ assertNotNull(actualTableName, assertContext.getText("Table
assertion error:"));
+ IdentifierValueAssert.assertIs(assertContext, actualTableName,
each, "Table");
+ }
}
}
+
+ private static IdentifierValue findTableName(final
ShowTableMetaDataStatement actual, final ExpectedIdentifier expected) {
+ return actual.getTableNames().stream().filter(each ->
expected.getName().equals(each.getValue())).findFirst().orElse(null);
+ }
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/updatable/RefreshTableMetaDataStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/updatable/RefreshTableMetaDataStatementAssert.java
index 15486b6adfd..5ba1a4ab616 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/updatable/RefreshTableMetaDataStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/type/updatable/RefreshTableMetaDataStatementAssert.java
@@ -20,12 +20,16 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.distsql.statement.type.ral.updatable.RefreshTableMetaDataStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ExistingAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.identifier.ExpectedIdentifier;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.RefreshTableMetaDataStatementTestCase;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
/**
* Refresh table meta data statement assert.
@@ -43,14 +47,20 @@ public final class RefreshTableMetaDataStatementAssert {
public static void assertIs(final SQLCaseAssertContext assertContext,
final RefreshTableMetaDataStatement actual, final
RefreshTableMetaDataStatementTestCase expected) {
if (ExistingAssert.assertIs(assertContext, actual, expected)) {
if (null != expected.getTableName()) {
- assertThat(assertContext.getText("Table name assertion
error"), actual.getTableName().get(), is(expected.getTableName()));
+ assertNotNull(actual.getTableName().orElse(null),
assertContext.getText("Table name assertion error"));
+ assertIdentifier(assertContext, actual.getTableName().get(),
expected.getTableName(), "Table name");
}
if (null != expected.getStorageUnitName()) {
assertThat(assertContext.getText("Storage unit name assertion
error"), actual.getStorageUnitName().get(), is(expected.getStorageUnitName()));
}
if (null != expected.getSchemaName()) {
- assertThat(assertContext.getText("Schema name assertion
error"), actual.getSchemaName().get(), is(expected.getSchemaName()));
+ assertNotNull(actual.getSchemaName().orElse(null),
assertContext.getText("Schema name assertion error"));
+ assertIdentifier(assertContext, actual.getSchemaName().get(),
expected.getSchemaName(), "Schema name");
}
}
}
+
+ private static void assertIdentifier(final SQLCaseAssertContext
assertContext, final IdentifierValue actual, final ExpectedIdentifier expected,
final String type) {
+ IdentifierValueAssert.assertIs(assertContext, actual, expected, type);
+ }
}
diff --git a/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/identifier/ExpectedIdentifier.java
similarity index 69%
copy from parser/distsql/engine/src/main/antlr4/imports/Literals.g4
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/identifier/ExpectedIdentifier.java
index 68f6a1b07ed..922b371b1ab 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/Literals.g4
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/identifier/ExpectedIdentifier.java
@@ -15,20 +15,12 @@
* limitations under the License.
*/
-lexer grammar Literals;
+package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.identifier;
-import Alphabet, Symbol;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
-IDENTIFIER_
- : [A-Za-z_$0-9]*?[A-Za-z_$]+?[A-Za-z_$0-9]*
- | BQ_ ~'`'+ BQ_
- ;
-
-STRING_
- : (DQ_ ('\\'. | '""' | ~('"' | '\\'))* DQ_)
- | (SQ_ ('\\'. | '\'\'' | ~('\'' | '\\'))* SQ_)
- ;
-
-INT_
- : [0-9]+
- ;
+/**
+ * Expected identifier.
+ */
+public final class ExpectedIdentifier extends
AbstractExpectedIdentifierSQLSegment {
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/RefreshTableMetaDataStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/RefreshTableMetaDataStatementTestCase.java
index cc710c8c352..e67f33fc902 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/RefreshTableMetaDataStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/RefreshTableMetaDataStatementTestCase.java
@@ -20,7 +20,9 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
import lombok.Getter;
import lombok.Setter;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.identifier.ExpectedIdentifier;
+import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAttribute;
/**
@@ -30,12 +32,12 @@ import javax.xml.bind.annotation.XmlAttribute;
@Setter
public final class RefreshTableMetaDataStatementTestCase extends
SQLParserTestCase {
- @XmlAttribute(name = "table-name")
- private String tableName;
+ @XmlElement(name = "table-name")
+ private ExpectedIdentifier tableName;
@XmlAttribute(name = "storage-unit-name")
private String storageUnitName;
- @XmlAttribute(name = "schema-name")
- private String schemaName;
+ @XmlElement(name = "schema-name")
+ private ExpectedIdentifier schemaName;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ShowTableMetaDataStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ShowTableMetaDataStatementTestCase.java
index d11d470c603..814f50c24d7 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ShowTableMetaDataStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ShowTableMetaDataStatementTestCase.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
import lombok.Getter;
import lombok.Setter;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.DatabaseContainedTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.identifier.ExpectedIdentifier;
import javax.xml.bind.annotation.XmlElement;
import java.util.Set;
@@ -32,5 +33,5 @@ import java.util.Set;
public final class ShowTableMetaDataStatementTestCase extends
DatabaseContainedTestCase {
@XmlElement(name = "table-name")
- private Set<String> tableNames;
+ private Set<ExpectedIdentifier> tableNames;
}
diff --git a/test/it/parser/src/main/resources/case/ral/queryable.xml
b/test/it/parser/src/main/resources/case/ral/queryable.xml
index 6a039c78cad..8a74a5c7b88 100644
--- a/test/it/parser/src/main/resources/case/ral/queryable.xml
+++ b/test/it/parser/src/main/resources/case/ral/queryable.xml
@@ -24,9 +24,19 @@
<show-status-from-readwrite-splitting-rules
sql-case-id="show-status-from-readwrite-splitting-rules" />
<show-table-metadata sql-case-id="show-table-metadata">
- <table-name>t_order</table-name>
+ <table-name name="t_order" />
<database name="database_name" start-index="33" stop-index="45" />
</show-table-metadata>
+ <show-table-metadata
sql-case-id="show-table-metadata-with-back-quoted-database-name">
+ <table-name name="t_order" />
+ <database name="database_name" start-index="33" stop-index="47"
start-delimiter="`" end-delimiter="`" />
+ </show-table-metadata>
+ <show-table-metadata
sql-case-id="show-table-metadata-with-back-quoted-table-name">
+ <table-name name="T_ORDER" start-delimiter="`" end-delimiter="`" />
+ </show-table-metadata>
+ <show-table-metadata
sql-case-id="show-table-metadata-with-double-quoted-table-name">
+ <table-name name="T_ORDER" start-delimiter="""
end-delimiter=""" />
+ </show-table-metadata>
<show-authority-rule sql-case-id="show-authority-rule" />
<show-transaction-rule sql-case-id="show-transaction-rule" />
diff --git a/test/it/parser/src/main/resources/case/ral/updatable.xml
b/test/it/parser/src/main/resources/case/ral/updatable.xml
index adb26d38174..9dd3adc6ff4 100644
--- a/test/it/parser/src/main/resources/case/ral/updatable.xml
+++ b/test/it/parser/src/main/resources/case/ral/updatable.xml
@@ -20,10 +20,31 @@
<set-dist-variable sql-case-id="set-dist-variable" />
<refresh-table-metadata sql-case-id="refresh-table-metadata" />
- <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-table-name" table-name="t_order" />
- <refresh-table-metadata sql-case-id="refresh-table-metadata-with-resource"
table-name="t_order" storage-unit-name="ds_0" />
- <refresh-table-metadata sql-case-id="refresh-table-metadata-with-schema"
storage-unit-name="ds_0" schema-name="public" />
- <refresh-table-metadata
sql-case-id="refresh-table-metadata-table-with-schema" table-name="t_order"
storage-unit-name="ds_0" schema-name="public" />
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-table-name">
+ <table-name name="t_order" />
+ </refresh-table-metadata>
+ <refresh-table-metadata sql-case-id="refresh-table-metadata-with-resource"
storage-unit-name="ds_0">
+ <table-name name="t_order" />
+ </refresh-table-metadata>
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-back-quoted-storage-unit-name"
storage-unit-name="ds_0">
+ <table-name name="t_order" />
+ </refresh-table-metadata>
+ <refresh-table-metadata sql-case-id="refresh-table-metadata-with-schema"
storage-unit-name="ds_0">
+ <schema-name name="public" />
+ </refresh-table-metadata>
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-table-with-schema" storage-unit-name="ds_0">
+ <table-name name="t_order" />
+ <schema-name name="public" />
+ </refresh-table-metadata>
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-back-quoted-table-name">
+ <table-name name="T_ORDER" start-delimiter="`" end-delimiter="`" />
+ </refresh-table-metadata>
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-double-quoted-table-name">
+ <table-name name="T_ORDER" start-delimiter="""
end-delimiter=""" />
+ </refresh-table-metadata>
+ <refresh-table-metadata
sql-case-id="refresh-table-metadata-with-double-quoted-schema-name"
storage-unit-name="ds_0">
+ <schema-name name="PUBLIC" start-delimiter="""
end-delimiter=""" />
+ </refresh-table-metadata>
<alter-sql-parser-rule sql-case-id="alter-sql-parser-rule">
<sql-parser sql-comment-parse-enabled="false">
diff --git a/test/it/parser/src/main/resources/case/rdl/alter.xml
b/test/it/parser/src/main/resources/case/rdl/alter.xml
index c0deb0c0f79..88d94f646b5 100644
--- a/test/it/parser/src/main/resources/case/rdl/alter.xml
+++ b/test/it/parser/src/main/resources/case/rdl/alter.xml
@@ -58,6 +58,14 @@
<property key="maxPoolSize" value="30" />
</data-source>
</alter-storage-unit>
+
+ <alter-storage-unit
sql-case-id="alter-storage-unit-simple-single-with-double-quoted-string-values">
+ <data-source name="ds_0" hostname="127.0.0.1" port="3306" db="test0"
user="ROOT" password="123456" />
+ </alter-storage-unit>
+
+ <alter-storage-unit
sql-case-id="alter-storage-unit-url-single-with-double-quoted-string-values">
+ <data-source name="ds_0" url="jdbc:mysql://127.0.0.1:3306/test0"
user="ROOT" password="123456" />
+ </alter-storage-unit>
<alter-sharding-auto-table-rule
sql-case-id="alter-sharding-auto-table-rule">
<rule name="t_order" table-strategy-column="order_id"
key-generate-strategy-column="another_id">
diff --git a/test/it/parser/src/main/resources/case/rdl/create.xml
b/test/it/parser/src/main/resources/case/rdl/create.xml
index 303a0645d72..2de629220d2 100644
--- a/test/it/parser/src/main/resources/case/rdl/create.xml
+++ b/test/it/parser/src/main/resources/case/rdl/create.xml
@@ -71,6 +71,14 @@
<property key="maxPoolSize" value="30" />
</data-source>
</register-storage-unit>
+
+ <register-storage-unit
sql-case-id="register-storage-unit-simple-single-with-double-quoted-string-values">
+ <data-source name="ds_0" hostname="127.0.0.1" port="3306" db="test0"
user="ROOT" password="123456" />
+ </register-storage-unit>
+
+ <register-storage-unit
sql-case-id="register-storage-unit-url-single-with-double-quoted-string-values">
+ <data-source name="ds_0" url="jdbc:mysql://127.0.0.1:3306/test0"
user="ROOT" password="123456" />
+ </register-storage-unit>
<create-sharding-auto-table-rule
sql-case-id="create-sharding-auto-table-rule">
<rule name="t_order" table-strategy-column="order_id"
key-generate-strategy-column="another_id">
diff --git a/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
b/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
index 619248f1778..b8267bef93b 100644
--- a/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
@@ -24,6 +24,9 @@
<sql-case id="show-status-from-readwrite-splitting-rules" value="SHOW
STATUS FROM READWRITE_SPLITTING RULES" db-types="ShardingSphere" />
<sql-case id="show-table-metadata" value="SHOW TABLE METADATA t_order FROM
database_name" db-types="ShardingSphere" />
+ <sql-case id="show-table-metadata-with-back-quoted-database-name"
value="SHOW TABLE METADATA t_order FROM `database_name`"
db-types="ShardingSphere" />
+ <sql-case id="show-table-metadata-with-back-quoted-table-name" value="SHOW
TABLE METADATA `T_ORDER`" db-types="ShardingSphere" />
+ <sql-case id="show-table-metadata-with-double-quoted-table-name"
value="SHOW TABLE METADATA "T_ORDER"" db-types="ShardingSphere" />
<sql-case id="show-authority-rule" value="SHOW AUTHORITY RULE"
db-types="ShardingSphere" />
<sql-case id="show-transaction-rule" value="SHOW TRANSACTION RULE"
db-types="ShardingSphere" />
diff --git a/test/it/parser/src/main/resources/sql/supported/ral/updatable.xml
b/test/it/parser/src/main/resources/sql/supported/ral/updatable.xml
index a14384f544e..30a4cf6d2e9 100644
--- a/test/it/parser/src/main/resources/sql/supported/ral/updatable.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ral/updatable.xml
@@ -22,8 +22,12 @@
<sql-case id="refresh-table-metadata" value="REFRESH TABLE METADATA"
db-types="ShardingSphere" />
<sql-case id="refresh-table-metadata-with-table-name" value="REFRESH TABLE
METADATA t_order" db-types="ShardingSphere" />
<sql-case id="refresh-table-metadata-with-resource" value="REFRESH TABLE
METADATA t_order FROM STORAGE UNIT ds_0" db-types="ShardingSphere" />
+ <sql-case id="refresh-table-metadata-with-back-quoted-storage-unit-name"
value="REFRESH TABLE METADATA t_order FROM STORAGE UNIT `ds_0`"
db-types="ShardingSphere" />
<sql-case id="refresh-table-metadata-with-schema" value="REFRESH TABLE
METADATA FROM STORAGE UNIT ds_0 SCHEMA public" db-types="ShardingSphere" />
<sql-case id="refresh-table-metadata-table-with-schema" value="REFRESH
TABLE METADATA t_order FROM STORAGE UNIT ds_0 SCHEMA public"
db-types="ShardingSphere" />
+ <sql-case id="refresh-table-metadata-with-back-quoted-table-name"
value="REFRESH TABLE METADATA `T_ORDER`" db-types="ShardingSphere" />
+ <sql-case id="refresh-table-metadata-with-double-quoted-table-name"
value="REFRESH TABLE METADATA "T_ORDER"" db-types="ShardingSphere" />
+ <sql-case id="refresh-table-metadata-with-double-quoted-schema-name"
value="REFRESH TABLE METADATA FROM STORAGE UNIT ds_0 SCHEMA "PUBLIC""
db-types="ShardingSphere" />
<sql-case id="alter-sql-parser-rule" value="ALTER SQL_PARSER RULE
(PARSE_TREE_CACHE(INITIAL_CAPACITY=10, MAXIMUM_SIZE=11),
SQL_STATEMENT_CACHE(INITIAL_CAPACITY=11, MAXIMUM_SIZE=11));"
db-types="ShardingSphere" />
<sql-case id="alter-sql-translator-rule" value="ALTER SQL_TRANSLATOR RULE
(TYPE(NAME='DISTSQL:FIXTURE', PROPERTIES('foo'='bar')),
USE_ORIGINAL_SQL_WHEN_TRANSLATING_FAILED=TRUE)" db-types="ShardingSphere" />
diff --git a/test/it/parser/src/main/resources/sql/supported/rdl/alter.xml
b/test/it/parser/src/main/resources/sql/supported/rdl/alter.xml
index 3eba35aa5e9..2b65490051a 100644
--- a/test/it/parser/src/main/resources/sql/supported/rdl/alter.xml
+++ b/test/it/parser/src/main/resources/sql/supported/rdl/alter.xml
@@ -26,6 +26,8 @@
<sql-case id="alter-storage-unit-single-with-properties" value="ALTER
STORAGE UNIT
ds_0(HOST='127.0.0.1',PORT=3306,DB='test0',USER='ROOT',PASSWORD='123456',PROPERTIES('maxPoolSize'='30'));"
db-types="ShardingSphere" />
<sql-case id="alter-storage-unit-url-single-with-empty-properties"
value="ALTER STORAGE UNIT
ds_0(URL='jdbc:mysql://127.0.0.1:3306/test0',USER='ROOT',PROPERTIES())"
db-types="ShardingSphere" />
<sql-case id="alter-storage-unit-url-single-with-properties" value="ALTER
STORAGE UNIT
ds_0(URL='jdbc:mysql://127.0.0.1:3306/test0',USER='ROOT',PASSWORD='123456',PROPERTIES('maxPoolSize'='30'))"
db-types="ShardingSphere" />
+ <sql-case
id="alter-storage-unit-simple-single-with-double-quoted-string-values"
value="ALTER STORAGE UNIT
ds_0(HOST="127.0.0.1",PORT=3306,DB="test0",USER="ROOT",PASSWORD="123456");"
db-types="ShardingSphere" />
+ <sql-case
id="alter-storage-unit-url-single-with-double-quoted-string-values"
value="ALTER STORAGE UNIT
ds_0(URL="jdbc:mysql://127.0.0.1:3306/test0",USER="ROOT",PASSWORD="123456");"
db-types="ShardingSphere" />
<sql-case id="alter-encrypt-rule" value="ALTER ENCRYPT RULE t_encrypt
(COLUMNS((NAME=user_id,CIPHER=user_cipher,ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc',
'digest-algorithm-name'='SHA-1')))), (NAME=order_id,
CIPHER=order_cipher,ENCRYPT_ALGORITHM(TYPE(NAME='RC4',PROPERTIES('rc4-key-value'='123456abc'))))))"
db-types="ShardingSphere" />
<sql-case id="alter-encrypt-rule-with-assisted-query-column" value="ALTER
ENCRYPT RULE t_encrypt
(COLUMNS((NAME=user_id,CIPHER=user_cipher,ASSISTED_QUERY_COLUMN=assisted_column,
ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc',
'digest-algorithm-name'='SHA-1'))),
ASSISTED_QUERY_ALGORITHM(TYPE(NAME='MD5'))), (NAME=order_id,
CIPHER=order_cipher,ENCRYPT_ALGORITHM(TYPE(NAME='RC4',PROPERTIES('rc4-key-value'='123456abc'))))))"
db-types="ShardingSphere" />
<sql-case id="alter-encrypt-rule-with-like-query-column" value="ALTER
ENCRYPT RULE t_encrypt
(COLUMNS((NAME=user_id,CIPHER=user_cipher,LIKE_QUERY_COLUMN=like_column,
ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc',
'digest-algorithm-name'='SHA-1'))),
LIKE_QUERY_ALGORITHM(TYPE(NAME='CHAR_DIGEST_LIKE'))), (NAME=order_id,
CIPHER=order_cipher,ENCRYPT_ALGORITHM(TYPE(NAME='RC4',PROPERTIES('rc4-key-value'='123456abc'))))))"
db-types="ShardingSphere" />
diff --git a/test/it/parser/src/main/resources/sql/supported/rdl/create.xml
b/test/it/parser/src/main/resources/sql/supported/rdl/create.xml
index 08ec77bbad2..43a1ae6431b 100644
--- a/test/it/parser/src/main/resources/sql/supported/rdl/create.xml
+++ b/test/it/parser/src/main/resources/sql/supported/rdl/create.xml
@@ -27,6 +27,8 @@
<sql-case id="register-storage-unit-single-with-properties"
value="REGISTER STORAGE UNIT
ds_0(HOST='127.0.0.1',PORT=3306,DB='test0',USER='ROOT',PASSWORD='123456',PROPERTIES('maxPoolSize'='30','idleTimeout'=30000));"
db-types="ShardingSphere" />
<sql-case id="register-storage-unit-url-single-with-empty-properties"
value="REGISTER STORAGE UNIT
ds_0(URL='jdbc:mysql://127.0.0.1:3306/test0',USER='ROOT',PROPERTIES())"
db-types="ShardingSphere" />
<sql-case id="register-storage-unit-url-single-with-properties"
value="REGISTER STORAGE UNIT
ds_0(URL='jdbc:mysql://127.0.0.1:3306/test0',USER='ROOT',PASSWORD='123456',PROPERTIES('maxPoolSize'='30'))"
db-types="ShardingSphere" />
+ <sql-case
id="register-storage-unit-simple-single-with-double-quoted-string-values"
value="REGISTER STORAGE UNIT
ds_0(HOST="127.0.0.1",PORT=3306,DB="test0",USER="ROOT",PASSWORD="123456");"
db-types="ShardingSphere" />
+ <sql-case
id="register-storage-unit-url-single-with-double-quoted-string-values"
value="REGISTER STORAGE UNIT
ds_0(URL="jdbc:mysql://127.0.0.1:3306/test0",USER="ROOT",PASSWORD="123456");"
db-types="ShardingSphere" />
<sql-case id="create-sharding-auto-table-rule" value="CREATE SHARDING
TABLE RULE t_order (STORAGE_UNITS(ms_group_0,ms_group_1),
SHARDING_COLUMN=order_id,TYPE(NAME='hash_mod',PROPERTIES('sharding-count'='4')),
KEY_GENERATE_STRATEGY(COLUMN=another_id,TYPE(NAME='snowflake')))"
db-types="ShardingSphere" />
<sql-case id="create-sharding-auto-table-rule-if-not-exists" value="CREATE
SHARDING TABLE RULE IF NOT EXISTS t_order
(STORAGE_UNITS(ms_group_0,ms_group_1),
SHARDING_COLUMN=order_id,TYPE(NAME='hash_mod',PROPERTIES('sharding-count'='4')),
KEY_GENERATE_STRATEGY(COLUMN=another_id,TYPE(NAME='snowflake')))"
db-types="ShardingSphere" />
<sql-case id="create-sharding-auto-table-rule-with-inline-expression"
value="CREATE SHARDING TABLE RULE t_order (STORAGE_UNITS('ms_group_${0..1}'),
SHARDING_COLUMN=order_id,TYPE(NAME='hash_mod',PROPERTIES('sharding-count'=4)),
KEY_GENERATE_STRATEGY(COLUMN=another_id,TYPE(NAME='snowflake')))"
db-types="ShardingSphere" />
diff --git a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
index 3448549e8bf..77b9c5767cd 100644
--- a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
+++ b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
@@ -21,6 +21,8 @@
<sql-case
id="assert_select_with_json_unquote_extract_sign_with_parameter_marker"
value="SELECT * FROM t_order WHERE order_id ->> ?" db-types="MySQL" />
<sql-case id="assert_insert_with_first" value="INSERT FIRST INTO TABLE_XXX
(field1) VALUES (field1) SELECT field1 FROM TABLE_XXX2" db-types="Oracle" />
<sql-case id="assert_dist_SQL_show_rule_parse_conflict" value="SHOW
REPLICA_QUERY RULE FROM schema_name" />
+ <sql-case
id="unsupported_show_table_metadata_with_single_quoted_table_name" value="SHOW
TABLE METADATA 'T_ORDER'" db-types="ShardingSphere" />
+ <sql-case
id="unsupported_refresh_table_metadata_with_single_quoted_table_name"
value="REFRESH TABLE METADATA 'T_ORDER'" db-types="ShardingSphere" />
<sql-case id="with_select" value="WITH cte AS (SELECT 0 /*! ) */ SELECT *
FROM cte a, cte b;" db-types="MySQL" />
<sql-case id="with_select_comment" value="WITH cte AS /*! ( */ SELECT 0)
SELECT * FROM cte a, cte b;" db-types="MySQL" />
<sql-case id="create_table_as_select" value="create table agg_data_2k as
select g from generate_series(0, 1999) g;" db-types="PostgreSQL" />