Assert that cutoffs are provided if freezing will be attempted
authorMelanie Plageman <melanieplageman@gmail.com>
Tue, 25 Nov 2025 21:39:56 +0000 (16:39 -0500)
committerMelanie Plageman <melanieplageman@gmail.com>
Tue, 25 Nov 2025 21:41:29 +0000 (16:41 -0500)
heap_page_prune_and_freeze() requires the caller to initialize
PruneFreezeParams->cutoffs so that the function can correctly evaluate
whether tuples should be frozen. This requirement previously existed
only in comments and was easy to miss, especially after β€œcutoffs” was
converted from a direct function parameter to a field of the newly
introduced PruneFreezeParams struct (added in 1937ed70621). Adding an
assert makes this requirement explicit and harder to violate.

Also, fix a minor typo while we're at it.

Author: Chao Li <li.evan.chao@gmail.com>
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Discussion: https://postgr.es/m/0AC177F5-5E26-45EE-B273-357C51212AC5%40gmail.com

src/backend/access/heap/pruneheap.c

index 0d6311088eac219f9f9bfea0de85b0c6cf7334a5..ac958d86374888437933e443b6b3aab393e9c2a2 100644 (file)
@@ -461,7 +461,7 @@ heap_page_will_freeze(Relation relation, Buffer buffer,
  * 'new_relmin_mxid' arguments are required when freezing.  When
  * HEAP_PAGE_PRUNE_FREEZE option is passed, we also set presult->all_visible
  * and presult->all_frozen after determining whether or not to
- * opporunistically freeze, to indicate if the VM bits can be set.  They are
+ * opportunistically freeze, to indicate if the VM bits can be set.  They are
  * always set to false when the HEAP_PAGE_PRUNE_FREEZE option is not passed,
  * because at the moment only callers that also freeze need that information.
  *
@@ -504,6 +504,9 @@ heap_page_prune_and_freeze(PruneFreezeParams *params,
    prstate.vistest = params->vistest;
    prstate.mark_unused_now =
        (params->options & HEAP_PAGE_PRUNE_MARK_UNUSED_NOW) != 0;
+
+   /* cutoffs must be provided if we will attempt freezing */
+   Assert(!(params->options & HEAP_PAGE_PRUNE_FREEZE) || params->cutoffs);
    prstate.attempt_freeze = (params->options & HEAP_PAGE_PRUNE_FREEZE) != 0;
    prstate.cutoffs = params->cutoffs;