parseOnDuplicateKeyUpdateClause parses the assignments in ON DUPLICATE KEY UPDATE
()
| 384 | |
| 385 | // parseOnDuplicateKeyUpdateClause parses the assignments in ON DUPLICATE KEY UPDATE |
| 386 | func (p *Parser) parseOnDuplicateKeyUpdateClause() (*ast.UpsertClause, error) { |
| 387 | upsert := &ast.UpsertClause{} |
| 388 | for { |
| 389 | if !p.isIdentifier() { |
| 390 | return nil, p.expectedError("column name in ON DUPLICATE KEY UPDATE") |
| 391 | } |
| 392 | columnName := p.currentToken.Token.Value |
| 393 | p.advance() |
| 394 | |
| 395 | if !p.isType(models.TokenTypeEq) { |
| 396 | return nil, p.expectedError("=") |
| 397 | } |
| 398 | p.advance() |
| 399 | |
| 400 | value, err := p.parseExpression() |
| 401 | if err != nil { |
| 402 | return nil, fmt.Errorf("failed to parse ON DUPLICATE KEY UPDATE value: %w", err) |
| 403 | } |
| 404 | |
| 405 | upsert.Updates = append(upsert.Updates, ast.UpdateExpression{ |
| 406 | Column: &ast.Identifier{Name: columnName}, |
| 407 | Value: value, |
| 408 | }) |
| 409 | |
| 410 | if !p.isType(models.TokenTypeComma) { |
| 411 | break |
| 412 | } |
| 413 | p.advance() // Consume comma |
| 414 | } |
| 415 | return upsert, nil |
| 416 | } |
no test coverage detected