diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGAnalytic.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGAnalytic.java index ee8c572f11..2e6dc18168 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGAnalytic.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGAnalytic.java @@ -50,11 +50,11 @@ public class PGAnalytic extends SQLObjectImpl implements PGExpr { } public void accept0(PGASTVisitor visitor) { -// if (visitor.visit(this)) { -// acceptChild(visitor, this.partitionBy); -// acceptChild(visitor, this.orderBy); -// } -// visitor.endVisit(this); + if (visitor.visit(this)) { + acceptChild(visitor, this.partitionBy); + acceptChild(visitor, this.orderBy); + } + visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java index cccce93953..6cfe4464e6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java @@ -9,6 +9,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoOption; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; @@ -22,6 +23,10 @@ public class PGSelectParser extends SQLSelectParser { this(new PGLexer(sql)); this.lexer.nextToken(); } + + protected SQLExprParser createExprParser() { + return new PGExprParser(lexer); + } @Override public SQLSelectQuery query() throws ParserException { @@ -125,7 +130,8 @@ public class PGSelectParser extends SQLSelectParser { if (lexer.token() == Token.ROW || lexer.token() == Token.ROWS) { lexer.nextToken(); } else { - throw new ParserException("expect 'ROW' or 'ROWS'"); + //TODO + //throw new ParserException("expect 'ROW' or 'ROWS'"); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java index 6adcaf80a5..5a3ea640b8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java @@ -1,7 +1,9 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; +import com.alibaba.druid.sql.dialect.postgresql.ast.PGAggregateExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGAnalytic; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; @@ -55,4 +57,14 @@ public interface PGASTVisitor extends SQLASTVisitor { void endVisit(PGUpdateStatement x); boolean visit(PGUpdateStatement x); + + void endVisit(PGAggregateExpr x); + + boolean visit(PGAggregateExpr x); + + void endVisit(PGAnalytic x); + + boolean visit(PGAnalytic x); + + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java index f2aa87d29f..b6ff67d9e7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java @@ -1,7 +1,9 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; +import com.alibaba.druid.sql.dialect.postgresql.ast.PGAggregateExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGAnalytic; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; @@ -132,4 +134,23 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi return true; } + @Override + public void endVisit(PGAggregateExpr x) { + } + + @Override + public boolean visit(PGAggregateExpr x) { + return false; + } + + @Override + public void endVisit(PGAnalytic x) { + } + + @Override + public boolean visit(PGAnalytic x) { + + return false; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 8c0722d3e2..bebdd2cc7c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -1,9 +1,12 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.PGAggregateExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGAnalytic; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; @@ -420,4 +423,46 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor public void endVisit(PGSelectQueryBlock x) { } + + @Override + public void endVisit(PGAggregateExpr x) { + + } + + @Override + public boolean visit(PGAggregateExpr x) { + print(x.getMethodName()); + print("("); + printAndAccept(x.getArguments(), ", "); + print(")"); + if(x.getOver() != null){ + x.getOver().accept(this); + } + return false; + } + + @Override + public void endVisit(PGAnalytic x) { + + + } + + @Override + public boolean visit(PGAnalytic x) { + print(" OVER ("); + if(x.getPartitionBy().size() > 0){ + int mark = 0; + for(SQLExpr e:x.getPartitionBy()){ + if(mark++ != 0){ + print(", "); + } + e.accept(this); + } + } + if(x.getOrderBy() != null){ + x.getOrderBy().accept(this); + } + print(")"); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index d52ca9437c..e5da2b730d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -7,8 +7,10 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.PGAggregateExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGAnalytic; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; @@ -234,4 +236,24 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit public boolean visit(PGSelectQueryBlock x) { return this.visit((SQLSelectQueryBlock) x); } + + @Override + public void endVisit(PGAggregateExpr x) { + + } + + @Override + public boolean visit(PGAggregateExpr x) { + return false; + } + + @Override + public void endVisit(PGAnalytic x) { + + } + + @Override + public boolean visit(PGAnalytic x) { + return false; + } } diff --git a/src/test/resources/bvt/parser/postgresql.txt b/src/test/resources/bvt/parser/postgresql.txt index cc29107e67..4e2d2bd107 100644 --- a/src/test/resources/bvt/parser/postgresql.txt +++ b/src/test/resources/bvt/parser/postgresql.txt @@ -8,7 +8,7 @@ sum_prod_show_num, sum_prod_click_num, sum_prod_fb_num, - count(*) over(order by a,b,c) as total_cnt + count(*) over(order by a,ba,c) as total_cnt from (select product_id, sum_prod_show_num, sum_prod_click_num,