dbms: supported 'NOT NOT x' chain in parser [#METR-16543].

This commit is contained in:
Alexey Milovidov 2015-05-28 04:41:40 +03:00
parent 5390f492e1
commit ef54e74f45
3 changed files with 41 additions and 0 deletions

View File

@ -375,6 +375,37 @@ bool ParserPrefixUnaryOperatorExpression::parseImpl(Pos & pos, Pos end, ASTPtr &
ws.ignore(pos, end);
/// Позволяем парсить цепочки вида NOT NOT x. Это хак.
/** Так сделано, потому что среди унарных операторов есть только минус и NOT.
* Но для минуса цепочку из унарных операторов не требуется поддерживать.
*/
if (it[0] && 0 == strncmp(it[0], "NOT", 3))
{
/// Было ли чётное количество NOT.
bool even = false;
const char ** jt;
while (true)
{
for (jt = operators; *jt; jt += 2)
{
ParserString op(jt[0], true, true);
if (op.ignore(pos, end, max_parsed_pos, expected))
break;
}
if (!*jt)
break;
even = !even;
ws.ignore(pos, end);
}
if (even)
it = jt; /// Зануляем результат парсинга первого NOT. Получается, как будто цепочки NOT нет вообще.
}
ASTPtr elem;
if (!elem_parser->parse(pos, end, elem, max_parsed_pos, expected))
return false;

View File

@ -0,0 +1,5 @@
0
1
0
1
0

View File

@ -0,0 +1,5 @@
SELECT NOT 1;
SELECT NOT NOT 1;
SELECT NOT NOT NOT 1;
SELECT NOT NOT NOT NOT 1 = 1;
SELECT NOT NOT not NoT NOT 1 = 1;