From 52b66266d8f2596c567597c9d501a3ba7592abc8 Mon Sep 17 00:00:00 2001 From: yakolee Date: Wed, 21 May 2014 14:49:49 +0800 Subject: [PATCH] improve ParameterizedOutputVisitor --- .../druid/sql/dialect/mysql/parser/MySqlLexer.java | 3 +++ .../alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java | 2 ++ .../druid/sql/dialect/oracle/parser/OracleLexer.java | 2 ++ .../sql/dialect/sqlserver/parser/SQLServerLexer.java | 2 ++ src/main/java/com/alibaba/druid/sql/parser/Lexer.java | 8 ++++++++ .../sql/visitor/ParameterizedOutputVisitorUtils.java | 2 +- .../visitor/MySqlParameterizedOutputVisitorTest.java | 5 +++++ 7 files changed, 23 insertions(+), 1 deletion(-) 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 9944ab2acd..8371dbe9bf 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 @@ -105,6 +105,7 @@ public class MySqlLexer extends Lexer { stringVal = subString(mark, bufPos); token = Token.LINE_COMMENT; + hasComment = true; if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { return; @@ -440,6 +441,7 @@ public class MySqlLexer extends Lexer { } else { stringVal = subString(mark, bufPos); token = Token.MULTI_LINE_COMMENT; + hasComment = true; } if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { @@ -481,6 +483,7 @@ public class MySqlLexer extends Lexer { stringVal = subString(mark, bufPos + 1); token = Token.LINE_COMMENT; + hasComment = true; if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { return; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java index eaf42c112f..68f179def7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java @@ -92,6 +92,7 @@ public class OdpsLexer extends Lexer { } else { stringVal = subString(mark, bufPos); token = Token.MULTI_LINE_COMMENT; + hasComment = true; } if (token != Token.HINT && !isAllowComment()) { @@ -134,6 +135,7 @@ public class OdpsLexer extends Lexer { stringVal = subString(mark + 1, bufPos); token = Token.LINE_COMMENT; + hasComment = true; return; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 3d3f6321ca..2352d2fdfb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -230,6 +230,7 @@ public class OracleLexer extends Lexer { } else { stringVal = subString(mark, bufPos); token = Token.MULTI_LINE_COMMENT; + hasComment = true; } if (token != Token.HINT && !isAllowComment()) { @@ -272,6 +273,7 @@ public class OracleLexer extends Lexer { stringVal = subString(mark + 1, bufPos); token = Token.LINE_COMMENT; + hasComment = true; return; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java index aab7796ba8..84abe762fd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java @@ -100,6 +100,7 @@ public class SQLServerLexer extends Lexer { } else { stringVal = subString(mark, bufPos); token = Token.MULTI_LINE_COMMENT; + hasComment = true; } if (token != Token.HINT && !isAllowComment()) { @@ -142,6 +143,7 @@ public class SQLServerLexer extends Lexer { stringVal = subString(mark + 1, bufPos); token = Token.LINE_COMMENT; + hasComment = true; return; } } 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 f9032f994b..a8174a78eb 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -69,6 +69,8 @@ public class Lexer { private int varIndex = -1; protected CommentHandler commentHandler; + + protected boolean hasComment = false; public Lexer(String input){ this(input, true); @@ -747,6 +749,7 @@ public class Lexer { stringVal = subString(mark, bufPos); token = Token.MULTI_LINE_COMMENT; + hasComment = true; return; } @@ -777,6 +780,7 @@ public class Lexer { stringVal = subString(mark + 1, bufPos); token = Token.LINE_COMMENT; + hasComment = true; return; } } @@ -1045,4 +1049,8 @@ public class Lexer { boolean handle(Token lastToken, String comment); } + + public boolean isHasComment() { + return hasComment; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 7d97f2c721..9f0e35a1c1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -67,7 +67,7 @@ public class ParameterizedOutputVisitorUtils { stmt.accept(visitor); } - if (visitor.getReplaceCount() == 0) { + if (visitor.getReplaceCount() == 0 && !parser.getLexer().isHasComment()) { return sql; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java index 8aa9b52bcc..acd5916e50 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java @@ -46,6 +46,11 @@ public class MySqlParameterizedOutputVisitorTest extends TestCase { sql = "select TID,POSTFEE,RECEIVERADDRESS from tradegroup003 where (0 = 650954981082695 or tid=650954981082695) And SELLERNICK='______________' And BUYERNICK='yingge7' and CREATED > date_sub(now(), interval 48 hour) and STATUS = 'WAIT_BUYER_PAY' and func_isNotFollowgroup003(tradegroup003.tid,'______________') = 0"; System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql ="SHOW COLUMNS FROM `pms_purchase_ops`/*20140512152820##%2Fbase.php%3Fshopid%3D%26module%3Dpms%26action%3DqualityItem%26op_id%3D756%26params%3Dcase%253Aupdate%252Ctable%253Aquality%252Corder_id%253A201405090006DL%252Creceive_no%253AQCI01201405090006DL%252Creceive_treat%253AALL_DONE%260.5652460628381133*/;"; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); } }