diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index f15017f4e..d2a880b41 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -2445,12 +2445,16 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement) case AT_ReplicaIdentity: case AT_ValidateConstraint: case AT_DropConstraint: /* we do the check for invalidation in AlterTableDropsForeignKey */ +#if PG_VERSION_NUM >= PG_VERSION_14 + case AT_SetCompression: +#endif { /* * We will not perform any special check for: * ALTER TABLE .. ALTER COLUMN .. SET NOT NULL * ALTER TABLE .. REPLICA IDENTITY .. * ALTER TABLE .. VALIDATE CONSTRAINT .. + * ALTER TABLE .. ALTER COLUMN .. SET COMPRESSION .. */ break; } diff --git a/src/test/regress/expected/pg14.out b/src/test/regress/expected/pg14.out index ea4cd716d..a59179991 100644 --- a/src/test/regress/expected/pg14.out +++ b/src/test/regress/expected/pg14.out @@ -219,13 +219,54 @@ CALL citus_cleanup_orphaned_shards(); NOTICE: cleaned up 1 orphaned shards SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 -)$$) ORDER BY length(result); +)$$); column_compression --------------------------------------------------------------------- {"a p","a p","b ","b "} {"a p","a p","b ","b "} (2 rows) +-- test propagation of ALTER TABLE .. ALTER COLUMN .. SET COMPRESSION .. +ALTER TABLE col_compression ALTER COLUMN b SET COMPRESSION pglz; +ALTER TABLE col_compression ALTER COLUMN a SET COMPRESSION default; +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 +)$$); + column_compression +--------------------------------------------------------------------- + {"a ","a ","b p","b p"} + {"a ","a ","b p","b p"} +(2 rows) + +-- test propagation of ALTER TABLE .. ADD COLUMN .. COMPRESSION .. +ALTER TABLE col_compression ADD COLUMN c TEXT COMPRESSION pglz; +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 +)$$); + column_compression +--------------------------------------------------------------------- + {"a ","a ","b p","b p","c p","c p"} + {"a ","a ","b p","b p","c p","c p"} +(2 rows) + +-- test attaching to a partitioned table with column compression +CREATE TABLE col_comp_par (a TEXT COMPRESSION pglz, b TEXT) PARTITION BY RANGE (a); +SELECT create_distributed_table('col_comp_par', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE TABLE col_comp_par_1 PARTITION OF col_comp_par FOR VALUES FROM ('abc') TO ('def'); +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_comp\_par\_1\_%' AND attnum > 0 ORDER BY 1 +)$$); + column_compression +--------------------------------------------------------------------- + {"a p","b "} + {"a p","b "} +(2 rows) + RESET citus.multi_shard_modify_mode; -- test procedure OUT parameters with procedure pushdown CREATE TABLE test_proc_table (a int); diff --git a/src/test/regress/sql/pg14.sql b/src/test/regress/sql/pg14.sql index 97ff71e43..967314206 100644 --- a/src/test/regress/sql/pg14.sql +++ b/src/test/regress/sql/pg14.sql @@ -77,7 +77,30 @@ SELECT rebalance_table_shards('col_compression', rebalance_strategy := 'by_shard CALL citus_cleanup_orphaned_shards(); SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 -)$$) ORDER BY length(result); +)$$); + +-- test propagation of ALTER TABLE .. ALTER COLUMN .. SET COMPRESSION .. +ALTER TABLE col_compression ALTER COLUMN b SET COMPRESSION pglz; +ALTER TABLE col_compression ALTER COLUMN a SET COMPRESSION default; +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 +)$$); + +-- test propagation of ALTER TABLE .. ADD COLUMN .. COMPRESSION .. +ALTER TABLE col_compression ADD COLUMN c TEXT COMPRESSION pglz; +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_compression%' AND attnum > 0 ORDER BY 1 +)$$); + +-- test attaching to a partitioned table with column compression +CREATE TABLE col_comp_par (a TEXT COMPRESSION pglz, b TEXT) PARTITION BY RANGE (a); +SELECT create_distributed_table('col_comp_par', 'a'); + +CREATE TABLE col_comp_par_1 PARTITION OF col_comp_par FOR VALUES FROM ('abc') TO ('def'); + +SELECT result AS column_compression FROM run_command_on_workers($$SELECT ARRAY( +SELECT attname || ' ' || attcompression FROM pg_attribute WHERE attrelid::regclass::text LIKE 'pg14.col\_comp\_par\_1\_%' AND attnum > 0 ORDER BY 1 +)$$); RESET citus.multi_shard_modify_mode;