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 по дате отправления: