diff --git a/src/backend/distributed/executor/multi_server_executor.c b/src/backend/distributed/executor/multi_server_executor.c index 33aa6d65f..ec3a3af2c 100644 --- a/src/backend/distributed/executor/multi_server_executor.c +++ b/src/backend/distributed/executor/multi_server_executor.c @@ -127,6 +127,12 @@ RouterExecutablePlan(MultiPlan *multiPlan, MultiExecutorType executorType) List *workerDependentTaskList = NIL; bool masterQueryHasAggregates = false; + /* TODO: this is a hacky solution to allow 0 shard INSERT ... SELECT */ + if (masterQuery == NULL) + { + return true; + } + /* router executor cannot execute queries that hit zero shards */ if (taskCount == 0) { diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 209e00418..44d83cac8 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -261,9 +261,6 @@ CreateMultiTaskRouterPlan(Query *originalQuery, Query *query, ++taskIdIndex; } - /* there should be a least a single task */ - Assert(sqlTaskList != NIL); - /* Create the worker job */ workerJob = CitusMakeNode(Job); workerJob->taskList = sqlTaskList; @@ -360,7 +357,7 @@ CreateMultipleTaskRouterModifyTask(Query *originalQuery, Query *query, } /* Ensure that we have INSERTed table's placement exists on the same worker */ - insertShardPlacementList = ShardPlacementList(shardId); + insertShardPlacementList = FinalizedShardPlacementList(shardId); intersectedPlacementList = IntersectPlacementList(insertShardPlacementList, selectPlacementList); diff --git a/src/test/regress/expected/multi_insert_select.out b/src/test/regress/expected/multi_insert_select.out index 9c7a519fa..f20b2ba08 100644 --- a/src/test/regress/expected/multi_insert_select.out +++ b/src/test/regress/expected/multi_insert_select.out @@ -223,6 +223,54 @@ DEBUG: Plan is router executable DEBUG: CommitTransactionCommand DEBUG: CommitTransaction DEBUG: name: unnamed; blockState: STARTED; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: +-- a zero shard select +INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time) +SELECT + value_2, value_1, value_3, value_4, user_id, time +FROM + raw_events_first +WHERE + false; +DEBUG: StartTransactionCommand +DEBUG: StartTransaction +DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: ProcessQuery +DEBUG: Plan is router executable +DEBUG: CommitTransactionCommand +DEBUG: CommitTransaction +DEBUG: name: unnamed; blockState: STARTED; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: +-- another zero shard select +INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time) +SELECT + value_2, value_1, value_3, value_4, user_id, time +FROM + raw_events_first +WHERE + 0 != 0; +DEBUG: StartTransactionCommand +DEBUG: StartTransaction +DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: skipping the task +DETAIL: Insert query hits 2 placements, Select query hits 1 placements and only 1 of those placements match. +DEBUG: ProcessQuery +DEBUG: Plan is router executable +DEBUG: CommitTransactionCommand +DEBUG: CommitTransaction +DEBUG: name: unnamed; blockState: STARTED; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: -- add one more row SET client_min_messages TO INFO; DEBUG: StartTransactionCommand diff --git a/src/test/regress/sql/multi_insert_select.sql b/src/test/regress/sql/multi_insert_select.sql index 32eb751f2..218d034eb 100644 --- a/src/test/regress/sql/multi_insert_select.sql +++ b/src/test/regress/sql/multi_insert_select.sql @@ -82,6 +82,24 @@ FROM WHERE user_id = 8; +-- a zero shard select +INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time) +SELECT + value_2, value_1, value_3, value_4, user_id, time +FROM + raw_events_first +WHERE + false; + + +-- another zero shard select +INSERT INTO raw_events_second (value_2, value_1, value_3, value_4, user_id, time) +SELECT + value_2, value_1, value_3, value_4, user_id, time +FROM + raw_events_first +WHERE + 0 != 0; -- add one more row SET client_min_messages TO INFO;