(pos Pos)
| 220 | } |
| 221 | |
| 222 | func (p *Parser) parseDeduplicateClause(pos Pos) (*DeduplicateClause, error) { |
| 223 | if err := p.expectKeyword(KeywordDeduplicate); err != nil { |
| 224 | return nil, err |
| 225 | } |
| 226 | if !p.tryConsumeKeywords(KeywordBy) { |
| 227 | return &DeduplicateClause{ |
| 228 | DeduplicatePos: pos, |
| 229 | }, nil |
| 230 | } |
| 231 | |
| 232 | by, err := p.parseColumnExprList(p.Pos()) |
| 233 | if err != nil { |
| 234 | return nil, err |
| 235 | } |
| 236 | var except *ColumnExprList |
| 237 | if p.tryConsumeKeywords(KeywordExcept) { |
| 238 | except, err = p.parseColumnExprList(p.Pos()) |
| 239 | if err != nil { |
| 240 | return nil, err |
| 241 | } |
| 242 | } |
| 243 | return &DeduplicateClause{ |
| 244 | DeduplicatePos: pos, |
| 245 | By: by, |
| 246 | Except: except, |
| 247 | }, nil |
| 248 | } |
| 249 | |
| 250 | func (p *Parser) parseOptimizeStmt(pos Pos) (*OptimizeStmt, error) { |
| 251 | if err := p.expectKeyword(KeywordOptimize); err != nil { |
no test coverage detected