MERGE: AFTER ROW trigger failure for cross-partition update

Поиск
Список
Период
Сортировка
От Dean Rasheed
Тема MERGE: AFTER ROW trigger failure for cross-partition update
Дата
Msg-id CAEZATCWjBgagyNZs02vgDF0DvASYj-iHTFtXG2-nP3orZhmtcw@mail.gmail.com
обсуждение исходный текст
Список pgsql-hackers
While working on the MERGE RETURNING patch, I noticed a pre-existing
MERGE bug --- ExecMergeMatched() should not call ExecUpdateEpilogue()
if ExecUpdateAct() indicates that it did a cross-partition update.

The immediate consequence is that it incorrectly tries (and fails) to
fire AFTER UPDATE ROW triggers, which it should not do if the UPDATE
has been turned into a DELETE and an INSERT:

DROP TABLE IF EXISTS foo CASCADE;

CREATE TABLE foo (a int) PARTITION BY LIST (a);
CREATE TABLE foo_p1 PARTITION OF foo FOR VALUES IN (1);
CREATE TABLE foo_p2 PARTITION OF foo FOR VALUES IN (2);
INSERT INTO foo VALUES (1);

CREATE OR REPLACE FUNCTION foo_trig_fn() RETURNS trigger AS
$$
BEGIN
  RAISE NOTICE 'Trigger: % %', TG_WHEN, TG_OP;
  IF TG_OP = 'DELETE' THEN RETURN OLD; END IF;
  RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER foo_b_trig BEFORE INSERT OR UPDATE OR DELETE ON foo
  FOR EACH ROW EXECUTE FUNCTION foo_trig_fn();
CREATE TRIGGER foo_a_trig AFTER INSERT OR UPDATE OR DELETE ON foo
  FOR EACH ROW EXECUTE FUNCTION foo_trig_fn();

UPDATE foo SET a = 2 WHERE a = 1;

NOTICE:  Trigger: BEFORE UPDATE
NOTICE:  Trigger: BEFORE DELETE
NOTICE:  Trigger: BEFORE INSERT
NOTICE:  Trigger: AFTER DELETE
NOTICE:  Trigger: AFTER INSERT
UPDATE 1

MERGE INTO foo USING (VALUES (1)) AS v(a) ON true
  WHEN MATCHED THEN UPDATE SET a = v.a;

NOTICE:  Trigger: BEFORE UPDATE
NOTICE:  Trigger: BEFORE DELETE
NOTICE:  Trigger: BEFORE INSERT
NOTICE:  Trigger: AFTER DELETE
NOTICE:  Trigger: AFTER INSERT
ERROR:  failed to fetch tuple2 for AFTER trigger

The attached patch fixes that, making the UPDATE path in
ExecMergeMatched() consistent with ExecUpdate().

(If there were no AFTER ROW triggers, the old code would go on to do
other unnecessary things, like WCO/RLS checks, which I didn't really
look into. This patch will stop any of that too.)

Regards,
Dean

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Nathan Bossart
Дата:
Сообщение: Re: Commitfest: older Waiting on Author entries
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Relids instead of Bitmapset * in plannode.h