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();
}