| 640 | } |
| 641 | |
| 642 | UpdateEntry SQLParser::parseUpdateField(Tokenizer& parser) { |
| 643 | auto tok = peekSqlToken(parser, FieldNameSqlToken, false); |
| 644 | if (tok.Type() != TokenName) { |
| 645 | const auto range = parser.Where(tok); |
| 646 | throw SqlParserError(range, "Expected field name but found '{}' in query {}", tok.Text(), range); |
| 647 | } |
| 648 | UpdateEntry updateField{tok.Text(), {}}; |
| 649 | |
| 650 | parser.SkipToken(); |
| 651 | tok = parser.NextToken(); |
| 652 | if (tok.Text() != "="sv) { |
| 653 | const auto range = parser.Where(tok); |
| 654 | throw SqlParserError(range, "Expected '=' but found '{}' in query, '{}'", tok.Text(), range); |
| 655 | } |
| 656 | |
| 657 | const size_t startPos = parser.GetPos(); |
| 658 | bool withArrayExpressions = false; |
| 659 | |
| 660 | tok = parser.NextToken(Tokenizer::Flags::NoFlags); |
| 661 | if (tok.Text() == "["sv) { |
| 662 | std::ignore = updateField.Values().MarkArray(); |
| 663 | parseArray(parser, tok, &updateField); |
| 664 | updateField.SetIsExpression(false); |
| 665 | } else if (tok.Text() == "array_remove"sv || tok.Text() == "array_remove_once"sv) { |
| 666 | parseCommand(parser); |
| 667 | |
| 668 | updateField.SetIsExpression(true); |
| 669 | updateField.Values() = {Variant(std::string(parser.Begin() + startPos, parser.GetPos() - startPos))}; |
| 670 | } else { |
| 671 | addUpdateValue(tok, parser, updateField); |
| 672 | } |
| 673 | |
| 674 | tok = parser.PeekToken(Tokenizer::Flags::NoFlags); |
| 675 | while (tok.Text() == "|"sv) { |
| 676 | parser.SkipToken(); |
| 677 | tok = parser.NextToken(); |
| 678 | if (tok.Text() != "|"sv) { |
| 679 | const auto range = parser.Where(tok); |
| 680 | throw SqlParserError(range, "Expected '|', not '{}', {}", tok.Text(), range); |
| 681 | } |
| 682 | tok = parser.NextToken(); |
| 683 | if (tok.Type() != TokenName) { |
| 684 | const auto range = parser.Where(tok); |
| 685 | throw SqlParserError(range, "Expected field name, but found '{}' in query, {}", tok.Text(), range); |
| 686 | } else if (tok.Text() == "array_remove"sv || tok.Text() == "array_remove_once"sv) { |
| 687 | parseCommand(parser); |
| 688 | } |
| 689 | tok = parser.PeekToken(); |
| 690 | withArrayExpressions = true; |
| 691 | } |
| 692 | |
| 693 | if (withArrayExpressions) { |
| 694 | updateField.SetIsExpression(true); |
| 695 | updateField.Values() = {Variant(std::string(parser.Begin() + startPos, parser.GetPos() - startPos))}; |
| 696 | } |
| 697 | |
| 698 | return updateField; |
| 699 | } |
nothing calls this directly
no test coverage detected