On Tue, Sep 8, 2020 at 4:11 PM Andres Freund <and...@anarazel.de> wrote: > At first I was very confused as to why none of the existing tests have > found this significant issue. But after thinking about it for a minute > that's because they all use psql, and largely separate psql invocations > for each query :(. Which means that there's no cached snapshot around...
I prototyped a TAP test patch that could maybe do the sort of thing you need, in patch 0006 over at [1]. Later versions of that patch set dropped it, because I figured out how to use the isolation tester instead, but I guess you can't do that for a standby test (at least not until someone teaches the isolation tester to support multi-node schedules, something that would be extremely useful...). Example: +# start an interactive session that we can use to interleave statements +my $session = PsqlSession->new($node, "postgres"); +$session->send("\\set PROMPT1 ''\n", 2); +$session->send("\\set PROMPT2 ''\n", 1); ... +# our snapshot is not too old yet, so we can still use it +@lines = $session->send("select * from t order by i limit 1;\n", 2); +shift @lines; +$result = shift @lines; +is($result, "1"); ... +# our snapshot is too old! the thing it wants to see has been removed +@lines = $session->send("select * from t order by i limit 1;\n", 2); +shift @lines; +$result = shift @lines; +is($result, "ERROR: snapshot too old"); [1] https://www.postgresql.org/message-id/CA%2BhUKG%2BFkUuDv-bcBns%3DZ_O-V9QGW0nWZNHOkEPxHZWjegRXvw%40mail.gmail.com