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 
     }
 }