mirror of https://github.com/citusdata/citus.git
handle mat views and extension owned tables/views
parent
ec700644ff
commit
859547f290
|
@ -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;
|
||||
|
|
|
@ -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}",{})
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue