# LogicTest: multiregion-9node-3region-3azs multiregion-9node-3region-3azs-tenant multiregion-9node-3region-3azs-no-los

query TTTTT rowsort
SHOW REGIONS
----
ap-southeast-2  {ap-az1,ap-az2,ap-az3}  {}  {}  {}
ca-central-1    {ca-az1,ca-az2,ca-az3}  {}  {}  {}
us-east-1       {us-az1,us-az2,us-az3}  {}  {}  {}

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

# Test setting gc.ttlseconds and then dropping a GLOBAL table results in
# a zone config drop.
statement ok
CREATE DATABASE drop_region_db PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2";

statement ok
USE drop_region_db

statement ok
CREATE TABLE global_table () LOCALITY GLOBAL;

statement ok
CREATE TABLE global_table_custom_gc_ttl () LOCALITY GLOBAL;

statement ok
ALTER TABLE global_table_custom_gc_ttl CONFIGURE ZONE USING gc.ttlseconds = 10

statement ok
ALTER DATABASE drop_region_db DROP REGION "ap-southeast-2"

statement ok
ALTER DATABASE drop_region_db DROP REGION "ca-central-1"

query TT colnames,rowsort
SELECT table_name, locality FROM [SHOW TABLES]
----
table_name                  locality
global_table                NULL
global_table_custom_gc_ttl  NULL

query TT
SHOW ZONE CONFIGURATION FOR TABLE global_table
----
RANGE default  ALTER RANGE default CONFIGURE ZONE USING
                 range_min_bytes = 134217728,
                 range_max_bytes = 536870912,
                 gc.ttlseconds = 14400,
                 num_replicas = 3,
                 constraints = '[]',
                 lease_preferences = '[]'

query TT
SHOW ZONE CONFIGURATION FOR TABLE global_table_custom_gc_ttl
----
TABLE global_table_custom_gc_ttl  ALTER TABLE global_table_custom_gc_ttl CONFIGURE ZONE USING
                                  range_min_bytes = 134217728,
                                  range_max_bytes = 536870912,
                                  gc.ttlseconds = 10,
                                  num_replicas = 3,
                                  constraints = '[]',
                                  lease_preferences = '[]'

# Test we preserve gc.ttlseconds when setting the initial primary region
# and dropping the final primary region.
statement ok
CREATE DATABASE gc_ttl_predefined_db

query TT
SHOW ZONE CONFIGURATION FOR DATABASE gc_ttl_predefined_db
----
RANGE default  ALTER RANGE default CONFIGURE ZONE USING
                 range_min_bytes = 134217728,
                 range_max_bytes = 536870912,
                 gc.ttlseconds = 14400,
                 num_replicas = 3,
                 constraints = '[]',
                 lease_preferences = '[]'

statement ok
ALTER DATABASE gc_ttl_predefined_db CONFIGURE ZONE USING gc.ttlseconds = 10;
ALTER DATABASE gc_ttl_predefined_db PRIMARY REGION "ca-central-1"

query TT
SHOW ZONE CONFIGURATION FOR DATABASE gc_ttl_predefined_db
----
DATABASE gc_ttl_predefined_db  ALTER DATABASE gc_ttl_predefined_db CONFIGURE ZONE USING
                               range_min_bytes = 134217728,
                               range_max_bytes = 536870912,
                               gc.ttlseconds = 10,
                               num_replicas = 3,
                               num_voters = 3,
                               constraints = '{+region=ca-central-1: 1}',
                               voter_constraints = '[+region=ca-central-1]',
                               lease_preferences = '[[+region=ca-central-1]]'

statement ok
ALTER DATABASE gc_ttl_predefined_db DROP REGION "ca-central-1"

query TT
SHOW ZONE CONFIGURATION FOR DATABASE gc_ttl_predefined_db
----
DATABASE gc_ttl_predefined_db  ALTER DATABASE gc_ttl_predefined_db CONFIGURE ZONE USING
                               range_min_bytes = 134217728,
                               range_max_bytes = 536870912,
                               gc.ttlseconds = 10,
                               num_replicas = 3,
                               constraints = '[]',
                               lease_preferences = '[]'

statement ok
CREATE DATABASE "mr-zone-configs" primary region "ca-central-1" regions "ap-southeast-2", "us-east-1"

statement ok
use "mr-zone-configs"

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING gc.ttlseconds = 5

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING range_min_bytes = 1000, range_max_bytes = 100000000

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 5,
                            num_replicas = 5,
                            num_voters = 3,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=ca-central-1]',
                            lease_preferences = '[[+region=ca-central-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement error attempting to modify protected field "num_voters" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_voters = 5

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 5,
                            num_replicas = 5,
                            num_voters = 3,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=ca-central-1]',
                            lease_preferences = '[[+region=ca-central-1]]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_voters = 5;

statement ok
SET override_multi_region_zone_config = false

statement error zone configuration for database "mr-zone-configs" contains incorrectly configured field "num_voters"
SELECT crdb_internal.validate_multi_region_zone_configs()

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 5,
                            num_replicas = 5,
                            num_voters = 5,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=ca-central-1]',
                            lease_preferences = '[[+region=ca-central-1]]'

# Ensure all fields are blocked
statement error attempting to modify protected field "global_reads" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING global_reads = true

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_replicas = 7

statement error attempting to modify protected field "constraints" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING constraints = '{+region=ap-southeast-2: 1}'

statement error attempting to modify protected field "voter_constraints" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING voter_constraints = '[+region=ap-southeast-2]'

statement error attempting to modify protected field "lease_preferences" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING lease_preferences = '[[+region=ap-southeast-2]]'

# With above modified zone config, try and drop a region to get error again
statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "num_voters"
ALTER DATABASE "mr-zone-configs" DROP REGION "ap-southeast-2"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" DROP REGION "ap-southeast-2";

statement ok
SET override_multi_region_zone_config = false

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING global_reads = true;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "global_reads"
ALTER DATABASE "mr-zone-configs" ADD REGION "ap-southeast-2"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" ADD REGION "ap-southeast-2";

statement ok
SET override_multi_region_zone_config = false

