diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index e1532c6a5..4f34f13d9 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -1630,10 +1630,15 @@ RouterJob(Query *originalQuery, PlannerRestrictionContext *plannerRestrictionCon * Queries to reference tables, or distributed tables with multiple replica's have * their task placements reordered according to the configured * task_assignment_policy. This is only applicable to select queries as the modify - * queries will be reordered to _always_ use the first-replica policy during - * execution. + * queries will _always_ be executed on all placements. + * + * We also ignore queries that are targeting only intermediate results (e.g., no + * valid anchorShardId). */ - ReorderTaskPlacementsByTaskAssignmentPolicy(job, TaskAssignmentPolicy); + if (shardId != INVALID_SHARD_ID) + { + ReorderTaskPlacementsByTaskAssignmentPolicy(job, TaskAssignmentPolicy); + } } else if (isMultiShardModifyQuery) { diff --git a/src/test/regress/expected/multi_task_assignment_policy.out b/src/test/regress/expected/multi_task_assignment_policy.out index 8879ae02a..cabb5f4ac 100644 --- a/src/test/regress/expected/multi_task_assignment_policy.out +++ b/src/test/regress/expected/multi_task_assignment_policy.out @@ -212,3 +212,25 @@ DEBUG: Plan is router executable (2 rows) ROLLBACK; +-- we should be able to use round-robin with router queries that +-- only contains intermediate results +BEGIN; +CREATE TABLE task_assignment_test_table_2 (test_id integer); +SELECT create_distributed_table('task_assignment_test_table_2', 'test_id'); + create_distributed_table +-------------------------- + +(1 row) + +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; + test_id +--------- +(0 rows) + +SET LOCAL citus.task_assignment_policy TO 'round-robin'; +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; + test_id +--------- +(0 rows) + +ROLLBACK; diff --git a/src/test/regress/sql/multi_task_assignment_policy.sql b/src/test/regress/sql/multi_task_assignment_policy.sql index 5dce8c727..6b2da3948 100644 --- a/src/test/regress/sql/multi_task_assignment_policy.sql +++ b/src/test/regress/sql/multi_task_assignment_policy.sql @@ -118,4 +118,19 @@ SET LOCAL citus.task_assignment_policy TO 'round-robin'; EXPLAIN (COSTS FALSE) SELECT * FROM task_assignment_reference_table; EXPLAIN (COSTS FALSE) SELECT * FROM task_assignment_reference_table; -ROLLBACK; \ No newline at end of file +ROLLBACK; + + + +-- we should be able to use round-robin with router queries that +-- only contains intermediate results +BEGIN; +CREATE TABLE task_assignment_test_table_2 (test_id integer); +SELECT create_distributed_table('task_assignment_test_table_2', 'test_id'); + +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; +SET LOCAL citus.task_assignment_policy TO 'round-robin'; +WITH q1 AS (SELECT * FROM task_assignment_test_table_2) SELECT * FROM q1; +ROLLBACK; + +