mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
add pgparser with over attribute
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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'");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
+21
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+22
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user