On Tue, 29 Mar 2022 at 11:10, Kyotaro Horiguchi <horikyota....@gmail.com> wrote: > > At Tue, 29 Mar 2022 17:06:21 +0900 (JST), Kyotaro Horiguchi > <horikyota....@gmail.com> wrote in > > At Mon, 28 Mar 2022 18:36:46 +0900 (JST), Kyotaro Horiguchi > > <horikyota....@gmail.com> wrote in > > Then, I found that portal->holdSnapshot is that. I came up with the > > attached. It does the follows: > > > > 1. Teach PlannedStmtRequiresSnapshot() to return true for FetchStmt. > > > > 2. Use holdSnapshot in RunFromStore if any. > > > > > > The rerpducer is reduced to as small as the following. > > > > CREATE TABLE t (a text); > > INSERT INTO t VALUES('some random text'); > > BEGIN; > > DECLARE c CURSOR FOR SELECT * FROM t; > > FETCH ALL IN c; > > > > But I haven't come up with a reasonable way to generate the 'some > > random text' yet. > > I gave up and took a straightforward way to generate one. > > I don't like that it uses a fixed length for the random text, but > anyway it works for now...
An shorter (?) reproducer might be the following, which forces any value for 'a' to be toasted and thus triggering the check in init_toast_snapshot regardless of value length: CREATE TABLE t (a text); ALTER TABLE t ALTER COLUMN a SET STORAGE EXTERNAL; INSERT INTO t VALUES ('toast'); BEGIN; DECLARE c CURSOR FOR SELECT * FROM t; FETCH ALL IN c; Enjoy, -Matthias