Is this a bug ?, the new.a_id in my opinion should not be replaced here with nextval () function but with the actual value returned by the sequence. Please have this minimal example .
CREATE TABLE a
(
a_id serial primary key
);
CREATE TABLE b
(
b_id serial Primary key
);
CREATE TABLE a_b
(
a_id INTEGER REFERENCES a (a_id),
b_id INTEGER REFERENCES b (b_id)
);
INSERT INTO b SELECT n FROM generate_series(1,10) AS n;
CREATE RULE a_a_b_insert AS ON INSERT TO a DO INSERT INTO a_b SELECT new.a_id , b_id FROM b;
INSERT INTO a (a_id) VALUES (DEFAULT);