Hi, On 2019-02-02 05:35:21 -0800, Andres Freund wrote: > This breaks HOT (and probably also foreign keys), when fast default > columns are set to NULL, because HeapDetermineModifiedColumns() gets the > values with heap_getattr(), which returns a spurious NULL for the old > value (instead of the fast default value). That then would compare equal > to the new column value set to NULL.
Repro: BEGIN; CREATE TABLE t(); INSERT INTO t DEFAULT VALUES; ALTER TABLE t ADD COLUMN a int default 1; CREATE INDEX ON t(a); UPDATE t SET a = NULL; SET LOCAL enable_seqscan = true; SELECT * FROM t WHERE a IS NULL; SET LOCAL enable_seqscan = false; SELECT * FROM t WHERE a IS NULL; ROLLBACK; output: ... UPDATE 1 SET ┌────────┐ │ a │ ├────────┤ │ (null) │ └────────┘ (1 row) SET ┌───┐ │ a │ ├───┤ └───┘ (0 rows) Greetings, Andres Freund