# Zone config is unmodified now. We don't need to override.
statement ok
ALTER DATABASE "mr-zone-configs" DROP REGION "ap-southeast-2"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" ADD REGION "ap-southeast-2";

statement ok
SET override_multi_region_zone_config = false

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_replicas = 7;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "num_replicas"
ALTER DATABASE "mr-zone-configs" SET PRIMARY REGION "us-east-1"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" SET PRIMARY REGION "us-east-1";

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 5,
                            num_replicas = 5,
                            num_voters = 3,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=us-east-1]',
                            lease_preferences = '[[+region=us-east-1]]'

# Alter with one protected field and one unprotected field.
statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_replicas = 7, gc.ttlseconds = 100000

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING num_replicas = 7, gc.ttlseconds = 100000;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "num_replicas"
ALTER DATABASE "mr-zone-configs" SURVIVE REGION FAILURE

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" SURVIVE REGION FAILURE;

statement ok
SET override_multi_region_zone_config = false

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" SURVIVE ZONE FAILURE;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to modify protected field "constraints" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING constraints = '{+region=us-east-1: 3}'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING constraints = '{+region=us-east-1: 3}';

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "constraints"
ALTER DATABASE "mr-zone-configs" DROP REGION "ap-southeast-2"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" DROP REGION "ap-southeast-2";

statement ok
SET override_multi_region_zone_config = false

statement error attempting to modify protected field "voter_constraints" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING voter_constraints = '[+region=ap-southeast-2]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING voter_constraints = '[+region=ap-southeast-2]';

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 4,
                            num_voters = 3,
                            constraints = '{+region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=ap-southeast-2]',
                            lease_preferences = '[[+region=us-east-1]]'

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "voter_constraints"
ALTER DATABASE "mr-zone-configs" DROP REGION "ca-central-1"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" DROP REGION "ca-central-1";

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 3,
                            num_voters = 3,
                            constraints = '{+region=us-east-1: 1}',
                            voter_constraints = '[+region=us-east-1]',
                            lease_preferences = '[[+region=us-east-1]]'

statement error attempting to modify protected field "lease_preferences" of a multi-region zone configuration
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING lease_preferences = '[[+region=ap-southeast-2]]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING lease_preferences = '[[+region=ap-southeast-2]]';

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 3,
                            num_voters = 3,
                            constraints = '{+region=us-east-1: 1}',
                            voter_constraints = '[+region=us-east-1]',
                            lease_preferences = '[[+region=ap-southeast-2]]'

statement error attempting to update zone configuration for database "mr-zone-configs" which contains modified field "lease_preferences"
ALTER DATABASE "mr-zone-configs" DROP REGION "us-east-1"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" DROP REGION "us-east-1";

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 3,
                            constraints = '[]',
                            lease_preferences = '[]'

query TTTTTT colnames,rowsort
SHOW DATABASES
----
database_name         owner  primary_region  secondary_region  regions  survival_goal
defaultdb             root   NULL            NULL              {}       NULL
drop_region_db        root   NULL            NULL              {}       NULL
gc_ttl_predefined_db  root   NULL            NULL              {}       NULL
mr-zone-configs       root   NULL            NULL              {}       NULL
postgres              root   NULL            NULL              {}       NULL
system                node   NULL            NULL              {}       NULL
test                  root   NULL            NULL              {}       NULL

statement ok
ALTER DATABASE "mr-zone-configs" SET PRIMARY REGION "us-east-1"

statement ok
ALTER DATABASE "mr-zone-configs" ADD REGION "ca-central-1"

statement ok
ALTER DATABASE "mr-zone-configs" ADD REGION "ap-southeast-2"

query TTTTTT colnames,rowsort
SHOW DATABASES
----
database_name         owner  primary_region  secondary_region  regions                                  survival_goal
defaultdb             root   NULL            NULL              {}                                       NULL
drop_region_db        root   NULL            NULL              {}                                       NULL
gc_ttl_predefined_db  root   NULL            NULL              {}                                       NULL
mr-zone-configs       root   us-east-1       ·                 {ap-southeast-2,ca-central-1,us-east-1}  zone
postgres              root   NULL            NULL              {}                                       NULL
system                node   NULL            NULL              {}                                       NULL
test                  root   NULL            NULL              {}                                       NULL

# Ensure that changes to the table-level zone config also require overriding.
statement ok
CREATE TABLE regional_by_row (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i),
  FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE regional_by_table (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i),
  FAMILY (pk, i)
) LOCALITY REGIONAL BY TABLE

statement ok
ALTER table regional_by_row CONFIGURE ZONE USING gc.ttlseconds = 10

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER table regional_by_row CONFIGURE ZONE USING num_replicas = 10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER table regional_by_row CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false

statement error zone configuration for table regional_by_row contains incorrectly configured field "num_replicas"
SELECT crdb_internal.validate_multi_region_zone_configs()

query TT
SHOW ZONE CONFIGURATION FOR TABLE regional_by_row
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 10,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER partition "us-east-1" of index regional_by_row@regional_by_row_pkey CONFIGURE ZONE USING num_replicas = 10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER partition "us-east-1" of index regional_by_row@regional_by_row_pkey CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false;

query TTT
SELECT ZONE_config, index_name, partition_name FROM [SHOW PARTITIONS FROM TABLE regional_by_row]
ORDER BY partition_name, index_name
----
num_voters = 3,\nvoter_constraints = '[+region=ap-southeast-2]',\nlease_preferences = '[[+region=ap-southeast-2]]'            regional_by_row@regional_by_row_i_idx  ap-southeast-2
num_voters = 3,\nvoter_constraints = '[+region=ap-southeast-2]',\nlease_preferences = '[[+region=ap-southeast-2]]'            regional_by_row@regional_by_row_pkey   ap-southeast-2
num_voters = 3,\nvoter_constraints = '[+region=ca-central-1]',\nlease_preferences = '[[+region=ca-central-1]]'                regional_by_row@regional_by_row_i_idx  ca-central-1
num_voters = 3,\nvoter_constraints = '[+region=ca-central-1]',\nlease_preferences = '[[+region=ca-central-1]]'                regional_by_row@regional_by_row_pkey   ca-central-1
num_voters = 3,\nvoter_constraints = '[+region=us-east-1]',\nlease_preferences = '[[+region=us-east-1]]'                      regional_by_row@regional_by_row_i_idx  us-east-1
num_replicas = 10,\nnum_voters = 3,\nvoter_constraints = '[+region=us-east-1]',\nlease_preferences = '[[+region=us-east-1]]'  regional_by_row@regional_by_row_pkey   us-east-1

