Обсуждение: Fix incorrect assertion in heapgettup_pagemode()

Поиск
Список
Период
Сортировка

Fix incorrect assertion in heapgettup_pagemode()

От
"cca5507"
Дата:
Hi,

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 469397e7344..1229e22e78a 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -1077,7 +1077,7 @@ continue_page:
                        ItemId          lpp;
                        OffsetNumber lineoff;
 
-                       Assert(lineindex <= scan->rs_ntuples);
+                       Assert(lineindex < scan->rs_ntuples);
                        lineoff = scan->rs_vistuples[lineindex];
                        lpp = PageGetItemId(page, lineoff);
                        Assert(ItemIdIsNormal(lpp));

The lineindex is 0-based, so it should be '<' rather than '<=', thoughts?

--
Regards,
ChangAo Chen

Вложения

Re: Fix incorrect assertion in heapgettup_pagemode()

От
Chao Li
Дата:

> On Dec 25, 2025, at 19:13, cca5507 <cca5507@qq.com> wrote:
>
> Hi,
>
> diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
> index 469397e7344..1229e22e78a 100644
> --- a/src/backend/access/heap/heapam.c
> +++ b/src/backend/access/heap/heapam.c
> @@ -1077,7 +1077,7 @@ continue_page:
>                        ItemId          lpp;
>                        OffsetNumber lineoff;
>
> -                       Assert(lineindex <= scan->rs_ntuples);
> +                       Assert(lineindex < scan->rs_ntuples);
>                        lineoff = scan->rs_vistuples[lineindex];
>                        lpp = PageGetItemId(page, lineoff);
>                        Assert(ItemIdIsNormal(lpp));
>
> The lineindex is 0-based, so it should be '<' rather than '<=', thoughts?
>
> --
> Regards,
> ChangAo Chen
> <v1-0001-Fix-incorrect-assertion-in-heapgettup_pagemode.patch>

Good catch. The function comment clearly mentions that lineindex is 0 based.
```
 * tuples listed in rs_vistuples[] rather than all tuples on the page. Notice
* that lineindex is 0-based, where the corresponding loop variable lineoff in
* heapgettup is 1-based.
* ----------------
*/
static void
heapgettup_pagemode(HeapScanDesc scan,
  ScanDirection dir,
  int nkeys,
  ScanKey key)
{
  HeapTuple tuple = &(scan->rs_ctup);
  Page page;
  uint32 lineindex;
  uint32 linesleft;
```

So, the fix looks correct.


Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/