add pgparser with over attribute

This commit is contained in:
axmanwang
2012-04-23 12:58:34 +08:00
parent ef0b985e66
commit ca53c530fc
7 changed files with 113 additions and 7 deletions
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
}
+1 -1
View File
@@ -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,