statement error attempting to update zone configuration for table regional_by_row which contains modified field "num_replicas"
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY TABLE

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY TABLE;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER index regional_by_row@regional_by_row_pkey CONFIGURE ZONE USING num_replicas = 10

query TTT
SELECT ZONE_config, index_name, partition_name FROM [SHOW PARTITIONS FROM TABLE regional_by_row]
ORDER BY partition_name, index_name
----

query TT
SHOW ZONE CONFIGURATION FOR INDEX regional_by_row@regional_by_row_pkey
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 10,
                       num_replicas = 5,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW ZONE CONFIGURATION FOR INDEX regional_by_row@regional_by_row_i_idx
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 10,
                       num_replicas = 5,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW ZONE CONFIGURATION FOR TABLE regional_by_row
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 10,
                       num_replicas = 5,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement ok
DROP TABLE regional_by_row

statement ok
CREATE TABLE regional_by_row (
  pk INT PRIMARY KEY,
  i INT,
  INDEX idx(i),
  FAMILY (pk, i)
) LOCALITY REGIONAL BY ROW

statement ok
ALTER PARTITION "ap-southeast-2" OF INDEX regional_by_row@idx CONFIGURE ZONE USING gc.ttlseconds = 10;
ALTER INDEX regional_by_row@idx CONFIGURE ZONE USING gc.ttlseconds = 10

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER PARTITION "ap-southeast-2" OF INDEX regional_by_row@idx CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false

statement error zone configuration for partition "ap-southeast-2" of regional_by_row@idx contains incorrectly configured field "num_replicas"
SELECT crdb_internal.validate_multi_region_zone_configs()

statement error attempting to update zone configuration for partition "ap-southeast-2" of regional_by_row@idx which contains modified field "num_replicas"
ALTER TABLE regional_by_row SET LOCALITY GLOBAL

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER PARTITION "ap-southeast-2" OF INDEX regional_by_row@idx CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

statement error missing zone configuration for partition "ap-southeast-2" of regional_by_row@idx
SELECT crdb_internal.validate_multi_region_zone_configs()

statement error attempting to update zone config which is missing an expected zone configuration for partition "ap-southeast-2" of regional_by_row@idx
ALTER TABLE regional_by_row SET LOCALITY GLOBAL

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE regional_by_row SET LOCALITY GLOBAL;

statement ok
SET override_multi_region_zone_config = false

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

# Table is now GLOBAL, set global_reads to false to validate that an ALTER back
# to GLOBAL will reset it to true.
statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER table regional_by_row CONFIGURE ZONE USING global_reads = false;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE regional_by_row
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 100000,
                       global_reads = false,
                       num_replicas = 5,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE regional_by_row SET LOCALITY GLOBAL;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE regional_by_row
----
TABLE regional_by_row  ALTER TABLE regional_by_row CONFIGURE ZONE USING
                       range_min_bytes = 1000,
                       range_max_bytes = 100000000,
                       gc.ttlseconds = 100000,
                       global_reads = true,
                       num_replicas = 5,
                       num_voters = 3,
                       constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER index regional_by_row@regional_by_row_pkey CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone config which contains an extra zone configuration for index regional_by_row@regional_by_row_pkey with field num_replicas populated
ALTER TABLE regional_by_row SET LOCALITY GLOBAL

statement error extraneous zone configuration for index regional_by_row@regional_by_row_pkey with field num_replicas populated
SELECT crdb_internal.validate_multi_region_zone_configs()

statement error attempting to update zone config which contains an extra zone configuration for index regional_by_row@regional_by_row_pkey with field num_replicas populated
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY ROW

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE regional_by_row SET LOCALITY REGIONAL BY ROW;

statement ok
SET override_multi_region_zone_config = false

statement ok
CREATE TABLE regional_by_row_as (
  pk INT PRIMARY KEY,
  i INT,
  cr crdb_internal_region NOT NULL DEFAULT 'ca-central-1',
  INDEX(i),
  FAMILY (cr, pk, i)
) LOCALITY REGIONAL BY ROW AS "cr";

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER index regional_by_row_as@regional_by_row_as_pkey CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX regional_by_row_as@regional_by_row_as_pkey
----
INDEX regional_by_row_as@regional_by_row_as_pkey  ALTER INDEX regional_by_row_as@regional_by_row_as_pkey CONFIGURE ZONE USING
                                  range_min_bytes = 1000,
                                  range_max_bytes = 100000000,
                                  gc.ttlseconds = 100000,
                                  num_replicas = 10,
                                  num_voters = 3,
                                  constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                                  voter_constraints = '[+region=us-east-1]',
                                  lease_preferences = '[[+region=us-east-1]]'

statement error attempting to update zone config which contains an extra zone configuration for index regional_by_row_as@regional_by_row_as_pkey with field num_replicas populated
ALTER TABLE regional_by_row_as SET LOCALITY REGIONAL BY ROW

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE regional_by_row_as SET LOCALITY REGIONAL BY ROW;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX regional_by_row_as@regional_by_row_as_pkey
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 5,
                            num_voters = 3,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=us-east-1]',
                            lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW CREATE TABLE regional_by_row_as
----
regional_by_row_as  CREATE TABLE public.regional_by_row_as (
                      pk INT8 NOT NULL,
                      i INT8 NULL,
                      cr public.crdb_internal_region NOT NULL DEFAULT 'ca-central-1':::public.crdb_internal_region,
                      crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
                      CONSTRAINT regional_by_row_as_pkey PRIMARY KEY (pk ASC),
                      INDEX regional_by_row_as_i_idx (i ASC),
                      FAMILY fam_0_cr_pk_i (cr, pk, i, crdb_region)
                    ) LOCALITY REGIONAL BY ROW

