From e705652cfe1696af9d55f843cfa2aa700a2cc540 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Sat, 16 Apr 2011 02:02:32 +0000 Subject: [PATCH] two IN clause in sql statement does not clear the value clause before processing the second IN value list --- include/Parser.h | 1 + src/sql/ParsedData.cxx | 21 ++++++++++++++------- src/sql/dmlyacc.yxx | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/Parser.h b/include/Parser.h index 31c277b3..f728f509 100644 --- a/include/Parser.h +++ b/include/Parser.h @@ -395,6 +395,7 @@ class DllExport ParsedData char *getFldName(); void setAutoFldName(char *fldName); void reset(); + void resetInValueList(); void init(); }; diff --git a/src/sql/ParsedData.cxx b/src/sql/ParsedData.cxx index 4e4793c7..ee589c52 100644 --- a/src/sql/ParsedData.cxx +++ b/src/sql/ParsedData.cxx @@ -284,6 +284,18 @@ void ParsedData::init() isExplain=false; plan = Normal; } +void ParsedData::resetInValueList() +{ + FieldValue *value; + ListIterator inIter = inValueList.getIterator(); + while (inIter.hasElement()) { + value = (FieldValue *) inIter.nextElement(); + if (value->parsedString) free(value->parsedString); + delete value; + } + inValueList.reset(); + return; +} //NOTE::when you add members to reset() check whether it needs to be added in init() as it is used for statement caching when it contains parameters void ParsedData::reset() @@ -329,13 +341,8 @@ void ParsedData::reset() delete value; } fieldValueList.reset(); - ListIterator inIter = inValueList.getIterator(); - while (inIter.hasElement()) { - value = (FieldValue *) inIter.nextElement(); - if (value->parsedString) free(value->parsedString); - delete value; - } - inValueList.reset(); + + resetInValueList(); predicate.reset(); havingPredicate.reset(); diff --git a/src/sql/dmlyacc.yxx b/src/sql/dmlyacc.yxx index 6915eaea..0b932198 100644 --- a/src/sql/dmlyacc.yxx +++ b/src/sql/dmlyacc.yxx @@ -815,6 +815,7 @@ condition: ident OPERATOR value finalPred = parsedData->insertPredicate(pred1, OpOr, pred2); pred1= finalPred; } + parsedData->resetInValueList(); if( $2 == (char*)1) finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL); -- 2.11.4.GIT