citus/src/test/regress/sql/disable_object_propagation.sql

83 lines
3.4 KiB
PL/PgSQL

SET citus.next_shard_id TO 20030000;
SET citus.enable_metadata_sync TO false; -- all tests here verify old behaviour without distributing types,functions,etc automatically
CREATE USER typeowner_for_disabled_object_propagation_guc;
CREATE SCHEMA disabled_object_propagation;
CREATE SCHEMA disabled_object_propagation2;
SET search_path TO disabled_object_propagation;
-- verify the table gets created, which requires schema distribution to still work
CREATE TABLE t1 (a int PRIMARY KEY , b int);
SELECT create_distributed_table('t1','a');
-- verify types are not created, preventing distributed tables to be created unless created manually on the workers
CREATE TYPE tt1 AS (a int , b int);
CREATE TABLE t2 (a int PRIMARY KEY, b tt1);
SELECT create_distributed_table('t2', 'a');
SELECT 1 FROM run_command_on_workers($$
BEGIN;
SET LOCAL citus.enable_ddl_propagation TO off;
CREATE TYPE disabled_object_propagation.tt1 AS (a int , b int);
COMMIT;
$$);
SELECT create_distributed_table('t2', 'a');
-- verify enum types are not created, preventing distributed tables to be created unless created manually on the workers
CREATE TYPE tt2 AS ENUM ('a', 'b');
CREATE TABLE t3 (a int PRIMARY KEY, b tt2);
SELECT create_distributed_table('t3', 'a');
SELECT 1 FROM run_command_on_workers($$
BEGIN;
SET LOCAL citus.enable_ddl_propagation TO off;
CREATE TYPE disabled_object_propagation.tt2 AS ENUM ('a', 'b');
COMMIT;
$$);
SELECT create_distributed_table('t3', 'a');
-- verify ALTER TYPE statements are not propagated for types, even though they are marked distributed
BEGIN;
-- object propagation is turned off after xact finished, type is already marked distributed by then
SET LOCAL citus.enable_metadata_sync TO on;
CREATE TYPE tt3 AS (a int, b int);
CREATE TABLE t4 (a int PRIMARY KEY, b tt3);
SELECT create_distributed_table('t4','a');
DROP TABLE t4; -- as long as the table is using the type some operations are hard to force
COMMIT;
-- verify the type is distributed
SELECT count(*) FROM pg_catalog.pg_dist_object WHERE objid = 'disabled_object_propagation.tt3'::regtype::oid;
ALTER TYPE tt3 ADD ATTRIBUTE c int, DROP ATTRIBUTE b, ALTER ATTRIBUTE a SET DATA TYPE text COLLATE "POSIX";
ALTER TYPE tt3 OWNER TO typeowner_for_disabled_object_propagation_guc;
ALTER TYPE tt3 RENAME ATTRIBUTE c TO d;
ALTER TYPE tt3 RENAME TO tt4;
ALTER TYPE tt4 SET SCHEMA disabled_object_propagation2;
DROP TYPE disabled_object_propagation2.tt4;
-- verify no changes have been made to the type on the remote servers. tt3 is used as a name since the rename should not have been propagated
SELECT run_command_on_workers($$
SELECT row(nspname, typname, usename)
FROM pg_type
JOIN pg_user ON (typowner = usesysid)
JOIN pg_namespace ON (pg_namespace.oid = typnamespace)
WHERE typname = 'tt3';
$$);
SELECT run_command_on_workers($$
SELECT row(pg_type.typname, string_agg(attname || ' ' || atttype.typname, ', ' ORDER BY attnum))
FROM pg_attribute
JOIN pg_class ON (attrelid = pg_class.oid)
JOIN pg_type ON (pg_class.reltype = pg_type.oid)
JOIN pg_type AS atttype ON (atttypid = atttype.oid)
WHERE pg_type.typname = 'tt3'
GROUP BY pg_type.typname;
$$);
-- suppress any warnings during cleanup
SET client_min_messages TO error;
RESET citus.enable_metadata_sync;
DROP SCHEMA disabled_object_propagation CASCADE;
DROP SCHEMA disabled_object_propagation2 CASCADE;
DROP USER typeowner_for_disabled_object_propagation_guc;