query TTT
SELECT ZONE_config, index_name, partition_name FROM [SHOW PARTITIONS FROM TABLE regional_by_row_as]
ORDER BY partition_name, index_name
----
num_voters = 3,\nvoter_constraints = '[+region=ap-southeast-2]',\nlease_preferences = '[[+region=ap-southeast-2]]'  regional_by_row_as@regional_by_row_as_i_idx  ap-southeast-2
num_voters = 3,\nvoter_constraints = '[+region=ap-southeast-2]',\nlease_preferences = '[[+region=ap-southeast-2]]'  regional_by_row_as@regional_by_row_as_pkey   ap-southeast-2
num_voters = 3,\nvoter_constraints = '[+region=ca-central-1]',\nlease_preferences = '[[+region=ca-central-1]]'      regional_by_row_as@regional_by_row_as_i_idx  ca-central-1
num_voters = 3,\nvoter_constraints = '[+region=ca-central-1]',\nlease_preferences = '[[+region=ca-central-1]]'      regional_by_row_as@regional_by_row_as_pkey   ca-central-1
num_voters = 3,\nvoter_constraints = '[+region=us-east-1]',\nlease_preferences = '[[+region=us-east-1]]'            regional_by_row_as@regional_by_row_as_i_idx  us-east-1
num_voters = 3,\nvoter_constraints = '[+region=us-east-1]',\nlease_preferences = '[[+region=us-east-1]]'            regional_by_row_as@regional_by_row_as_pkey   us-east-1

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
DATABASE "mr-zone-configs"  ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE USING
                            range_min_bytes = 1000,
                            range_max_bytes = 100000000,
                            gc.ttlseconds = 100000,
                            num_replicas = 5,
                            num_voters = 3,
                            constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                            voter_constraints = '[+region=us-east-1]',
                            lease_preferences = '[[+region=us-east-1]]'

statement error attempting to discard the zone configuration of a multi-region entity
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE DISCARD

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "mr-zone-configs" CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "mr-zone-configs"
----
RANGE default  ALTER RANGE default CONFIGURE ZONE USING
                 range_min_bytes = 134217728,
                 range_max_bytes = 536870912,
                 gc.ttlseconds = 14400,
                 num_replicas = 3,
                 constraints = '[]',
                 lease_preferences = '[]'

statement ok
ALTER INDEX regional_by_row@regional_by_row_pkey CONFIGURE ZONE DISCARD

statement error attempting to discard the zone configuration of a multi-region entity
ALTER PARTITION "ca-central-1" OF INDEX regional_by_row@regional_by_row_pkey CONFIGURE ZONE DISCARD

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER PARTITION "ca-central-1" OF INDEX regional_by_row@regional_by_row_pkey CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

# Drop invalid zone config database so validation passes.
statement ok
DROP DATABASE "mr-zone-configs" CASCADE

# Test validation for initial SET PRIMARY REGION
statement ok
CREATE DATABASE initial_multiregion_db;

statement ok
USE initial_multiregion_db;

statement ok
CREATE TABLE tbl (a INT PRIMARY KEY, INDEX a_idx (a));

statement ok
ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING gc.ttlseconds = 5;

statement ok
ALTER TABLE tbl CONFIGURE ZONE USING gc.ttlseconds = 5;

statement ok
ALTER INDEX tbl@a_idx CONFIGURE ZONE USING gc.ttlseconds = 5

statement ok
ALTER DATABASE initial_multiregion_db SET PRIMARY REGION "us-east-1"

query TT
SHOW ZONE CONFIGURATION FOR DATABASE initial_multiregion_db
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                 range_min_bytes = 134217728,
                                 range_max_bytes = 536870912,
                                 gc.ttlseconds = 5,
                                 num_replicas = 3,
                                 num_voters = 3,
                                 constraints = '{+region=us-east-1: 1}',
                                 voter_constraints = '[+region=us-east-1]',
                                 lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl
----
TABLE tbl  ALTER TABLE tbl CONFIGURE ZONE USING
           range_min_bytes = 134217728,
           range_max_bytes = 536870912,
           gc.ttlseconds = 5,
           num_replicas = 3,
           num_voters = 3,
           constraints = '{+region=us-east-1: 1}',
           voter_constraints = '[+region=us-east-1]',
           lease_preferences = '[[+region=us-east-1]]'

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl@a_idx
----
INDEX tbl@a_idx  ALTER INDEX tbl@a_idx CONFIGURE ZONE USING
                 range_min_bytes = 134217728,
                 range_max_bytes = 536870912,
                 gc.ttlseconds = 5,
                 num_replicas = 3,
                 num_voters = 3,
                 constraints = '{+region=us-east-1: 1}',
                 voter_constraints = '[+region=us-east-1]',
                 lease_preferences = '[[+region=us-east-1]]'

# Drop the last region, making the database a non-multi-region database.
# Then, modify the zone configs so that we can test transitioning to
# multi-region with a zone config applied.
statement ok
ALTER DATABASE initial_multiregion_db DROP REGION "us-east-1";
ALTER INDEX tbl@a_idx CONFIGURE ZONE USING num_replicas = 10

statement error zone configuration for index tbl@a_idx has field "num_replicas" set which will be overwritten when setting the initial PRIMARY REGION \(expected=nil actual=10\)\nHINT: discard the zone config using CONFIGURE ZONE DISCARD before continuing
ALTER DATABASE initial_multiregion_db SET PRIMARY REGION "us-east-1"

# Variations of tests where a zone config is present while we try to transition
# to a multi-region database.
statement ok
ALTER INDEX tbl@a_idx CONFIGURE ZONE DISCARD;
ALTER TABLE tbl CONFIGURE ZONE USING num_replicas = 10

statement error zone configuration for table tbl has field "num_replicas" set which will be overwritten when setting the the initial PRIMARY REGION \(expected=nil actual=10\)\nHINT: discard the zone config using CONFIGURE ZONE DISCARD before continuing
ALTER DATABASE initial_multiregion_db SET PRIMARY REGION "us-east-1"

