CREATE SCHEMA recursive_dml_with_different_planner_executors;
SET search_path TO recursive_dml_with_different_planner_executors, public;

CREATE TABLE distributed_table (tenant_id text, dept int, info jsonb);
SELECT create_distributed_table('distributed_table', 'tenant_id');

CREATE TABLE second_distributed_table (tenant_id text, dept int, info jsonb);
SELECT create_distributed_table('second_distributed_table', 'tenant_id');

CREATE TABLE reference_table (id text, name text);
SELECT create_reference_table('reference_table');

INSERT INTO distributed_table SELECT i::text, i % 10, row_to_json(row(i, i*i)) FROM generate_series (0, 100) i;
INSERT INTO second_distributed_table SELECT i::text, i % 10, row_to_json(row(i, i*i)) FROM generate_series (0, 100) i;

SET client_min_messages TO DEBUG1;

-- subquery with router planner
-- joined with a real-time query
UPDATE 
	distributed_table 
SET dept = foo.dept FROM 
	(SELECT tenant_id, dept FROM second_distributed_table WHERE dept = 1 ) as foo, 
	(SELECT tenant_id FROM second_distributed_table WHERE dept IN (1, 2, 3, 4) OFFSET 0) as bar
	WHERE foo.tenant_id = bar.tenant_id
	AND distributed_table.tenant_id = bar.tenant_id; 

-- a non colocated subquery inside the UPDATE
UPDATE distributed_table SET dept = foo.max_dept FROM 
(
	SELECT 
		max(dept) as max_dept
	FROM 
		(SELECT DISTINCT tenant_id, dept FROM distributed_table) as distributed_table
	WHERE tenant_id NOT IN 
				(SELECT tenant_id FROM second_distributed_table WHERE dept IN (1, 2, 3, 4))
) as  foo WHERE foo.max_dept > dept * 3;


-- subquery with repartition query
SET citus.enable_repartition_joins to ON;

UPDATE distributed_table SET dept = foo.some_tenants::int FROM 
(
	SELECT
	 	DISTINCT second_distributed_table.tenant_id as some_tenants
	 FROM second_distributed_table, distributed_table WHERE second_distributed_table.dept = distributed_table.dept
) as foo;

SET citus.enable_repartition_joins to OFF;

-- final query is router 
UPDATE distributed_table SET dept = foo.max_dept FROM 
(
	SELECT 
		max(dept) as max_dept
	FROM 
		(SELECT DISTINCT tenant_id, dept FROM distributed_table) as distributed_table
	WHERE tenant_id IN 
				(SELECT tenant_id FROM second_distributed_table WHERE dept IN (1, 2, 3, 4))
) as  foo WHERE foo.max_dept >= dept and tenant_id = '8';


RESET client_min_messages;
DROP SCHEMA recursive_dml_with_different_planner_executors CASCADE;
SET search_path TO public;
