absl::Status SchemaUpdaterImpl::ValidateAlterDatabaseOptions()

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