mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
dbms: supported 'NOT NOT x' chain in parser [#METR-16543].
This commit is contained in:
parent
5390f492e1
commit
ef54e74f45
@ -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;
|
||||
|
5
dbms/tests/queries/0_stateless/00164_not_chain.reference
Normal file
5
dbms/tests/queries/0_stateless/00164_not_chain.reference
Normal file
@ -0,0 +1,5 @@
|
||||
0
|
||||
1
|
||||
0
|
||||
1
|
||||
0
|
5
dbms/tests/queries/0_stateless/00164_not_chain.sql
Normal file
5
dbms/tests/queries/0_stateless/00164_not_chain.sql
Normal 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;
|
Loading…
Reference in New Issue
Block a user