Hi John,

I discovered a bug in the where clause parsing.

It seems that the lexer already removed the first and last character of quoted 
strings:

{QUOTED} { /* a quoted string literal */
#if defined(DEBUG) && DEBUG + 0 > 1
    LOGGER(ibis::gVerbose >= 0)
      << __FILE__ << ':' << __LINE__ << " got a quoted string: " << yytext;
#endif
    yylval->stringVal = new std::string(yytext+1, yyleng-2);
    return token::STRLIT;
}

However, in qString::qString and qLike::qLike  the string is unquoted once more.

So typically, it make a predicate like str='"test"' test for the value test 
instead of "test".

The fix would be to either change the lexer (but this is risky since it seems 
that the token STRLIT is used at other places) or, maybe more safely, remove 
the quote striping in qString::qString and qLike::qLike :

diff --git a/src/qExpr.cpp b/src/qExpr.cpp
index 4cb5aba..a726957 100644
--- a/src/qExpr.cpp
+++ b/src/qExpr.cpp
@@ -1820,11 +1820,9 @@ ibis::qString::qString(const char* ls, const char* rs) :
     qExpr(ibis::qExpr::STRING), lstr(ibis::util::strnewdup(ls)) {
     // need to remove leading and trailing quote and the meta characters
     rstr = new char[1+strlen(rs)];
-    const char quote = ('"' == *rs || '\'' == *rs) ? *rs : 0;
     const char* cptr = rs;
     char* dptr = rstr;
-    cptr += (quote != 0);
-    while (*cptr != quote) {
+    while (*cptr != 0) {
        if (*cptr != '\\') {
            *dptr = *cptr;
        }
@@ -1859,11 +1857,9 @@ ibis::qLike::qLike(const char* ls, const char* rs) :
 #endif
     // need to remove leading and trailing quote and the meta characters
     rpat = new char[1+strlen(rs)];
-    const char quote = ('"' == *rs || '\'' == *rs) ? *rs : 0;
     const char* cptr = rs;
     char* dptr = rpat;
-    cptr += (quote != 0);
-    while (*cptr != quote) {
+    while (*cptr != 0) {
        if (*cptr != '\\') {
            *dptr = *cptr;
        }

The patch above seems to fix the issue.

Thanks,

Dominique Prunier
 APG Lead Developper
[cid:[email protected]]
 4388, rue Saint-Denis
 Bureau 309
 Montreal (Quebec)  H2J 2L1
 Tel. +1 514-842-6767  x310
 Fax +1 514-842-3989
 [email protected]<mailto:[email protected]>
 www.watch4net.com<http://www.watch4net.com/>

This message is for the designated recipient only and may contain privileged, 
proprietary, or otherwise private information. If you have received it in 
error, please notify the sender immediately and delete the original. Any other 
use of this electronic mail by you is prohibited.

Ce message est pour le récipiendaire désigné seulement et peut contenir des 
informations privilégiées, propriétaires ou autrement privées. Si vous l'avez 
reçu par erreur, S.V.P. avisez l'expéditeur immédiatement et effacez 
l'original. Toute autre utilisation de ce courrier électronique par vous est 
prohibée.

<<inline: image001.gif>>

_______________________________________________
FastBit-users mailing list
[email protected]
https://hpcrdm.lbl.gov/cgi-bin/mailman/listinfo/fastbit-users

Reply via email to