mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
One step backwards
This commit is contained in:
parent
ca62c7d3d1
commit
6df2afb5dd
@ -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:
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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{}, [&]
|
||||
|
@ -0,0 +1 @@
|
||||
\N
|
@ -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;
|
||||
|
@ -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'
|
||||
|
Loading…
Reference in New Issue
Block a user