bug fixed for schema stat

This commit is contained in:
温少
2012-02-22 22:31:02 +08:00
10 changed files with 327 additions and 216 deletions
@@ -0,0 +1,27 @@
package com.alibaba.druid.sql.dialect.postgresql.ast;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
public class PGCurrentOfExpr extends PGSQLObjectImpl implements SQLExpr {
private static final long serialVersionUID = 1L;
private SQLExpr cursor;
public SQLExpr getCursor() {
return cursor;
}
public void setCursor(SQLExpr cursor) {
this.cursor = cursor;
}
@Override
public void accept0(PGASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, cursor);
}
visitor.endVisit(this);
}
}
@@ -147,6 +147,7 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
acceptChild(visitor, name);
acceptChild(visitor, definition);
}
visitor.endVisit(this);
}
}
@@ -181,6 +182,7 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
if (visitor.visit(this)) {
acceptChild(visitor, count);
}
visitor.endVisit(this);
}
}
@@ -225,6 +227,7 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
if (visitor.visit(this)) {
acceptChild(visitor, of);
}
visitor.endVisit(this);
}
}
@@ -259,6 +262,7 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
if (visitor.visit(this)) {
acceptChild(visitor, table);
}
visitor.endVisit(this);
}
}
@@ -39,5 +39,6 @@ public class PGTruncateStatement extends SQLTruncateStatement implements PGSQLSt
if (visitor.visit(this)) {
acceptChild(visitor, tableNames);
}
visitor.endVisit(this);
}
}
@@ -31,5 +31,6 @@ public class PGWithClause extends PGSQLObjectImpl {
if (visitor.visit(this)) {
acceptChild(visitor, withQuery);
}
visitor.endVisit(this);
}
}
}
@@ -40,5 +40,6 @@ public class PGWithQuery extends PGSQLObjectImpl {
acceptChild(visitor, columns);
acceptChild(visitor, subQuery);
}
visitor.endVisit(this);
}
}
}
@@ -1,5 +1,6 @@
package com.alibaba.druid.sql.dialect.postgresql.visitor;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGTruncateStatement;
@@ -40,4 +41,8 @@ public interface PGASTVisitor extends SQLASTVisitor {
void endVisit(PGDeleteStatement x);
boolean visit(PGDeleteStatement x);
void endVisit(PGCurrentOfExpr x);
boolean visit(PGCurrentOfExpr x);
}
@@ -1,5 +1,6 @@
package com.alibaba.druid.sql.dialect.postgresql.visitor;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock.FetchClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock.ForClause;
@@ -99,5 +100,15 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi
return true;
}
@Override
public void endVisit(PGCurrentOfExpr x) {
}
@Override
public boolean visit(PGCurrentOfExpr x) {
return true;
}
}
@@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock.FetchClause;
@@ -13,263 +14,262 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class PGOutputVisitor extends SQLASTOutputVisitor implements
PGASTVisitor {
public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor {
public PGOutputVisitor(Appendable appender) {
super(appender);
}
public PGOutputVisitor(Appendable appender){
super(appender);
}
@Override
public void endVisit(WindowClause x) {
@Override
public void endVisit(WindowClause x) {
}
}
@Override
public boolean visit(WindowClause x) {
print("WINDOW ");
x.getName().accept(this);
print(" AS ");
for (int i = 0; i < x.getDefinition().size(); ++i) {
if (i != 0) {
println(", ");
}
print("(");
x.getDefinition().get(i).accept(this);
print(")");
}
return false;
}
@Override
public boolean visit(WindowClause x) {
print("WINDOW ");
x.getName().accept(this);
print(" AS ");
for (int i = 0; i < x.getDefinition().size(); ++i) {
if (i != 0) {
println(", ");
}
print("(");
x.getDefinition().get(i).accept(this);
print(")");
}
return false;
}
@Override
public void endVisit(FetchClause x) {
@Override
public void endVisit(FetchClause x) {
}
}
@Override
public boolean visit(FetchClause x) {
print("FETCH ");
if (FetchClause.Option.FIRST.equals(x.getOption())) {
print("FIRST ");
} else if (FetchClause.Option.NEXT.equals(x.getOption())) {
print("NEXT ");
}
x.getCount().accept(this);
print(" ROWS ONLY");
return false;
}
@Override
public boolean visit(FetchClause x) {
print("FETCH ");
if (FetchClause.Option.FIRST.equals(x.getOption())) {
print("FIRST ");
} else if (FetchClause.Option.NEXT.equals(x.getOption())) {
print("NEXT ");
}
x.getCount().accept(this);
print(" ROWS ONLY");
return false;
}
@Override
public void endVisit(ForClause x) {
@Override
public void endVisit(ForClause x) {
}
}
@Override
public boolean visit(ForClause x) {
print("FOR ");
if (ForClause.Option.UPDATE.equals(x.getOption())) {
print("UPDATE ");
} else if (ForClause.Option.SHARE.equals(x.getOption())) {
print("SHARE ");
}
@Override
public boolean visit(ForClause x) {
print("FOR ");
if (ForClause.Option.UPDATE.equals(x.getOption())) {
print("UPDATE ");
} else if (ForClause.Option.SHARE.equals(x.getOption())) {
print("SHARE ");
}
if (x.getOf().size() > 0) {
for (int i = 0; i < x.getOf().size(); ++i) {
if (i != 0) {
println(", ");
}
x.getOf().get(i).accept(this);
}
}
if (x.isNoWait()) {
print(" NOWAIT");
}
if (x.getOf().size() > 0) {
for (int i = 0; i < x.getOf().size(); ++i) {
if (i != 0) {
println(", ");
}
x.getOf().get(i).accept(this);
}
}
return false;
}
if (x.isNoWait()) {
print(" NOWAIT");
}
@Override
public void endVisit(PGWithQuery x) {
return false;
}
}
@Override
public void endVisit(PGWithQuery x) {
@Override
public boolean visit(PGWithQuery x) {
x.getName().accept(this);
}
if (x.getColumns().size() > 0) {
print(" (");
printAndAccept(x.getColumns(), ", ");
print(")");
}
println();
print("AS");
println();
print("(");
incrementIndent();
println();
x.getSubQuery().accept(this);
decrementIndent();
println();
print(")");
@Override
public boolean visit(PGWithQuery x) {
x.getName().accept(this);
return false;
}
if (x.getColumns().size() > 0) {
print(" (");
printAndAccept(x.getColumns(), ", ");
print(")");
}
println();
print("AS");
println();
print("(");
incrementIndent();
println();
x.getSubQuery().accept(this);
decrementIndent();
println();
print(")");
@Override
public void endVisit(PGWithClause x) {
return false;
}
}
@Override
public void endVisit(PGWithClause x) {
@Override
public boolean visit(PGWithClause x) {
print("WITH");
incrementIndent();
println();
printlnAndAccept(x.getWithQuery(), ", ");
decrementIndent();
return false;
}
}
public boolean visit(SQLSelectQueryBlock x) {
if (x instanceof PGSelectQueryBlock) {
return visit((PGSelectQueryBlock) x);
}
@Override
public boolean visit(PGWithClause x) {
print("WITH");
incrementIndent();
println();
printlnAndAccept(x.getWithQuery(), ", ");
decrementIndent();
return false;
}
return super.visit(x);
}
public boolean visit(SQLSelectQueryBlock x) {
if (x instanceof PGSelectQueryBlock) {
return visit((PGSelectQueryBlock) x);
}
public boolean visit(PGSelectQueryBlock x) {
if (x.getWith() != null) {
x.getWith().accept(this);
println();
}
return super.visit(x);
}
print("SELECT ");
public boolean visit(PGSelectQueryBlock x) {
if (x.getWith() != null) {
x.getWith().accept(this);
println();
}
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print("ALL ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print("DISTINCT ");
print("SELECT ");
if (x.getDistinctOn() != null) {
print("ON ");
printAndAccept(x.getDistinctOn(), ", ");
}
}
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print("ALL ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print("DISTINCT ");
printSelectList(x.getSelectList());
if (x.getInto() != null) {
println();
x.getInto().accept(this);
}
if (x.getDistinctOn() != null) {
print("ON ");
printAndAccept(x.getDistinctOn(), ", ");
}
}
if (x.getFrom() != null) {
println();
print("FROM ");
x.getFrom().accept(this);
}
printSelectList(x.getSelectList());
if (x.getWhere() != null) {
println();
print("WHERE ");
x.getWhere().accept(this);
}
if (x.getInto() != null) {
println();
x.getInto().accept(this);
}
if (x.getGroupBy() != null) {
print(" ");
x.getGroupBy().accept(this);
}
if (x.getFrom() != null) {
println();
print("FROM ");
x.getFrom().accept(this);
}
if (x.getWindow() != null) {
println();
x.getWindow().accept(this);
}
if (x.getWhere() != null) {
println();
print("WHERE ");
x.getWhere().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getGroupBy() != null) {
print(" ");
x.getGroupBy().accept(this);
}
if (x.getLimit() != null) {
println();
print("LIMIT ");
x.getLimit().accept(this);
}
if (x.getWindow() != null) {
println();
x.getWindow().accept(this);
}
if (x.getOffset() != null) {
println();
print("OFFSET ");
x.getOffset().accept(this);
print(" ROWS");
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getFetch() != null) {
println();
x.getFetch().accept(this);
}
if (x.getLimit() != null) {
println();
print("LIMIT ");
x.getLimit().accept(this);
}
if (x.getForClause() != null) {
println();
x.getForClause().accept(this);
}
if (x.getOffset() != null) {
println();
print("OFFSET ");
x.getOffset().accept(this);
print(" ROWS");
}
return false;
}
if (x.getFetch() != null) {
println();
x.getFetch().accept(this);
}
@Override
public void endVisit(IntoClause x) {
}
if (x.getForClause() != null) {
println();
x.getForClause().accept(this);
}
@Override
public boolean visit(IntoClause x) {
print("INTO ");
if (x.getOption() != null) {
print(x.getOption().name());
print(" ");
}
x.getTable().accept(this);
return false;
}
@Override
public void endVisit(PGTruncateStatement x) {
}
@Override
public boolean visit(PGTruncateStatement x) {
print("TRUNCATE TABLE ");
if (x.isOnly()) {
print("ONLY ");
}
printlnAndAccept(x.getTableNames(), ", ");
if (x.getRestartIdentity() != null) {
if (x.getRestartIdentity().booleanValue()) {
print(" RESTART IDENTITY");
} else {
print(" CONTINUE IDENTITY");
}
}
if (x.getCascade() != null) {
return false;
}
@Override
public void endVisit(IntoClause x) {
}
@Override
public boolean visit(IntoClause x) {
print("INTO ");
if (x.getOption() != null) {
print(x.getOption().name());
print(" ");
}
x.getTable().accept(this);
return false;
}
@Override
public void endVisit(PGTruncateStatement x) {
}
@Override
public boolean visit(PGTruncateStatement x) {
print("TRUNCATE TABLE ");
if (x.isOnly()) {
print("ONLY ");
}
printlnAndAccept(x.getTableNames(), ", ");
if (x.getRestartIdentity() != null) {
if (x.getRestartIdentity().booleanValue()) {
print(" RESTART IDENTITY");
} else {
print(" CONTINUE IDENTITY");
}
}
if (x.getCascade() != null) {
if (x.getCascade().booleanValue()) {
print(" CASCADE");
} else {
print(" RESTRICT");
}
}
return false;
}
return false;
}
@Override
public void endVisit(PGDeleteStatement x) {
}
@Override
@@ -278,26 +278,26 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements
x.getWith().accept(this);
println();
}
print("DELETE FROM ");
if (x.isOnly()) {
print("ONLY ");
}
x.getTableName().accept(this);
if (x.getAlias() != null) {
print(" AS ");
print(x.getAlias());
}
if (x.getUsing().size() > 0) {
println();
print("USING ");
printAndAccept(x.getUsing(), ", ");
}
if (x.getWhere() != null) {
println();
print("WHERE ");
@@ -306,4 +306,17 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements
return false;
}
@Override
public void endVisit(PGCurrentOfExpr x) {
}
@Override
public boolean visit(PGCurrentOfExpr x) {
print("CURRENT OF ");
x.getCursor().accept(this);
return false;
}
}
@@ -6,6 +6,7 @@ import java.util.Map;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock.FetchClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSelectQueryBlock.ForClause;
@@ -152,4 +153,14 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
return false;
}
@Override
public void endVisit(PGCurrentOfExpr x) {
}
@Override
public boolean visit(PGCurrentOfExpr x) {
return false;
}
}