statement ok
ALTER TABLE tbl CONFIGURE ZONE DISCARD;
ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING num_replicas = 10

statement error zone configuration for database initial_multiregion_db has field "num_replicas" set which will be overwritten when setting the the initial PRIMARY REGION \(expected=nil actual=10\)\nHINT: discard the zone config using CONFIGURE ZONE DISCARD before continuing
ALTER DATABASE initial_multiregion_db SET PRIMARY REGION "us-east-1"

# Validate that if we DISCARD the zone configuration, we can successfully turn
# this database into a multi-region database.
statement ok
ALTER DATABASE initial_multiregion_db CONFIGURE ZONE DISCARD;
ALTER DATABASE initial_multiregion_db SET PRIMARY REGION "us-east-1"

# Test case where user has an applied zone config that won't directly get
# overwritten by the locality transition.
subtest force_repaving_all_zone_configs

statement ok
USE initial_multiregion_db;
CREATE TABLE tbl1 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl1@tbl1_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone config which contains an extra zone configuration for index tbl1@tbl1_i_idx with field num_replicas populated
ALTER TABLE tbl1 SET LOCALITY GLOBAL

# This statement should wipe out the zone configuration we applied on the
# index above.
statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl1 SET LOCALITY GLOBAL;

statement ok
SET override_multi_region_zone_config = false

# Validate that the zone configuration is gone
query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl1@tbl1_i_idx
----
TABLE tbl1  ALTER TABLE tbl1 CONFIGURE ZONE USING
              range_min_bytes = 134217728,
              range_max_bytes = 536870912,
              gc.ttlseconds = 14400,
              global_reads = true,
              num_replicas = 3,
              num_voters = 3,
              constraints = '{+region=us-east-1: 1}',
              voter_constraints = '[+region=us-east-1]',
              lease_preferences = '[[+region=us-east-1]]'

# Confirm that the zone configuration was wiped above by changing the locality
# again, this time without an override.
statement ok
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

# Repeat the test, this time with an alter to REGIONAL BY TABLE.
statement ok
ALTER TABLE tbl1 SET LOCALITY GLOBAL

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl1@tbl1_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone config which contains an extra zone configuration for index tbl1@tbl1_i_idx with field num_replicas populated
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN "us-east-1"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN "us-east-1";

statement ok
SET override_multi_region_zone_config = false

statement ok
ALTER TABLE tbl1 SET LOCALITY GLOBAL

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl1@tbl1_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone config which contains an extra zone configuration for index tbl1@tbl1_i_idx with field num_replicas populated
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION;

statement ok
SET override_multi_region_zone_config = false

statement ok
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY ROW

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl1@tbl1_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone config which contains an extra zone configuration for index tbl1@tbl1_i_idx with field num_replicas populated
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl1 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION;

statement ok
SET override_multi_region_zone_config = false

# Now test to ensure that the same test holds true if we're transitioning from
# REGIONAL BY ROW.
statement ok
CREATE TABLE tbl2 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY ROW

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl2@tbl2_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false;

statement error attempting to update zone config which contains an extra zone configuration for index tbl2@tbl2_i_idx with field num_replicas populated
ALTER TABLE tbl2 SET LOCALITY GLOBAL

statement ok
ALTER INDEX tbl2@tbl2_i_idx CONFIGURE ZONE USING gc.ttlseconds=10

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl2@tbl2_i_idx
----
INDEX tbl2@tbl2_i_idx  ALTER INDEX tbl2@tbl2_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl2 SET LOCALITY GLOBAL;

statement ok
SET override_multi_region_zone_config = false

# Validate that we don't overwrite gc.ttlseconds
query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl2@tbl2_i_idx
----
INDEX tbl2@tbl2_i_idx  ALTER INDEX tbl2@tbl2_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       global_reads = true,
                       num_replicas = 3,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

statement ok
ALTER TABLE tbl2 SET LOCALITY REGIONAL BY ROW

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl2 CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

statement error attempting to update zone configuration for table tbl2 which contains modified field "num_replicas"
ALTER TABLE tbl2 SET LOCALITY GLOBAL

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl2 SET LOCALITY GLOBAL;

statement ok
SET override_multi_region_zone_config = false

statement ok
ALTER TABLE tbl2 SET LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement ok
DROP TABLE tbl2

# Test all cases where DISCARD is used to remove a zone configuration from a
# REGIONAL BY ROW table.
subtest discard_regional_by_row

statement ok
CREATE TABLE tbl3 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY ROW

statement ok
ALTER INDEX tbl3@tbl3_i_idx CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER INDEX tbl3@tbl3_i_idx CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl3@tbl3_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl3@tbl3_i_idx
----
INDEX tbl3@tbl3_i_idx  ALTER INDEX tbl3@tbl3_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an index zone config on a RBR table should succeed without override.
statement ok
ALTER INDEX tbl3@tbl3_i_idx CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl3@tbl3_i_idx
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

# DISCARDing a partition's zone configuration on a RBR table should fail.
statement error attempting to discard the zone configuration of a multi-region entity
ALTER partition "us-east-1" of index tbl3@tbl3_i_idx CONFIGURE ZONE DISCARD

# ...but we should be able to override.
statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER partition "us-east-1" of index tbl3@tbl3_i_idx CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

# Try a similar test but on the table zone configuration.
statement ok
ALTER TABLE tbl3 CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER TABLE tbl3 CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl3 CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl3
----
TABLE tbl3  ALTER TABLE tbl3 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 10,
            num_replicas = 10,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an table zone config on a RBR table should succeed without override.
statement ok
ALTER TABLE tbl3 CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl3
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement ok
DROP TABLE tbl3

# Test all cases where DISCARD is used to remove a zone configuration from a
# REGIONAL BY TABLE IN PRIMARY REGION table.
subtest discard_regional_by_table_in_primary_region

