From a11649ca879fad805016093135fb3e49b339bfda Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 21 May 2011 07:33:59 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=BE=93=E5=87=BA=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@172 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../sql/ast/statement/SQLInsertStatement.java | 29 ++-------------- .../mysql/parser/MySqlStatementParser.java | 2 +- .../druid/sql/parser/SQLStatementParser.java | 2 +- .../sql/visitor/SQLASTOutputVisitor.java | 16 ++++++--- src/test/resources/bvt/parser/oracle-1.txt | 33 +++++++++++-------- 5 files changed, 36 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index a7d557b78e..291e177099 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -22,7 +22,6 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatementImpl; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLInsertStatement extends SQLStatementImpl { @@ -33,7 +32,7 @@ public class SQLInsertStatement extends SQLStatementImpl { private final List columns = new ArrayList(); private ValuesClause values; - private SQLQueryExpr query; + private SQLSelect query; public SQLInsertStatement(){ @@ -55,11 +54,11 @@ public class SQLInsertStatement extends SQLStatementImpl { this.tableName = tableName; } - public SQLQueryExpr getQuery() { + public SQLSelect getQuery() { return query; } - public void setQuery(SQLQueryExpr query) { + public void setQuery(SQLSelect query) { this.query = query; } @@ -75,28 +74,6 @@ public class SQLInsertStatement extends SQLStatementImpl { this.values = values; } - public void output(StringBuffer buf) { - buf.append("INSERT INTO "); - this.tableName.output(buf); - if (columns.size() > 0) { - buf.append(" ("); - for (int i = 0, size = columns.size(); i < size; ++i) { - if (i != 0) { - buf.append(", "); - } - columns.get(i).output(buf); - } - buf.append(")"); - } - - if (values != null) { - values.output(buf); - } else { - buf.append(" "); - this.query.output(buf); - } - } - @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 321a3a0547..2c6126d4ce 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -803,7 +803,7 @@ public class MySqlStatementParser extends SQLStatementParser { } else if (lexer.token() == (Token.SELECT)) { SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); - insertStatement.setQuery(queryExpr); + insertStatement.setQuery(queryExpr.getSubQuery()); } if (lexer.token() == Token.ON) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 8407f38101..667406bd5d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -159,7 +159,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); } else if (lexer.token() == (Token.SELECT)) { SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr(); - insertStatement.setQuery(queryExpr); + insertStatement.setQuery(queryExpr.getSubQuery()); } return insertStatement; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 524f795c78..9e3de4eb0e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -182,17 +182,17 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLBetweenExpr x) { x.getTestExpr().accept(this); - + if (x.isNot()) { print(" NOT BETWEEN "); } else { print(" BETWEEN "); } - + x.getBeginExpr().accept(this); print(" AND "); x.getEndExpr().accept(this); - + return false; } @@ -586,21 +586,27 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { if (x.getColumns().size() > 0) { print(" ("); + incrementIndent(); for (int i = 0, size = x.getColumns().size(); i < size; ++i) { if (i != 0) { + if (i % 5 == 0) { + println(); + } print(", "); } x.getColumns().get(i).accept(this); } + decrementIndent(); print(")"); } if (x.getValues() != null) { - print(" VALUES "); + println(); + print("VALUES "); x.getValues().accept(this); } else { if (x.getQuery() != null) { - print(" "); + println(); x.getQuery().accept(this); } } diff --git a/src/test/resources/bvt/parser/oracle-1.txt b/src/test/resources/bvt/parser/oracle-1.txt index 1067b1a748..34685de220 100644 --- a/src/test/resources/bvt/parser/oracle-1.txt +++ b/src/test/resources/bvt/parser/oracle-1.txt @@ -58,16 +58,23 @@ INSERT INTO GLOBAL_ACCOUNT_SMD WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1 --------------------------- -INSERT INTO GLOBAL_ACCOUNT_SMD (ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE) (SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR - , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND - , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID - , IS_DELETED, CUST_GRADE - FROM APOLLO_ZEUS.GLOBAL_ACCOUNT - WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1 - UNION ALL - SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR - , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND - , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID - , IS_DELETED, CUST_GRADE - FROM APOLLO_NIR.GLOBAL_ACCOUNT - WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1); \ No newline at end of file +INSERT INTO GLOBAL_ACCOUNT_SMD (ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR + , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND + , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID + , IS_DELETED, CUST_GRADE) +SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR + , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND + , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID + , IS_DELETED, CUST_GRADE +FROM APOLLO_ZEUS.GLOBAL_ACCOUNT +WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1 +UNION ALL +SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR + , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND + , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID + , IS_DELETED, CUST_GRADE +FROM APOLLO_NIR.GLOBAL_ACCOUNT +WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1; + + +