Fix broken MemoizePath support in reparameterize_path().

It neglected to recurse to the subpath, meaning you'd get back
a path identical to the input.  This could produce wrong query
results if the omission meant that the subpath fails to enforce
some join clause it should be enforcing.  We don't have a test
case for this at the moment, but the code is obviously broken
and the fix is equally obvious.  Back-patch to v14 where
Memoize was introduced.

Richard Guo

Discussion: https://postgr.es/m/CAMbWs4_R=ORpz=Lkn2q3ebPC5EuWyfZF+tmfCPVLBVK5W39mHA@mail.gmail.com
This commit is contained in:
Tom Lane 2022-12-04 13:48:12 -05:00
parent 6eb2f0ed4c
commit e76913802c

View file

@ -3994,9 +3994,15 @@ reparameterize_path(PlannerInfo *root, Path *path,
case T_Memoize:
{
MemoizePath *mpath = (MemoizePath *) path;
Path *spath = mpath->subpath;
spath = reparameterize_path(root, spath,
required_outer,
loop_count);
if (spath == NULL)
return NULL;
return (Path *) create_memoize_path(root, rel,
mpath->subpath,
spath,
mpath->param_exprs,
mpath->hash_operators,
mpath->singlerow,