ATPrepCmd: cleanup unreachable AT_AddIndexConstraint handling

Started by Chao Li3 months ago4 messageshackers
Jump to latest
#1Chao Li
li.evan.chao@gmail.com

Hi Hackers,

While working on the patch [1]/messages/by-id/CAEoWx2kggo1N2kDH6OSfXHL_5gKg3DqQ0PdNuL4LH4XSTKJ3-g@mail.gmail.com, I was looking at the handling of AT_AddIndexConstraint in ATPrepCmd():
```
ATPrepCmd()
{
case AT_AddIndexConstraint: /* ADD CONSTRAINT USING INDEX */
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_PARTITIONED_TABLE);
/* This command never recurses */
/* No command-specific prep needed */
pass = AT_PASS_ADD_INDEXCONSTR;
}
```

I initially thought the comment about “never recurses” was stale, but after some debugging, I found that this branch is actually unreachable. So leaving the code and comments in an unreachable branch would be confusing for readers.

This patch cleans up the handling by putting an Assert(false) there and adding a comment to explain why this code path is unreachable. I did think about just deleting the branch, but decided to keep it: if it were removed entirely, readers might wonder why AT_AddIndexConstraint is not handled in ATPrepCmd() and end up spending time debugging this themselves.

Two things to note in the patch:

1) The test edits are purely cosmetic. They just change lowercase keywords to uppercase to align with surrounding SQL statements, and remove an unnecessary whitespace. I noticed this while debugging ADD CONSTRAINT USING INDEX, and the change felt too trivial to file a separate patch.

2) There is an unnecessary empty line after "case AT_AddIndexConstraint:" that was added by pgindent. I believe this is a known pgindent issue that I reported before.

With this patch applied, all regression tests pass.

[1]: /messages/by-id/CAEoWx2kggo1N2kDH6OSfXHL_5gKg3DqQ0PdNuL4LH4XSTKJ3-g@mail.gmail.com

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

Attachments:

