diff --git a/src/Parsers/ExpressionElementParsers.cpp b/src/Parsers/ExpressionElementParsers.cpp index 8a76d404531..526b3aeb2bd 100644 --- a/src/Parsers/ExpressionElementParsers.cpp +++ b/src/Parsers/ExpressionElementParsers.cpp @@ -689,7 +689,7 @@ bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ++pos; /// Avoid excessive backtracking. - pos.putBarrier(); + //pos.putBarrier(); /// Special cases for expressions that look like functions but contain some syntax sugar: diff --git a/src/Parsers/IParser.h b/src/Parsers/IParser.h index d4ccb9604ea..4e6dbca15a6 100644 --- a/src/Parsers/IParser.h +++ b/src/Parsers/IParser.h @@ -59,31 +59,11 @@ public: { uint32_t depth = 0; uint32_t max_depth = 0; - TokenIterator barrier; - Pos(Tokens & tokens_, uint32_t max_depth_) : TokenIterator(tokens_), max_depth(max_depth_), barrier(tokens_) + Pos(Tokens & tokens_, uint32_t max_depth_) : TokenIterator(tokens_), max_depth(max_depth_) { } - Pos & operator= (const Pos & rhs) - { - static_cast(*this) = rhs; - depth = rhs.depth; - max_depth = rhs.max_depth; - if (barrier < rhs.barrier) - barrier = rhs.barrier; - return *this; - } - - Pos & operator= (Pos && rhs) - { - *this = rhs; - return *this; - } - - Pos(const Pos & rhs) = default; - Pos(Pos && rhs) = default; - ALWAYS_INLINE void increaseDepth() { ++depth; @@ -99,19 +79,6 @@ public: throw Exception("Logical error in parser: incorrect calculation of parse depth", ErrorCodes::LOGICAL_ERROR); --depth; } - - /// Will set up a barrier to avoid excessive backtracking. - /// E.g. after keyword CAST has been parsed it does not make sense to try to parse other alternatives. - void putBarrier() - { - if (barrier < *this) - barrier = *this; - } - - bool feasible() const - { - return barrier <= *this; - } }; /** Get the text of this parser parses. */ diff --git a/src/Parsers/IParserBase.cpp b/src/Parsers/IParserBase.cpp index 917a586c6ce..0241250926d 100644 --- a/src/Parsers/IParserBase.cpp +++ b/src/Parsers/IParserBase.cpp @@ -6,10 +6,6 @@ namespace DB bool IParserBase::parse(Pos & pos, ASTPtr & node, Expected & expected) { - /// Avoid excessive backtracking. - if (!pos.feasible()) - return false; - expected.add(pos, getName()); return wrapParseImpl(pos, IncreaseDepthTag{}, [&] diff --git a/tests/queries/0_stateless/01503_if_const_optimization.reference b/tests/queries/0_stateless/01503_if_const_optimization.reference index e69de29bb2d..dec7d2fabd2 100644 --- a/tests/queries/0_stateless/01503_if_const_optimization.reference +++ b/tests/queries/0_stateless/01503_if_const_optimization.reference @@ -0,0 +1 @@ +\N diff --git a/tests/queries/0_stateless/01503_if_const_optimization.sql b/tests/queries/0_stateless/01503_if_const_optimization.sql index 047f6f757e8..a64be6bc80b 100644 --- a/tests/queries/0_stateless/01503_if_const_optimization.sql +++ b/tests/queries/0_stateless/01503_if_const_optimization.sql @@ -1 +1 @@ -SELECT if(CAST(NULL), '2.55', NULL) AS x; -- { serverError 42 } +SELECT if(CAST(NULL AS Nullable(UInt8)), '2.55', NULL) AS x; diff --git a/tests/queries/0_stateless/02154_parser_backtracking.sh b/tests/queries/0_stateless/02154_parser_backtracking.sh index 458afab5325..af032008069 100755 --- a/tests/queries/0_stateless/02154_parser_backtracking.sh +++ b/tests/queries/0_stateless/02154_parser_backtracking.sh @@ -10,7 +10,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'a b c'"$(perl -e 'print ")" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 2>&1 | grep -cF 'Syntax error' echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'a, b'"$(perl -e 'print ")" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 2>&1 | grep -cF 'Syntax error' echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'a AS b'"$(perl -e 'print ")" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 2>&1 | grep -cF 'Syntax error' -echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'1'"$(perl -e 'print ", 'UInt8')" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 +echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'1'"$(perl -e 'print ", '"'UInt8'"')" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 echo 'SELECT '"$(perl -e 'print "CAST(" x 100')"'1'"$(perl -e 'print " AS UInt8)" x 100')" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 echo "SELECT fo,22222?LUTAY(SELECT(NOT CAUTAY(SELECT(NOT CAST(NOTT(NOT CAST(NOT NOT LEfT(NOT coARRAYlumnsFLuTAY(SELECT(NO0?LUTAY(SELECT(NOT CAUTAY(SELECT(NOT CAST(NOTT(NOT CAST(NOT NOT LEfT(NOT coARRAYlumnsFLuTAY(SELECT(NOTAYTAY(SELECT(NOTAYEFAULT(fo,22222?LUTAY(%SELECT(NOT CAST(NOT NOTAYTAY(SELECT(NOTAYEFAULT(fo,22222?LUTAY(SELECT(NOT CAST(NOT NOT (NOe)))))))))))))))))))))))))))))))))" | ${CLICKHOUSE_LOCAL} --max_parser_depth 10000 2>&1 | grep -cF 'Syntax error'