bugfix:union子查询bug

This commit is contained in:
yakolee
2014-06-12 17:20:23 +08:00
parent f8d2987931
commit 69b6a40e56
6 changed files with 100 additions and 2 deletions
@@ -0,0 +1,50 @@
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLUnionQueryTableSource extends SQLTableSourceImpl {
private SQLUnionQuery union;
public SQLUnionQueryTableSource(){
}
public SQLUnionQueryTableSource(String alias){
super(alias);
}
public SQLUnionQueryTableSource(SQLUnionQuery union, String alias){
super(alias);
this.setUnion(union);
}
public SQLUnionQueryTableSource(SQLUnionQuery union){
this.setUnion(union);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, union);
}
visitor.endVisit(this);
}
public void output(StringBuffer buf) {
buf.append("(");
this.union.output(buf);
buf.append(")");
}
public SQLUnionQuery getUnion() {
return union;
}
public void setUnion(SQLUnionQuery union) {
if (union != null) {
union.setParent(this);
}
this.union = union;
}
}
@@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnionOperator;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
public class SQLSelectParser extends SQLParser {
@@ -316,8 +317,12 @@ public class SQLSelectParser extends SQLParser {
if (lexer.token() == Token.SELECT || lexer.token() == Token.WITH) {
SQLSelect select = select();
accept(Token.RPAREN);
queryRest(select.getQuery());
tableSource = new SQLSubqueryTableSource(select);
SQLSelectQuery query = queryRest(select.getQuery());
if (query instanceof SQLUnionQuery) {
tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
} else {
tableSource = new SQLSubqueryTableSource(select);
}
} else if (lexer.token() == Token.LPAREN) {
tableSource = parseTableSource();
accept(Token.RPAREN);
@@ -136,6 +136,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
@@ -1975,4 +1976,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
public void endVisit(SQLBooleanExpr x) {
}
@Override
public boolean visit(SQLUnionQueryTableSource x) {
print("(");
incrementIndent();
x.getUnion().accept(this);
println();
decrementIndent();
print(")");
if (x.getAlias() != null) {
print(' ');
print(x.getAlias());
}
return false;
}
}
@@ -112,6 +112,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
@@ -540,4 +541,8 @@ public interface SQLASTVisitor {
boolean visit(SQLBooleanExpr x);
void endVisit(SQLUnionQueryTableSource x);
boolean visit(SQLUnionQueryTableSource x);
}
@@ -114,6 +114,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
@@ -1053,4 +1054,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
return true;
}
@Override
public void endVisit(SQLUnionQueryTableSource x) {
}
@Override
public boolean visit(SQLUnionQueryTableSource x) {
return true;
}
}
@@ -88,6 +88,15 @@ public class SQLSelectTest extends TestCase {
output(stmtList);
}
public void test_select_7() throws Exception {
String sql = "select * from ((select * from test1) UNION (select * from test2) UNION (select * from test3)) where t1='温高铁';";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
output(stmtList);
}
private void output(List<SQLStatement> stmtList) {
for (SQLStatement stmt : stmtList) {