(pos Pos)
| 482 | } |
| 483 | |
| 484 | func (p *Parser) parseColumnCastExpr(pos Pos) (Expr, error) { |
| 485 | if err := p.expectKeyword(KeywordCast); err != nil { |
| 486 | return nil, err |
| 487 | } |
| 488 | |
| 489 | if err := p.expectTokenKind(TokenKindLParen); err != nil { |
| 490 | return nil, err |
| 491 | } |
| 492 | |
| 493 | columnExpr, err := p.parseColumnExpr(p.Pos()) |
| 494 | if err != nil { |
| 495 | return nil, err |
| 496 | } |
| 497 | |
| 498 | var separator string |
| 499 | asPos := p.Pos() |
| 500 | switch { |
| 501 | // CAST(x, T) and CAST(x AS T) are equivalent |
| 502 | case p.matchKeyword(KeywordAs), p.matchTokenKind(","): |
| 503 | separator = p.last().String |
| 504 | _ = p.lexer.consumeToken() |
| 505 | default: |
| 506 | return nil, fmt.Errorf("expected AS or , but got %s", p.lastTokenKind()) |
| 507 | } |
| 508 | |
| 509 | var asColumnType Expr |
| 510 | // CAST(1 AS 'Float') or CAST(1 AS Float) are equivalent |
| 511 | if p.matchTokenKind(TokenKindString) { |
| 512 | asColumnType, err = p.parseString(p.Pos()) |
| 513 | } else { |
| 514 | asColumnType, err = p.parseColumnType(p.Pos()) |
| 515 | } |
| 516 | if err != nil { |
| 517 | return nil, err |
| 518 | } |
| 519 | |
| 520 | if err := p.expectTokenKind(TokenKindRParen); err != nil { |
| 521 | return nil, err |
| 522 | } |
| 523 | |
| 524 | return &CastExpr{ |
| 525 | CastPos: pos, |
| 526 | AsPos: asPos, |
| 527 | Separator: separator, |
| 528 | Expr: columnExpr, |
| 529 | AsType: asColumnType, |
| 530 | }, nil |
| 531 | } |
| 532 | |
| 533 | func (p *Parser) parseColumnExprListWithLParen(pos Pos) (*ColumnExprList, error) { |
| 534 | return p.parseColumnExprListWithTerm(TokenKindRParen, pos) |
no test coverage detected