diff --git a/src/backend/distributed/executor/local_executor.c b/src/backend/distributed/executor/local_executor.c index 7da48f5d6..100998f40 100644 --- a/src/backend/distributed/executor/local_executor.c +++ b/src/backend/distributed/executor/local_executor.c @@ -241,10 +241,7 @@ ExecuteLocalTaskListExtended(List *taskList, if (localPlan != NULL) { Query *jobQuery = distributedPlan->workerJob->jobQuery; - LOCKMODE lockMode = - IsModifyCommand(jobQuery) ? RowExclusiveLock : (jobQuery->hasForUpdate ? - RowShareLock : - AccessShareLock); + LOCKMODE lockMode = GetQueryLockMode(jobQuery); Oid relationId = InvalidOid; foreach_oid(relationId, localPlan->relationOids) diff --git a/src/backend/distributed/planner/distributed_planner.c b/src/backend/distributed/planner/distributed_planner.c index 861cbc70f..57363ccd8 100644 --- a/src/backend/distributed/planner/distributed_planner.c +++ b/src/backend/distributed/planner/distributed_planner.c @@ -527,6 +527,28 @@ GetRTEIdentity(RangeTblEntry *rte) } +/* + * GetQueryLockMode returns the necessary lock mode to be acquired for the + * given query. (See comment written in RangeTblEntry->rellockmode) + */ +LOCKMODE +GetQueryLockMode(Query *query) +{ + if (IsModifyCommand(query)) + { + return RowExclusiveLock; + } + else if (query->hasForUpdate) + { + return RowShareLock; + } + else + { + return AccessShareLock; + } +} + + /* * IsModifyCommand returns true if the query performs modifications, false * otherwise. diff --git a/src/backend/distributed/planner/local_plan_cache.c b/src/backend/distributed/planner/local_plan_cache.c index 584ce2d51..598049098 100644 --- a/src/backend/distributed/planner/local_plan_cache.c +++ b/src/backend/distributed/planner/local_plan_cache.c @@ -61,9 +61,7 @@ CacheLocalPlanForShardQuery(Task *task, DistributedPlan *originalDistributedPlan UpdateRelationsToLocalShardTables((Node *) shardQuery, task->relationShardList); - LOCKMODE lockMode = - IsModifyCommand(shardQuery) ? RowExclusiveLock : (shardQuery->hasForUpdate ? - RowShareLock : AccessShareLock); + LOCKMODE lockMode = GetQueryLockMode(shardQuery); /* fast path queries can only have a single RTE by definition */ RangeTblEntry *rangeTableEntry = (RangeTblEntry *) linitial(shardQuery->rtable); diff --git a/src/include/distributed/distributed_planner.h b/src/include/distributed/distributed_planner.h index 859193199..80501118e 100644 --- a/src/include/distributed/distributed_planner.h +++ b/src/include/distributed/distributed_planner.h @@ -203,6 +203,7 @@ extern Node * ResolveExternalParams(Node *inputNode, ParamListInfo boundParams); extern bool IsMultiTaskPlan(struct DistributedPlan *distributedPlan); extern RangeTblEntry * RemoteScanRangeTableEntry(List *columnNameList); extern int GetRTEIdentity(RangeTblEntry *rte); +extern LOCKMODE GetQueryLockMode(Query *query); extern int32 BlessRecordExpression(Expr *expr); extern void DissuadePlannerFromUsingPlan(PlannedStmt *plan); extern PlannedStmt * FinalizePlan(PlannedStmt *localPlan,