CreateDistributedInsertSelectPlan: avoid calling GetCitusTableCacheEntry in a way that would invalidate live ShardInterval pointers

pull/3769/head
Philip Dubé 2020-04-16 19:24:47 +00:00
parent 1d0f4bdcd2
commit c00d57a955
1 changed files with 6 additions and 3 deletions

View File

@ -53,6 +53,7 @@ static DistributedPlan * CreateDistributedInsertSelectPlan(Query *originalQuery,
PlannerRestrictionContext * PlannerRestrictionContext *
plannerRestrictionContext); plannerRestrictionContext);
static Task * RouterModifyTaskForShardInterval(Query *originalQuery, static Task * RouterModifyTaskForShardInterval(Query *originalQuery,
CitusTableCacheEntry *targetTableCacheEntry,
ShardInterval *shardInterval, ShardInterval *shardInterval,
PlannerRestrictionContext * PlannerRestrictionContext *
plannerRestrictionContext, plannerRestrictionContext,
@ -259,6 +260,7 @@ CreateDistributedInsertSelectPlan(Query *originalQuery,
targetCacheEntry->sortedShardIntervalArray[shardOffset]; targetCacheEntry->sortedShardIntervalArray[shardOffset];
Task *modifyTask = RouterModifyTaskForShardInterval(originalQuery, Task *modifyTask = RouterModifyTaskForShardInterval(originalQuery,
targetCacheEntry,
targetShardInterval, targetShardInterval,
plannerRestrictionContext, plannerRestrictionContext,
taskIdIndex, taskIdIndex,
@ -415,7 +417,9 @@ DistributedInsertSelectSupported(Query *queryTree, RangeTblEntry *insertRte,
* subqueries with non equi-joins.). * subqueries with non equi-joins.).
*/ */
static Task * static Task *
RouterModifyTaskForShardInterval(Query *originalQuery, ShardInterval *shardInterval, RouterModifyTaskForShardInterval(Query *originalQuery,
CitusTableCacheEntry *targetTableCacheEntry,
ShardInterval *shardInterval,
PlannerRestrictionContext *plannerRestrictionContext, PlannerRestrictionContext *plannerRestrictionContext,
uint32 taskIdIndex, uint32 taskIdIndex,
bool safeToPushdownSubquery, bool safeToPushdownSubquery,
@ -428,7 +432,6 @@ RouterModifyTaskForShardInterval(Query *originalQuery, ShardInterval *shardInter
uint64 shardId = shardInterval->shardId; uint64 shardId = shardInterval->shardId;
Oid distributedTableId = shardInterval->relationId; Oid distributedTableId = shardInterval->relationId;
CitusTableCacheEntry *cacheEntry = GetCitusTableCacheEntry(distributedTableId);
PlannerRestrictionContext *copyOfPlannerRestrictionContext = palloc0( PlannerRestrictionContext *copyOfPlannerRestrictionContext = palloc0(
sizeof(PlannerRestrictionContext)); sizeof(PlannerRestrictionContext));
@ -584,7 +587,7 @@ RouterModifyTaskForShardInterval(Query *originalQuery, ShardInterval *shardInter
modifyTask->anchorShardId = shardId; modifyTask->anchorShardId = shardId;
modifyTask->taskPlacementList = insertShardPlacementList; modifyTask->taskPlacementList = insertShardPlacementList;
modifyTask->relationShardList = relationShardList; modifyTask->relationShardList = relationShardList;
modifyTask->replicationModel = cacheEntry->replicationModel; modifyTask->replicationModel = targetTableCacheEntry->replicationModel;
return modifyTask; return modifyTask;
} }