Re: max_stack_depth Exceeded

From: Ow Mun Heng <Ow(dot)Mun(dot)Heng(at)wdc(dot)com>
To: Magnus Hagander <magnus(at)hagander(dot)net>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: max_stack_depth Exceeded
Date: 2008-09-05 08:58:20
Message-ID: 1220605100.11681.65.camel@neuromancer.home.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Fri, 2008-09-05 at 10:35 +0200, Magnus Hagander wrote:
> Ow Mun Heng wrote:
> > Hi,
> >
> > I'm playing around with triggers to implement partitioning.
> > I hit something which I don't know what and I don't have internet here
> > at work to find out what is the cause.
> >
> >
> > ERROR : stack depth limit exceeded
> >
> > I see that this is one of the options in postgresql.conf but I don't
> > know exactly what it is.
>
> Sounds like you may have created a situation with infinite recursion.
>
> Like in some branch your trigger is inserting back into the parent
> table, thus firing the trigger again in an endless loop, instead of
> inserting it into the proper child table.

This seems simple enough.

CREATE OR REPLACE FUNCTION head_raw_all_test_2_insert_trigger()
RETURNS "trigger" AS
$BODY$
BEGIN

IF ( NEW.test_run_start_date_time >= '2008-08-18' and
NEW.test_run_start_date_time < '2008-08-19' ) THEN
INSERT INTO head_raw_all_test_2_prod_8_18 VALUES (NEW.*);
ELSEIF ( NEW.test_run_start_date_time >= '2008-08-19' and
NEW.test_run_start_date_time < '2008-08-20' ) THEN
INSERT INTO head_raw_all_test_2_prod_8_19 VALUES (NEW.*);
ELSE
INSERT INTO head_raw_all_test_2 VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

This one, though, works.

CREATE OR REPLACE FUNCTION head_raw_all_test_insert_trigger()
RETURNS "trigger" AS
$BODY$
BEGIN

IF ( NEW.dcm_evaluation_code = 'PROD' OR NEW.dcm_evaluation_code is
null) THEN
INSERT INTO head_raw_all_test_prod VALUES (NEW.*);
ELSEIF ( NEW.dcm_evaluation_code <> 'PROD' ) THEN
INSERT INTO head_raw_all_test_eval VALUES (NEW.*);
ELSE
INSERT INTO head_raw_all_test VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION head_raw_all_test_insert_trigger() OWNER TO "operator";

Am I doing something wrong? Is the ELSE condition that is making it
recurse further and further?

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Jef Peeraer 2008-09-05 09:39:41 xml queries & date format
Previous Message Magnus Hagander 2008-09-05 08:35:47 Re: max_stack_depth Exceeded