mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Use list_copy_head() instead of list_truncate(list_copy(...), ...)
Truncating off the end of a freshly copied List is not a very efficient
way of copying the first N elements of a List.
In many of the cases that are updated here, the pattern was only being
used to remove the final element of a List. That's about the best case
for it, but there were many instances where the truncate trimming the List
down much further.
4cc832f94
added list_copy_head(), so let's use it in cases where it's
useful.
Author: David Rowley
Discussion: https://postgr.es/m/1986787.1657666922%40sss.pgh.pa.us
This commit is contained in:
@@ -2053,9 +2053,8 @@ accumulate_append_subpath(Path *path, List **subpaths, List **special_subpaths)
|
||||
*subpaths = list_concat(*subpaths,
|
||||
list_copy_tail(apath->subpaths,
|
||||
apath->first_partial_path));
|
||||
new_special_subpaths =
|
||||
list_truncate(list_copy(apath->subpaths),
|
||||
apath->first_partial_path);
|
||||
new_special_subpaths = list_copy_head(apath->subpaths,
|
||||
apath->first_partial_path);
|
||||
*special_subpaths = list_concat(*special_subpaths,
|
||||
new_special_subpaths);
|
||||
return;
|
||||
@@ -3086,8 +3085,8 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel,
|
||||
root->query_pathkeys);
|
||||
else if (npathkeys > 0)
|
||||
useful_pathkeys_list = lappend(useful_pathkeys_list,
|
||||
list_truncate(list_copy(root->query_pathkeys),
|
||||
npathkeys));
|
||||
list_copy_head(root->query_pathkeys,
|
||||
npathkeys));
|
||||
}
|
||||
|
||||
return useful_pathkeys_list;
|
||||
|
@@ -3026,14 +3026,12 @@ expand_indexqual_rowcompare(PlannerInfo *root,
|
||||
|
||||
rc->rctype = (RowCompareType) op_strategy;
|
||||
rc->opnos = new_ops;
|
||||
rc->opfamilies = list_truncate(list_copy(clause->opfamilies),
|
||||
matching_cols);
|
||||
rc->inputcollids = list_truncate(list_copy(clause->inputcollids),
|
||||
matching_cols);
|
||||
rc->largs = list_truncate(copyObject(var_args),
|
||||
matching_cols);
|
||||
rc->rargs = list_truncate(copyObject(non_var_args),
|
||||
matching_cols);
|
||||
rc->opfamilies = list_copy_head(clause->opfamilies,
|
||||
matching_cols);
|
||||
rc->inputcollids = list_copy_head(clause->inputcollids,
|
||||
matching_cols);
|
||||
rc->largs = list_copy_head(var_args, matching_cols);
|
||||
rc->rargs = list_copy_head(non_var_args, matching_cols);
|
||||
iclause->indexquals = list_make1(make_simple_restrictinfo(root,
|
||||
(Expr *) rc));
|
||||
}
|
||||
|
@@ -2464,7 +2464,7 @@ truncate_useless_pathkeys(PlannerInfo *root,
|
||||
else if (nuseful == list_length(pathkeys))
|
||||
return pathkeys;
|
||||
else
|
||||
return list_truncate(list_copy(pathkeys), nuseful);
|
||||
return list_copy_head(pathkeys, nuseful);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -1397,8 +1397,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
|
||||
*/
|
||||
if (tlist_was_changed && (flags & (CP_EXACT_TLIST | CP_SMALL_TLIST)))
|
||||
{
|
||||
tlist = list_truncate(list_copy(plan->plan.targetlist),
|
||||
orig_tlist_length);
|
||||
tlist = list_copy_head(plan->plan.targetlist, orig_tlist_length);
|
||||
return inject_projection_plan((Plan *) plan, tlist,
|
||||
plan->plan.parallel_safe);
|
||||
}
|
||||
@@ -1557,7 +1556,7 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
|
||||
*/
|
||||
if (tlist_was_changed && (flags & (CP_EXACT_TLIST | CP_SMALL_TLIST)))
|
||||
{
|
||||
tlist = list_truncate(list_copy(plan->targetlist), orig_tlist_length);
|
||||
tlist = list_copy_head(plan->targetlist, orig_tlist_length);
|
||||
return inject_projection_plan(plan, tlist, plan->parallel_safe);
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user