Skip to content

Commit 4b8860e

Browse files
committed
Fix create_scan_plan's handling of sortgrouprefs for physical tlists.
We should only run apply_pathtarget_labeling_to_tlist if CP_LABEL_TLIST was specified, because only in that case has use_physical_tlist checked that the labeling will succeed; otherwise we may get an "ORDER/GROUP BY expression not found in targetlist" error. (This subsumes the previous test about gating_clauses, because we reset "flags" to zero earlier if there are gating clauses to apply.) The only known case in which a failure can occur is with a ProjectSet path directly atop a table scan path, although it seems likely that there are other cases or will be such in future. This means that the failure is currently only visible in the v10 branch: 9.6 didn't have ProjectSet, while in v11 and HEAD, apply_scanjoin_target_to_paths for some weird reason is using create_projection_path not apply_projection_to_path, masking the problem because there's a ProjectionPath in between. Nonetheless this code is clearly wrong on its own terms, so back-patch to 9.6 where this logic was introduced. Per report from Regina Obe. Discussion: https://postgr.es/m/001501d40f88$75186950$5f493bf0$@pcorp.us
1 parent d93c056 commit 4b8860e

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/backend/optimizer/plan/createplan.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,10 +546,10 @@ create_scan_plan(PlannerInfo *root, Path *best_path, int flags)
546546
tlist = copyObject(((IndexPath *) best_path)->indexinfo->indextlist);
547547

548548
/*
549-
* Transfer any sortgroupref data to the replacement tlist, unless
550-
* we don't care because the gating Result will handle it.
549+
* Transfer sortgroupref data to the replacement tlist, if
550+
* requested (use_physical_tlist checked that this will work).
551551
*/
552-
if (!gating_clauses)
552+
if (flags & CP_LABEL_TLIST)
553553
apply_pathtarget_labeling_to_tlist(tlist, best_path->pathtarget);
554554
}
555555
else
@@ -563,7 +563,7 @@ create_scan_plan(PlannerInfo *root, Path *best_path, int flags)
563563
else
564564
{
565565
/* As above, transfer sortgroupref data to replacement tlist */
566-
if (!gating_clauses)
566+
if (flags & CP_LABEL_TLIST)
567567
apply_pathtarget_labeling_to_tlist(tlist, best_path->pathtarget);
568568
}
569569
}

0 commit comments

Comments
 (0)