Use bms_add_members() instead of bms_union() when possible
authorDavid Rowley <[email protected]>
Fri, 3 Oct 2025 23:19:31 +0000 (12:19 +1300)
committerDavid Rowley <[email protected]>
Fri, 3 Oct 2025 23:19:31 +0000 (12:19 +1300)
bms_union() causes a new set to be allocated.  What this caller needs is
members added to an existing set.  bms_add_members() is the tool for
that job.

This is just a matter of fixing an inefficiency due to surplus memory
allocations.  No bugs being fixed.

The only other place I found that might be valid to apply this change is
in markNullableIfNeeded(), but I opted not to do that due to the risk to
reward ratio not looking favorable.  The risk being that there *could* be
another pointer pointing to the Bitmapset.

Author: David Rowley <[email protected]>
Reviewed-by: Greg Burd <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/CAApHDvoCcoS-p5tZNJLTxFOKTYNjqVh7Dwf+5ikDUBwnvWftRw@mail.gmail.com

src/backend/optimizer/prep/prepunion.c

index 6bd0f4a5dc3ce5f9bb49aebba817be223948b9c7..6c0e2383af94cc7991226d21cd0b57e055843470 100644 (file)
@@ -802,7 +802,7 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root,
                                           linitial(rel->partial_pathlist));
        }
 
-       relids = bms_union(relids, rel->relids);
+       relids = bms_add_members(relids, rel->relids);
    }
 
    /* Build result relation. */