Re: BUG #16661: Changing columns after the rule is created leads to an error when the RETURNING is used
| От | Tom Lane | 
|---|---|
| Тема | Re: BUG #16661: Changing columns after the rule is created leads to an error when the RETURNING is used | 
| Дата | |
| Msg-id | 2576538.1602178210@sss.pgh.pa.us обсуждение исходный текст | 
| Ответ на | BUG #16661: Changing columns after the rule is created leads to an error when the RETURNING is used (PG Bug reporting form <noreply@postgresql.org>) | 
| Список | pgsql-bugs | 
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
		
	В списке pgsql-bugs по дате отправления: