From e47fb502b27a0a8187fc14bc079b0501cee0a68b Mon Sep 17 00:00:00 2001 From: sduzh Date: Thu, 10 Dec 2020 21:34:06 +0800 Subject: [PATCH] [Compatibility] Support embedded quota in string literal (#5045) ``` mysql> select 'I''m a student'; +-----------------+ | 'I'm a student' | +-----------------+ | I'm a student | +-----------------+ mysql> select "I""m a student"; +-----------------+ | 'I"m a student' | +-----------------+ | I"m a student | +-----------------+ mysql> select 'I""m a student'; +------------------+ | 'I""m a student' | +------------------+ | I""m a student | +------------------+ mysql> select "I''m a student"; +------------------+ | 'I''m a student' | +------------------+ | I''m a student | +------------------+ ``` --- fe/fe-core/src/main/jflex/sql_scanner.flex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex b/fe/fe-core/src/main/jflex/sql_scanner.flex index bbd0435ec1..e50be25c85 100644 --- a/fe/fe-core/src/main/jflex/sql_scanner.flex +++ b/fe/fe-core/src/main/jflex/sql_scanner.flex @@ -506,8 +506,8 @@ IdentifierOrKwContents = [:digit:]*[:jletter:][:jletterdigit:]* | "&&" | "||" IdentifierOrKw = \`{IdentifierOrKwContents}\` | {IdentifierOrKwContents} IntegerLiteral = [:digit:][:digit:]* QuotedIdentifier = \`(\`\`|[^\`])*\` -SingleQuoteStringLiteral = \'(\\.|[^\\\'])*\' -DoubleQuoteStringLiteral = \"(\\.|[^\\\"])*\" +SingleQuoteStringLiteral = \'(\\.|[^\\\']|\'\')*\' +DoubleQuoteStringLiteral = \"(\\.|[^\\\"]|\"\")*\" FLit1 = [0-9]+ \. [0-9]* FLit2 = \. [0-9]+ @@ -595,12 +595,12 @@ EndOfLineComment = "--" !({HintContent}|{ContainsLineTerminator}) {LineTerminato {SingleQuoteStringLiteral} { return newToken(SqlParserSymbols.STRING_LITERAL, - escapeBackSlash(yytext().substring(1, yytext().length()-1))); + escapeBackSlash(yytext().substring(1, yytext().length()-1)).replaceAll("''", "'")); } {DoubleQuoteStringLiteral} { return newToken(SqlParserSymbols.STRING_LITERAL, - escapeBackSlash(yytext().substring(1, yytext().length()-1))); + escapeBackSlash(yytext().substring(1, yytext().length()-1)).replaceAll("\"\"", "\"")); } {CommentedHintBegin} {