connectivity/source/parse/sqlbison.y | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)
New commits: commit c90db23996c0580e9cd45db0230062a586fb8a53 Author: Lionel Elie Mamane <lio...@mamane.lu> Date: Tue Aug 21 19:27:30 2012 +0200 fdo#53887 ConvertLikeToken(): make escape character properly escape itself Change-Id: Ic2b79e78f95e298a08794fa11f227d76152244f5 Reviewed-on: https://gerrit.libreoffice.org/444 Reviewed-by: Andras Timar <ati...@suse.com> Tested-by: Andras Timar <ati...@suse.com> diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y index 54cc68e..00fb0b3 100755 --- a/connectivity/source/parse/sqlbison.y +++ b/connectivity/source/parse/sqlbison.y @@ -4519,7 +4519,7 @@ const double fMilliSecondsPerDay = 86400000.0; //------------------------------------------------------------------ ::rtl::OUString ConvertLikeToken(const OSQLParseNode* pTokenNode, const OSQLParseNode* pEscapeNode, sal_Bool bInternational) { - ::rtl::OUStringBuffer aMatchStr; + ::rtl::OUStringBuffer aMatchStr(0); if (pTokenNode->isToken()) { sal_Unicode cEscape = 0; @@ -4541,18 +4541,34 @@ const double fMilliSecondsPerDay = 86400000.0; sReplace.appendAscii("%_",2); } + bool wasEscape = false; for (sal_Int32 i = 0; i < nLen; i++) { const sal_Unicode c = aMatchStr[i]; - if (c == sSearch[0] || c == sSearch[1]) + // SQL standard requires the escape to be followed + // by a meta-character ('%', '_' or itself), else error + // We are more lenient here and let it escape anything. + // Especially since some databases (e.g. Microsoft SQL Server) + // have more meta-characters than the standard, such as e.g. '[' and ']' + if (wasEscape) { - if (i > 0 && aMatchStr[i - 1] == cEscape) - continue; - else - { - const sal_Unicode cCharacter = sReplace[(c == sSearch[0] ? 0 : 1)]; - aMatchStr[i] = cCharacter; - } + wasEscape=false; + continue; + } + if (c == cEscape) + { + wasEscape=true; + continue; + } + int match = -1; + if (c == sSearch[0]) + match=0; + else if (c == sSearch[1]) + match=1; + + if (match != -1) + { + aMatchStr[i] = sReplace[match]; } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits