(pos Pos)
| 840 | } |
| 841 | |
| 842 | func (p *Parser) parseColumnCaseExpr(pos Pos) (*CaseExpr, error) { |
| 843 | // CASE expr |
| 844 | caseExpr := &CaseExpr{CasePos: pos} |
| 845 | if err := p.expectKeyword(KeywordCase); err != nil { |
| 846 | return nil, err |
| 847 | } |
| 848 | |
| 849 | // case expr is optional |
| 850 | if !p.matchKeyword(KeywordWhen) { |
| 851 | expr, err := p.parseExpr(p.Pos()) |
| 852 | if err != nil { |
| 853 | return nil, err |
| 854 | } |
| 855 | caseExpr.Expr = expr |
| 856 | } |
| 857 | |
| 858 | // WHEN expr THEN expr |
| 859 | whenClauses := make([]*WhenClause, 0) |
| 860 | for p.matchKeyword(KeywordWhen) { |
| 861 | whenPos := p.Pos() |
| 862 | _ = p.lexer.consumeToken() |
| 863 | whenCondition, err := p.parseExpr(p.Pos()) |
| 864 | if err != nil { |
| 865 | return nil, err |
| 866 | } |
| 867 | |
| 868 | thenPos := p.Pos() |
| 869 | if err := p.expectKeyword(KeywordThen); err != nil { |
| 870 | return nil, err |
| 871 | } |
| 872 | thenCondition, err := p.parseExpr(p.Pos()) |
| 873 | if err != nil { |
| 874 | return nil, err |
| 875 | } |
| 876 | |
| 877 | whenClauses = append(whenClauses, &WhenClause{ |
| 878 | WhenPos: whenPos, |
| 879 | ThenPos: thenPos, |
| 880 | When: whenCondition, |
| 881 | Then: thenCondition, |
| 882 | }) |
| 883 | } |
| 884 | caseExpr.Whens = whenClauses |
| 885 | |
| 886 | // ELSE expr |
| 887 | elsePos := p.Pos() |
| 888 | if p.tryConsumeKeywords(KeywordElse) { |
| 889 | elseExpr, err := p.parseExpr(p.Pos()) |
| 890 | if err != nil { |
| 891 | return nil, err |
| 892 | } |
| 893 | caseExpr.ElsePos = elsePos |
| 894 | caseExpr.Else = elseExpr |
| 895 | } |
| 896 | |
| 897 | if err := p.expectKeyword(KeywordEnd); err != nil { |
| 898 | return nil, err |
| 899 | } |
no test coverage detected