in backend/schema/updater/schema_updater.cc [4549:4603]
absl::Status SchemaUpdaterImpl::ValidateAlterDatabaseOptions(
const ::google::protobuf::RepeatedPtrField<ddl::SetOption>& set_options) {
for (const ddl::SetOption& option : set_options) {
absl::string_view option_name =
absl::StripPrefix(option.option_name(), "spanner.internal.cloud_");
if (option_name == ddl::kWitnessLocationOptionName) {
if (option.has_string_value()) {
continue;
} else if (option.has_null_value()) {
return error::NullValueAlterDatabaseOption();
}
} else if (option_name == ddl::kDefaultLeaderOptionName) {
if (option.has_string_value()) {
continue;
} else if (option.has_null_value()) {
return error::NullValueAlterDatabaseOption();
}
} else if (option_name == ddl::kDefaultSequenceKindOptionName) {
if (option.has_string_value() || option.has_null_value()) {
if (latest_schema_->options() != nullptr &&
latest_schema_->options()->default_sequence_kind().has_value()) {
return error::DefaultSequenceKindAlreadySet();
}
if (option.has_string_value() &&
option.string_value() != kSequenceKindBitReversedPositive) {
return error::UnsupportedSequenceKind(option.string_value());
}
} else {
return error::UnsupportedDefaultSequenceKindOptionValues();
}
} else if (option_name == ddl::kDefaultTimeZoneOptionName) {
if (option.has_string_value() || option.has_null_value()) {
if (!latest_schema_->tables().empty()) {
return error::ChangeDefaultTimeZoneOnNonEmptyDatabase();
}
absl::TimeZone time_zone;
if (option.has_string_value() &&
!absl::LoadTimeZone(option.string_value(), &time_zone)) {
return error::InvalidDefaultTimeZoneOption(option.string_value());
}
} else {
return error::UnsupportedDefaultTimeZoneOptionValues();
}
} else if (option_name == ddl::kVersionRetentionPeriodOptionName) {
if (option.has_string_value() || option.has_null_value()) {
continue;
}
return error::UnsupportedVersionRetentionPeriodOptionValues();
} else {
return error::UnsupportedAlterDatabaseOption(option_name);
}
}
return absl::OkStatus();
}