This is an automated email from the ASF dual-hosted git repository.

sunnianjun 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 43a21e397da Add database type on SQLStatement (#27369)
43a21e397da is described below

commit 43a21e397da008b10a35ecb1bd84b23453a4c86f
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jul 22 16:05:49 2023 +0800

    Add database type on SQLStatement (#27369)
    
    * Move QuoteCharacter and NullsOrderType to database module
    
    * Add database type on SQLStatement
---
 .../sharding/merge/dql/ShardingDQLResultMerger.java     | 17 ++++-------------
 .../token/generator/impl/ProjectionsTokenGenerator.java | 12 ++++--------
 .../select/orderby/engine/OrderByContextEngine.java     | 11 +----------
 .../sql/parser/sql/common/statement/SQLStatement.java   | 11 +++++++++++
 .../sql/dialect/statement/mysql/MySQLStatement.java     |  7 +++++++
 .../dialect/statement/opengauss/OpenGaussStatement.java |  7 +++++++
 .../sql/dialect/statement/oracle/OracleStatement.java   |  7 +++++++
 .../statement/postgresql/PostgreSQLStatement.java       |  7 +++++++
 .../dialect/statement/sqlserver/SQLServerStatement.java |  7 +++++++
 9 files changed, 55 insertions(+), 31 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMerger.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMerger.java
index ac13fbda8c5..bf412aa8764 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMerger.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMerger.java
@@ -22,14 +22,14 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem
 import 
org.apache.shardingsphere.infra.binder.segment.select.pagination.PaginationContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
-import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.engine.merger.ResultMerger;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import 
org.apache.shardingsphere.sharding.merge.common.IteratorStreamMergedResult;
 import 
org.apache.shardingsphere.sharding.merge.dql.groupby.GroupByMemoryMergedResult;
 import 
org.apache.shardingsphere.sharding.merge.dql.groupby.GroupByStreamMergedResult;
@@ -37,14 +37,9 @@ import 
org.apache.shardingsphere.sharding.merge.dql.orderby.OrderByStreamMergedR
 import 
org.apache.shardingsphere.sharding.merge.dql.pagination.LimitDecoratorMergedResult;
 import 
org.apache.shardingsphere.sharding.merge.dql.pagination.RowNumberDecoratorMergedResult;
 import 
org.apache.shardingsphere.sharding.merge.dql.pagination.TopAndRowNumberDecoratorMergedResult;
-import org.apache.shardingsphere.infra.database.enums.NullsOrderType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.OpenGaussStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement;
 
 import java.sql.SQLException;
 import java.util.List;
@@ -112,17 +107,13 @@ public final class ShardingDQLResultMerger implements 
ResultMerger {
     
     private void setGroupByForDistinctRow(final SelectStatementContext 
selectStatementContext) {
         for (int index = 1; index <= 
selectStatementContext.getProjectionsContext().getExpandProjections().size(); 
index++) {
-            OrderByItem orderByItem = new OrderByItem(new 
IndexOrderByItemSegment(-1, -1, index, OrderDirection.ASC, 
createDefaultNullsOrderType(selectStatementContext.getSqlStatement())));
+            OrderByItem orderByItem = new OrderByItem(new 
IndexOrderByItemSegment(-1, -1, index, OrderDirection.ASC,
+                    
selectStatementContext.getSqlStatement().getDatabaseType().getDefaultNullsOrderType()));
             orderByItem.setIndex(index);
             
selectStatementContext.getGroupByContext().getItems().add(orderByItem);
         }
     }
     
-    private NullsOrderType createDefaultNullsOrderType(final SelectStatement 
selectStatement) {
-        return selectStatement instanceof PostgreSQLStatement || 
selectStatement instanceof OpenGaussStatement || selectStatement instanceof 
OracleStatement ? NullsOrderType.LAST
-                : NullsOrderType.FIRST;
-    }
-    
     private MergedResult getGroupByMergedResult(final List<QueryResult> 
queryResults, final SelectStatementContext selectStatementContext,
                                                 final Map<String, Integer> 
columnLabelIndexMap, final ShardingSphereSchema schema) throws SQLException {
         return selectStatementContext.isSameGroupByAndOrderByItems()
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
index 67dbc17c30e..b64a27b3222 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Agg
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.DerivedProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.database.oracle.OracleDatabaseType;
+import org.apache.shardingsphere.infra.database.enums.NullsOrderType;
 import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.RouteContextAware;
@@ -34,7 +34,6 @@ import 
org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import 
org.apache.shardingsphere.sharding.rewrite.token.generator.IgnoreForSingleRoute;
 import org.apache.shardingsphere.sharding.rewrite.token.pojo.ProjectionsToken;
-import org.apache.shardingsphere.infra.database.enums.NullsOrderType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.extractor.TableExtractor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -135,13 +134,10 @@ public final class ProjectionsTokenGenerator implements 
OptionalSQLTokenGenerato
         IdentifierValue newOwnerIdentifier = new 
IdentifierValue(ownerSegment.get().getIdentifier().getQuoteCharacter().wrap(actualTableName.get()));
         OwnerSegment newOwner = new OwnerSegment(0, 0, newOwnerIdentifier);
         newColumnSegment.setOwner(newOwner);
-        return new ColumnOrderByItemSegment(newColumnSegment, 
old.getOrderDirection(), generateNewNullsOrderType(databaseType, 
old.getOrderDirection()));
+        return new ColumnOrderByItemSegment(newColumnSegment, 
old.getOrderDirection(), generateNewNullsOrderType(old.getOrderDirection(), 
databaseType));
     }
     
-    private NullsOrderType generateNewNullsOrderType(final DatabaseType 
databaseType, final OrderDirection orderDirection) {
-        if (databaseType.getDefaultSchema().isPresent() || databaseType 
instanceof OracleDatabaseType) {
-            return OrderDirection.ASC == orderDirection ? NullsOrderType.LAST 
: NullsOrderType.FIRST;
-        }
-        return OrderDirection.ASC == orderDirection ? NullsOrderType.FIRST : 
NullsOrderType.LAST;
+    private NullsOrderType generateNewNullsOrderType(final OrderDirection 
orderDirection, final DatabaseType databaseType) {
+        return OrderDirection.ASC == orderDirection ? 
databaseType.getDefaultNullsOrderType() : 
databaseType.getDefaultNullsOrderType().getReversedOrderType();
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/orderby/engine/OrderByContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/orderby/engine/OrderByContextEngine.java
index 8407f797024..cfa1184e6ff 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/orderby/engine/OrderByContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/orderby/engine/OrderByContextEngine.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.infra.binder.segment.select.orderby.engine;
 import 
org.apache.shardingsphere.infra.binder.segment.select.groupby.GroupByContext;
 import 
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByContext;
 import 
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem;
-import org.apache.shardingsphere.infra.database.enums.NullsOrderType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
@@ -28,9 +27,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.Co
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.OpenGaussStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -71,7 +67,7 @@ public final class OrderByContextEngine {
                 if (projectionSegment instanceof ColumnProjectionSegment) {
                     ColumnProjectionSegment columnProjectionSegment = 
(ColumnProjectionSegment) projectionSegment;
                     ColumnOrderByItemSegment columnOrderByItemSegment =
-                            new 
ColumnOrderByItemSegment(columnProjectionSegment.getColumn(), 
OrderDirection.ASC, createDefaultNullsOrderType(selectStatement));
+                            new 
ColumnOrderByItemSegment(columnProjectionSegment.getColumn(), 
OrderDirection.ASC, 
selectStatement.getDatabaseType().getDefaultNullsOrderType());
                     OrderByItem item = new 
OrderByItem(columnOrderByItemSegment);
                     item.setIndex(index++);
                     orderByItems.add(item);
@@ -83,9 +79,4 @@ public final class OrderByContextEngine {
         }
         return null;
     }
-    
-    private NullsOrderType createDefaultNullsOrderType(final SelectStatement 
selectStatement) {
-        return selectStatement instanceof PostgreSQLStatement || 
selectStatement instanceof OpenGaussStatement || selectStatement instanceof 
OracleStatement ? NullsOrderType.LAST
-                : NullsOrderType.FIRST;
-    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
index edf087f2198..5287b3bd352 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/SQLStatement.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.sql.common.statement;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 
 /**
@@ -30,4 +32,13 @@ public interface SQLStatement extends ASTNode {
      * @return count of parameters
      */
     int getParameterCount();
+    
+    /**
+     * Get database type.
+     * 
+     * @return database type
+     */
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "SQL92");
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/MySQLStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/MySQLStatement.java
index 438bea3ce78..6143e222f76 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/MySQLStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/MySQLStatement.java
@@ -17,10 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
  * MySQL statement.
  */
 public interface MySQLStatement extends SQLStatement {
+    
+    @Override
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "MySQL");
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/OpenGaussStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/OpenGaussStatement.java
index 651116ac625..624abcebf72 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/OpenGaussStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/OpenGaussStatement.java
@@ -17,10 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
  * OpenGauss statement.
  */
 public interface OpenGaussStatement extends SQLStatement {
+    
+    @Override
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "openGauss");
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/OracleStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/OracleStatement.java
index 23d26376934..b382bdf86b3 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/OracleStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/OracleStatement.java
@@ -17,10 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
  * Oracle statement.
  */
 public interface OracleStatement extends SQLStatement {
+    
+    @Override
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "Oracle");
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/PostgreSQLStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/PostgreSQLStatement.java
index 1e78e0903c7..eb7567b8225 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/PostgreSQLStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/PostgreSQLStatement.java
@@ -17,10 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
  * PostgreSQL statement.
  */
 public interface PostgreSQLStatement extends SQLStatement {
+    
+    @Override
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/SQLServerStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/SQLServerStatement.java
index 52c93c28bb7..ab0de10611f 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/SQLServerStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/SQLServerStatement.java
@@ -17,10 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver;
 
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
  * SQLServer statement.
  */
 public interface SQLServerStatement extends SQLStatement {
+    
+    @Override
+    default DatabaseType getDatabaseType() {
+        return TypedSPILoader.getService(DatabaseType.class, "SQLServer");
+    }
 }

Reply via email to