Re: Can rs_cindex be < 0 for bitmap heap scans? - Mailing list pgsql-hackers

From Melanie Plageman
Subject Re: Can rs_cindex be < 0 for bitmap heap scans?
Date
Msg-id CAAKRu_ae8g2B1NOv+w7oyAPhCen4cJ3cNxNj8syEDV0yMV1M3Q@mail.gmail.com
Whole thread Raw
In response to Re: Can rs_cindex be < 0 for bitmap heap scans?  (Melanie Plageman <melanieplageman@gmail.com>)
Responses Re: Can rs_cindex be < 0 for bitmap heap scans?
Re: Can rs_cindex be < 0 for bitmap heap scans?
List pgsql-hackers
On Wed, Dec 18, 2024 at 3:13 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:
>
> option 1:
> most straightforward fix
>
> diff --git a/src/backend/access/heap/heapam_handler.c
> b/src/backend/access/heap/heapam_handler.c
> index d0e5922eed7..fa03bedd4b8 100644
> --- a/src/backend/access/heap/heapam_handler.c
> +++ b/src/backend/access/heap/heapam_handler.c
> @@ -2577,6 +2577,11 @@ SampleHeapTupleVisible(TableScanDesc scan, Buffer buffer,
>
>     if (scan->rs_flags & SO_ALLOW_PAGEMODE)
>     {
> +       int         start, end;
> +
> +       if (hscan->rs_ntuples == 0)
> +           return false;
> +
>         /*
>          * In pageatatime mode, heap_prepare_pagescan() already did visibility
>          * checks, so just look at the info it left in rs_vistuples[].
> @@ -2586,8 +2591,8 @@ SampleHeapTupleVisible(TableScanDesc scan, Buffer buffer,
>          * in increasing order, but it's not clear that there would be enough
>          * gain to justify the restriction.
>          */
> -       int         start = 0,
> -                   end = hscan->rs_ntuples - 1;
> +       start = 0;
> +       end = hscan->rs_ntuples - 1;
>
>         while (start <= end)
>         {
>
> option 2:
> change the binary search code a bit more but avoid the extra branch
> introduced by option 1.
>
> diff --git a/src/backend/access/heap/heapam_handler.c
> b/src/backend/access/heap/heapam_handler.c
> index d0e5922eed7..c8e25bdd197 100644
> --- a/src/backend/access/heap/heapam_handler.c
> +++ b/src/backend/access/heap/heapam_handler.c
> @@ -2586,18 +2586,17 @@ SampleHeapTupleVisible(TableScanDesc scan,
> Buffer buffer,
>          * in increasing order, but it's not clear that there would be enough
>          * gain to justify the restriction.
>          */
> -       int         start = 0,
> -                   end = hscan->rs_ntuples - 1;
> +       uint32 start = 0, end = hscan->rs_ntuples;
>
> -       while (start <= end)
> +       while (start < end)
>         {
> -           int         mid = (start + end) / 2;
> +           int mid = (start + end) / 2;
>             OffsetNumber curoffset = hscan->rs_vistuples[mid];
>
>             if (tupoffset == curoffset)
>                 return true;
>             else if (tupoffset < curoffset)
> -               end = mid - 1;
> +               end = mid;
>             else
>                 start = mid + 1;
>         }

I pushed the straightforward option for now so that it's fixed.

- Melanie



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Pg18 Recursive Crash
Next
From: Peter Smith
Date:
Subject: Re: Logical Replication of sequences