The problem: In Postgresql, if table temp_person_two inherits from temp_person , default column values on the child table are ignored if the parent table is altered.

How to replicate:

First, create table and a child table. The child table should have one column that has a default value.

CREATE TEMPORARY TABLE temp_person ( person_id SERIAL, name VARCHAR ); CREATE TEMPORARY TABLE temp_person_two ( has_default character varying(4) DEFAULT 'en'::character varying NOT NULL ) INHERITS (temp_person);

Next, create a trigger on the parent table that copies its data to the child table (I know this appears like bad design, but this is a minimal test case to show the problem).

CREATE FUNCTION temp_person_insert() RETURNS trigger LANGUAGE plpgsql AS ' BEGIN INSERT INTO temp_person_two VALUES ( NEW.* ); RETURN NULL; END; '; CREATE TRIGGER temp_person_insert_trigger BEFORE INSERT ON temp_person FOR EACH ROW EXECUTE PROCEDURE temp_person_insert();

Then insert data into parent and select data from child. The data should be correct.

INSERT INTO temp_person (name) VALUES ('ovid'); SELECT * FROM temp_person_two; person_id | name | has_default -----------+------+------------- 1 | ovid | en (1 row )

Finally, alter parent table by adding a new, unrelated column. Attempt to insert data and watch a "not-null constraint" violation occur:

ALTER TABLE temp_person ADD column foo text; INSERT INTO temp_person(name) VALUES ('Corinna'); ERROR: null value in column "has_default" violates not-null constraint CONTEXT: SQL statement "INSERT INTO temp_person_two VALUES ( $1 .* )" PL/pgSQL function "temp_person_insert" line 2 at SQL statement

My version: