# HG changeset patch # User Matthias Bläsing # Date 1403899301 -7200 # Fri Jun 27 22:01:41 2014 +0200 # Node ID c51b32555f1a1fd25e4a25e5181b9c05d5497df3 # Parent dd4f5e756332b6b5bbba36f7956a9488639f2ca6 Fix bug #200479: SQL-Standard dictates, that '\' is parsed into a STRING-Token, this conflicts with MySQL-Rules, which parses this as an incomplete string diff --git a/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java b/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java --- a/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java +++ b/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java @@ -163,10 +163,6 @@ // If we are currently in a string literal. case ISI_STRING: switch (actChar) { - case '\\': // NOI18N - // escape possible single quote #152325 - state = State.ISA_BACK_SLASH_IN_STRING; - break; case '\'': // NOI18N state = State.ISA_QUOTE_IN_STRING; break; @@ -185,11 +181,6 @@ } break; - // If we are after a back slash (\) in string. - case ISA_BACK_SLASH_IN_STRING: - state = State.ISI_STRING; - break; - // If we are currently in an identifier (e.g. a variable name), // or a keyword. case ISI_IDENTIFIER: @@ -369,7 +360,6 @@ break; case ISI_STRING: - case ISA_BACK_SLASH_IN_STRING: id = SQLTokenId.INCOMPLETE_STRING; // XXX or string? part = PartType.START; break; @@ -469,7 +459,6 @@ ISI_INT, // integer number ISI_DOUBLE, // double number ISA_DOT, // after '.' - ISA_BACK_SLASH_IN_STRING, // after \ in string ISA_QUOTE_IN_STRING, // encountered quote in string - could be sql99 escape ISA_QUOTE_IN_IDENTIFIER // encountered quote in identifier - could be sql99 escape } diff --git a/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java b/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java --- a/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java +++ b/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java @@ -145,25 +145,16 @@ TokenSequence seq = getTokenSequence("'incomplete"); assertTokens(seq, SQLTokenId.INCOMPLETE_STRING); } - - public void testEscapeSingleQuote() throws Exception { - TokenSequence seq = getTokenSequence("'Frank\\'s Book'"); - assertTrue(seq.moveNext()); - assertEquals(SQLTokenId.STRING, seq.token().id()); - assertEquals("'Frank\\'s Book'", seq.token().text().toString()); - - seq = getTokenSequence("'Frank\\s Book'"); - assertTrue(seq.moveNext()); - assertEquals(SQLTokenId.STRING, seq.token().id()); - assertEquals("'Frank\\s Book'", seq.token().text().toString()); - - seq = getTokenSequence("'Frank\\"); - assertTokens(seq, SQLTokenId.INCOMPLETE_STRING); - - seq = getTokenSequence("'Frank\\'"); - assertTokens(seq, SQLTokenId.INCOMPLETE_STRING); + + public void testSingleQuote() throws Exception { + // See bug #200479 - the fix introduced with this text reverts a "fix" + // for bug #152325 - the latter bug can't be fixed, as it is clear violation + // to SQL Standard - as this is a SQL lexer, not a MySQL lexer, this should + // should follow the standard + TokenSequence seq = getTokenSequence("'\\'"); + assertTokens(seq, SQLTokenId.STRING, SQLTokenId.WHITESPACE); } - + /** * Check correct handling of multiline comments (bug #) *