statement ok
CREATE TABLE tbl4 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement ok
ALTER INDEX tbl4@tbl4_i_idx CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER INDEX tbl4@tbl4_i_idx CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl4@tbl4_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl4@tbl4_i_idx
----
INDEX tbl4@tbl4_i_idx  ALTER INDEX tbl4@tbl4_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an index zone config on a RBT table should succeed without override.
statement ok
ALTER INDEX tbl4@tbl4_i_idx CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl4@tbl4_i_idx
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement ok
ALTER TABLE tbl4 CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER TABLE tbl4 CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl4 CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl4
----
TABLE tbl4  ALTER TABLE tbl4 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 10,
            num_replicas = 10,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an table zone config on a RBT table should succeed without override.
statement ok
ALTER TABLE tbl4 CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl4
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

# Test all cases where DISCARD is used to remove a zone configuration from a
# REGIONAL BY TABLE IN REGION <region> table.
subtest discard_regional_by_table_in_region

statement ok
CREATE TABLE tbl5 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY TABLE IN "us-east-1"

statement ok
ALTER INDEX tbl5@tbl5_i_idx CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER INDEX tbl5@tbl5_i_idx CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl5@tbl5_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl5@tbl5_i_idx
----
INDEX tbl5@tbl5_i_idx  ALTER INDEX tbl5@tbl5_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an index zone config on a RBT table should succeed without override.
statement ok
ALTER INDEX tbl5@tbl5_i_idx CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl5@tbl5_i_idx
----
TABLE tbl5  ALTER TABLE tbl5 CONFIGURE ZONE USING
              range_min_bytes = 134217728,
              range_max_bytes = 536870912,
              gc.ttlseconds = 14400,
              num_replicas = 3,
              num_voters = 3,
              constraints = '{+region=us-east-1: 1}',
              voter_constraints = '[+region=us-east-1]',
              lease_preferences = '[[+region=us-east-1]]'

statement ok
ALTER TABLE tbl5 CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER TABLE tbl5 CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl5 CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl5
----
TABLE tbl5  ALTER TABLE tbl5 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 10,
            num_replicas = 10,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an table zone config on a RBT table should fail without override.
statement error attempting to discard the zone configuration of a multi-region entity
ALTER TABLE tbl5 CONFIGURE ZONE DISCARD

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl5 CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl5
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement ok
DROP TABLE tbl5

# Test all cases where DISCARD is used to remove a zone configuration from a
# GLOBAL table.
subtest discard_global

statement ok
CREATE TABLE tbl6 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY GLOBAL

statement ok
ALTER INDEX tbl6@tbl6_i_idx CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER INDEX tbl6@tbl6_i_idx CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER INDEX tbl6@tbl6_i_idx CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl6@tbl6_i_idx
----
INDEX tbl6@tbl6_i_idx  ALTER INDEX tbl6@tbl6_i_idx CONFIGURE ZONE USING
                       range_min_bytes = 134217728,
                       range_max_bytes = 536870912,
                       gc.ttlseconds = 10,
                       global_reads = true,
                       num_replicas = 10,
                       num_voters = 3,
                       constraints = '{+region=us-east-1: 1}',
                       voter_constraints = '[+region=us-east-1]',
                       lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an index zone config on a GLOBAL table should succeed without
# override.
statement ok
ALTER INDEX tbl6@tbl6_i_idx CONFIGURE ZONE DISCARD

query TT
SHOW ZONE CONFIGURATION FOR INDEX tbl6@tbl6_i_idx
----
TABLE tbl6  ALTER TABLE tbl6 CONFIGURE ZONE USING
              range_min_bytes = 134217728,
              range_max_bytes = 536870912,
              gc.ttlseconds = 14400,
              global_reads = true,
              num_replicas = 3,
              num_voters = 3,
              constraints = '{+region=us-east-1: 1}',
              voter_constraints = '[+region=us-east-1]',
              lease_preferences = '[[+region=us-east-1]]'

statement ok
ALTER TABLE tbl6 CONFIGURE ZONE USING gc.ttlseconds=10

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER TABLE tbl6 CONFIGURE ZONE USING num_replicas=10

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl6 CONFIGURE ZONE USING num_replicas=10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl6
----
TABLE tbl6  ALTER TABLE tbl6 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 10,
            global_reads = true,
            num_replicas = 10,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

# DISCARD of an table zone config on a GLOBAL table should fail without
# override.
statement error attempting to discard the zone configuration of a multi-region entity
ALTER TABLE tbl6 CONFIGURE ZONE DISCARD

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl6 CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl6
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement ok
DROP TABLE tbl6

# Ensure that when using INHERIT FROM PARENT, blocks still apply.
subtest inherit_from_parent

statement ok
CREATE TABLE tbl7 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY TABLE IN PRIMARY REGION

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER TABLE tbl7 CONFIGURE ZONE USING num_replicas = COPY FROM PARENT

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER INDEX tbl7@tbl7_i_idx CONFIGURE ZONE USING num_replicas = COPY FROM PARENT

statement error attempting to modify protected field "num_replicas" of a multi-region zone configuration
ALTER PARTITION "us-east-1" OF INDEX tbl7@tbl7_i_idx CONFIGURE ZONE USING num_replicas = COPY FROM PARENT

# Validate crdb_internal.reset_multi_region_zone_configs_for_table builtin
subtest reset_multi_region_zone_configs

statement ok
CREATE TABLE tbl8 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL BY ROW

query TT
SHOW ZONE CONFIGURATION FOR PARTITION "us-east-1" of INDEX tbl8@tbl8_pkey
----
PARTITION "us-east-1" OF INDEX tbl8@tbl8_pkey  ALTER PARTITION "us-east-1" OF INDEX tbl8@tbl8_pkey CONFIGURE ZONE USING
                                                 range_min_bytes = 134217728,
                                                 range_max_bytes = 536870912,
                                                 gc.ttlseconds = 14400,
                                                 num_replicas = 3,
                                                 num_voters = 3,
                                                 constraints = '{+region=us-east-1: 1}',
                                                 voter_constraints = '[+region=us-east-1]',
                                                 lease_preferences = '[[+region=us-east-1]]'

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER PARTITION "us-east-1" OF INDEX tbl8@tbl8_pkey CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR PARTITION "us-east-1" of INDEX tbl8@tbl8_pkey
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement error missing zone configuration for partition "us-east-1" of tbl8@tbl8_pkey
SELECT crdb_internal.validate_multi_region_zone_configs()

