odd behavior/possible bug (Was: Re: PG10 partitioning - odd behavior/possible bug)

From: Joe Conway <mail(at)joeconway(dot)com>
To: PostgreSQL-development <pgsql-hackers(at)postgreSQL(dot)org>
Subject: odd behavior/possible bug (Was: Re: PG10 partitioning - odd behavior/possible bug)
Date: 2017-09-03 22:22:17
Message-ID: 3dbbd878-cbb8-6c97-6953-d4c646d4da93@joeconway.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 09/03/2017 02:28 PM, Joe Conway wrote:
> I was playing around with partitioning and found an oddity that is best
> described with the following reasonably minimal test case:

<snip>

> Notice that in the first loop iteration tsr is calculated from OLD.tr
> correctly. But in the second loop iteration it is not, and therefore no
> partition can be found for the insert.
>
> I have not dug too deeply into this yet, but was wondering if this
> behavior is sane/expected for some reason I am missing?

This does not require partitioning to reproduce -- sorry for the false
accusations ;-)

8<---------------
CREATE TABLE timetravel
(
id int8,
f1 text not null,
tr tstzrange not null default tstzrange(now(), 'infinity', '[]')
);

CREATE OR REPLACE FUNCTION modify_timetravel()
RETURNS TRIGGER AS $$
DECLARE
tsr tstzrange;
BEGIN
RAISE NOTICE 'OLD.tr = %', OLD.tr;

tsr := tstzrange(lower(OLD.tr), now(), '[)');
RAISE NOTICE 'tsr = %', tsr;

OLD.tr = tsr;
INSERT INTO timetravel VALUES (OLD.*);
IF (TG_OP = 'UPDATE') THEN
tsr := tstzrange(now(), 'infinity', '[]');
RAISE NOTICE 'NEW.tr = %', tsr;
NEW.tr = tsr;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
RETURN OLD;
END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER timetravel_audit BEFORE DELETE OR UPDATE
ON timetravel FOR EACH ROW EXECUTE PROCEDURE modify_timetravel();

INSERT INTO timetravel(id, f1)
SELECT g.i, 'row-' || g.i::text
FROM generate_series(1,10) AS g(i);

DO $$
DECLARE
i int;
BEGIN
FOR i IN 1..2 LOOP
RAISE NOTICE 'loop = %', i;
UPDATE timetravel SET f1 = f1 || '-r' || i where id < 4;
END LOOP;
END
$$;
NOTICE: loop = 1
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07",infinity]
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07",infinity]
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07",infinity]
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: loop = 2
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: tsr = empty
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: tsr = empty
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: tsr = ["2017-09-03 15:17:31.598734-07","2017-09-03
15:17:31.608018-07")
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: OLD.tr = ["2017-09-03 15:17:31.608018-07",infinity]
NOTICE: tsr = empty
NOTICE: NEW.tr = ["2017-09-03 15:17:31.608018-07",infinity]
DO
8<---------------

Notice that tsr is not empty at all on the first loop, but on the second
loop it is empty every second time the trigger fires.

Joe

--
Crunchy Data - http://crunchydata.com
PostgreSQL Support for Secure Enterprises
Consulting, Training, & Open Source Development

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2017-09-03 22:34:26 Re: odd behavior/possible bug (Was: Re: PG10 partitioning - odd behavior/possible bug)
Previous Message Tom Lane 2017-09-03 22:20:17 Re: [bug fix] Savepoint-related statements terminates connection