(pos Pos)
| 248 | } |
| 249 | |
| 250 | func (p *Parser) parseOptimizeStmt(pos Pos) (*OptimizeStmt, error) { |
| 251 | if err := p.expectKeyword(KeywordOptimize); err != nil { |
| 252 | return nil, err |
| 253 | } |
| 254 | if err := p.expectKeyword(KeywordTable); err != nil { |
| 255 | return nil, err |
| 256 | } |
| 257 | |
| 258 | table, err := p.parseTableIdentifier(p.Pos()) |
| 259 | if err != nil { |
| 260 | return nil, err |
| 261 | } |
| 262 | statementEnd := table.End() |
| 263 | |
| 264 | onCluster, err := p.tryParseClusterClause(p.Pos()) |
| 265 | if err != nil { |
| 266 | return nil, err |
| 267 | } |
| 268 | if onCluster != nil { |
| 269 | statementEnd = onCluster.End() |
| 270 | } |
| 271 | |
| 272 | partition, err := p.tryParsePartitionClause(p.Pos()) |
| 273 | if err != nil { |
| 274 | return nil, err |
| 275 | } |
| 276 | if partition != nil { |
| 277 | statementEnd = partition.End() |
| 278 | } |
| 279 | |
| 280 | hasFinal := false |
| 281 | lastPos := p.Pos() |
| 282 | if p.tryConsumeKeywords(KeywordFinal) { |
| 283 | hasFinal = true |
| 284 | statementEnd = lastPos |
| 285 | } |
| 286 | |
| 287 | deduplicate, err := p.tryParseDeduplicateClause(p.Pos()) |
| 288 | if err != nil { |
| 289 | return nil, err |
| 290 | } |
| 291 | if deduplicate != nil { |
| 292 | statementEnd = deduplicate.End() |
| 293 | } |
| 294 | |
| 295 | return &OptimizeStmt{ |
| 296 | OptimizePos: pos, |
| 297 | StatementEnd: statementEnd, |
| 298 | Table: table, |
| 299 | OnCluster: onCluster, |
| 300 | Partition: partition, |
| 301 | HasFinal: hasFinal, |
| 302 | Deduplicate: deduplicate, |
| 303 | }, nil |
| 304 | } |
| 305 | |
| 306 | func (p *Parser) parseSystemStmt(pos Pos) (*SystemStmt, error) { |
| 307 | if err := p.expectKeyword(KeywordSystem); err != nil { |
no test coverage detected