From 22c6f4f0741b7142c09f67cd8807ec16904b1fd3 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 18 May 2011 09:57:10 +0000 Subject: [PATCH] git-svn-id: http://code.alibabatech.com/svn/druid/trunk@118 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../sql/dialect/mysql/parser/MySqlLexer.java | 4 +- .../com/alibaba/druid/sql/parser/Lexer.java | 14 ++++++- .../sql/visitor/SQLASTOutputVisitor.java | 5 ++- .../alibaba/druid/sql/parser/CommentTest.java | 2 +- .../druid/sql/parser/SQLMergeTest.java | 40 +++++++++++++++++++ 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/sql/parser/SQLMergeTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index 651714df67..8904dfb159 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -108,8 +108,8 @@ public class MySqlLexer extends Lexer { DEFAULT_MYSQL_KEYWORDS = new Keywords(map); } - public MySqlLexer(char[] input, int inputLength){ - super(input, inputLength); + public MySqlLexer(char[] input, int inputLength, boolean skipComment){ + super(input, inputLength, skipComment); super.keywods = DEFAULT_MYSQL_KEYWORDS; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 9a5407edc8..c77cc7a599 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -74,11 +74,18 @@ public class Lexer { protected String stringVal; + protected boolean skipComment = true; + public Lexer(String input){ - this(input.toCharArray(), input.length()); + this(input, true); } - public Lexer(char[] input, int inputLength){ + public Lexer(String input, boolean skipComment){ + this(input.toCharArray(), input.length(), skipComment); + } + + public Lexer(char[] input, int inputLength, boolean skipComment){ + this.skipComment = skipComment; this.sbuf = sbufRef.get(); // new char[1024]; if (this.sbuf == null) { this.sbuf = new char[1024]; @@ -245,6 +252,9 @@ public class Lexer { return; case '/': scanComment(); + if (skipComment) { + continue; + } return; default: if (Character.isLetter(ch)) { 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 c1a504076c..e7502e2a0a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -287,8 +287,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLInListExpr x) { x.getExpr().accept(this); - if (x.isNot()) print(" NOT IN ("); - else { + if (x.isNot()) { + print(" NOT IN ("); + } else { print(" IN ("); } diff --git a/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java b/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java index cf674f4390..35efde7f51 100644 --- a/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java +++ b/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java @@ -31,7 +31,7 @@ public class CommentTest extends TestCase { } } - public void f_test_1 () throws Exception { + public void test_1 () throws Exception { String sql = "SELECT /*mark for picman*/ * FROM WP_ALBUM WHERE MEMBER_ID = ? AND ID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; StringBuilder out = new StringBuilder(); diff --git a/src/test/java/com/alibaba/druid/sql/parser/SQLMergeTest.java b/src/test/java/com/alibaba/druid/sql/parser/SQLMergeTest.java new file mode 100644 index 0000000000..e12fd847e8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/parser/SQLMergeTest.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.parser; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLInListExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; + +import junit.framework.TestCase; + +public class SQLMergeTest extends TestCase { + + public void test_merge() throws Exception { + String sql = "SELECT /*mark for picman*/ * FROM WP_ALBUM WHERE MEMBER_ID = ? AND ID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + StringBuilder out = new StringBuilder(); + OracleOutputVisitor visitor = new OracleOutputVisitor(out) { + public boolean visit(SQLInListExpr x) { + x.getExpr().accept(this); + + if (x.isNot()) { + print(" NOT IN (##)"); + } else { + print(" IN (##)"); + } + return false; + } + }; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + for (SQLStatement statement : statementList) { + statement.accept(visitor); + visitor.println(); + } + + System.out.println(out.toString()); + } +}