Re: BitmapHeapScan streaming read user and prelim refactoring

From: Andres Freund <andres(at)anarazel(dot)de>
To: Alexander Lakhin <exclusion(at)gmail(dot)com>
Cc: Melanie Plageman <melanieplageman(at)gmail(dot)com>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Tomas Vondra <tomas(at)vondra(dot)me>, Nazir Bilal Yavuz <byavuz81(at)gmail(dot)com>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: BitmapHeapScan streaming read user and prelim refactoring
Date: 2025-03-22 20:42:42
Message-ID: xho3hx5jda6ucdzytjb2hgbpwxbrbtlz5m626sardw2rv35zvu@g6g3eqr4u52f
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2025-03-22 16:14:11 -0400, Andres Freund wrote:
> On 2025-03-22 22:00:00 +0200, Alexander Lakhin wrote:
> > @@ -24,14 +24,14 @@
> >  SELECT count(*) FROM bmscantest WHERE a = 1 AND b = 1;
> >   count
> >  -------
> > -    23
> > +    18
> >  (1 row)
>
> Is it possible that this is the bug reported here:
> https://postgr.es/m/873c33c5-ef9e-41f6-80b2-2f5e11869f1c%40garret.ru
>
> I.e. that the all-visible logic in bitmap heapscans is fundamentally broken?
>
> I can reproduce different results on a fast machien by just putting a VACUUM
> FREEZE bmscantest after the CREATE INDEXes in bitmapops.sql. After I disable
> the all-visible logic in bitmapheap_stream_read_next(), I can't observe such a
> difference anymore.

Hm, it's clearly related to the all-visible path, but I think the bug is
actually independent of what was reported there. The bug you reported is
perfectly reproducible, without any concurrency, after all.

Here's a smaller reproducer:

CREATE TABLE bmscantest (a int, t text);

INSERT INTO bmscantest
SELECT (r%53), 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo'
FROM generate_series(1,70000) r;

CREATE INDEX i_bmtest_a ON bmscantest(a);
set enable_indexscan=false;
set enable_seqscan=false;

-- Lower work_mem to trigger use of lossy bitmaps
set work_mem = 64;

SELECT count(*) FROM bmscantest WHERE a = 1;
vacuum freeze bmscantest;
SELECT count(*) FROM bmscantest WHERE a = 1;

-- clean up
DROP TABLE bmscantest;

The first SELECT reports 1321, the second 572 tuples.

Greetings,

Andres Freund

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Sami Imseih 2025-03-22 20:59:02 Re: pg_stat_statements and "IN" conditions
Previous Message Andres Freund 2025-03-22 20:14:11 Re: BitmapHeapScan streaming read user and prelim refactoring