(pos Pos)
| 365 | } |
| 366 | |
| 367 | func (p *Parser) parseTableExpr(pos Pos) (*TableExpr, error) { |
| 368 | var expr Expr |
| 369 | var err error |
| 370 | switch { |
| 371 | case p.matchTokenKind(TokenKindString), p.matchTokenKind(TokenKindIdent): |
| 372 | // table name |
| 373 | tableIdentifier, err := p.parseTableIdentifier(p.Pos()) |
| 374 | if err != nil { |
| 375 | return nil, err |
| 376 | } |
| 377 | // it's a table name |
| 378 | if tableIdentifier.Database != nil || !p.matchTokenKind(TokenKindLParen) { // database.table |
| 379 | expr = tableIdentifier |
| 380 | } else { |
| 381 | // table function expr |
| 382 | tableArgs, err := p.parseTableArgList(p.Pos()) |
| 383 | if err != nil { |
| 384 | return nil, err |
| 385 | } |
| 386 | expr = &TableFunctionExpr{ |
| 387 | Name: tableIdentifier.Table, |
| 388 | Args: tableArgs, |
| 389 | } |
| 390 | } |
| 391 | case p.matchTokenKind(TokenKindLParen): |
| 392 | expr, err = p.parseSubQuery(p.Pos()) |
| 393 | default: |
| 394 | return nil, errors.New("expect table name or subquery") |
| 395 | } |
| 396 | if err != nil { |
| 397 | return nil, err |
| 398 | } |
| 399 | |
| 400 | tableEnd := expr.End() |
| 401 | if p.tryConsumeKeywords(KeywordAs) { |
| 402 | alias, err := p.parseIdent() |
| 403 | if err != nil { |
| 404 | return nil, err |
| 405 | } |
| 406 | expr = &AliasExpr{ |
| 407 | Expr: expr, |
| 408 | AliasPos: alias.Pos(), |
| 409 | Alias: alias, |
| 410 | } |
| 411 | tableEnd = expr.End() |
| 412 | } else if p.matchTokenKind(TokenKindIdent) && p.lastTokenKind() != TokenKindKeyword { |
| 413 | alias, err := p.parseIdent() |
| 414 | if err != nil { |
| 415 | return nil, err |
| 416 | } |
| 417 | expr = &AliasExpr{ |
| 418 | Expr: expr, |
| 419 | AliasPos: alias.Pos(), |
| 420 | Alias: alias, |
| 421 | } |
| 422 | tableEnd = expr.End() |
| 423 | } |
| 424 |
no test coverage detected