Re: bug when apply fast default mechanism for adding new column over domain with default value
От | jian he |
---|---|
Тема | Re: bug when apply fast default mechanism for adding new column over domain with default value |
Дата | |
Msg-id | CACJufxG97GWGC3kczph04JjLHKGDMH4oVou1_yXKHxFSqAHwBQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: bug when apply fast default mechanism for adding new column over domain with default value (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: bug when apply fast default mechanism for adding new column over domain with default value
|
Список | pgsql-hackers |
On Sat, Mar 1, 2025 at 2:43 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > I do not believe that case should require a table rewrite. > Both the default and the check constraint are immutable, > so we ought to be able to apply the check once and then > use the default as the attmissingval. > > > Attach a patch to fix this issue by cause it to table rewrite. > > I see no attached patch, but in any case forcing a table rewrite > seems like the wrong direction... > forcing table rewrite would be an easier fix. but not forcing table write seems doable. \d pg_attrdef Table "pg_catalog.pg_attrdef" Column | Type | Collation | Nullable | Default ---------+--------------+-----------+----------+--------- oid | oid | | not null | adrelid | oid | | not null | adnum | smallint | | not null | adbin | pg_node_tree | C | not null | Indexes: "pg_attrdef_oid_index" PRIMARY KEY, btree (oid) "pg_attrdef_adrelid_adnum_index" UNIQUE CONSTRAINT, btree (adrelid, adnum) pg_attrdef_adrelid_adnum_index means a column can only have one default expression adbin. if we store domain's default expression in pg_attrdef it may have error like: CREATE DOMAIN int_domain AS int DEFAULT 11; ALTER TABLE t2 ADD COLUMN b int_domain default 3; ERROR: duplicate key value violates unique constraint "pg_attrdef_adrelid_adnum_index" DETAIL: Key (adrelid, adnum)=(18102, 2) already exists. currently function StoreAttrDefault will 1. set pg_attribute.atthasdef 2. compute and set atthasmissing, attmissingval 3. insert an entry in pg_attrdef. but we only want 2. So I duplicated StoreAttrDefault and removed pg_attribute.atthasdef, pg_attrdef related code. and it works fine.
Вложения
В списке pgsql-hackers по дате отправления: