-- run this test only when old citus version is earlier than 11.0
\set upgrade_test_old_citus_version `echo "$CITUS_OLD_VERSION"`
SELECT substring(:'upgrade_test_old_citus_version', 'v(\d+)\.\d+\.\d+')::int < 11
AS upgrade_test_old_citus_version_lt_11_0;
 upgrade_test_old_citus_version_lt_11_0
---------------------------------------------------------------------
 t
(1 row)

\gset
\if :upgrade_test_old_citus_version_lt_11_0
\else
\q
\endif
SET search_path = post_11_upgrade;
-- 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, 'post_11_upgrade.owned_by_extension_table'::regclass, 'post_11_upgrade.materialized_view'::regclass, 'post_11_upgrade.owned_by_extension_view'::regclass, 'post_11_upgrade.local_type'::regtype, 'post_11_upgrade.non_dist_dist_table_for_view'::regclass, 'post_11_upgrade.depends_on_nothing_1'::regclass, 'post_11_upgrade.depends_on_nothing_2'::regclass, 'post_11_upgrade.depends_on_pg'::regclass, 'post_11_upgrade.depends_on_citus'::regclass, 'post_11_upgrade.depends_on_seq'::regclass, 'post_11_upgrade.depends_on_seq_and_no_support'::regclass) ORDER BY 1;
                         pg_identify_object_as_address
---------------------------------------------------------------------
 (function,"{post_11_upgrade,func_in_transaction_def}",{})
 (schema,{post_11_upgrade},{})
 (table,"{post_11_upgrade,employees}",{})
 (table,"{post_11_upgrade,part_table}",{})
 (table,"{post_11_upgrade,sensors}",{})
 ("text search configuration","{post_11_upgrade,partial_index_test_config}",{})
 (type,{post_11_upgrade.my_type},{})
 (type,{post_11_upgrade.my_type_for_view},{})
 (view,"{post_11_upgrade,depends_on_citus}",{})
 (view,"{post_11_upgrade,depends_on_nothing_1}",{})
 (view,"{post_11_upgrade,depends_on_nothing_2}",{})
 (view,"{post_11_upgrade,depends_on_pg}",{})
 (view,"{post_11_upgrade,depends_on_seq}",{})
 (view,"{post_11_upgrade,non_dist_upgrade_multiple_dist_view}",{})
 (view,"{post_11_upgrade,non_dist_upgrade_ref_view}",{})
 (view,"{post_11_upgrade,non_dist_upgrade_ref_view_2}",{})
 (view,"{post_11_upgrade,reporting_line}",{})
 (view,"{post_11_upgrade,view_for_upgrade_test}",{})
 (view,"{post_11_upgrade,view_for_upgrade_test_my_type}",{})
(19 rows)

-- on all nodes
SELECT run_command_on_workers($$SELECT array_agg(worker_object) FROM (SELECT pg_identify_object_as_address(classid, objid, objsubid) worker_object 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) worker_objects;$$) ORDER BY 1;
                                                                                                                                                                                                                                                                                                          run_command_on_workers
---------------------------------------------------------------------
 (localhost,57636,t,"{""(function,\\""{post_11_upgrade,func_in_transaction_def}\\"",{})"",""(schema,{post_11_upgrade},{})"",""(table,\\""{post_11_upgrade,part_table}\\"",{})"",""(table,\\""{post_11_upgrade,sensors}\\"",{})"",""(\\""text search configuration\\"",\\""{post_11_upgrade,partial_index_test_config}\\"",{})"",""(type,{post_11_upgrade.my_type},{})"",""(view,\\""{post_11_upgrade,non_dist_upgrade_ref_view_2}\\"",{})"",""(view,\\""{post_11_upgrade,reporting_line}\\"",{})"",""(view,\\""{post_11_upgrade,view_for_upgrade_test}\\"",{})"",""(view,\\""{post_11_upgrade,view_for_upgrade_test_my_type}\\"",{})""}")
 (localhost,57637,t,"{""(function,\\""{post_11_upgrade,func_in_transaction_def}\\"",{})"",""(schema,{post_11_upgrade},{})"",""(table,\\""{post_11_upgrade,part_table}\\"",{})"",""(table,\\""{post_11_upgrade,sensors}\\"",{})"",""(\\""text search configuration\\"",\\""{post_11_upgrade,partial_index_test_config}\\"",{})"",""(type,{post_11_upgrade.my_type},{})"",""(view,\\""{post_11_upgrade,non_dist_upgrade_ref_view_2}\\"",{})"",""(view,\\""{post_11_upgrade,reporting_line}\\"",{})"",""(view,\\""{post_11_upgrade,view_for_upgrade_test}\\"",{})"",""(view,\\""{post_11_upgrade,view_for_upgrade_test_my_type}\\"",{})""}")
(2 rows)

-- Create the necessary test utility function
CREATE OR REPLACE FUNCTION activate_node_snapshot()
    RETURNS text[]
    LANGUAGE C STRICT
    AS 'citus';
-- make sure that workers and the coordinator has the same datesyle
SET datestyle = "ISO, YMD";
SELECT 1 FROM run_command_on_workers($$ALTER SYSTEM SET datestyle = "ISO, YMD";$$);
 ?column?
---------------------------------------------------------------------
        1
        1
(2 rows)

SELECT 1 FROM run_command_on_workers($$SELECT pg_reload_conf()$$);
 ?column?
---------------------------------------------------------------------
        1
        1
(2 rows)

-- In the version that we use for upgrade tests (v10.2.0), we propagate
-- "valid until" to the workers as "infinity" even if it's not set. And
-- given that "postgres" role is created in the older version, "valid until"
-- is set to "infinity" on the workers while this is not the case for
-- coordinator. See https://github.com/citusdata/citus/issues/7533.
--
-- We're fixing this for new versions of Citus and we'll probably backport
-- this to some older versions too. However, v10.2.0 won't ever have this
-- fix.
--
-- For this reason, here we set "valid until" to "infinity" for all the
-- nodes so that below query doesn't report any difference between the
-- metadata on coordinator and workers.
ALTER ROLE postgres WITH VALID UNTIL 'infinity';
-- make sure that the metadata is consistent across all nodes
-- we exclude the distributed_object_data as they are
-- not sorted in the same order (as OIDs differ on the nodes)
SELECT count(*) = 0 AS same_metadata_in_workers FROM
(
	(
		SELECT unnest(activate_node_snapshot()) as command
			EXCEPT
		SELECT unnest(result::text[]) AS command
		FROM run_command_on_workers($$SELECT post_11_upgrade.activate_node_snapshot()$$)
	)
UNION
	(
		SELECT unnest(result::text[]) AS command
		FROM run_command_on_workers($$SELECT post_11_upgrade.activate_node_snapshot()$$)
			EXCEPT
		SELECT unnest(activate_node_snapshot()) as command
	)
) AS foo WHERE command NOT ILIKE '%distributed_object_data%' and
-- sequences differ per node, so exclude
command NOT ILIKE '%sequence%';
 same_metadata_in_workers
---------------------------------------------------------------------
 t
(1 row)

