One step backwards

This commit is contained in:
Alexey Milovidov 2022-01-09 10:42:06 +03:00
parent ca62c7d3d1
commit 6df2afb5dd
6 changed files with 5 additions and 41 deletions

View File

@ -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:

View File

@ -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<TokenIterator &>(*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. */

View File

@ -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{}, [&]

View File

@ -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;

View File

@ -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'