Обсуждение: bug: repeated ALTER COLUMN SET DATA TYPE corrupt check constraint
hi.
while working on let ALTER COLUMN SET DATA TYPE cope with trigger dependency.
I found this bug, it involves several ALTER COLUMN SET DATA TYPE calls.
DROP TABLE IF EXISTS main_table;
CREATE TABLE main_table (a int, b int, check(a = b));
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE numeric;
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE int;
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE text;
ALTER TABLE main_table ALTER COLUMN b SET DATA TYPE text;
INSERT INTO main_table VALUES ('a', 'a');
This also applies to statistics, indexes. for statistics: the error is only
observable after running ANALYZE manually.
--
jian
https://www.enterprisedb.com/
Re: bug: repeated ALTER COLUMN SET DATA TYPE corrupt check constraint
От
Srinath Reddy Sadipiralla
Дата:
Hi Jian,
On Sat, Dec 27, 2025 at 1:28 PM jian he <jian.universality@gmail.com> wrote:
hi.
while working on let ALTER COLUMN SET DATA TYPE cope with trigger dependency.
I found this bug, it involves several ALTER COLUMN SET DATA TYPE calls.
DROP TABLE IF EXISTS main_table;
CREATE TABLE main_table (a int, b int, check(a = b));
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE numeric;
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE int;
ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE text;
ALTER TABLE main_table ALTER COLUMN b SET DATA TYPE text;
INSERT INTO main_table VALUES ('a', 'a');
This also applies to statistics, indexes. for statistics: the error is only
observable after running ANALYZE manually.
Yeah, I can easily reproduce this.
On Sat, Dec 27, 2025 at 4:32 PM Srinath Reddy Sadipiralla <srinath2133@gmail.com> wrote: >> > > Yeah, I can easily reproduce this. > hi. thinking about it more... I tend to think it's not a bug. because SET DATA TYPE changes the CHECK constraint definition. >> DROP TABLE IF EXISTS main_table; >> CREATE TABLE main_table (a int, b int, check(a = b)); >> ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE numeric; >> ALTER TABLE main_table ALTER COLUMN a SET DATA TYPE int; At this stage, the constraint definition is no longer "a = b", it becomes "(a::numeric = b::numeric)", which is different from "(a = b)". sorry for the noise.