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

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

statement ok
USE multi_region_test_db

statement ok
CREATE TABLE t_regional (
  pk INT PRIMARY KEY,
  b INT
) LOCALITY REGIONAL BY ROW;

statement error hash sharded indexes cannot include implicit partitioning columns from "PARTITION ALL BY" or "LOCALITY REGIONAL BY ROW"
CREATE INDEX ON t_regional (crdb_region, b) USING HASH;

statement error hash sharded indexes cannot include implicit partitioning columns from "PARTITION ALL BY" or "LOCALITY REGIONAL BY ROW"
CREATE UNIQUE INDEX ON t_regional (crdb_region, b) USING HASH;

statement error hash sharded indexes cannot include implicit partitioning columns from "PARTITION ALL BY" or "LOCALITY REGIONAL BY ROW"
ALTER TABLE t_regional ALTER PRIMARY KEY USING COLUMNS (crdb_region, pk) USING HASH;

statement error hash sharded indexes cannot include implicit partitioning columns from "PARTITION ALL BY" or "LOCALITY REGIONAL BY ROW"
CREATE TABLE t_regional_bad (
  pk INT PRIMARY KEY,
  b INT,
  INDEX (crdb_region, b) USING HASH
) LOCALITY REGIONAL BY ROW;

statement error hash sharded indexes cannot include implicit partitioning columns from "PARTITION ALL BY" or "LOCALITY REGIONAL BY ROW"
CREATE TABLE t_regional_bad (
  pk INT,
  b INT,
  PRIMARY KEY (crdb_region, pk) USING HASH
) LOCALITY REGIONAL BY ROW;

statement ok
CREATE TABLE t_to_be_hashed (
  pk INT PRIMARY KEY,
  b INT,
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_to_be_hashed];
----
CREATE TABLE public.t_to_be_hashed (
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  CONSTRAINT t_to_be_hashed_pkey PRIMARY KEY (pk ASC),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE INDEX ON t_to_be_hashed (b) USING HASH;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_to_be_hashed];
----
CREATE TABLE public.t_to_be_hashed (
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(b))), 16:::INT8)) VIRTUAL,
  CONSTRAINT t_to_be_hashed_pkey PRIMARY KEY (pk ASC),
  INDEX t_to_be_hashed_b_idx (b ASC) USING HASH WITH (bucket_count=16),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE UNIQUE INDEX ON t_to_be_hashed (b) USING HASH;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_to_be_hashed];
----
CREATE TABLE public.t_to_be_hashed (
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(b))), 16:::INT8)) VIRTUAL,
  CONSTRAINT t_to_be_hashed_pkey PRIMARY KEY (pk ASC),
  INDEX t_to_be_hashed_b_idx (b ASC) USING HASH WITH (bucket_count=16),
  UNIQUE INDEX t_to_be_hashed_b_key (b ASC) USING HASH WITH (bucket_count=16),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

statement ok
ALTER TABLE t_to_be_hashed ALTER PRIMARY KEY USING COLUMNS (pk) USING HASH;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_to_be_hashed];
----
CREATE TABLE public.t_to_be_hashed (
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(b))), 16:::INT8)) VIRTUAL,
  crdb_internal_pk_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(pk))), 16:::INT8)) VIRTUAL,
  CONSTRAINT t_to_be_hashed_pkey PRIMARY KEY (pk ASC) USING HASH WITH (bucket_count=16),
  INDEX t_to_be_hashed_b_idx (b ASC) USING HASH WITH (bucket_count=16),
  UNIQUE INDEX t_to_be_hashed_b_key (b ASC) USING HASH WITH (bucket_count=16),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE t_regional_pk_hashed_1 (
  pk INT PRIMARY KEY USING HASH,
  b INT,
  INDEX (b) USING HASH,
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_regional_pk_hashed_1];
----
CREATE TABLE public.t_regional_pk_hashed_1 (
  crdb_internal_pk_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(pk))), 16:::INT8)) VIRTUAL,
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(b))), 16:::INT8)) VIRTUAL,
  CONSTRAINT t_regional_pk_hashed_1_pkey PRIMARY KEY (pk ASC) USING HASH WITH (bucket_count=16),
  INDEX t_regional_pk_hashed_1_b_idx (b ASC) USING HASH WITH (bucket_count=16),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE t_regional_pk_hashed_2 (
  pk INT,
  b INT,
  PRIMARY KEY (pk) USING HASH,
  INDEX (b) USING HASH,
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t_regional_pk_hashed_2];
----
CREATE TABLE public.t_regional_pk_hashed_2 (
  pk INT8 NOT NULL,
  b INT8 NULL,
  crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
  crdb_internal_pk_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(pk))), 16:::INT8)) VIRTUAL,
  crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(md5(crdb_internal.datums_to_bytes(b))), 16:::INT8)) VIRTUAL,
  CONSTRAINT t_regional_pk_hashed_2_pkey PRIMARY KEY (pk ASC) USING HASH WITH (bucket_count=16),
  INDEX t_regional_pk_hashed_2_b_idx (b ASC) USING HASH WITH (bucket_count=16),
  FAMILY fam_0_b_pk_crdb_region (b, pk, crdb_region)
) LOCALITY REGIONAL BY ROW

# Permit foreign key constraint on full primary index of RBR table excluding
# hash column (See #74244).
statement ok
CREATE TABLE users (
    id         UUID   NOT NULL DEFAULT gen_random_uuid(),
    username   STRING NOT NULL,
    PRIMARY KEY (id) USING HASH
) LOCALITY REGIONAL BY ROW

statement error virtual column "crdb_internal_user_id_shard_16" cannot reference a foreign key
CREATE TABLE user_settings (
    id      UUID   PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID   NOT NULL,
    value   STRING NOT NULL,
    INDEX (user_id) USING HASH,
    FOREIGN KEY (crdb_internal_user_id_shard_16, user_id, crdb_region) REFERENCES users (crdb_internal_id_shard_16, id, crdb_region) ON DELETE CASCADE ON UPDATE CASCADE
) LOCALITY REGIONAL BY ROW

statement ok
CREATE TABLE user_settings (
    id      UUID   PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID   NOT NULL,
    value   STRING NOT NULL,
    INDEX (user_id) USING HASH,
    FOREIGN KEY (user_id, crdb_region) REFERENCES users (id, crdb_region) ON DELETE CASCADE ON UPDATE CASCADE
) LOCALITY REGIONAL BY ROW

statement error virtual column "crdb_internal_user_id_shard_16" cannot reference a foreign key
ALTER TABLE user_settings ADD FOREIGN KEY (crdb_internal_user_id_shard_16, user_id, crdb_region)
  REFERENCES users (crdb_internal_id_shard_16, id, crdb_region) ON DELETE CASCADE ON UPDATE CASCADE

statement ok
ALTER TABLE user_settings ADD FOREIGN KEY (user_id, crdb_region)
  REFERENCES users (id, crdb_region) ON DELETE CASCADE ON UPDATE CASCADE
