You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2021/06/12 05:55:16 UTC
[shardingsphere] branch master updated: Remove useless to phase
parse for DistSQL (#10780)
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 e305060 Remove useless to phase parse for DistSQL (#10780)
e305060 is described below
commit e305060325b31f7cafe58484cc077237dafaf14d
Author: Liang Zhang <te...@163.com>
AuthorDate: Sat Jun 12 13:54:29 2021 +0800
Remove useless to phase parse for DistSQL (#10780)
---
.../parser/api/DistSQLStatementParserEngine.java | 32 ++-----
.../api/DistSQLStatementParserEngineTest.java | 103 ++++++++++-----------
2 files changed, 58 insertions(+), 77 deletions(-)
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
index 33d861c..b0f75e4 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
@@ -17,9 +17,6 @@
package org.apache.shardingsphere.distsql.parser.api;
-import org.antlr.v4.runtime.BailErrorStrategy;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.atn.PredictionMode;
import org.antlr.v4.runtime.misc.ParseCancellationException;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.apache.shardingsphere.distsql.parser.core.DistSQLParserFactory;
@@ -41,31 +38,16 @@ public final class DistSQLStatementParserEngine {
* @return AST node
*/
public SQLStatement parse(final String sql) {
- ParseASTNode parseASTNode = twoPhaseParse(sql);
- if (parseASTNode.getRootNode() instanceof ErrorNode) {
- throw new SQLParsingException("Unsupported SQL of `%s`", sql);
- }
- return (SQLStatement) new DistSQLVisitor().visit(parseASTNode.getRootNode());
- }
-
- private ParseASTNode twoPhaseParse(final String sql) {
SQLParser sqlParser = DistSQLParserFactory.newInstance(sql);
+ ParseASTNode parseASTNode;
try {
- setPredictionMode((Parser) sqlParser, PredictionMode.SLL);
- return (ParseASTNode) sqlParser.parse();
+ parseASTNode = (ParseASTNode) sqlParser.parse();
} catch (final ParseCancellationException ex) {
- ((Parser) sqlParser).reset();
- setPredictionMode((Parser) sqlParser, PredictionMode.LL);
- try {
- return (ParseASTNode) sqlParser.parse();
- } catch (final ParseCancellationException e) {
- throw new SQLParsingException("You have an error in your SQL syntax");
- }
+ throw new SQLParsingException("You have an error in your SQL syntax");
}
- }
-
- private void setPredictionMode(final Parser sqlParser, final PredictionMode mode) {
- sqlParser.setErrorHandler(new BailErrorStrategy());
- sqlParser.getInterpreter().setPredictionMode(mode);
+ if (parseASTNode.getRootNode() instanceof ErrorNode) {
+ throw new SQLParsingException("Unsupported SQL of `%s`", sql);
+ }
+ return (SQLStatement) new DistSQLVisitor().visit(parseASTNode.getRootNode());
}
}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
index 818abb0..cc827c9 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
@@ -85,35 +85,35 @@ public final class DistSQLStatementParserEngineTest {
+ "(t_order,t_order_item), (t_1,t_2))";
private static final String RDL_CREATE_SHARDING_BROADCAST_TABLE_RULES = "CREATE SHARDING BROADCAST TABLE RULES(t_1,t_2)";
-
+
private static final String RDL_ALTER_SHARDING_TABLE_RULE = "ALTER SHARDING TABLE RULE t_order ("
+ "RESOURCES(ms_group_0,ms_group_1),"
+ "SHARDING_COLUMN=order_id,"
+ "TYPE(NAME=hash_mod,PROPERTIES('sharding-count'=4)),"
+ "GENERATED_KEY(COLUMN=another_id,TYPE(NAME=snowflake,PROPERTIES(\"worker-id\"=123))))";
-
+
private static final String RDL_ALTER_SHARDING_BINDING_TABLE_RULES = "ALTER SHARDING BINDING TABLE RULES ("
+ "(t_order,t_order_item), (t_1,t_2))";
-
+
private static final String RDL_ALTER_SHARDING_BROADCAST_TABLE_RULES = "ALTER SHARDING BROADCAST TABLE RULES(t_1,t_2)";
-
+
private static final String RDL_DROP_SHARDING_TABLE_RULE = "DROP SHARDING TABLE RULE t_order,t_order_item";
-
+
private static final String RDL_DROP_SHARDING_BINDING_TABLE_RULES = "DROP SHARDING BINDING TABLE RULES";
-
+
private static final String RDL_DROP_SHARDING_BROADCAST_TABLE_RULES = "DROP SHARDING BROADCAST TABLE RULES";
-
+
private static final String RDL_CREATE_STATIC_READWRITE_SPLITTING_RULE = "CREATE READWRITE_SPLITTING RULE ms_group_0 ("
+ "WRITE_RESOURCE=primary_ds,"
+ "READ_RESOURCES(replica_ds_0,replica_ds_1),"
+ "TYPE(NAME=random)"
+ ")";
-
+
private static final String RDL_CREATE_DYNAMIC_READWRITE_SPLITTING_RULE = "CREATE READWRITE_SPLITTING RULE ms_group_1 ("
+ "AUTO_AWARE_RESOURCE=group_0,"
+ "TYPE(NAME=random,PROPERTIES(read_weight='2:1'))"
+ ")";
-
+
private static final String RDL_ALTER_READWRITE_SPLITTING_RULE = "ALTER READWRITE_SPLITTING RULE ms_group_0 ("
+ "AUTO_AWARE_RESOURCE=group_0,"
+ "TYPE(NAME=random,PROPERTIES(read_weight='2:1'))),"
@@ -122,9 +122,9 @@ public final class DistSQLStatementParserEngineTest {
+ "READ_RESOURCES(replica_ds_0,replica_ds_1),"
+ "TYPE(NAME=random)"
+ ")";
-
+
private static final String RDL_DROP_READWRITE_SPLITTING_RULE = "DROP READWRITE_SPLITTING RULE ms_group_0,ms_group_1";
-
+
private static final String RDL_CREATE_DATABASE_DISCOVERY_RULE = "CREATE DB_DISCOVERY RULE ha_group_0 ("
+ "RESOURCES(resource0,resource1),"
+ "TYPE(NAME=mgr,PROPERTIES(groupName='92504d5b-6dec',keepAliveCron=''))),"
@@ -132,7 +132,7 @@ public final class DistSQLStatementParserEngineTest {
+ "RESOURCES(resource2,resource3),"
+ "TYPE(NAME=mgr2,PROPERTIES(groupName='92504d5b-6dec-2',keepAliveCron=''))"
+ ")";
-
+
private static final String RDL_ALTER_DATABASE_DISCOVERY_RULE = "ALTER DB_DISCOVERY RULE ha_group_0 ("
+ "RESOURCES(resource0,resource1),"
+ "TYPE(NAME=mgr,PROPERTIES(groupName='92504d5b-6dec',keepAliveCron=''))),"
@@ -140,41 +140,41 @@ public final class DistSQLStatementParserEngineTest {
+ "RESOURCES(resource2,resource3),"
+ "TYPE(NAME=mgr2,PROPERTIES(groupName='92504d5b-6dec-2',keepAliveCron=''))"
+ ")";
-
+
private static final String RDL_DROP_DATABASE_DISCOVERY_RULE = "DROP DB_DISCOVERY RULE ha_group_0,ha_group_1";
-
+
private static final String RDL_CREATE_ENCRYPT_RULE = "CREATE ENCRYPT RULE t_encrypt ("
+ "COLUMNS("
+ "(NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),"
+ "(NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))"
+ "))";
-
+
private static final String RDL_ALTER_ENCRYPT_RULE = "ALTER ENCRYPT RULE t_encrypt ("
+ "COLUMNS("
+ "(NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),"
+ "(NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))"
+ "))";
-
+
private static final String RDL_DROP_ENCRYPT_RULE = "DROP ENCRYPT RULE t_encrypt,t_encrypt_order";
-
+
private static final String RQL_SHOW_SHARDING_BINDING_TABLE_RULES = "SHOW SHARDING BINDING TABLE RULES FROM sharding_db";
-
+
private static final String RQL_SHOW_SHARDING_BROADCAST_TABLE_RULES = "SHOW SHARDING BROADCAST TABLE RULES FROM sharding_db";
-
+
private static final String RQL_SHOW_SHARDING_TABLE_RULES = "SHOW SHARDING TABLE RULES FROM schemaName";
-
+
private static final String RQL_SHOW_SHARDING_TABLE_RULE = "SHOW SHARDING TABLE RULE t_order";
-
+
private static final String RQL_SHOW_SHARDING_TABLE_RULE_FROM = "SHOW SHARDING TABLE RULE t_order FROM schemaName";
-
+
private static final String RQL_SHOW_READWRITE_SPLITTING_RULES = "SHOW READWRITE_SPLITTING RULES FROM readwrite_splitting_db";
-
+
private static final String RQL_SHOW_DB_DISCOVERY_RULES = "SHOW DB_DISCOVERY RULES FROM db_discovery_db";
-
+
private static final String RQL_SHOW_ENCRYPT_RULES = "SHOW ENCRYPT RULES FROM encrypt_db";
-
+
private static final String RQL_SHOW_ENCRYPT_TABLE_RULE = "SHOW ENCRYPT TABLE RULE t_encrypt FROM encrypt_db";
-
+
private final DistSQLStatementParserEngine engine = new DistSQLStatementParserEngine();
@Test
@@ -268,7 +268,7 @@ public final class DistSQLStatementParserEngineTest {
assertTrue(sqlStatement instanceof CreateShardingBroadcastTableRulesStatement);
assertThat(((CreateShardingBroadcastTableRulesStatement) sqlStatement).getTables(), is(Arrays.asList("t_1", "t_2")));
}
-
+
@Test
public void assertParseAlterShardingTableRule() {
SQLStatement sqlStatement = engine.parse(RDL_ALTER_SHARDING_TABLE_RULE);
@@ -284,7 +284,7 @@ public final class DistSQLStatementParserEngineTest {
assertThat(tableRuleSegment.getTableStrategy().getAlgorithmName(), is("hash_mod"));
assertThat(tableRuleSegment.getTableStrategy().getAlgorithmProps().getProperty("sharding-count"), is("4"));
}
-
+
@Test
public void assertParseAlterShardingBindingTableRules() {
SQLStatement sqlStatement = engine.parse(RDL_ALTER_SHARDING_BINDING_TABLE_RULES);
@@ -303,7 +303,7 @@ public final class DistSQLStatementParserEngineTest {
assertTrue(sqlStatement instanceof AlterShardingBroadcastTableRulesStatement);
assertThat(((AlterShardingBroadcastTableRulesStatement) sqlStatement).getTables(), is(Arrays.asList("t_1", "t_2")));
}
-
+
@Test
public void assertParseDropShardingTableRule() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_SHARDING_TABLE_RULE);
@@ -311,19 +311,19 @@ public final class DistSQLStatementParserEngineTest {
assertThat(((DropShardingTableRuleStatement) sqlStatement).getTableNames().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList()),
is(Arrays.asList("t_order", "t_order_item")));
}
-
+
@Test
public void assertParseDropShardingBindingTableRules() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_SHARDING_BINDING_TABLE_RULES);
assertTrue(sqlStatement instanceof DropShardingBindingTableRulesStatement);
}
-
+
@Test
public void assertParseDropShardingBroadcastTableRules() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_SHARDING_BROADCAST_TABLE_RULES);
assertTrue(sqlStatement instanceof DropShardingBroadcastTableRulesStatement);
}
-
+
@Test
public void assertParseStaticReadwriteSplittingRule() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_STATIC_READWRITE_SPLITTING_RULE);
@@ -338,7 +338,7 @@ public final class DistSQLStatementParserEngineTest {
assertThat(readwriteSplittingRuleSegments.get(0).getLoadBalancer(), is("random"));
assertThat(readwriteSplittingRuleSegments.get(0).getProps().size(), is(0));
}
-
+
@Test
public void assertParseDynamicReadwriteSplittingRule() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_DYNAMIC_READWRITE_SPLITTING_RULE);
@@ -355,7 +355,7 @@ public final class DistSQLStatementParserEngineTest {
assertThat(readwriteSplittingRuleSegments.get(0).getProps().size(), is(1));
assertThat(readwriteSplittingRuleSegments.get(0).getProps().getProperty("read_weight"), is("'2:1'"));
}
-
+
@Test
public void assertParseAlterReadwriteSplittingRule() {
SQLStatement sqlStatement = engine.parse(RDL_ALTER_READWRITE_SPLITTING_RULE);
@@ -377,14 +377,14 @@ public final class DistSQLStatementParserEngineTest {
assertThat(readwriteSplittingRuleSegments.get(1).getLoadBalancer(), is("random"));
assertThat(readwriteSplittingRuleSegments.get(1).getProps().size(), is(0));
}
-
+
@Test
public void assertParseDropReadwriteSplittingRule() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_READWRITE_SPLITTING_RULE);
assertTrue(sqlStatement instanceof DropReadwriteSplittingRuleStatement);
assertThat(((DropReadwriteSplittingRuleStatement) sqlStatement).getRuleNames(), is(Arrays.asList("ms_group_0", "ms_group_1")));
}
-
+
@Test
public void assertParseCreateDatabaseDiscoveryRule() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_DATABASE_DISCOVERY_RULE);
@@ -402,15 +402,14 @@ public final class DistSQLStatementParserEngineTest {
assertThat(databaseDiscoveryRuleSegments.get(1).getDataSources(), is(Arrays.asList("resource2", "resource3")));
assertThat(databaseDiscoveryRuleSegments.get(1).getProps().get("groupName"), is("92504d5b-6dec-2"));
}
-
+
@Test
public void assertParseAlterDatabaseDiscoveryRule() {
SQLStatement sqlStatement = engine.parse(RDL_ALTER_DATABASE_DISCOVERY_RULE);
assertTrue(sqlStatement instanceof AlterDatabaseDiscoveryRuleStatement);
AlterDatabaseDiscoveryRuleStatement statement = (AlterDatabaseDiscoveryRuleStatement) sqlStatement;
assertThat(statement.getRules().size(), is(2));
- List<DatabaseDiscoveryRuleSegment> databaseDiscoveryRuleSegments
- = new ArrayList<>(((AlterDatabaseDiscoveryRuleStatement) sqlStatement).getRules());
+ List<DatabaseDiscoveryRuleSegment> databaseDiscoveryRuleSegments = new ArrayList<>(((AlterDatabaseDiscoveryRuleStatement) sqlStatement).getRules());
assertThat(databaseDiscoveryRuleSegments.get(0).getName(), is("ha_group_0"));
assertThat(databaseDiscoveryRuleSegments.get(0).getDiscoveryTypeName(), is("mgr"));
assertThat(databaseDiscoveryRuleSegments.get(0).getDataSources(), is(Arrays.asList("resource0", "resource1")));
@@ -420,14 +419,14 @@ public final class DistSQLStatementParserEngineTest {
assertThat(databaseDiscoveryRuleSegments.get(1).getDataSources(), is(Arrays.asList("resource2", "resource3")));
assertThat(databaseDiscoveryRuleSegments.get(1).getProps().get("groupName"), is("92504d5b-6dec-2"));
}
-
+
@Test
public void assertParseDropDatabaseDiscoveryRule() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_DATABASE_DISCOVERY_RULE);
assertTrue(sqlStatement instanceof DropDatabaseDiscoveryRuleStatement);
assertThat(((DropDatabaseDiscoveryRuleStatement) sqlStatement).getRuleNames(), is(Arrays.asList("ha_group_0", "ha_group_1")));
}
-
+
@Test
public void assertParseCreateEncryptRule() {
SQLStatement sqlStatement = engine.parse(RDL_CREATE_ENCRYPT_RULE);
@@ -447,7 +446,7 @@ public final class DistSQLStatementParserEngineTest {
assertThat(encryptColumnSegments.get(1).getCipherColumn(), is("order_cipher"));
assertThat(encryptColumnSegments.get(1).getEncryptor().getAlgorithmName(), is("MD5"));
}
-
+
@Test
public void assertParseAlterEncryptRule() {
SQLStatement sqlStatement = engine.parse(RDL_ALTER_ENCRYPT_RULE);
@@ -467,28 +466,28 @@ public final class DistSQLStatementParserEngineTest {
assertThat(encryptColumnSegments.get(1).getCipherColumn(), is("order_cipher"));
assertThat(encryptColumnSegments.get(1).getEncryptor().getAlgorithmName(), is("MD5"));
}
-
+
@Test
public void assertParseDropEncryptRule() {
SQLStatement sqlStatement = engine.parse(RDL_DROP_ENCRYPT_RULE);
assertTrue(sqlStatement instanceof DropEncryptRuleStatement);
assertThat(((DropEncryptRuleStatement) sqlStatement).getTables(), is(Arrays.asList("t_encrypt", "t_encrypt_order")));
}
-
+
@Test
public void assertParseShowShardingTableRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_SHARDING_TABLE_RULES);
assertTrue(sqlStatement instanceof ShowShardingTableRulesStatement);
assertThat(((ShowShardingTableRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("schemaName"));
}
-
+
@Test
public void assertParseShowShardingTableRule() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_SHARDING_TABLE_RULE);
assertTrue(sqlStatement instanceof ShowShardingTableRulesStatement);
assertThat(((ShowShardingTableRulesStatement) sqlStatement).getTableName(), is("t_order"));
}
-
+
@Test
public void assertParseShowShardingTableRuleFrom() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_SHARDING_TABLE_RULE_FROM);
@@ -496,35 +495,35 @@ public final class DistSQLStatementParserEngineTest {
assertThat(((ShowShardingTableRulesStatement) sqlStatement).getTableName(), is("t_order"));
assertThat(((ShowShardingTableRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("schemaName"));
}
-
+
@Test
public void assertParseShowShardingBindingTableRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_SHARDING_BINDING_TABLE_RULES);
assertTrue(sqlStatement instanceof ShowShardingBindingTableRulesStatement);
assertThat(((ShowShardingBindingTableRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("sharding_db"));
}
-
+
@Test
public void assertParseShowShardingBroadcastTableRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_SHARDING_BROADCAST_TABLE_RULES);
assertTrue(sqlStatement instanceof ShowShardingBroadcastTableRulesStatement);
assertThat(((ShowShardingBroadcastTableRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("sharding_db"));
}
-
+
@Test
public void assertParseShowReadwriteSplittingRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_READWRITE_SPLITTING_RULES);
assertTrue(sqlStatement instanceof ShowReadwriteSplittingRulesStatement);
assertThat(((ShowReadwriteSplittingRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("readwrite_splitting_db"));
}
-
+
@Test
public void assertParseShowDatabaseDiscoveryRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_DB_DISCOVERY_RULES);
assertTrue(sqlStatement instanceof ShowDatabaseDiscoveryRulesStatement);
assertThat(((ShowDatabaseDiscoveryRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("db_discovery_db"));
}
-
+
@Test
public void assertParseShowEncryptRules() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_ENCRYPT_RULES);
@@ -532,7 +531,7 @@ public final class DistSQLStatementParserEngineTest {
assertNull(((ShowEncryptRulesStatement) sqlStatement).getTableName());
assertThat(((ShowEncryptRulesStatement) sqlStatement).getSchema().get().getIdentifier().getValue(), is("encrypt_db"));
}
-
+
@Test
public void assertParseShowEncryptTableRule() {
SQLStatement sqlStatement = engine.parse(RQL_SHOW_ENCRYPT_TABLE_RULE);