Re: tablecmds: reject CLUSTER ON for partitioned tables earlier
Chao Li <li.evan.chao@gmail.com>
From: Chao Li <li.evan.chao@gmail.com>
To: Postgres hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-01-22T23:30:55Z
Lists: pgsql-hackers
Attachments
- v3-0001-tablecmds-reject-CLUSTER-ON-for-partitioned-table.patch (application/octet-stream) patch v3-0001
- v3-0002-tablecmds-reject-INHERIT-NO-INHERIT-for-partition.patch (application/octet-stream) patch v3-0002
> On Jan 22, 2026, at 17:01, Chao Li <li.evan.chao@gmail.com> wrote: > > > >> On Jan 21, 2026, at 11:55, Chao Li <li.evan.chao@gmail.com> wrote: >> >> Hi Hacker, >> >> I noticed this while working other patches related to “ALTER TABLE”. >> >> “ALTER TABLE … CLUSTER ON” and "SET WITHOUT CLUSTER" are not supported for partitioned tables, but currently ATPrepCmd() allows them through and they only fail later at execution time. >> >> This patch rejects these commands earlier by using the existing ATSimplePermissions() infrastructure in ATPrepCmd(), matching the handling of other unsupported ALTER TABLE actions on partitioned tables (such as SET LOGGED / SET UNLOGGED). This makes the behavior more consistent and simplifies the code path. >> >> As a result, the error reported for partitioned tables changes: >> >> Before the patch: >> ``` >> evantest=# ALTER TABLE p_test CLUSTER ON idx_p_test_id; >> ERROR: cannot mark index clustered in partitioned table >> ``` >> >> With the patch: >> ``` >> evantest=# ALTER TABLE p_test CLUSTER ON idx_p_test_id; >> ERROR: ALTER action CLUSTER ON cannot be performed on relation "p_test" >> DETAIL: This operation is not supported for partitioned tables. >> ``` >> >> Best regards, >> -- >> Chao Li (Evan) >> HighGo Software Co., Ltd. >> https://www.highgo.com/ >> >> >> >> >> <v1-0001-tablecmds-reject-CLUSTER-ON-for-partitioned-table.patch> > > > > Applying the same change to INHERIT/NO INHeRIT in v2-0002. Other than that, fixing 2 more things for INHERIT/NO INHERIT: > > * The header comment of ATPrepAddInherit() was a copy-paste mistake, it described something totally unrelated. > * NO INHERIT didn’t call ATPrepAddInherit() to check early, so it had to go deeper and run unnecessary checks. > > Basically, 0001 and 0002 do the same thing on two sub-commands. If accepted, they can be squashed. > > Best regards, > -- > Chao Li (Evan) > HighGo Software Co., Ltd. > https://www.highgo.com/ > > <v2-0001-tablecmds-reject-CLUSTER-ON-for-partitioned-table.patch><v2-0002-tablecmds-reject-INHERIT-NO-INHERIT-for-partition.patch> PFA v3: 0001 is the same as v2. In 0002: * Restored the header comment of ATPrepAddInherit, because I realized the should belong to ATExecAddInherit. * Renamed ATPrepAddInherit to ATPrepChangeInherit. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/
Commits
-
Refactor some code around ALTER TABLE [NO] INHERIT
- 1a7ccd2b332d 19 (unreleased) landed
-
Add regression test for ALTER TABLE .. NO INHERIT on typed tables
- cbf9a72993ec 19 (unreleased) landed
-
Reject ALTER TABLE .. CLUSTER earlier for partitioned tables
- c336133c65a7 19 (unreleased) landed
-
Ignore partitioned indexes where appropriate
- 05fb5d661925 11.0 cited