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");
+ }
}