Always make a BufferAccessStrategy for ANALYZE
authorDavid Rowley <[email protected]>
Thu, 6 Apr 2023 00:37:03 +0000 (12:37 +1200)
committerDavid Rowley <[email protected]>
Thu, 6 Apr 2023 00:37:03 +0000 (12:37 +1200)
32fbe0239 changed things so we didn't bother allocating the
BufferAccessStrategy during VACUUM (ONLY_DATABASE_STATS); and VACUUM
(FULL), however, it forgot to consider that VACUUM (FULL, ANALYZE) is a
possible combination.  That change would have resulted in such a command
allowing ANALYZE to make full use of shared buffers, which wasn't
intended, so fix that.

Reported-by: Melanie Plageman
Discussion: https://postgr.es/m/CAAKRu_bJRKe+v_=OqwC+5sA3j5qv8rqdAwy3+yHaO3wmtfrCRg@mail.gmail.com

src/backend/commands/vacuum.c

index da85330ef407d7c2e873e017ec1b449b842e7ec3..2c31745fbc4488ef030bebd6680d4b2de366967c 100644 (file)
@@ -393,11 +393,13 @@ vacuum(List *relations, VacuumParams *params,
     * If caller didn't give us a buffer strategy object, make one in the
     * cross-transaction memory context.  We needn't bother making this for
     * VACUUM (FULL) or VACUUM (ONLY_DATABASE_STATS) as they'll not make use
-    * of it.
+    * of it.  VACUUM (FULL, ANALYZE) is possible, so we'd better ensure that
+    * we make a strategy when we see ANALYZE.
     */
    if (bstrategy == NULL &&
-       (params->options & (VACOPT_ONLY_DATABASE_STATS |
-                           VACOPT_FULL)) == 0)
+       ((params->options & (VACOPT_ONLY_DATABASE_STATS |
+                            VACOPT_FULL)) == 0 ||
+        (params->options & VACOPT_ANALYZE) != 0))
    {
        MemoryContext old_context = MemoryContextSwitchTo(vac_context);