This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 8285994b145 Support cte with postgres and openGauss (#32836)
8285994b145 is described below
commit 8285994b14590edf162d2c35a6a3ad57c1fc7139
Author: Cong Hu <[email protected]>
AuthorDate: Thu Sep 12 18:53:40 2024 +0800
Support cte with postgres and openGauss (#32836)
* Support cte with postgres.
* Support cte with openGauss.
---
.../main/antlr4/imports/opengauss/DMLStatement.g4 | 7 +++--
.../statement/OpenGaussStatementVisitor.java | 30 ++++++++++++++++++++++
.../main/antlr4/imports/postgresql/DMLStatement.g4 | 5 ++--
.../statement/PostgreSQLStatementVisitor.java | 30 ++++++++++++++++++++++
4 files changed, 65 insertions(+), 7 deletions(-)
diff --git
a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
index e97b5950e16..2b56262040c 100644
---
a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
+++
b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
@@ -151,12 +151,11 @@ optTempTableName
;
cteList
- : commonTableExpr
- | cteList COMMA_ commonTableExpr
+ : commonTableExpr (COMMA_ commonTableExpr)*
;
commonTableExpr
- : name optNameList AS optMaterialized LP_ preparableStmt RP_
+ : alias optNameList AS optMaterialized LP_ preparableStmt RP_
;
optMaterialized
@@ -220,7 +219,7 @@ valuesClause
limitClause
: LIMIT selectLimitValue
- | LIMIT selectOffsetValue COMMA_ selectLimitValue
+ | LIMIT selectOffsetValue COMMA_ selectLimitValue
| FETCH firstOrNext selectFetchValue? rowOrRows onlyOrWithTies
;
diff --git
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
index a0a6c8b3577..856f352d3fa 100644
---
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
+++
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
@@ -29,6 +29,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementBaseVisito
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AExprContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AexprConstContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AliasClauseContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AliasContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AnyNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AscDescContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AssignmentContext;
@@ -41,6 +42,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.Col
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ColumnNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ColumnNamesContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ColumnrefContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.CommonTableExprContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.ConstraintNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.DataTypeContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.DataTypeLengthContext;
@@ -112,6 +114,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.Whe
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowDefinitionContext;
import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowDefinitionListContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WithClauseContext;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.AggregationType;
import org.apache.shardingsphere.sql.parser.statement.core.enums.CombineType;
import org.apache.shardingsphere.sql.parser.statement.core.enums.JoinType;
@@ -140,6 +143,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InEx
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.TypeCastExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment;
@@ -174,6 +178,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Owner
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
@@ -943,9 +948,34 @@ public abstract class OpenGaussStatementVisitor extends
OpenGaussStatementBaseVi
LockSegment lockSegment = (LockSegment)
visit(ctx.forLockingClause());
result.setLock(lockSegment);
}
+ if (null != ctx.withClause()) {
+ WithSegment withSegment = (WithSegment) visit(ctx.withClause());
+ result.setWithSegment(withSegment);
+ }
return result;
}
+ @Override
+ public ASTNode visitWithClause(final WithClauseContext ctx) {
+ Collection<CommonTableExpressionSegment> commonTableExpressions = new
LinkedList<>();
+ for (CommonTableExprContext each : ctx.cteList().commonTableExpr()) {
+ commonTableExpressions.add((CommonTableExpressionSegment)
visit(each));
+ }
+ return new WithSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), commonTableExpressions, null != ctx.RECURSIVE());
+ }
+
+ @Override
+ public ASTNode visitCommonTableExpr(final CommonTableExprContext ctx) {
+ return new
CommonTableExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), (AliasSegment) visit(ctx.alias()),
+ new SubquerySegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), (OpenGaussSelectStatement)
visit(ctx.preparableStmt().select()),
+ getOriginalText(ctx.preparableStmt().select())));
+ }
+
+ @Override
+ public ASTNode visitAlias(final AliasContext ctx) {
+ return new AliasSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), new IdentifierValue(ctx.identifier().getText()));
+ }
+
@Override
public ASTNode visitForLockingClause(final ForLockingClauseContext ctx) {
return new LockSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex());
diff --git
a/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
b/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
index 60570045b65..84810a50658 100644
---
a/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
+++
b/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
@@ -157,12 +157,11 @@ optTempTableName
;
cteList
- : commonTableExpr
- | cteList COMMA_ commonTableExpr
+ : commonTableExpr (COMMA_ commonTableExpr)*
;
commonTableExpr
- : name optNameList AS optMaterialized LP_ preparableStmt RP_
+ : alias optNameList AS optMaterialized LP_ preparableStmt RP_
;
optMaterialized
diff --git
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
index 7696ef1bd2c..c5e53705d2b 100644
---
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
+++
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.sql.parser.api.ASTNode;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AExprContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AexprConstContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AliasClauseContext;
+import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AliasContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AnyNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AscDescContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AttrNameContext;
@@ -39,6 +40,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Co
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ColumnNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ColumnNamesContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ColumnrefContext;
+import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.CommonTableExprContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ConstraintNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.DataTypeContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.DataTypeLengthContext;
@@ -112,6 +114,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Wh
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowDefinitionContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowDefinitionListContext;
+import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WithClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParserBaseVisitor;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.AggregationType;
import org.apache.shardingsphere.sql.parser.statement.core.enums.CombineType;
@@ -141,6 +144,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InEx
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.TypeCastExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment;
@@ -175,6 +179,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Owner
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
@@ -916,9 +921,34 @@ public abstract class PostgreSQLStatementVisitor extends
PostgreSQLStatementPars
LockSegment lockSegment = (LockSegment)
visit(ctx.forLockingClause());
result.setLock(lockSegment);
}
+ if (null != ctx.withClause()) {
+ WithSegment withSegment = (WithSegment) visit(ctx.withClause());
+ result.setWithSegment(withSegment);
+ }
return result;
}
+ @Override
+ public ASTNode visitWithClause(final WithClauseContext ctx) {
+ Collection<CommonTableExpressionSegment> commonTableExpressions = new
LinkedList<>();
+ for (CommonTableExprContext each : ctx.cteList().commonTableExpr()) {
+ commonTableExpressions.add((CommonTableExpressionSegment)
visit(each));
+ }
+ return new WithSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), commonTableExpressions, null != ctx.RECURSIVE());
+ }
+
+ @Override
+ public ASTNode visitCommonTableExpr(final CommonTableExprContext ctx) {
+ return new
CommonTableExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), (AliasSegment) visit(ctx.alias()),
+ new SubquerySegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), (PostgreSQLSelectStatement)
visit(ctx.preparableStmt().select()),
+ getOriginalText(ctx.preparableStmt().select())));
+ }
+
+ @Override
+ public ASTNode visitAlias(final AliasContext ctx) {
+ return new AliasSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), new IdentifierValue(ctx.identifier().getText()));
+ }
+
@Override
public ASTNode visitForLockingClause(final ForLockingClauseContext ctx) {
return new LockSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex());