Re: REPACK ONLY is accepted but ignored

From: Antonin Houska <ah(at)cybertec(dot)at>
To: Nathan Bossart <nathandbossart(at)gmail(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: REPACK ONLY is accepted but ignored
Date: 2026-08-29 13:34:42
Message-ID: 16326.1788010482@localhost
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Nathan Bossart <nathandbossart(at)gmail(dot)com> wrote:

> On Thu, Aug 27, 2026 at 10:11:45AM -0500, Nathan Bossart wrote:
> > The REPACK grammar accepts ONLY and a trailing * like VACUUM does, but it's
> > neither documented nor handled in the REPACK code. From a v19 perspective,
> > it might be best to just reject that syntax for now, but that does mean it
> > won't be able to do everything VACUUM (FULL) can.
>
> Bringing REPACK in line with its documentation looks pretty simple. This
> is probably the way to go for v19, as proper support for ONLY and trailing
> * seems to require more invasive changes.
>
> diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
> index a33c3aaeeb2..2df39a48fc6 100644
> --- a/src/backend/parser/gram.y
> +++ b/src/backend/parser/gram.y
> @@ -12543,25 +12543,25 @@ CreateConversionStmt:
> *****************************************************************************/
>
> RepackStmt:
> - REPACK opt_utility_option_list vacuum_relation USING INDEX name
> + REPACK opt_utility_option_list qualified_name opt_name_list USING INDEX name
> {
> RepackStmt *n = makeNode(RepackStmt);
>
> n->command = REPACK_COMMAND_REPACK;
> - n->relation = (VacuumRelation *) $3;
> - n->indexname = $6;
> + n->relation = makeVacuumRelation($3, InvalidOid, $4);
> + n->indexname = $7;
> n->usingindex = true;
> n->params = $2;
> $$ = (Node *) n;
> }
> - | REPACK opt_utility_option_list vacuum_relation opt_usingindex
> + | REPACK opt_utility_option_list qualified_name opt_name_list opt_usingindex
> {
> RepackStmt *n = makeNode(RepackStmt);
>
> n->command = REPACK_COMMAND_REPACK;
> - n->relation = (VacuumRelation *) $3;
> + n->relation = makeVacuumRelation($3, InvalidOid, $4);
> n->indexname = NULL;
> - n->usingindex = $4;
> + n->usingindex = $5;
> n->params = $2;
> $$ = (Node *) n;
> }

At the moment, I can't think of other reason for using the 'vacuum_relation'
rule than the effort to replace both CLUSTER and VACUUM FULL. Unfortunately it
appears that the difference in the command arguments was missed. What you
propose LGTM, thanks.

--
Antonin Houska
Web: https://www.cybertec-postgresql.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrey Borodin 2026-08-29 14:18:21 Re: Possible race condition in pg_basebackup
Previous Message Andres Freund 2026-08-29 13:18:20 Re: Allow tuple visibility checks without hint-bit, maintenance