agora inbox for pgsql-bugs@postgresql.org
help / color / mirror / Atom feedBUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error
3+ messages / 2 participants
[nested] [flat]
* BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error
@ 2026-09-26 09:00 PG Bug reporting form <noreply@postgresql.org>
2026-09-26 14:25 ` Re: BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error Ayush Tiwari <ayushtiwari.slg01@gmail.com>
0 siblings, 1 reply; 3+ messages in thread
From: PG Bug reporting form @ 2026-09-26 09:00 UTC (permalink / raw)
To: pgsql-bugs@lists.postgresql.org; +Cc: exclusion@gmail.com
The following bug has been logged on the website:
Bug reference: 19723
Logged by: Alexander Lakhin
Email address: exclusion@gmail.com
PostgreSQL version: 19beta4
Operating system: Ubuntu 24.04
Description:
The following script:
echo "
CREATE TABLE t (a int, b int) PARTITION BY list (b);
CREATE TABLE tp1 PARTITION OF t FOR VALUES IN (1);
" | psql
for ((i=1;i<=100;i++)); do
echo "iteration $i"
echo "
DROP INDEX t_a_idx;
DROP INDEX t_a_idx2;
CREATE INDEX t_a_idx ON ONLY t (a);
CREATE INDEX tp1_a_idx ON tp1 (a);
" | psql
echo "ALTER INDEX t_a_idx ATTACH PARTITION tp1_a_idx;" | psql &
echo "CREATE INDEX t_a_idx2 ON t(a);" | psql
wait
grep 'ERROR: bogus pg_inherit row' server.log && break;
done
tirggers:
iteration 3
DROP INDEX
DROP INDEX
CREATE INDEX
CREATE INDEX
ERROR: bogus pg_inherit row: inhrelid 16400 inhparent 16399
ALTER INDEX
2026-09-26 04:36:22.653 EDT|user|regression|6ab78406.1ddce8|XX000 ERROR:
bogus pg_inherit row: inhrelid 16400 inhparent 16399
which is described as unexpected:
/*
* A pg_inherits row exists. If it's the same we
want, then we're
* good; if it differs, that amounts to a corrupt
catalog and
* should not happen.
*/
if (inhForm->inhparent != parentOid)
{
/* unexpected: we should not get called in
this case */
elog(ERROR, "bogus pg_inherit row: inhrelid
%u inhparent %u",
inhForm->inhrelid,
inhForm->inhparent);
}
Reproduced starting from 8b08f7d48.
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error
2026-09-26 09:00 BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error PG Bug reporting form <noreply@postgresql.org>
@ 2026-09-26 14:25 ` Ayush Tiwari <ayushtiwari.slg01@gmail.com>
2026-09-28 04:44 ` Re: BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error Ayush Tiwari <ayushtiwari.slg01@gmail.com>
0 siblings, 1 reply; 3+ messages in thread
From: Ayush Tiwari @ 2026-09-26 14:25 UTC (permalink / raw)
To: exclusion@gmail.com; pgsql-bugs@lists.postgresql.org
Hi,
On Sat, 26 Sept 2026 at 18:51, PG Bug reporting form
<noreply@postgresql.org> wrote:
>
> The following bug has been logged on the website:
>
> Bug reference: 19723
> Logged by: Alexander Lakhin
> Email address: exclusion@gmail.com
> PostgreSQL version: 19beta4
> Operating system: Ubuntu 24.04
> Description:
>
> The following script:
> echo "
> CREATE TABLE t (a int, b int) PARTITION BY list (b);
> CREATE TABLE tp1 PARTITION OF t FOR VALUES IN (1);
> " | psql
>
> for ((i=1;i<=100;i++)); do
> echo "iteration $i"
> echo "
> DROP INDEX t_a_idx;
> DROP INDEX t_a_idx2;
> CREATE INDEX t_a_idx ON ONLY t (a);
> CREATE INDEX tp1_a_idx ON tp1 (a);
> " | psql
>
> echo "ALTER INDEX t_a_idx ATTACH PARTITION tp1_a_idx;" | psql &
> echo "CREATE INDEX t_a_idx2 ON t(a);" | psql
> wait
> grep 'ERROR: bogus pg_inherit row' server.log && break;
> done
>
> tirggers:
> iteration 3
> DROP INDEX
> DROP INDEX
> CREATE INDEX
> CREATE INDEX
> ERROR: bogus pg_inherit row: inhrelid 16400 inhparent 16399
> ALTER INDEX
> 2026-09-26 04:36:22.653 EDT|user|regression|6ab78406.1ddce8|XX000 ERROR:
> bogus pg_inherit row: inhrelid 16400 inhparent 16399
>
> which is described as unexpected:
> /*
> * A pg_inherits row exists. If it's the same we
> want, then we're
> * good; if it differs, that amounts to a corrupt
> catalog and
> * should not happen.
> */
> if (inhForm->inhparent != parentOid)
> {
> /* unexpected: we should not get called in
> this case */
> elog(ERROR, "bogus pg_inherit row: inhrelid
> %u inhparent %u",
> inhForm->inhrelid,
> inhForm->inhparent);
> }
>
> Reproduced starting from 8b08f7d48.
Thanks for the report with repro and bisect.
I think I see how this happens. DefineIndex() calls has_superclass()
before locking the child index, although its comment says the caller
*must hold that lock*. If ALTER INDEX ... ATTACH hasn't committed yet,
CREATE INDEX sees the child as unattached, waits in index_open(), and
then tries to attach it to its new parent after ATTACH commits.
Would it make sense to open the index before calling has_superclass()?
Then the check would see the attachment after the wait and skip that
index.
The below simple diff fixed the issue for me:
---
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 5a0312fe772..561dd124e2c 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -1453,11 +1453,14 @@ DefineIndex(ParseState *pstate,
Relation cldidx;
IndexInfo *cldIdxInfo;
+ cldidx = index_open(cldidxid, lockmode);
/* this index is already partition of another one */
if (has_superclass(cldidxid))
+ {
+ index_close(cldidx, lockmode);
continue;
+ }
- cldidx = index_open(cldidxid, lockmode);
cldIdxInfo = BuildIndexInfo(cldidx);
Regards,
Ayush
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error
2026-09-26 09:00 BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error PG Bug reporting form <noreply@postgresql.org>
2026-09-26 14:25 ` Re: BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error Ayush Tiwari <ayushtiwari.slg01@gmail.com>
@ 2026-09-28 04:44 ` Ayush Tiwari <ayushtiwari.slg01@gmail.com>
0 siblings, 0 replies; 3+ messages in thread
From: Ayush Tiwari @ 2026-09-28 04:44 UTC (permalink / raw)
To: exclusion@gmail.com, pgsql-bugs@lists.postgresql.org, Álvaro Herrera <alvherre@kurilemu.de>
Hi,
On Sat, 26 Sept 2026 at 19:55, Ayush Tiwari <ayushtiwari.slg01@gmail.com> wrote:
> On Sat, 26 Sept 2026 at 18:51, PG Bug reporting form
> <noreply@postgresql.org> wrote:
> >
> > The following bug has been logged on the website:
> >
> > Bug reference: 19723
> > Logged by: Alexander Lakhin
> > Email address: exclusion@gmail.com
> > PostgreSQL version: 19beta4
> > Operating system: Ubuntu 24.04
> > Description:
> >
> > The following script:
> > echo "
> > CREATE TABLE t (a int, b int) PARTITION BY list (b);
> > CREATE TABLE tp1 PARTITION OF t FOR VALUES IN (1);
> > " | psql
> >
> > for ((i=1;i<=100;i++)); do
> > echo "iteration $i"
> > echo "
> > DROP INDEX t_a_idx;
> > DROP INDEX t_a_idx2;
> > CREATE INDEX t_a_idx ON ONLY t (a);
> > CREATE INDEX tp1_a_idx ON tp1 (a);
> > " | psql
> >
> > echo "ALTER INDEX t_a_idx ATTACH PARTITION tp1_a_idx;" | psql &
> > echo "CREATE INDEX t_a_idx2 ON t(a);" | psql
> > wait
> > grep 'ERROR: bogus pg_inherit row' server.log && break;
> > done
> >
> > tirggers:
> > iteration 3
> > DROP INDEX
> > DROP INDEX
> > CREATE INDEX
> > CREATE INDEX
> > ERROR: bogus pg_inherit row: inhrelid 16400 inhparent 16399
> > ALTER INDEX
> > 2026-09-26 04:36:22.653 EDT|user|regression|6ab78406.1ddce8|XX000 ERROR:
> > bogus pg_inherit row: inhrelid 16400 inhparent 16399
> >
> > which is described as unexpected:
> > /*
> > * A pg_inherits row exists. If it's the same we
> > want, then we're
> > * good; if it differs, that amounts to a corrupt
> > catalog and
> > * should not happen.
> > */
> > if (inhForm->inhparent != parentOid)
> > {
> > /* unexpected: we should not get called in
> > this case */
> > elog(ERROR, "bogus pg_inherit row: inhrelid
> > %u inhparent %u",
> > inhForm->inhrelid,
> > inhForm->inhparent);
> > }
> >
> > Reproduced starting from 8b08f7d48.
>
> Thanks for the report with repro and bisect.
>
> I think I see how this happens. DefineIndex() calls has_superclass()
> before locking the child index, although its comment says the caller
> *must hold that lock*. If ALTER INDEX ... ATTACH hasn't committed yet,
> CREATE INDEX sees the child as unattached, waits in index_open(), and
> then tries to attach it to its new parent after ATTACH commits.
>
> Would it make sense to open the index before calling has_superclass()?
> Then the check would see the attachment after the wait and skip that
> index.
>
> The below simple diff fixed the issue for me:
>
> ---
> diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
> index 5a0312fe772..561dd124e2c 100644
> --- a/src/backend/commands/indexcmds.c
> +++ b/src/backend/commands/indexcmds.c
> @@ -1453,11 +1453,14 @@ DefineIndex(ParseState *pstate,
> Relation cldidx;
> IndexInfo *cldIdxInfo;
>
> + cldidx = index_open(cldidxid, lockmode);
> /* this index is already partition of another one */
> if (has_superclass(cldidxid))
> + {
> + index_close(cldidx, lockmode);
> continue;
> + }
>
> - cldidx = index_open(cldidxid, lockmode);
> cldIdxInfo = BuildIndexInfo(cldidx);
Post some more testing, attaching patch file with above diff.
Regards,
Ayush
Attachments:
[application/octet-stream] v1-0001-Lock-child-index-before-checking-its-parent.patch (1.7K, ../../CAJTYsWV3K0vN1c=4ZEybDtcMKRLk2qatFvG2aQRQ1ZXVWXMn3Q@mail.gmail.com/2-v1-0001-Lock-child-index-before-checking-its-parent.patch)
download | inline diff:
From 743ad3a5a9c2f4c01a2c1a2e194f01610d608aa3 Mon Sep 17 00:00:00 2001
From: Ayush Tiwari <ayushtiwari.slg01@gmail.com>
Date: Mon, 28 Sep 2026 09:53:34 +0530
Subject: [PATCH v1] Lock child index before checking its partition parent
When creating an index on a partitioned table, DefineIndex() may
reuse an existing index on a partition. It calls has_superclass()
before locking the child index, though has_superclass() requires it.
If ALTER INDEX ... ATTACH PARTITION commits while CREATE INDEX
waits for the child index lock, the earlier check becomes stale.
CREATE INDEX can then try to attach the child index to a different
parent and report "bogus pg_inherit row".
Lock the child index before calling has_superclass(), so the check
sees the attachment after the lock wait. Close the index when it is
already attached.
Reported-by: Alexander Lakhin <exclusion@gmail.com>
Bug: #19723
---
src/backend/commands/indexcmds.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 5a0312fe772..561dd124e2c 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -1453,11 +1453,14 @@ DefineIndex(ParseState *pstate,
Relation cldidx;
IndexInfo *cldIdxInfo;
+ cldidx = index_open(cldidxid, lockmode);
/* this index is already partition of another one */
if (has_superclass(cldidxid))
+ {
+ index_close(cldidx, lockmode);
continue;
+ }
- cldidx = index_open(cldidxid, lockmode);
cldIdxInfo = BuildIndexInfo(cldidx);
if (CompareIndexInfo(cldIdxInfo, indexInfo,
cldidx->rd_indcollation,
--
2.34.1
^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2026-09-28 04:44 UTC | newest]
Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-09-26 09:00 BUG #19723: CREATE INDEX racing with ALTER INDEX ATTACH PARTITION triggers unexpected internal error PG Bug reporting form <noreply@postgresql.org>
2026-09-26 14:25 ` Ayush Tiwari <ayushtiwari.slg01@gmail.com>
2026-09-28 04:44 ` Ayush Tiwari <ayushtiwari.slg01@gmail.com>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox