match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->fieldIdentifierExpression = $parser->SimpleArithmeticExpression(); $parser->match(Lexer::T_AS); $parser->match(Lexer::T_IDENTIFIER); $type = $parser->getLexer()->token['value']; if ($parser->getLexer()->isNextToken(Lexer::T_OPEN_PARENTHESIS)) { $parser->match(Lexer::T_OPEN_PARENTHESIS); /** @var Literal $parameter */ $parameter = $parser->Literal(); $parameters = [$parameter->value]; if ($parser->getLexer()->isNextToken(Lexer::T_COMMA)) { while ($parser->getLexer()->isNextToken(Lexer::T_COMMA)) { $parser->match(Lexer::T_COMMA); $parameter = $parser->Literal(); $parameters[] = $parameter->value; } } $parser->match(Lexer::T_CLOSE_PARENTHESIS); $type .= '('.implode(', ', $parameters).')'; } $this->castingTypeExpression = $type; $parser->match(Lexer::T_CLOSE_PARENTHESIS); } /** * @param SqlWalker $sqlWalker * * @return string */ public function getSql(SqlWalker $sqlWalker) { return sprintf( 'CAST(%s AS %s)', $sqlWalker->walkSimpleArithmeticExpression($this->fieldIdentifierExpression), $this->castingTypeExpression ); } }