Re: BUG #18970: Atempt to alter type of table column used in row type with check leads to assertion failure
От | jian he |
---|---|
Тема | Re: BUG #18970: Atempt to alter type of table column used in row type with check leads to assertion failure |
Дата | |
Msg-id | CACJufxGYBfGbOj3x0C0U-FsMR4K-gDEyxE6hjBJ870FnkDAO4w@mail.gmail.com обсуждение исходный текст |
Ответ на | BUG #18970: Atempt to alter type of table column used in row type with check leads to assertion failure (PG Bug reporting form <noreply@postgresql.org>) |
Список | pgsql-bugs |
On Sun, Jun 29, 2025 at 1:35 AM PG Bug reporting form <noreply@postgresql.org> wrote: > > The following bug has been logged on the website: > > Bug reference: 18970 > Logged by: Alexander Lakhin > Email address: exclusion@gmail.com > PostgreSQL version: 18beta1 > Operating system: Ubuntu 24.04 > Description: > > The following script: > CREATE TABLE t1(a int); > CREATE TABLE t2(b t1 CHECK ((b).a IS NOT NULL)); > ALTER TABLE t1 ALTER COLUMN a TYPE numeric; > triggers > 2025-06-28 06:52:21.201 UTC [2233016] LOG: statement: ALTER TABLE t1 ALTER > COLUMN a TYPE numeric; > TRAP: failed Assert("lockmode != NoLock || IsBootstrapProcessingMode() || > CheckRelationLockedByMe(r, AccessShareLock, true)"), File: "relation.c", > Line: 67, PID: 2233016 > ExceptionalCondition at assert.c:52:13 > relation_open at relation.c:72:6 > transformAlterTableStmt at parse_utilcmd.c:3543:8 > ATPostAlterTypeParse at tablecmds.c:15600:20 > ATPostAlterTypeCleanup at tablecmds.c:15478:3 > ATRewriteCatalogs at tablecmds.c:5336:11 > ATController at tablecmds.c:4882:2 > AlterTable at tablecmds.c:4535:1 > ... > with an assert-enabled build, and fails with just > ERROR: cannot alter table "t1" because column "t2.b" uses its row type > with no asserts. > Reproduced starting from commit b04aeb0a0, which added the Assert. > hi. this bug can be triggered by exclusion constraints too. drop table if exists t1,t2; CREATE TABLE t1(a int); CREATE TABLE t2(b t1); ALTER TABLE t2 ADD CONSTRAINT xxn EXCLUDE USING btree (((b).a) WITH =); ALTER TABLE t1 ALTER COLUMN a TYPE numeric; in ATPostAlterTypeCleanup /* * When rebuilding an FK constraint that references the table we're * modifying, we might not yet have any lock on the FK's table, so get * one now. We'll need AccessExclusiveLock for the DROP CONSTRAINT * step, so there's no value in asking for anything weaker. */ if (relid != tab->relid && contype == CONSTRAINT_FOREIGN) LockRelationOid(relid, AccessExclusiveLock); we can change to if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); obviously, the comments need to be updated. When altering the data type of a column in one relation causes a constraint of another table rebuild, the other table should be locked with AccessExclusiveLock. but in ATPostAlterTypeCleanup, we only know that tab->relid is locked with the specified lock mode. RememberConstraintForRebuilding only records the constraint information—it doesn't acquire a lock on pg_constraint.conrelid. so in ATPostAlterTypeCleanup, we should lock the tab->changedConstraintOids associated pg_constraint.conrelid.
В списке pgsql-bugs по дате отправления: