| 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: | Whole Thread | Raw Message | 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
| 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 |