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/28 09:56:32 UTC
[shardingsphere] branch master updated: Use shardingSphere parser
instead of calcite's parser (#11042)
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 f9ddb20 Use shardingSphere parser instead of calcite's parser (#11042)
f9ddb20 is described below
commit f9ddb208851f65b75a6179232da0d3946e7adbd2
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Mon Jun 28 17:55:52 2021 +0800
Use shardingSphere parser instead of calcite's parser (#11042)
* add offset and rowcount sql converter
* Use shardingSphere parser instead of calcite's parser
* fix tests
---
.../infra/optimize/ShardingSphereOptimizer.java | 16 +++---
.../infra/optimize/context/OptimizeContext.java | 8 +++
.../optimize/context/OptimizeContextFactory.java | 11 +++-
.../core/convert/SqlNodeConvertEngine.java | 13 +++--
.../SelectStatementSqlNodeConverterTest.java | 59 +++++++++-------------
5 files changed, 57 insertions(+), 50 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
index b622faa..9d2c5e1 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
@@ -23,9 +23,11 @@ import org.apache.calcite.adapter.enumerable.EnumerableConvention;
import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.parser.SqlParseException;
-import org.apache.calcite.sql.parser.SqlParser;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.optimize.context.OptimizeContext;
+import org.apache.shardingsphere.infra.optimize.core.convert.SqlNodeConvertEngine;
+import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
@RequiredArgsConstructor
@@ -41,14 +43,16 @@ public final class ShardingSphereOptimizer {
* @throws SQLParsingException sql parsing exception
*/
public RelNode optimize(final String sql) throws SQLParsingException {
- // TODO The below will be replaced by SqlNodeConverter.
try {
- SqlNode sqlNode = SqlParser.create(sql, context.getParserConfig()).parseQuery();
+ // TODO : Remove the following statement after SqlNodeConvertEngine becomes available.
+ // SqlNode sqlNode = SqlParser.create(sql, context.getParserConfig()).parseQuery();
+ ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(context.getDatabaseType()));
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlParserEngine.parse(sql, true));
SqlNode validNode = context.getValidator().validate(sqlNode);
RelNode logicPlan = context.getRelConverter().convertQuery(validNode, false, true).rel;
return optimize(logicPlan);
- } catch (final SqlParseException ex) {
- throw new SQLParsingException(ex.getMessage());
+ } catch (final UnsupportedOperationException ex) {
+ throw new ShardingSphereException(ex);
}
}
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContext.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContext.java
index d11a911..851492d 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContext.java
@@ -23,6 +23,7 @@ import org.apache.calcite.schema.Schema;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.sql2rel.SqlToRelConverter;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import java.util.Properties;
@@ -33,12 +34,19 @@ import java.util.Properties;
@Getter
public final class OptimizeContext {
+ private final DatabaseType databaseType;
+
private final Properties connectionProperties;
private final String schemaName;
private final Schema logicSchema;
+ /**
+ * Remove calcite's parser.
+ * @deprecated Use ShardingSphere parser instead.
+ */
+ @Deprecated
private final SqlParser.Config parserConfig;
private final SqlValidator validator;
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
index c3485a9..06bf005 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
@@ -67,11 +67,18 @@ public final class OptimizeContextFactory {
private static final String CONFORMANCE_CAMEL_NAME = CalciteConnectionProperty.CONFORMANCE.camelName();
+ private final DatabaseType databaseType;
+
@Getter
private final Properties properties = new Properties();
private final CalciteConnectionConfig connectionConfig;
+ /**
+ * Remove calcite's parser.
+ * @deprecated Use ShardingSphere parser instead.
+ */
+ @Deprecated
private final Config parserConfig;
private final RelDataTypeFactory typeFactory;
@@ -82,7 +89,7 @@ public final class OptimizeContextFactory {
private final RelOptCluster cluster;
public OptimizeContextFactory(final Map<String, ShardingSphereMetaData> metaDataMap) {
- DatabaseType databaseType = metaDataMap.isEmpty() ? null : metaDataMap.values().iterator().next().getResource().getDatabaseType();
+ this.databaseType = metaDataMap.isEmpty() ? null : metaDataMap.values().iterator().next().getResource().getDatabaseType();
initProperties(databaseType);
typeFactory = new JavaTypeFactoryImpl();
cluster = newCluster();
@@ -156,7 +163,7 @@ public final class OptimizeContextFactory {
CalciteCatalogReader catalogReader = createCalciteCatalogReader(schemaName, connectionConfig, typeFactory, logicSchema);
SqlValidator validator = createSqlValidator(connectionConfig, typeFactory, catalogReader);
SqlToRelConverter relConverter = createSqlToRelConverter(cluster, validator, catalogReader);
- return new OptimizeContext(properties, schemaName, logicSchema, parserConfig, validator, relConverter);
+ return new OptimizeContext(databaseType, properties, schemaName, logicSchema, parserConfig, validator, relConverter);
}
private CalciteCatalogReader createCalciteCatalogReader(final String schemaName, final CalciteConnectionConfig config,
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/convert/SqlNodeConvertEngine.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/convert/SqlNodeConvertEngine.java
index 06cdab1..c1f9a2c 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/convert/SqlNodeConvertEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/convert/SqlNodeConvertEngine.java
@@ -37,14 +37,13 @@ public final class SqlNodeConvertEngine {
* @param statement statement
* @return sqlNode optional
*/
- public static Optional<SqlNode> convert(final SQLStatement statement) {
- try {
- if (statement instanceof SelectStatement) {
- return new SelectStatementSqlNodeConverter().convert((SelectStatement) statement);
+ public static SqlNode convert(final SQLStatement statement) {
+ if (statement instanceof SelectStatement) {
+ Optional<SqlNode> selectSqlNode = new SelectStatementSqlNodeConverter().convert((SelectStatement) statement);
+ if (selectSqlNode.isPresent()) {
+ return selectSqlNode.get();
}
- return Optional.empty();
- } catch (final UnsupportedOperationException ex) {
- return Optional.empty();
}
+ throw new UnsupportedOperationException("Unsupported sqlNode conversion.");
}
}
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSqlNodeConverterTest.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSqlNodeConverterTest.java
index 834bf97..cef0e4f 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSqlNodeConverterTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/test/java/org/apache/shardingsphere/infra/optimize/core/convert/SelectStatementSqlNodeConverterTest.java
@@ -24,17 +24,13 @@ import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import java.util.Optional;
-
import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
/**
@@ -58,10 +54,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelect() {
String sql = "select order_id, user_id from t_order";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- Assert.assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNull(sqlSelect.getWhere());
assertNull(sqlSelect.getOffset());
@@ -78,10 +73,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelectLimit() {
String sql = "select order_id, user_id from t_order limit 1, 2";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- Assert.assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNull(sqlSelect.getWhere());
assertNotNull(sqlSelect.getOffset());
@@ -92,10 +86,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelectRowCount() {
String sql = "select order_id, user_id from t_order limit 2";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- Assert.assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNull(sqlSelect.getWhere());
assertNull(sqlSelect.getOffset());
@@ -106,10 +99,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelectFilter() {
String sql = "select order_id, user_id from t_order where order_id = 10";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- Assert.assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNotNull(sqlSelect.getWhere());
}
@@ -118,10 +110,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelectFilterGroupBy() {
String sql = "select order_id, user_id from t_order where order_id = 10 group by order_id";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- Assert.assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNotNull(sqlSelect.getWhere());
assertEquals(1, sqlSelect.getGroup().size());
@@ -131,10 +122,9 @@ public final class SelectStatementSqlNodeConverterTest {
public void testConvertSimpleSelectFilterOrderBy() {
String sql = "select order_id, user_id from t_order where user_id = 10 order by order_id desc";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertEquals(2, sqlSelect.getSelectList().size());
assertNotNull(sqlSelect.getWhere());
assertEquals(1, sqlSelect.getOrderList().size());
@@ -146,10 +136,9 @@ public final class SelectStatementSqlNodeConverterTest {
+ "o1.order_id = o2.order_id where o1.status='FINISHED' and o2.order_item_id > 1024 and 1=1 order by "
+ "o1.order_id desc";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
- assertThat(optional.get(), instanceOf(SqlSelect.class));
- SqlSelect sqlSelect = (SqlSelect) optional.get();
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
+ SqlSelect sqlSelect = (SqlSelect) sqlNode;
assertThat(sqlSelect.getFrom(), instanceOf(SqlJoin.class));
assertEquals(1, sqlSelect.getOrderList().size());
}
@@ -160,8 +149,8 @@ public final class SelectStatementSqlNodeConverterTest {
+ "o1.order_id = o2.order_id where o1.status='FINISHED' and o2.order_item_id > 1024 and 1=1 order by "
+ "o1.order_id desc";
SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
- Optional<SqlNode> optional = SqlNodeConvertEngine.convert(sqlStatement);
- assertTrue(optional.isPresent());
+ SqlNode sqlNode = SqlNodeConvertEngine.convert(sqlStatement);
+ assertThat(sqlNode, instanceOf(SqlSelect.class));
// TODO outer join is not supported by parser of ShardingSphere
}
}