absl::Status SchemaUpdaterImpl::AlterSequence()

in backend/schema/updater/schema_updater.cc [4765:4830]


absl::Status SchemaUpdaterImpl::AlterSequence(
    const ddl::AlterSequence& alter_sequence,
    const Sequence* current_sequence) {
  std::string sequence_name = current_sequence->Name();
  if (alter_sequence.alter_type_case() != ddl::AlterSequence::kSetOptions &&
      alter_sequence.alter_type_case() != ddl::AlterSequence::kSetSkipRange &&
      alter_sequence.alter_type_case() !=
          ddl::AlterSequence::kSetStartWithCounter) {
    return error::Internal(
        absl::StrCat("Unsupported alter sequence statement: ",
                     alter_sequence.DebugString()));
  }

  ::google::protobuf::RepeatedPtrField<ddl::SetOption> repeated_set_options;
  bool set_from_syntax = false;
  if (alter_sequence.alter_type_case() == ddl::AlterSequence::kSetOptions) {
    if (current_sequence->created_from_syntax()) {
      return error::CannotSetSequenceClauseAndOptionTogether(sequence_name);
    }
    repeated_set_options = alter_sequence.set_options().options();
  } else if (alter_sequence.alter_type_case() ==
             ddl::AlterSequence::kSetSkipRange) {
    if (current_sequence->created_from_options()) {
      return error::CannotSetSequenceClauseAndOptionTogether(sequence_name);
    }
    ddl::SetOption* skip_range_min = repeated_set_options.Add();
    ddl::SetOption* skip_range_max = repeated_set_options.Add();
    skip_range_min->set_option_name(kSequenceSkipRangeMinOptionName);
    skip_range_max->set_option_name(kSequenceSkipRangeMaxOptionName);
    if (alter_sequence.set_skip_range().has_min_value()) {
      skip_range_min->set_int64_value(
          alter_sequence.set_skip_range().min_value());
      skip_range_max->set_int64_value(
          alter_sequence.set_skip_range().max_value());
    } else {
      skip_range_min->set_null_value(true);
      skip_range_max->set_null_value(true);
    }
    set_from_syntax = true;
  } else if (alter_sequence.alter_type_case() ==
             ddl::AlterSequence::kSetStartWithCounter) {
    if (current_sequence->created_from_options()) {
      return error::CannotSetSequenceClauseAndOptionTogether(sequence_name);
    }
    ddl::SetOption* start_with_counter = repeated_set_options.Add();
    start_with_counter->set_option_name(kSequenceStartWithCounterOptionName);
    start_with_counter->set_int64_value(
        alter_sequence.set_start_with_counter().counter_value());
    set_from_syntax = true;
  }
  ZETASQL_RETURN_IF_ERROR(
      ValidateSequenceOptions(repeated_set_options, current_sequence));
  ZETASQL_RETURN_IF_ERROR(AlterNode<Sequence>(
      current_sequence,
      [this, set_from_syntax,
       repeated_set_options](Sequence::Editor* editor) -> absl::Status {
        if (set_from_syntax) {
          editor->set_created_from_syntax();
        } else {
          editor->set_created_from_options();
        }
        // Set sequence options
        return SetSequenceOptions(repeated_set_options, editor);
      }));
  return absl::OkStatus();
}