mirror of https://github.com/citusdata/citus.git
146 lines
5.6 KiB
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;
|