Guard against parallel-restricted functions in VALUES expressions.
Obvious brain fade in set_rel_consider_parallel(). Noticed it while adjusting the adjacent RTE_FUNCTION case. In 9.6, also make the code look more like what I just did in HEAD by removing the unnecessary function_rte_parallel_ok subroutine (it does nothing that expression_tree_walker wouldn't do).
This commit is contained in:
parent
0440f49523
commit
c3813268a7
@ -78,7 +78,6 @@ static void set_plain_rel_size(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
static void create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel);
|
static void create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel);
|
||||||
static void set_rel_consider_parallel(PlannerInfo *root, RelOptInfo *rel,
|
static void set_rel_consider_parallel(PlannerInfo *root, RelOptInfo *rel,
|
||||||
RangeTblEntry *rte);
|
RangeTblEntry *rte);
|
||||||
static bool function_rte_parallel_ok(RangeTblEntry *rte);
|
|
||||||
static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
|
static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
|
||||||
RangeTblEntry *rte);
|
RangeTblEntry *rte);
|
||||||
static void set_tablesample_rel_size(PlannerInfo *root, RelOptInfo *rel,
|
static void set_tablesample_rel_size(PlannerInfo *root, RelOptInfo *rel,
|
||||||
@ -596,16 +595,14 @@ set_rel_consider_parallel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
|
|
||||||
case RTE_FUNCTION:
|
case RTE_FUNCTION:
|
||||||
/* Check for parallel-restricted functions. */
|
/* Check for parallel-restricted functions. */
|
||||||
if (!function_rte_parallel_ok(rte))
|
if (has_parallel_hazard((Node *) rte->functions, false))
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTE_VALUES:
|
case RTE_VALUES:
|
||||||
|
/* Check for parallel-restricted functions. */
|
||||||
/*
|
if (has_parallel_hazard((Node *) rte->values_lists, false))
|
||||||
* The data for a VALUES clause is stored in the plan tree itself,
|
return;
|
||||||
* so scanning it in a worker is fine.
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTE_CTE:
|
case RTE_CTE:
|
||||||
@ -643,26 +640,6 @@ set_rel_consider_parallel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
rel->consider_parallel = true;
|
rel->consider_parallel = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Check whether a function RTE is scanning something parallel-restricted.
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
function_rte_parallel_ok(RangeTblEntry *rte)
|
|
||||||
{
|
|
||||||
ListCell *lc;
|
|
||||||
|
|
||||||
foreach(lc, rte->functions)
|
|
||||||
{
|
|
||||||
RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc);
|
|
||||||
|
|
||||||
Assert(IsA(rtfunc, RangeTblFunction));
|
|
||||||
if (has_parallel_hazard(rtfunc->funcexpr, false))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set_plain_rel_pathlist
|
* set_plain_rel_pathlist
|
||||||
* Build access paths for a plain relation (no subquery, no inheritance)
|
* Build access paths for a plain relation (no subquery, no inheritance)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user