v1-0001-tablecmds-cleanup-unreachable-AT_AddIndexConstrai.patchapplication/octet-stream; name=v1-0001-tablecmds-cleanup-unreachable-AT_AddIndexConstrai.patch; x-unix-mode=0644Download+16-9
#2Chao Li
li.evan.chao@gmail.com
In reply to: Chao Li (#1)
Re: ATPrepCmd: cleanup unreachable AT_AddIndexConstraint handling

On Jan 28, 2026, at 14:14, Chao Li <li.evan.chao@gmail.com> wrote:

Hi Hackers,

While working on the patch [1], I was looking at the handling of AT_AddIndexConstraint in ATPrepCmd():
```
ATPrepCmd()
{
case AT_AddIndexConstraint: /* ADD CONSTRAINT USING INDEX */
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_PARTITIONED_TABLE);
/* This command never recurses */
/* No command-specific prep needed */
pass = AT_PASS_ADD_INDEXCONSTR;
}
```

I initially thought the comment about “never recurses” was stale, but after some debugging, I found that this branch is actually unreachable. So leaving the code and comments in an unreachable branch would be confusing for readers.

This patch cleans up the handling by putting an Assert(false) there and adding a comment to explain why this code path is unreachable. I did think about just deleting the branch, but decided to keep it: if it were removed entirely, readers might wonder why AT_AddIndexConstraint is not handled in ATPrepCmd() and end up spending time debugging this themselves.

I thought over and decided to delete AT_AddIndexConstraint from ATPrepCmd, which should be cleaner.

PFA v2:

* Deleted AT_AddIndexConstraint from ATPrepCmd
* Added a comment under AT_AddConstraint to explain how AT_AddIndexConstraint is handled

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

Attachments:

v2-0001-tablecmds-cleanup-unreachable-AT_AddIndexConstrai.patchapplication/octet-stream; name=v2-0001-tablecmds-cleanup-unreachable-AT_AddIndexConstrai.patch; x-unix-mode=0644Download+14-12
#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chao Li (#2)
Re: ATPrepCmd: cleanup unreachable AT_AddIndexConstraint handling

Chao Li <li.evan.chao@gmail.com> writes:

On Jan 28, 2026, at 14:14, Chao Li <li.evan.chao@gmail.com> wrote:

I initially thought the comment about “never recurses” was stale, but after some debugging, I found that this branch is actually unreachable. So leaving the code and comments in an unreachable branch would be confusing for readers.

This patch cleans up the handling by putting an Assert(false) there and adding a comment to explain why this code path is unreachable. I did think about just deleting the branch, but decided to keep it: if it were removed entirely, readers might wonder why AT_AddIndexConstraint is not handled in ATPrepCmd() and end up spending time debugging this themselves.

I thought over and decided to delete AT_AddIndexConstraint from ATPrepCmd, which should be cleaner.

Your first version was very substantially better. The Assert is
important to help debug things if somebody changes the parsing
logic in a way that falsifies the assumption that we can't get
here for AT_AddIndexConstraint. And, as you thought originally,
it's better to clearly document why we think this case is
unreachable than to leave it looking like possibly an oversight.
(I do not think a comment in some other case-branch accomplishes
that.)

Also, a look at the code coverage report suggests that the same
might be true for AT_AddIndex. Can we replace that branch too
with an Assert(false)?

Matter of taste perhaps, but if I were committing this I would
drop these case-folding-only changes in the regression tests.
That's just useless code churn, accomplishing nothing except
to create a hazard for possible future back-patches.

regards, tom lane

#4Chao Li
li.evan.chao@gmail.com
In reply to: Tom Lane (#3)
Re: ATPrepCmd: cleanup unreachable AT_AddIndexConstraint handling

On Jan 29, 2026, at 13:12, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Chao Li <li.evan.chao@gmail.com> writes:

On Jan 28, 2026, at 14:14, Chao Li <li.evan.chao@gmail.com> wrote:

I initially thought the comment about “never recurses” was stale, but after some debugging, I found that this branch is actually unreachable. So leaving the code and comments in an unreachable branch would be confusing for readers.

This patch cleans up the handling by putting an Assert(false) there and adding a comment to explain why this code path is unreachable. I did think about just deleting the branch, but decided to keep it: if it were removed entirely, readers might wonder why AT_AddIndexConstraint is not handled in ATPrepCmd() and end up spending time debugging this themselves.

I thought over and decided to delete AT_AddIndexConstraint from ATPrepCmd, which should be cleaner.

Your first version was very substantially better. The Assert is
important to help debug things if somebody changes the parsing
logic in a way that falsifies the assumption that we can't get
here for AT_AddIndexConstraint. And, as you thought originally,
it's better to clearly document why we think this case is
unreachable than to leave it looking like possibly an oversight.
(I do not think a comment in some other case-branch accomplishes
that.)

Also, a look at the code coverage report suggests that the same
might be true for AT_AddIndex. Can we replace that branch too
with an Assert(false)?

Matter of taste perhaps, but if I were committing this I would
drop these case-folding-only changes in the regression tests.
That's just useless code churn, accomplishing nothing except
to create a hazard for possible future back-patches.

regards, tom lane

Thanks for the guidance.

I verified AT_AddIndex with:
```
create table t1 (id int);
alter table t1 add primary key (id);
```

“Add primary key” is also initially parsed as AT_AddConstraint, then transformed to AT_AddIndex during the execution phase.

So in v3 I reverted back to the v1 approach and placed AT_AddIndex next to AT_AddIndexConstraint in ATPrepCmd, putting them in the same branch so they share the same assertion and explanatory comment.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

Attachments:

v3-0001-tablecmds-cleanup-unreachable-AT_AddIndex-and-AT_.patchapplication/octet-stream; name=v3-0001-tablecmds-cleanup-unreachable-AT_AddIndex-and-AT_.patch; x-unix-mode=0644Download+18-15