(pos Pos)
| 918 | } |
| 919 | |
| 920 | func (p *Parser) parseOrderByClause(pos Pos) (*OrderByClause, error) { |
| 921 | orderByListExpr := &OrderByClause{OrderPos: pos, ListEnd: pos} |
| 922 | items := make([]Expr, 0) |
| 923 | for { |
| 924 | expr, err := p.parseOrderExpr(pos) |
| 925 | if err != nil { |
| 926 | return nil, err |
| 927 | } |
| 928 | if expr == nil { |
| 929 | break |
| 930 | } |
| 931 | items = append(items, expr) |
| 932 | |
| 933 | if p.lexer.isEOF() || p.tryConsumeTokenKind(TokenKindComma) == nil { |
| 934 | break |
| 935 | } |
| 936 | } |
| 937 | if len(items) > 0 { |
| 938 | orderByListExpr.ListEnd = items[len(items)-1].End() |
| 939 | } |
| 940 | orderByListExpr.Items = items |
| 941 | |
| 942 | // Parse optional INTERPOLATE clause |
| 943 | if p.matchKeyword(KeywordInterpolate) { |
| 944 | interpolatePos := p.Pos() |
| 945 | _ = p.lexer.consumeToken() |
| 946 | interpolate, err := p.parseInterpolateClause(interpolatePos) |
| 947 | if err != nil { |
| 948 | return nil, err |
| 949 | } |
| 950 | orderByListExpr.Interpolate = interpolate |
| 951 | orderByListExpr.ListEnd = interpolate.End() |
| 952 | } |
| 953 | |
| 954 | return orderByListExpr, nil |
| 955 | } |
| 956 | |
| 957 | func (p *Parser) parseOrderExpr(pos Pos) (*OrderExpr, error) { |
| 958 | // parse column expr |
no test coverage detected