]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix broken MemoizePath support in reparameterize_path().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 Dec 2022 18:48:12 +0000 (13:48 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 Dec 2022 18:48:12 +0000 (13:48 -0500)
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

src/backend/optimizer/util/pathnode.c

index 0762eb232e4034703e47ac66562868b6ae1bb39c..bc9958a1d2737c6f0b0cac0d6312bb61834fdf30 100644 (file)
@@ -3952,9 +3952,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,