Add missing MaterialPath support in reparameterize_path[_by_child].
authorTom Lane <[email protected]>
Sun, 4 Dec 2022 18:35:42 +0000 (13:35 -0500)
committerTom Lane <[email protected]>
Sun, 4 Dec 2022 18:35:42 +0000 (13:35 -0500)
These two functions failed to cover MaterialPath.  That's not a
fatal problem, but we can generate better plans in some cases
if we support it.

Tom Lane and Richard Guo

Discussion: https://postgr.es/m/1854233.1669949723@sss.pgh.pa.us

src/backend/optimizer/util/pathnode.c

index 6dd11329fb527ebe1e39071c584fc1686733f865..ea2e158f6d428d458c10a612d12e5e53b7979317 100644 (file)
@@ -3979,6 +3979,18 @@ reparameterize_path(PlannerInfo *root, Path *path,
                                                                           apath->path.parallel_aware,
                                                                           -1);
                        }
+               case T_Material:
+                       {
+                               MaterialPath *mpath = (MaterialPath *) path;
+                               Path       *spath = mpath->subpath;
+
+                               spath = reparameterize_path(root, spath,
+                                                                                       required_outer,
+                                                                                       loop_count);
+                               if (spath == NULL)
+                                       return NULL;
+                               return (Path *) create_material_path(rel, spath);
+                       }
                case T_Memoize:
                        {
                                MemoizePath *mpath = (MemoizePath *) path;
@@ -4013,7 +4025,8 @@ reparameterize_path(PlannerInfo *root, Path *path,
  * path->parent, which does not change during the translation. Hence those
  * members are copied as they are.
  *
- * If the given path can not be reparameterized, the function returns NULL.
+ * Currently, only a few path types are supported here, though more could be
+ * added at need.  We return NULL if we can't reparameterize the given path.
  */
 Path *
 reparameterize_path_by_child(PlannerInfo *root, Path *path,
@@ -4211,6 +4224,16 @@ do { \
                        }
                        break;
 
+               case T_MaterialPath:
+                       {
+                               MaterialPath *mpath;
+
+                               FLAT_COPY_PATH(mpath, path, MaterialPath);
+                               REPARAMETERIZE_CHILD_PATH(mpath->subpath);
+                               new_path = (Path *) mpath;
+                       }
+                       break;
+
                case T_MemoizePath:
                        {
                                MemoizePath *mpath;