let $tbl8_id
select table_id from crdb_internal.tables where name = 'tbl8'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl8_id)

query TT
SHOW ZONE CONFIGURATION FOR PARTITION "us-east-1" of INDEX tbl8@tbl8_pkey
----
PARTITION "us-east-1" OF INDEX tbl8@tbl8_pkey  ALTER PARTITION "us-east-1" OF INDEX tbl8@tbl8_pkey CONFIGURE ZONE USING
                                                 range_min_bytes = 134217728,
                                                 range_max_bytes = 536870912,
                                                 gc.ttlseconds = 14400,
                                                 num_replicas = 3,
                                                 num_voters = 3,
                                                 constraints = '{+region=us-east-1: 1}',
                                                 voter_constraints = '[+region=us-east-1]',
                                                 lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
CREATE TABLE tbl9 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL IN PRIMARY REGION

# Set gc.ttlseconds. Since this isn't a multi-region protected field, the reset
# should no-op.
statement ok
ALTER table tbl9 CONFIGURE ZONE USING gc.ttlseconds = 5

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl9
----
TABLE tbl9  ALTER TABLE tbl9 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 5,
            num_replicas = 3,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

let $tbl9_id
select table_id from crdb_internal.tables where name = 'tbl9'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl9_id)

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl9
----
TABLE tbl9  ALTER TABLE tbl9 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 5,
            num_replicas = 3,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl9 CONFIGURE ZONE USING num_replicas = 5;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl9
----
TABLE tbl9  ALTER TABLE tbl9 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 5,
            num_replicas = 5,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl9_id)

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl9
----
TABLE tbl9  ALTER TABLE tbl9 CONFIGURE ZONE USING
            range_min_bytes = 134217728,
            range_max_bytes = 536870912,
            gc.ttlseconds = 5,
            num_replicas = 3,
            num_voters = 3,
            constraints = '{+region=us-east-1: 1}',
            voter_constraints = '[+region=us-east-1]',
            lease_preferences = '[[+region=us-east-1]]'

statement ok
CREATE TABLE tbl10 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
) LOCALITY REGIONAL IN "us-east-1"

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER table tbl10 CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl10
----
DATABASE initial_multiregion_db  ALTER DATABASE initial_multiregion_db CONFIGURE ZONE USING
                                   range_min_bytes = 134217728,
                                   range_max_bytes = 536870912,
                                   gc.ttlseconds = 14400,
                                   num_replicas = 3,
                                   num_voters = 3,
                                   constraints = '{+region=us-east-1: 1}',
                                   voter_constraints = '[+region=us-east-1]',
                                   lease_preferences = '[[+region=us-east-1]]'

statement error zone configuration for table tbl10 contains incorrectly configured field "num_voters"
SELECT crdb_internal.validate_multi_region_zone_configs()

let $tbl10_id
select table_id from crdb_internal.tables where name = 'tbl10'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl10_id)

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl10
----
TABLE tbl10  ALTER TABLE tbl10 CONFIGURE ZONE USING
               range_min_bytes = 134217728,
               range_max_bytes = 536870912,
               gc.ttlseconds = 14400,
               num_replicas = 3,
               num_voters = 3,
               constraints = '{+region=us-east-1: 1}',
               voter_constraints = '[+region=us-east-1]',
               lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER TABLE tbl10 CONFIGURE ZONE USING num_replicas = 5;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl10
----
TABLE tbl10  ALTER TABLE tbl10 CONFIGURE ZONE USING
               range_min_bytes = 134217728,
               range_max_bytes = 536870912,
               gc.ttlseconds = 14400,
               num_replicas = 5,
               num_voters = 3,
               constraints = '{+region=us-east-1: 1}',
               voter_constraints = '[+region=us-east-1]',
               lease_preferences = '[[+region=us-east-1]]'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl10_id)

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl10
----
TABLE tbl10  ALTER TABLE tbl10 CONFIGURE ZONE USING
               range_min_bytes = 134217728,
               range_max_bytes = 536870912,
               gc.ttlseconds = 14400,
               num_replicas = 3,
               num_voters = 3,
               constraints = '{+region=us-east-1: 1}',
               voter_constraints = '[+region=us-east-1]',
               lease_preferences = '[[+region=us-east-1]]'

# Ensure that built-in no-ops on non-multi-region tables.
statement ok
CREATE DATABASE not_multi_region;

statement ok
USE not_multi_region

statement ok
CREATE TABLE tbl11 (
  pk INT PRIMARY KEY,
  i INT,
  INDEX(i)
)

statement ok
ALTER table tbl11 CONFIGURE ZONE USING num_replicas=10

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl11
----
TABLE tbl11  ALTER TABLE tbl11 CONFIGURE ZONE USING
               range_min_bytes = 134217728,
               range_max_bytes = 536870912,
               gc.ttlseconds = 14400,
               num_replicas = 10,
               constraints = '[]',
               lease_preferences = '[]'

let $tbl11_id
select table_id from crdb_internal.tables where name = 'tbl11'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl11_id)

query TT
SHOW ZONE CONFIGURATION FOR TABLE tbl11
----
TABLE tbl11  ALTER TABLE tbl11 CONFIGURE ZONE USING
               range_min_bytes = 134217728,
               range_max_bytes = 536870912,
               gc.ttlseconds = 14400,
               num_replicas = 10,
               constraints = '[]',
               lease_preferences = '[]'

query error pq: crdb_internal\.reset_multi_region_zone_configs_for_table\(\): error resolving referenced table ID 1: relation "\[1\]" does not exist
SELECT crdb_internal.reset_multi_region_zone_configs_for_table(1)

subtest reset_multi_region_zone_configs_database

statement ok
CREATE DATABASE "rebuild_zc_db" primary region "ca-central-1" regions "ap-southeast-2", "us-east-1";

