(pos Pos)
| 887 | } |
| 888 | |
| 889 | func (p *Parser) parseWindowClause(pos Pos) (*WindowClause, error) { |
| 890 | if err := p.expectKeyword(KeywordWindow); err != nil { |
| 891 | return nil, err |
| 892 | } |
| 893 | |
| 894 | windows := make([]*WindowDefinition, 0, 1) |
| 895 | for { |
| 896 | windowName, err := p.parseIdent() |
| 897 | if err != nil { |
| 898 | return nil, err |
| 899 | } |
| 900 | |
| 901 | asPos := p.Pos() |
| 902 | if err := p.expectKeyword(KeywordAs); err != nil { |
| 903 | return nil, err |
| 904 | } |
| 905 | |
| 906 | condition, err := p.parseWindowCondition(p.Pos()) |
| 907 | if err != nil { |
| 908 | return nil, err |
| 909 | } |
| 910 | |
| 911 | windows = append(windows, &WindowDefinition{ |
| 912 | Name: windowName, |
| 913 | AsPos: asPos, |
| 914 | Expr: condition, |
| 915 | }) |
| 916 | |
| 917 | if p.tryConsumeTokenKind(TokenKindComma) == nil { |
| 918 | break |
| 919 | } |
| 920 | } |
| 921 | |
| 922 | var endPos Pos |
| 923 | if len(windows) > 0 { |
| 924 | endPos = windows[len(windows)-1].End() |
| 925 | } |
| 926 | |
| 927 | return &WindowClause{ |
| 928 | WindowPos: pos, |
| 929 | EndPos: endPos, |
| 930 | Windows: windows, |
| 931 | }, nil |
| 932 | } |
| 933 | |
| 934 | func (p *Parser) tryParseHavingClause(pos Pos) (*HavingClause, error) { |
| 935 | if !p.matchKeyword(KeywordHaving) { |
no test coverage detected