(pos Pos)
| 1336 | } |
| 1337 | |
| 1338 | func (p *Parser) parseEngineExpr(pos Pos) (*EngineExpr, error) { |
| 1339 | if err := p.expectKeyword(KeywordEngine); err != nil { |
| 1340 | return nil, err |
| 1341 | } |
| 1342 | _ = p.tryConsumeTokenKind(TokenKindSingleEQ) |
| 1343 | |
| 1344 | engineExpr := &EngineExpr{EnginePos: pos} |
| 1345 | var engineEnd Pos |
| 1346 | switch { |
| 1347 | case p.matchTokenKind(TokenKindIdent): |
| 1348 | ident, err := p.parseIdent() |
| 1349 | if err != nil { |
| 1350 | return nil, err |
| 1351 | } |
| 1352 | engineExpr.Name = ident.Name |
| 1353 | engineEnd = ident.End() |
| 1354 | if p.matchTokenKind(TokenKindLParen) { |
| 1355 | params, err := p.parseFunctionParams(p.Pos()) |
| 1356 | if err != nil { |
| 1357 | return nil, err |
| 1358 | } |
| 1359 | engineExpr.Params = params |
| 1360 | engineExpr.EngineEnd = params.End() |
| 1361 | } |
| 1362 | default: |
| 1363 | return nil, fmt.Errorf("unexpected token: %s", p.lastTokenKind()) |
| 1364 | } |
| 1365 | |
| 1366 | for !p.lexer.isEOF() { |
| 1367 | switch { |
| 1368 | case p.matchKeyword(KeywordOrder): |
| 1369 | orderBy, err := p.tryParseOrderByClause(p.Pos()) |
| 1370 | if err != nil { |
| 1371 | return nil, err |
| 1372 | } |
| 1373 | engineExpr.OrderBy = orderBy |
| 1374 | engineEnd = orderBy.End() |
| 1375 | case p.matchKeyword(KeywordPartition): |
| 1376 | partitionBy, err := p.tryParsePartitionByClause(p.Pos()) |
| 1377 | if err != nil { |
| 1378 | return nil, err |
| 1379 | } |
| 1380 | engineExpr.PartitionBy = partitionBy |
| 1381 | engineEnd = partitionBy.End() |
| 1382 | case p.matchKeyword(KeywordPrimary): |
| 1383 | primaryKey, err := p.tryParsePrimaryKeyClause(p.Pos()) |
| 1384 | if err != nil { |
| 1385 | return nil, err |
| 1386 | } |
| 1387 | engineExpr.PrimaryKey = primaryKey |
| 1388 | engineEnd = primaryKey.End() |
| 1389 | case p.matchKeyword(KeywordSample): |
| 1390 | sampleBy, err := p.tryParseSampleByClause(p.Pos()) |
| 1391 | if err != nil { |
| 1392 | return nil, err |
| 1393 | } |
| 1394 | engineExpr.SampleBy = sampleBy |
| 1395 | engineEnd = sampleBy.End() |
no test coverage detected