diff --git a/src/Parsers/CommonParsers.cpp b/src/Parsers/CommonParsers.cpp index d7a9ed60ac3..85f477b084a 100644 --- a/src/Parsers/CommonParsers.cpp +++ b/src/Parsers/CommonParsers.cpp @@ -65,4 +65,17 @@ bool ParserKeyword::parseImpl(Pos & pos, ASTPtr & /*node*/, Expected & expected) return true; } +bool ParserDoubleColon::parseImpl(Pos & pos, ASTPtr & /*node*/, Expected & expected) +{ + /// Do not move position if only one colon mathced. + Pos begin = pos; + if (parser_colon.ignore(begin, expected) && parser_colon.ignore(begin, expected)) + { + pos = begin; + return true; + } + + return false; +} + } diff --git a/src/Parsers/CommonParsers.h b/src/Parsers/CommonParsers.h index 85b5217b617..c3a5ec97dcf 100644 --- a/src/Parsers/CommonParsers.h +++ b/src/Parsers/CommonParsers.h @@ -56,4 +56,15 @@ public: bool parseImpl(Pos & /*pos*/, ASTPtr & /*node*/, Expected & /*expected*/) override { return true; } }; +class ParserDoubleColon : public IParserBase +{ +public: + const char * getName() const override { return "double colon"; } + + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; + +private: + ParserToken parser_colon{TokenType::Colon}; +}; + } diff --git a/src/Parsers/ExpressionElementParsers.cpp b/src/Parsers/ExpressionElementParsers.cpp index ed49f89128a..bf7fff84405 100644 --- a/src/Parsers/ExpressionElementParsers.cpp +++ b/src/Parsers/ExpressionElementParsers.cpp @@ -866,11 +866,9 @@ bool ParserCastOperator::parseImpl(Pos & pos, ASTPtr & node, Expected & expected return false; ASTPtr type_ast; - ParserToken parser_colon(TokenType::Colon); const char * data_end = pos->begin; - if (parser_colon.ignore(pos, expected) - && parser_colon.ignore(pos, expected) + if (ParserDoubleColon().ignore(pos, expected) && ParserDataType().parse(pos, type_ast, expected)) { auto type = DataTypeFactory::instance().get(type_ast); diff --git a/src/Parsers/ExpressionListParsers.cpp b/src/Parsers/ExpressionListParsers.cpp index a4cd983992c..e853311d2e4 100644 --- a/src/Parsers/ExpressionListParsers.cpp +++ b/src/Parsers/ExpressionListParsers.cpp @@ -564,9 +564,7 @@ bool ParserCastExpression::parseImpl(Pos & pos, ASTPtr & node, Expected & expect return false; ASTPtr type_ast; - ParserToken parser_colon(TokenType::Colon); - if (parser_colon.ignore(pos, expected) - && parser_colon.ignore(pos, expected) + if (ParserDoubleColon().ignore(pos, expected) && ParserDataType().parse(pos, type_ast, expected)) { node = createFunctionCast(expr_ast, type_ast);