citus/src/test/regress/sql/multi_metadata_sync_domain.sql

146 lines
5.6 KiB
SQL

--
-- MULTI_METADATA_SYNC_DOMAIN
--
-- Test that metadata sync works correctly with DOMAIN types in non-public schemas
--
-- Create the initial cluster setup
SET citus.shard_replication_factor TO 1;
SET citus.next_shard_id TO 9000000;
-- Store current sequence values and calculate restart values
SELECT nextval('pg_catalog.pg_dist_groupid_seq') - 1 AS last_group_id \gset
SELECT nextval('pg_catalog.pg_dist_node_nodeid_seq') - 1 AS last_node_id \gset
-- Remove the second worker node to start with
SELECT citus_remove_node('localhost', :worker_2_port);
-- Test 1: Domain in a non-public schema with special characters
CREATE SCHEMA "prepared statements";
CREATE DOMAIN "prepared statements".test_key AS text CHECK(VALUE ~ '^test-\d$');
CREATE TABLE dist_domain_nonpublic(a "prepared statements".test_key, b int);
SELECT create_distributed_table('dist_domain_nonpublic', 'a');
-- Insert some test data
INSERT INTO dist_domain_nonpublic VALUES ('test-1', 100), ('test-2', 200);
-- Reset sequences to avoid conflicts with other tests
ALTER SEQUENCE pg_catalog.pg_dist_groupid_seq RESTART :last_group_id;
ALTER SEQUENCE pg_catalog.pg_dist_node_nodeid_seq RESTART :last_node_id;
-- Now add the worker back - this is should not fail
-- The metadata sync should now work
SELECT 1 FROM citus_add_node('localhost', :worker_2_port);
-- cleanup before next test
DROP TABLE dist_domain_nonpublic CASCADE;
DROP DOMAIN "prepared statements".test_key CASCADE;
DROP SCHEMA "prepared statements" CASCADE;
SELECT citus_remove_node('localhost', :worker_2_port);
-- Test 2: Domain in public schema
CREATE DOMAIN public.positive_int AS int CHECK(VALUE > 0);
CREATE TABLE dist_domain_public(a positive_int, b text);
SELECT create_distributed_table('dist_domain_public', 'a');
-- Insert some test data
INSERT INTO dist_domain_public VALUES (1, 'one'), (2, 'two');
-- Reset sequences to avoid conflicts with other tests
ALTER SEQUENCE pg_catalog.pg_dist_groupid_seq RESTART :last_group_id;
ALTER SEQUENCE pg_catalog.pg_dist_node_nodeid_seq RESTART :last_node_id;
-- Now add the worker back - this is should not fail
-- The metadata sync should now work
SELECT 1 FROM citus_add_node('localhost', :worker_2_port);
-- cleanup before next test
DROP TABLE dist_domain_public CASCADE;
DROP DOMAIN public.positive_int CASCADE;
SELECT citus_remove_node('localhost', :worker_2_port);
-- Test 3: Domain in a regular schema
CREATE SCHEMA test_schema;
CREATE DOMAIN test_schema.email_address AS text CHECK(VALUE ~ '^[^@]+@[^@]+\.[^@]+$');
CREATE TABLE dist_domain_regular_schema(id int, email test_schema.email_address);
SELECT create_distributed_table('dist_domain_regular_schema', 'id');
-- Insert some test data
INSERT INTO dist_domain_regular_schema VALUES (1, 'user@example.com'), (2, 'admin@test.org');
-- Reset sequences to avoid conflicts with other tests
ALTER SEQUENCE pg_catalog.pg_dist_groupid_seq RESTART :last_group_id;
ALTER SEQUENCE pg_catalog.pg_dist_node_nodeid_seq RESTART :last_node_id;
-- Now add the worker back - this is should not fail
-- The metadata sync should now work
SELECT 1 FROM citus_add_node('localhost', :worker_2_port);
CREATE SCHEMA "prepared statements";
CREATE DOMAIN "prepared statements".test_key AS text CHECK(VALUE ~ '^test-\d$');
CREATE TABLE dist_domain_nonpublic(a "prepared statements".test_key, b int);
SELECT create_distributed_table('dist_domain_nonpublic', 'a');
CREATE DOMAIN public.positive_int AS int CHECK(VALUE > 0);
CREATE TABLE dist_domain_public(a positive_int, b text);
SELECT create_distributed_table('dist_domain_public', 'a');
-- Insert some test data
INSERT INTO dist_domain_public VALUES (11, 'eleven'), (12, 'twelve');
INSERT INTO dist_domain_regular_schema VALUES (11, 'user@example.com'), (12, 'admin@test.org');
INSERT INTO dist_domain_nonpublic VALUES ('test-3', 110), ('test-4', 120);
-- Verify the colocation metadata exists
SELECT shardcount, replicationfactor, distributioncolumntype::regtype
FROM pg_dist_colocation
WHERE distributioncolumntype IN (
'"prepared statements".test_key'::regtype,
'public.positive_int'::regtype,
'test_schema.email_address'::regtype
)
ORDER BY distributioncolumntype::regtype::text;
-- Verify metadata was synced correctly by checking colocation on the worker
\c - - - :worker_2_port
SELECT shardcount, replicationfactor, distributioncolumntype::regtype
FROM pg_dist_colocation
WHERE distributioncolumntype IN (
'"prepared statements".test_key'::regtype,
'public.positive_int'::regtype,
'test_schema.email_address'::regtype
)
ORDER BY distributioncolumntype::regtype::text;
-- Verify the domains exist on the worker
SELECT typname, typnamespace::regnamespace
FROM pg_type
WHERE typname IN ('test_key', 'positive_int', 'email_address')
ORDER BY typname;
-- Back to coordinator for cleanup
\c - - - :master_port
-- Test that queries still work after re-adding the worker
SELECT * FROM dist_domain_nonpublic ORDER BY a;
SELECT * FROM dist_domain_public ORDER BY a;
SELECT * FROM dist_domain_regular_schema ORDER BY id;
-- Test inserts still work
INSERT INTO dist_domain_regular_schema VALUES (1, 'test@domain.com');
INSERT INTO dist_domain_regular_schema VALUES (2, 'info@citusdata.com');
SELECT * FROM dist_domain_nonpublic ORDER BY a;
SELECT * FROM dist_domain_public ORDER BY a;
SELECT * FROM dist_domain_regular_schema ORDER BY id;
-- Cleanup
DROP TABLE dist_domain_nonpublic CASCADE;
DROP TABLE dist_domain_public CASCADE;
DROP TABLE dist_domain_regular_schema CASCADE;
DROP DOMAIN "prepared statements".test_key CASCADE;
DROP DOMAIN public.positive_int CASCADE;
DROP DOMAIN test_schema.email_address CASCADE;
DROP SCHEMA "prepared statements" CASCADE;
DROP SCHEMA test_schema CASCADE;