Op 29-03-2022 om 12:50 schreef Matthias van de Meent:
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;

Excellent. That indeed immediately forces the error.

(and the patch prevents it)

Thanks!



Enjoy,

-Matthias


Reply via email to