statement ok
USE "rebuild_zc_db"

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "rebuild_zc_db"
----
DATABASE rebuild_zc_db  ALTER DATABASE rebuild_zc_db CONFIGURE ZONE USING
                          range_min_bytes = 134217728,
                          range_max_bytes = 536870912,
                          gc.ttlseconds = 14400,
                          num_replicas = 5,
                          num_voters = 3,
                          constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                          voter_constraints = '[+region=ca-central-1]',
                          lease_preferences = '[[+region=ca-central-1]]'


statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "rebuild_zc_db" CONFIGURE ZONE USING num_replicas = 10;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "rebuild_zc_db"
----
DATABASE rebuild_zc_db  ALTER DATABASE rebuild_zc_db CONFIGURE ZONE USING
                          range_min_bytes = 134217728,
                          range_max_bytes = 536870912,
                          gc.ttlseconds = 14400,
                          num_replicas = 10,
                          num_voters = 3,
                          constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                          voter_constraints = '[+region=ca-central-1]',
                          lease_preferences = '[[+region=ca-central-1]]'

let $rebuild_db_id
select id from crdb_internal.databases where name = 'rebuild_zc_db'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_database($rebuild_db_id)

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "rebuild_zc_db"
----
DATABASE rebuild_zc_db  ALTER DATABASE rebuild_zc_db CONFIGURE ZONE USING
                          range_min_bytes = 134217728,
                          range_max_bytes = 536870912,
                          gc.ttlseconds = 14400,
                          num_replicas = 5,
                          num_voters = 3,
                          constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                          voter_constraints = '[+region=ca-central-1]',
                          lease_preferences = '[[+region=ca-central-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

statement ok
SET override_multi_region_zone_config = true;

statement ok
ALTER DATABASE "rebuild_zc_db" CONFIGURE ZONE DISCARD;

statement ok
SET override_multi_region_zone_config = false

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "rebuild_zc_db"
----
RANGE default  ALTER RANGE default CONFIGURE ZONE USING
                 range_min_bytes = 134217728,
                 range_max_bytes = 536870912,
                 gc.ttlseconds = 14400,
                 num_replicas = 3,
                 constraints = '[]',
                 lease_preferences = '[]'

statement ok
SELECT crdb_internal.reset_multi_region_zone_configs_for_database($rebuild_db_id)

query TT
SHOW ZONE CONFIGURATION FOR DATABASE "rebuild_zc_db"
----
DATABASE rebuild_zc_db  ALTER DATABASE rebuild_zc_db CONFIGURE ZONE USING
                          range_min_bytes = 134217728,
                          range_max_bytes = 536870912,
                          gc.ttlseconds = 14400,
                          num_replicas = 5,
                          num_voters = 3,
                          constraints = '{+region=ap-southeast-2: 1, +region=ca-central-1: 1, +region=us-east-1: 1}',
                          voter_constraints = '[+region=ca-central-1]',
                          lease_preferences = '[[+region=ca-central-1]]'

statement ok
SELECT crdb_internal.validate_multi_region_zone_configs()

let $descriptor_table_id
SELECT table_id FROM crdb_internal.tables WHERE schema_name = 'public' AND name = 'descriptor'

# Validate that builtin errors if called on a table id
query error pq: crdb_internal\.reset_multi_region_zone_configs_for_database\(\): database "\[3\]" does not exist
SELECT crdb_internal.reset_multi_region_zone_configs_for_database($descriptor_table_id)

user testuser

query error user testuser must be owner of rebuild_zc_db or have CREATE privilege on database rebuild_zc_db
SELECT crdb_internal.reset_multi_region_zone_configs_for_database($rebuild_db_id)

query error user testuser must be owner of tbl11 or have CREATE privilege on relation tbl11
SELECT crdb_internal.reset_multi_region_zone_configs_for_table($tbl11_id)

query error user testuser must be owner of test or have CREATE privilege on database test
SELECT crdb_internal.validate_multi_region_zone_configs()

subtest drop_all_backrefs

user root

statement ok
CREATE DATABASE db1 PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2", "us-east-1" SURVIVE REGION FAILURE

statement ok
CREATE TABLE db1.t1_with_index_zone(x INT, j INT REFERENCES db1.t1_with_index_zone(x), PRIMARY KEY(x)) LOCALITY REGIONAL BY ROW

statement ok
ALTER PARTITION "ap-southeast-2" OF INDEX db1.t1_with_index_zone@t1_with_index_zone_pkey CONFIGURE ZONE USING gc.ttlseconds = 32000;

statement ok
ALTER PARTITION "ca-central-1" OF INDEX db1.t1_with_index_zone@t1_with_index_zone_pkey CONFIGURE ZONE USING gc.ttlseconds = 34000;

statement ok
ALTER PARTITION "us-east-1" OF INDEX db1.t1_with_index_zone@t1_with_index_zone_pkey CONFIGURE ZONE USING gc.ttlseconds = 38000;

statement ok
DROP TABLE db1.t1_with_index_zone CASCADE;

subtest end


subtest invalid_zone_config

statement ok
CREATE DATABASE db_invalid_zone_config PRIMARY REGION "ca-central-1" REGIONS "ap-southeast-2"

let $database_id
select id from system.namespace WHERE name='db_invalid_zone_config'

statement ok
UPSERT INTO system.zones (id, config)
VALUES
	(
		$database_id,
		(
			SELECT
				crdb_internal.json_to_pb(
					'cockroach.config.zonepb.ZoneConfig',
					jsonb_set(
						crdb_internal.pb_to_json(
							'cockroach.config.zonepb.ZoneConfig',
							config
						),
						ARRAY['rangeMinBytes'],
						'-1'::JSONB
					)
				)
			FROM
				system.zones
			WHERE
				id = $database_id
		)
	);

statement error RangeMinBytes -1 less than minimum allowed 0
ALTER DATABASE db_invalid_zone_config ADD REGION 'us-east-1'

statement error RangeMinBytes -1 less than minimum allowed 0
ALTER DATABASE db_invalid_zone_config DROP REGION 'ap-southeast-2'

statement error RangeMinBytes -1 less than minimum allowed 0
ALTER DATABASE db_invalid_zone_config SET SECONDARY REGION 'us-east-1'

subtest end
