PG Bug reporting form <noreply@postgresql.org> writes:
> The SQL:
> CREATE TABLE rule_bug_table (
> id serial NOT NULL PRIMARY KEY,
> archived boolean NOT NULL
> );
> CREATE OR REPLACE RULE rule_bug_table__archive_instead_of_delete__rule
> AS ON DELETE TO rule_bug_table
> DO INSTEAD
> UPDATE rule_bug_table
> SET archived = true
> WHERE rule_bug_table."id" = OLD."id"
> RETURNING OLD.*;
> ALTER TABLE rule_bug_table ADD COLUMN select_allowed boolean NOT NULL
> DEFAULT (false);
> DELETE FROM rule_bug_table WHERE id = 1 RETURNING *;
> gives an error "could not find replacement targetlist entry for attno 3".
Hmm. The error message definitely needs to be more user-friendly,
but I don't think this is actually a bug. The rule's RETURNING clause
expands to this during parsing:
RETURNING old.id, old.archived
as you can see with "\d+ rule_bug_table". Then when you try to do
"RETURNING *" in the DELETE, that's asking for a column not available
from the rewritten query. So you *should* get an error, just not one
that looks like it's an internal failure.
The root issue here is that "*" is expanded at parse time for stored
rules and views. Unfortunately, that behavior is specifically demanded
by the SQL spec (at least for the view case), so I doubt we can change it.
regards, tom lane