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());

Reply via email to