MCPcopy Create free account
hub / github.com/Restream/reindexer / parseUpdateField

Method parseUpdateField

cpp_src/core/query/sql/sqlparser.cc:642–699  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

640}
641
642UpdateEntry 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}

Callers

nothing calls this directly

Calls 12

SqlParserErrorClass · 0.85
addUpdateValueFunction · 0.85
SkipTokenMethod · 0.80
GetPosMethod · 0.80
SetIsExpressionMethod · 0.80
BeginMethod · 0.80
PeekTokenMethod · 0.80
TypeMethod · 0.65
VariantClass · 0.50
WhereMethod · 0.45
NextTokenMethod · 0.45
ValuesMethod · 0.45

Tested by

no test coverage detected