This is an automated email from the ASF dual-hosted git repository.
yx9o 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 75fd0df3124 Optimize PostgreSQL, openGauss order by item parse and
convert to SqlNode (#20238)
75fd0df3124 is described below
commit 75fd0df3124fe0a7e038a62b71a23904bd6f3288
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Aug 17 16:21:49 2022 +0800
Optimize PostgreSQL, openGauss order by item parse and convert to SqlNode
(#20238)
* Optimize PostgreSQL, openGauss order by item parse and convert to SqlNode
* optimize code style
---
.../loader/dialect/OracleSchemaMetaDataLoader.java | 4 +--
.../item/ExpressionOrderByItemConverter.java | 4 +--
.../orderby/item/OrderByItemConverterUtil.java | 2 +-
.../core/util/PipelineDistributedBarrier.java | 1 +
.../impl/OpenGaussStatementSQLVisitor.java | 32 ++++++++++++++++++----
.../impl/PostgreSQLStatementSQLVisitor.java | 32 ++++++++++++++++++----
.../SQLNodeConvertEngineParameterizedTest.java | 2 ++
.../main/resources/case/dml/select-aggregate.xml | 1 -
8 files changed, 60 insertions(+), 18 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
index 2e5156168d5..904b4b647a5 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
@@ -67,7 +67,7 @@ public final class OracleSchemaMetaDataLoader implements
DialectSchemaMetaDataLo
private static final int COLLATION_START_MINOR_VERSION = 2;
private static final int IDENTITY_COLUMN_START_MINOR_VERSION = 1;
-
+
private static final int HIDDEN_COLUMN_START_MINOR_VERSION = 1;
private static final int MAX_EXPRESSION_SIZE = 1000;
@@ -144,7 +144,7 @@ public final class OracleSchemaMetaDataLoader implements
DialectSchemaMetaDataLo
return tables.isEmpty() ? String.format(TABLE_META_DATA_SQL, collation)
: String.format(TABLE_META_DATA_SQL_IN_TABLES, collation,
tables.stream().map(each -> String.format("'%s'",
each)).collect(Collectors.joining(",")));
}
-
+
private boolean versionContainsHiddenColumn(final DatabaseMetaData
databaseMetaData) throws SQLException {
return databaseMetaData.getDatabaseMajorVersion() >=
COLLATION_START_MAJOR_VERSION && databaseMetaData.getDatabaseMinorVersion() >=
HIDDEN_COLUMN_START_MINOR_VERSION;
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
index 2162bddbd8c..430ce309993 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/ExpressionOrderByItemConverter.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.o
import org.apache.calcite.sql.SqlNode;
import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.SQLSegmentConverter;
+import
org.apache.shardingsphere.infra.federation.optimizer.converter.segment.expression.ExpressionConverter;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
import java.util.Optional;
@@ -30,7 +31,6 @@ public final class ExpressionOrderByItemConverter implements
SQLSegmentConverter
@Override
public Optional<SqlNode> convert(final ExpressionOrderByItemSegment
segment) {
- // TODO
- return Optional.empty();
+ return null == segment ? Optional.empty() : new
ExpressionConverter().convert(segment.getExpr());
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/OrderByItemConverterUtil.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/OrderByItemConverterUtil.java
index 066b1358646..ea66567872b 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/OrderByItemConverterUtil.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/orderby/item/OrderByItemConverterUtil.java
@@ -47,7 +47,7 @@ public final class OrderByItemConverterUtil {
if (each instanceof ColumnOrderByItemSegment) {
new
ColumnOrderByItemConverter().convert((ColumnOrderByItemSegment)
each).ifPresent(result::add);
} else if (each instanceof ExpressionOrderByItemSegment) {
- throw new UnsupportedOperationException("unsupported
ExpressionOrderByItemSegment");
+ new
ExpressionOrderByItemConverter().convert((ExpressionOrderByItemSegment)
each).ifPresent(result::add);
} else if (each instanceof IndexOrderByItemSegment) {
new
IndexOrderByItemConverter().convert((IndexOrderByItemSegment)
each).ifPresent(result::add);
} else if (each instanceof TextOrderByItemSegment) {
diff --git
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/util/PipelineDistributedBarrier.java
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/util/PipelineDistributedBarrier.java
index 038fe1f90c7..0ee714eb1d9 100644
---
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/util/PipelineDistributedBarrier.java
+++
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/util/PipelineDistributedBarrier.java
@@ -42,6 +42,7 @@ public final class PipelineDistributedBarrier {
private static final PipelineDistributedBarrier INSTANCE = new
PipelineDistributedBarrier();
private static final LazyInitializer<ClusterPersistRepository>
REPOSITORY_LAZY_INITIALIZER = new LazyInitializer<ClusterPersistRepository>() {
+
@Override
protected ClusterPersistRepository initialize() {
return (ClusterPersistRepository)
PipelineContext.getContextManager().getMetaDataContexts().getPersistService().getRepository();
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
index 211f1631ddc..3015528f905 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
@@ -298,18 +298,38 @@ public abstract class OpenGaussStatementSQLVisitor
extends OpenGaussStatementBas
if (null != ctx.patternMatchingOperator()) {
return createPatternMatchingOperationSegment(ctx);
}
+ Optional<String> commonBinaryOperator = findCommonBinaryOperator(ctx);
+ if (commonBinaryOperator.isPresent()) {
+ return createCommonBinaryOperationSegment(ctx,
commonBinaryOperator.get());
+ }
+ super.visitAExpr(ctx);
+ String text = ctx.start.getInputStream().getText(new
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+ return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
+ }
+
+ private Optional<String> findCommonBinaryOperator(final AExprContext ctx) {
if (null != ctx.comparisonOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.comparisonOperator().getText());
+ return Optional.of(ctx.comparisonOperator().getText());
}
if (null != ctx.andOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.andOperator().getText());
+ return Optional.of(ctx.andOperator().getText());
}
if (null != ctx.orOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.orOperator().getText());
+ return Optional.of(ctx.orOperator().getText());
}
- super.visitAExpr(ctx);
- String text = ctx.start.getInputStream().getText(new
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
+ if (null != ctx.PLUS_()) {
+ return Optional.of(ctx.PLUS_().getText());
+ }
+ if (null != ctx.MINUS_()) {
+ return Optional.of(ctx.MINUS_().getText());
+ }
+ if (null != ctx.ASTERISK_()) {
+ return Optional.of(ctx.ASTERISK_().getText());
+ }
+ if (null != ctx.SLASH_()) {
+ return Optional.of(ctx.SLASH_().getText());
+ }
+ return Optional.empty();
}
private BinaryOperationExpression
createPatternMatchingOperationSegment(final AExprContext ctx) {
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
index 9239a4975c2..a60694050ec 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
@@ -296,18 +296,38 @@ public abstract class PostgreSQLStatementSQLVisitor
extends PostgreSQLStatementP
if (null != ctx.patternMatchingOperator()) {
return createPatternMatchingOperationSegment(ctx);
}
+ Optional<String> commonBinaryOperator = findCommonBinaryOperator(ctx);
+ if (commonBinaryOperator.isPresent()) {
+ return createCommonBinaryOperationSegment(ctx,
commonBinaryOperator.get());
+ }
+ super.visitAExpr(ctx);
+ String text = ctx.start.getInputStream().getText(new
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+ return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
+ }
+
+ private Optional<String> findCommonBinaryOperator(final AExprContext ctx) {
if (null != ctx.comparisonOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.comparisonOperator().getText());
+ return Optional.of(ctx.comparisonOperator().getText());
}
if (null != ctx.andOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.andOperator().getText());
+ return Optional.of(ctx.andOperator().getText());
}
if (null != ctx.orOperator()) {
- return createCommonBinaryOperationSegment(ctx,
ctx.orOperator().getText());
+ return Optional.of(ctx.orOperator().getText());
}
- super.visitAExpr(ctx);
- String text = ctx.start.getInputStream().getText(new
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
+ if (null != ctx.PLUS_()) {
+ return Optional.of(ctx.PLUS_().getText());
+ }
+ if (null != ctx.MINUS_()) {
+ return Optional.of(ctx.MINUS_().getText());
+ }
+ if (null != ctx.ASTERISK_()) {
+ return Optional.of(ctx.ASTERISK_().getText());
+ }
+ if (null != ctx.SLASH_()) {
+ return Optional.of(ctx.SLASH_().getText());
+ }
+ return Optional.empty();
}
private BinaryOperationExpression
createPatternMatchingOperationSegment(final AExprContext ctx) {
diff --git
a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
index 1906b0b68e2..439973390a1 100644
---
a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
+++
b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
@@ -99,6 +99,8 @@ public final class SQLNodeConvertEngineParameterizedTest {
SUPPORTED_SQL_CASE_IDS.add("select_count_with_binding_tables_with_join");
SUPPORTED_SQL_CASE_IDS.add("select_join_using");
SUPPORTED_SQL_CASE_IDS.add("select_count_with_escape_character");
+ SUPPORTED_SQL_CASE_IDS.add("select_group_by_with_order_by_and_limit");
+ SUPPORTED_SQL_CASE_IDS.add("select_count_with_sub");
}
private final String sqlCaseId;
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-aggregate.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-aggregate.xml
index a41434c91d0..cffb272fbb6 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-aggregate.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-aggregate.xml
@@ -74,7 +74,6 @@
<literal-expression value="1" start-index="64"
stop-index="64" />
</right>
</binary-operation-expression>
- <common-expression text="1-1" start-index="62"
stop-index="64" />
</right>
</binary-operation-expression>
</expr>