Hi Ante,

> ALTER TABLE ... REPLICA IDENTITY USING INDEX checks key columns by
> reading attnotnull, but since a379061a22a8 (PG 18, NOT NULL NOT VALID)
> attnotnull is set even when the constraint is unvalidated.  An index on
> a column that actually contains NULLs is therefore accepted as replica
> identity:
>
>     CREATE TABLE t (id int);
>     INSERT INTO t VALUES (1), (NULL), (2);
>     ALTER TABLE t ADD CONSTRAINT id_nn NOT NULL id NOT VALID;
>     CREATE UNIQUE INDEX t_idx ON t(id);
>     ALTER TABLE t REPLICA IDENTITY USING INDEX t_idx;  -- accepted
>     -- relreplident => 'i'
>
> This would cause data divergence on UPDATE/DELETE targeting NULL-keyed rows.
>
> Patch follows same pattern as d9ffc27291f (the same bugfix for identity 
> columns);
> after the attnotnull check, look up the constraint and reject if 
> !convalidated.

Thanks for the patch. This clearly seems to be a bug.

The patch is well written and has regression tests. The tests pass, I
also tested under Valgrind. All in all the patch looks good to me.

I added the patch to the commitfest application to make sure it's not
going to be lost [1]. Please add yourself as the author.

[1]: https://commitfest.postgresql.org/patch/6801/


--
Best regards,
Aleksander Alekseev


Reply via email to