Re: [BUGS] BUG #14809: Heap Corruption with deeply nested triggers.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [BUGS] BUG #14809: Heap Corruption with deeply nested triggers.
Дата
Msg-id 5242.1504979216@sss.pgh.pa.us
обсуждение исходный текст
Ответ на [BUGS] BUG #14809: Heap Corruption with deeply nested triggers.  (matthew.r.maurer@gmail.com)
Ответы Re: [BUGS] BUG #14809: Heap Corruption with deeply nested triggers.  (Matthew Maurer <matthew.r.maurer@gmail.com>)
Список pgsql-bugs
matthew.r.maurer@gmail.com writes:
> Log looks like: https://bpaste.net/show/4c1d3940ca27
> https://data.maurer.codes/clique.sql contains a reproduction case.

For the archives' sake, it'd have been better to include the test case.
The test isn't very large so I'll attach it below.

> On my machine, this consistently causes the glibc heap assertion in about 9
> seconds on a fresh database. If you get "ERROR:  stack depth limit exceeded"
> you may need to increase your max_stack_depth to observe the error (mine was
> 2MB, but is a release build, debug builds might need more to hit this).

I tried a few different max_stack_depth settings on both 9.6 and HEAD,
but was unable to reproduce a crash.  I see either a clean "stack depth
limit exceeded" failure, or successful completion of the query (at
stack depths above circa 3MB for me).  Tested on RHEL6 x86_64; maybe
some other platform would show the problem.

            regards, tom lane

-- General initialization
CREATE SCHEMA facts;
-- Define predicates
CREATE TABLE facts.edge (id serial PRIMARY KEY, arg0 bigint, arg1 bigint);
CREATE TABLE facts.reachable (id serial PRIMARY KEY, arg0 bigint, arg1 bigint);
CREATE TABLE facts.same_clique (id serial PRIMARY KEY, arg0 bigint, arg1 bigint);
-- Restrict predicates to contain unique facts
CREATE UNIQUE INDEX pred_edge_unique ON facts.edge (arg0,arg1);
CREATE UNIQUE INDEX pred_reachable_unique ON facts.reachable (arg0,arg1);
CREATE UNIQUE INDEX pred_same_clique_unique ON facts.same_clique (arg0,arg1);
-- Add triggers to automate rules

CREATE FUNCTION holmes_rule_reach_edge_0() RETURNS trigger AS $reach_edge$
    BEGIN
    INSERT INTO facts.reachable (arg0, arg1) (SELECT NEW.arg0, NEW.arg1  ) ON CONFLICT DO NOTHING;
    RETURN NULL;
    END;
    $reach_edge$ LANGUAGE plpgsql;
    CREATE TRIGGER holmes_rule_reach_edge_0 AFTER INSERT ON facts.edge FOR EACH ROW EXECUTE PROCEDURE
holmes_rule_reach_edge_0();
;

CREATE FUNCTION holmes_rule_reach_trans_0() RETURNS trigger AS $reach_trans$
    BEGIN
    INSERT INTO facts.reachable (arg0, arg1) (SELECT NEW.arg0, t0.arg1 FROM facts.reachable as t0 WHERE NEW.arg1 =
t0.arg0)ON CONFLICT DO NOTHING; 
    RETURN NULL;
    END;
    $reach_trans$ LANGUAGE plpgsql;
    CREATE TRIGGER holmes_rule_reach_trans_0 AFTER INSERT ON facts.edge FOR EACH ROW EXECUTE PROCEDURE
holmes_rule_reach_trans_0();


CREATE FUNCTION holmes_rule_reach_trans_1() RETURNS trigger AS $reach_trans$
    BEGIN
    INSERT INTO facts.reachable (arg0, arg1) (SELECT t0.arg0, NEW.arg1 FROM facts.edge as t0 WHERE t0.arg1 = NEW.arg0)
ONCONFLICT DO NOTHING; 
    RETURN NULL;
    END;
    $reach_trans$ LANGUAGE plpgsql;
    CREATE TRIGGER holmes_rule_reach_trans_1 AFTER INSERT ON facts.reachable FOR EACH ROW EXECUTE PROCEDURE
holmes_rule_reach_trans_1();
;

CREATE FUNCTION holmes_rule_scc_0() RETURNS trigger AS $scc$
    BEGIN
    INSERT INTO facts.same_clique (arg0, arg1) (SELECT NEW.arg0, NEW.arg1 FROM facts.reachable as t0 WHERE NEW.arg1 =
t0.arg0AND NEW.arg0 = t0.arg1) ON CONFLICT DO NOTHING; 
    RETURN NULL;
    END;
    $scc$ LANGUAGE plpgsql;
    CREATE TRIGGER holmes_rule_scc_0 AFTER INSERT ON facts.reachable FOR EACH ROW EXECUTE PROCEDURE
holmes_rule_scc_0();


CREATE FUNCTION holmes_rule_scc_1() RETURNS trigger AS $scc$
    BEGIN
    INSERT INTO facts.same_clique (arg0, arg1) (SELECT t0.arg0, t0.arg1 FROM facts.reachable as t0 WHERE t0.arg1 =
NEW.arg0AND t0.arg0 = NEW.arg1) ON CONFLICT DO NOTHING; 
    RETURN NULL;
    END;
    $scc$ LANGUAGE plpgsql;
    CREATE TRIGGER holmes_rule_scc_1 AFTER INSERT ON facts.reachable FOR EACH ROW EXECUTE PROCEDURE
holmes_rule_scc_1();
;

CREATE FUNCTION insert_for_clique(iters int) RETURNS VOID as $$
DECLARE
counter integer := 0;
BEGIN
    LOOP
        EXIT WHEN counter = iters;
        INSERT INTO facts.edge (arg0, arg1) values (counter, counter + 1);
        counter := counter + 1;
    END LOOP;
    INSERT INTO facts.edge (arg0, arg1) values (counter, 0);
END ; $$ LANGUAGE plpgsql;

SELECT insert_for_clique(1000);

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [BUGS] BUG #14808: V10-beta4, backend abort
Следующее
От: Matthew Maurer
Дата:
Сообщение: Re: [BUGS] BUG #14809: Heap Corruption with deeply nested triggers.