From 859547f290ff91205e3c78e2dc0182321bf9b353 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Thu, 5 May 2022 13:09:27 +0200 Subject: [PATCH] handle mat views and extension owned tables/views --- src/backend/distributed/commands/extension.c | 26 +++++++++++++-- .../expected/upgrade_post_11_after.out | 2 +- .../expected/upgrade_post_11_before.out | 33 ++++++++++++++++++- .../regress/sql/upgrade_post_11_after.sql | 2 +- .../regress/sql/upgrade_post_11_before.sql | 16 +++++++++ 5 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/backend/distributed/commands/extension.c b/src/backend/distributed/commands/extension.c index 52a93e076..11d69e7a7 100644 --- a/src/backend/distributed/commands/extension.c +++ b/src/backend/distributed/commands/extension.c @@ -510,6 +510,15 @@ MarkExistingObjectDependenciesDistributedIfSupported() Oid citusTableId = InvalidOid; foreach_oid(citusTableId, citusTableIdList) { + if (!IsTableOwnedByExtension(citusTableId)) + { + /* + * We let extensions handle its objects by themselves. This includes + * the dependencies that such table has. + */ + continue; + } + ObjectAddress tableAddress = { 0 }; ObjectAddressSet(tableAddress, RelationRelationId, citusTableId); @@ -527,7 +536,6 @@ MarkExistingObjectDependenciesDistributedIfSupported() list_concat(resultingObjectAddresses, distributableDependencyObjectAddresses); - /* * We mark tables distributed immediately because we also need to mark * views as distributed. We check whether the views that depend on @@ -549,10 +557,24 @@ MarkExistingObjectDependenciesDistributedIfSupported() Oid viewOid = InvalidOid; foreach_oid(viewOid, viewList) { + if (get_rel_relkind(viewOid) == RELKIND_MATVIEW) + { + /* + * We currently do not support distributed materialized + * views, so skip it and its dependencies. + */ + continue; + } + ObjectAddress viewAddress = { 0 }; ObjectAddressSet(viewAddress, RelationRelationId, viewOid); - if (DeferErrorIfHasUnsupportedDependency(&viewAddress) != NULL) + if (IsTableOwnedByExtension(viewOid)) + { + /* we let extensions handle its objects by themselves */ + continue; + } + else if (DeferErrorIfHasUnsupportedDependency(&viewAddress) != NULL) { /* this view has unsupported dependencies, skip */ continue; diff --git a/src/test/regress/expected/upgrade_post_11_after.out b/src/test/regress/expected/upgrade_post_11_after.out index 638fa322d..27f9eaaf9 100644 --- a/src/test/regress/expected/upgrade_post_11_after.out +++ b/src/test/regress/expected/upgrade_post_11_after.out @@ -10,7 +10,7 @@ NOTICE: Preparing to sync the metadata to all nodes (1 row) -- tables, views and their dependencies become objects with Citus 11+ -SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM pg_catalog.pg_dist_object WHERE objid IN ('post_11_upgrade'::regnamespace, 'post_11_upgrade.part_table'::regclass, 'post_11_upgrade.sensors'::regclass, 'post_11_upgrade.func_in_transaction_def'::regproc, 'post_11_upgrade.partial_index_test_config'::regconfig, 'post_11_upgrade.my_type'::regtype, 'post_11_upgrade.employees'::regclass, 'post_11_upgrade.view_for_upgrade_test'::regclass, 'post_11_upgrade.my_type_for_view'::regtype, 'post_11_upgrade.view_for_upgrade_test_my_type'::regclass, 'post_11_upgrade.non_dist_table_for_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view_local_join'::regclass, 'post_11_upgrade.non_dist_upgrade_multiple_dist_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view_2'::regclass, 'post_11_upgrade.reporting_line'::regclass, 'post_11_upgrade.v_test_1'::regclass, 'post_11_upgrade.v_test_2'::regclass) ORDER BY 1; +SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM pg_catalog.pg_dist_object WHERE objid IN ('post_11_upgrade'::regnamespace, 'post_11_upgrade.part_table'::regclass, 'post_11_upgrade.sensors'::regclass, 'post_11_upgrade.func_in_transaction_def'::regproc, 'post_11_upgrade.partial_index_test_config'::regconfig, 'post_11_upgrade.my_type'::regtype, 'post_11_upgrade.employees'::regclass, 'post_11_upgrade.view_for_upgrade_test'::regclass, 'post_11_upgrade.my_type_for_view'::regtype, 'post_11_upgrade.view_for_upgrade_test_my_type'::regclass, 'post_11_upgrade.non_dist_table_for_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view_local_join'::regclass, 'post_11_upgrade.non_dist_upgrade_multiple_dist_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view_2'::regclass, 'post_11_upgrade.reporting_line'::regclass, 'post_11_upgrade.v_test_1'::regclass, 'post_11_upgrade.v_test_2'::regclass, 'post_11_upgrade.owned_by_extension_table'::regclass, 'post_11_upgrade.materialized_view'::regclass, 'post_11_upgrade.owned_by_extension_view'::regclass) ORDER BY 1; pg_identify_object_as_address --------------------------------------------------------------------- (function,"{post_11_upgrade,func_in_transaction_def}",{}) diff --git a/src/test/regress/expected/upgrade_post_11_before.out b/src/test/regress/expected/upgrade_post_11_before.out index 1836baec4..66517af1f 100644 --- a/src/test/regress/expected/upgrade_post_11_before.out +++ b/src/test/regress/expected/upgrade_post_11_before.out @@ -122,6 +122,34 @@ SELECT create_distributed_table('employees', 'employee_id'); (1 row) +-- table for owned_by_extension +-- note that tables owned by extension are +-- not added to the pg_dist_object, and assumed +-- to exists on all nodes via the extension +CREATE TABLE owned_by_extension_table (employee_id int, manager_id int, full_name text); +ALTER EXTENSION plpgsql ADD TABLE post_11_upgrade.owned_by_extension_table; +NOTICE: Citus does not propagate adding/dropping member objects +HINT: You can add/drop the member objects on the workers as well. +SELECT create_distributed_table('owned_by_extension_table', 'employee_id'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +SELECT run_command_on_workers($$CREATE TABLE post_11_upgrade.owned_by_extension_table (employee_id int, manager_id int, full_name text);$$); + run_command_on_workers +--------------------------------------------------------------------- + (localhost,57636,t,"CREATE TABLE") + (localhost,57637,t,"CREATE TABLE") +(2 rows) + +SELECT run_command_on_workers($$ALTER EXTENSION plpgsql ADD TABLE post_11_upgrade.owned_by_extension_table;$$); + run_command_on_workers +--------------------------------------------------------------------- + (localhost,57636,t,"ALTER EXTENSION") + (localhost,57637,t,"ALTER EXTENSION") +(2 rows) + SET citus.enable_ddl_propagation TO off; CREATE TEXT SEARCH CONFIGURATION post_11_upgrade.partial_index_test_config ( parser = default ); SELECT 1 FROM run_command_on_workers($$CREATE TEXT SEARCH CONFIGURATION post_11_upgrade.partial_index_test_config ( parser = default );$$); @@ -186,6 +214,10 @@ CREATE VIEW post_11_upgrade.non_dist_upgrade_multiple_dist_view AS SELECT coloca CREATE VIEW post_11_upgrade.non_dist_upgrade_ref_view AS SELECT * FROM reference_table; -- a view selecting from another (distributed) view should also be distributed CREATE VIEW post_11_upgrade.non_dist_upgrade_ref_view_2 AS SELECT * FROM non_dist_upgrade_ref_view; +-- materialized views never becomes distributed +CREATE MATERIALIZED VIEW post_11_upgrade.materialized_view AS SELECT * FROM reference_table; +CREATE VIEW post_11_upgrade.owned_by_extension_view AS SELECT * FROM reference_table; +ALTER EXTENSION plpgsql ADD VIEW post_11_upgrade.owned_by_extension_view; -- temporary views should not be marked as distributed CREATE VIEW pg_temp.temp_view_1 AS SELECT * FROM reference_table; CREATE temporary VIEW temp_view_2 AS SELECT * FROM reference_table; @@ -240,4 +272,3 @@ SELECT create_distributed_table('test_propagate_collate', 'id'); --------------------------------------------------------------------- (1 row) - diff --git a/src/test/regress/sql/upgrade_post_11_after.sql b/src/test/regress/sql/upgrade_post_11_after.sql index b2f3f0712..67a27bcfb 100644 --- a/src/test/regress/sql/upgrade_post_11_after.sql +++ b/src/test/regress/sql/upgrade_post_11_after.sql @@ -5,7 +5,7 @@ UPDATE pg_dist_node_metadata SET metadata=jsonb_set(metadata, '{partitioned_citu SELECT citus_finalize_upgrade_to_citus11(enforce_version_check:=false); -- tables, views and their dependencies become objects with Citus 11+ -SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM pg_catalog.pg_dist_object WHERE objid IN ('post_11_upgrade'::regnamespace, 'post_11_upgrade.part_table'::regclass, 'post_11_upgrade.sensors'::regclass, 'post_11_upgrade.func_in_transaction_def'::regproc, 'post_11_upgrade.partial_index_test_config'::regconfig, 'post_11_upgrade.my_type'::regtype, 'post_11_upgrade.employees'::regclass, 'post_11_upgrade.view_for_upgrade_test'::regclass, 'post_11_upgrade.my_type_for_view'::regtype, 'post_11_upgrade.view_for_upgrade_test_my_type'::regclass, 'post_11_upgrade.non_dist_table_for_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view_local_join'::regclass, 'post_11_upgrade.non_dist_upgrade_multiple_dist_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view_2'::regclass, 'post_11_upgrade.reporting_line'::regclass, 'post_11_upgrade.v_test_1'::regclass, 'post_11_upgrade.v_test_2'::regclass) ORDER BY 1; +SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM pg_catalog.pg_dist_object WHERE objid IN ('post_11_upgrade'::regnamespace, 'post_11_upgrade.part_table'::regclass, 'post_11_upgrade.sensors'::regclass, 'post_11_upgrade.func_in_transaction_def'::regproc, 'post_11_upgrade.partial_index_test_config'::regconfig, 'post_11_upgrade.my_type'::regtype, 'post_11_upgrade.employees'::regclass, 'post_11_upgrade.view_for_upgrade_test'::regclass, 'post_11_upgrade.my_type_for_view'::regtype, 'post_11_upgrade.view_for_upgrade_test_my_type'::regclass, 'post_11_upgrade.non_dist_table_for_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view'::regclass, 'post_11_upgrade.non_dist_upgrade_test_view_local_join'::regclass, 'post_11_upgrade.non_dist_upgrade_multiple_dist_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view_2'::regclass, 'post_11_upgrade.reporting_line'::regclass, 'post_11_upgrade.v_test_1'::regclass, 'post_11_upgrade.v_test_2'::regclass, 'post_11_upgrade.owned_by_extension_table'::regclass, 'post_11_upgrade.materialized_view'::regclass, 'post_11_upgrade.owned_by_extension_view'::regclass) ORDER BY 1; -- on all nodes SELECT run_command_on_workers($$SELECT array_agg(pg_identify_object_as_address(classid, objid, objsubid)) FROM pg_catalog.pg_dist_object WHERE objid IN ('post_11_upgrade'::regnamespace, 'post_11_upgrade.part_table'::regclass, 'post_11_upgrade.sensors'::regclass, 'post_11_upgrade.func_in_transaction_def'::regproc, 'post_11_upgrade.partial_index_test_config'::regconfig, 'post_11_upgrade.my_type'::regtype, 'post_11_upgrade.view_for_upgrade_test'::regclass, 'post_11_upgrade.view_for_upgrade_test_my_type'::regclass, 'post_11_upgrade.non_dist_upgrade_ref_view_2'::regclass, 'post_11_upgrade.reporting_line'::regclass) ORDER BY 1;$$) ORDER BY 1; diff --git a/src/test/regress/sql/upgrade_post_11_before.sql b/src/test/regress/sql/upgrade_post_11_before.sql index 0f1c1d499..6ad06e40d 100644 --- a/src/test/regress/sql/upgrade_post_11_before.sql +++ b/src/test/regress/sql/upgrade_post_11_before.sql @@ -108,6 +108,16 @@ INSERT INTO sensors SELECT i, '2020-01-05', '{}' FROM generate_series(0,1000)i; CREATE TABLE employees (employee_id int, manager_id int, full_name text); SELECT create_distributed_table('employees', 'employee_id'); +-- table for owned_by_extension +-- note that tables owned by extension are +-- not added to the pg_dist_object, and assumed +-- to exists on all nodes via the extension +CREATE TABLE owned_by_extension_table (employee_id int, manager_id int, full_name text); +ALTER EXTENSION plpgsql ADD TABLE post_11_upgrade.owned_by_extension_table; +SELECT create_distributed_table('owned_by_extension_table', 'employee_id'); +SELECT run_command_on_workers($$CREATE TABLE post_11_upgrade.owned_by_extension_table (employee_id int, manager_id int, full_name text);$$); +SELECT run_command_on_workers($$ALTER EXTENSION plpgsql ADD TABLE post_11_upgrade.owned_by_extension_table;$$); + SET citus.enable_ddl_propagation TO off; CREATE TEXT SEARCH CONFIGURATION post_11_upgrade.partial_index_test_config ( parser = default ); SELECT 1 FROM run_command_on_workers($$CREATE TEXT SEARCH CONFIGURATION post_11_upgrade.partial_index_test_config ( parser = default );$$); @@ -166,6 +176,12 @@ CREATE VIEW post_11_upgrade.non_dist_upgrade_ref_view AS SELECT * FROM reference -- a view selecting from another (distributed) view should also be distributed CREATE VIEW post_11_upgrade.non_dist_upgrade_ref_view_2 AS SELECT * FROM non_dist_upgrade_ref_view; +-- materialized views never becomes distributed +CREATE MATERIALIZED VIEW post_11_upgrade.materialized_view AS SELECT * FROM reference_table; + +CREATE VIEW post_11_upgrade.owned_by_extension_view AS SELECT * FROM reference_table; +ALTER EXTENSION plpgsql ADD VIEW post_11_upgrade.owned_by_extension_view; + -- temporary views should not be marked as distributed CREATE VIEW pg_temp.temp_view_1 AS SELECT * FROM reference_table; CREATE temporary VIEW temp_view_2 AS SELECT * FROM reference_table;