From 8572e4edf2833b8ee472fe97d1ec910445262764 Mon Sep 17 00:00:00 2001 From: James Xu Date: Fri, 28 Nov 2014 20:06:10 +0800 Subject: [PATCH] fix comment sanning for double dashes --- .../com/alibaba/druid/sql/parser/Lexer.java | 86 +++++++++---------- .../alibaba/druid/sql/parser/CommentTest.java | 17 ++++ 2 files changed, 60 insertions(+), 43 deletions(-) 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 00aa846896..e85583db24 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -736,66 +736,66 @@ public class Lexer { throw new NotAllowCommentException(); } - if (ch != '/') { + if ((ch == '/' && charAt(pos + 1) == '/') + || (ch == '-' && charAt(pos + 1) == '-')) { + scanSingleLineComment(); + } else if (ch == '/' && charAt(pos + 1) == '*') { + scanMultiLineComment(); + } else { throw new IllegalStateException(); } + } + private void scanMultiLineComment() { + scanChar(); + scanChar(); mark = pos; bufPos = 0; + + for (;;) { + if (ch == '*' && charAt(pos + 1) == '/') { + scanChar(); + scanChar(); + break; + } + + scanChar(); + bufPos++; + } + + stringVal = subString(mark, bufPos); + token = Token.MULTI_LINE_COMMENT; + hasComment = true; + } + + private void scanSingleLineComment() { scanChar(); + scanChar(); + mark = pos; + bufPos = 0; - if (ch == '*') { - scanChar(); - bufPos++; - - for (;;) { - if (ch == '*' && charAt(pos + 1) == '/') { - bufPos += 2; - scanChar(); + for (;;) { + if (ch == '\r') { + if (charAt(pos + 1) == '\n') { scanChar(); break; } - - scanChar(); bufPos++; + break; } - stringVal = subString(mark, bufPos); - token = Token.MULTI_LINE_COMMENT; - hasComment = true; - return; - } - - if (ch == '/') { - scanChar(); - bufPos++; - - for (;;) { - if (ch == '\r') { - if (charAt(pos + 1) == '\n') { - bufPos += 2; - scanChar(); - break; - } - bufPos++; - break; - } - - if (ch == '\n') { - scanChar(); - bufPos++; - break; - } - + if (ch == '\n') { scanChar(); - bufPos++; + break; } - stringVal = subString(mark + 1, bufPos); - token = Token.LINE_COMMENT; - hasComment = true; - return; + scanChar(); + bufPos++; } + + stringVal = subString(mark, bufPos); + token = Token.LINE_COMMENT; + hasComment = true; } public void scanIdentifier() { 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 f37140b54c..c4c6ec6ed4 100644 --- a/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java +++ b/src/test/java/com/alibaba/druid/sql/parser/CommentTest.java @@ -62,4 +62,21 @@ public class CommentTest extends TestCase { System.out.println(out.toString()); } + + public void test_2() throws Exception { + String sql = "//hello world\n"; + Lexer lexer = new Lexer(sql); + lexer.nextToken(); + assertEquals("hello world", lexer.stringVal()); + + sql = "/*hello \nworld*/"; + lexer = new Lexer(sql); + lexer.nextToken(); + assertEquals("hello \nworld", lexer.stringVal()); + + sql = "--hello world\n"; + lexer = new Lexer(sql); + lexer.nextToken(); + assertEquals("hello world", lexer.stringVal()); + } }