Fix GiST buffering build to work when there are included columns.
authorTom Lane <[email protected]>
Mon, 12 Oct 2020 22:01:34 +0000 (18:01 -0400)
committerTom Lane <[email protected]>
Mon, 12 Oct 2020 22:01:34 +0000 (18:01 -0400)
gistRelocateBuildBuffersOnSplit did not get the memo about which
attribute count to use.  This could lead to a crash if there were
included columns and buffering build was chosen.  (Because there
are random page-split decisions elsewhere in GiST index build,
the crashes are not entirely deterministic.)

Back-patch to v12 where GiST gained support for included columns.

Pavel Borisov

Discussion: https://postgr.es/m/CALT9ZEECCV5m7wvxg46PC-7x-EybUmnpupBGhSFMoAAay+r6HQ@mail.gmail.com

src/backend/access/gist/gistbuildbuffers.c

index 4eab9bb83ac0c90858f01f54977d93c1896b936c..4ad67c88b4e5d8828fa067c1bdaf24dd2da09bbd 100644 (file)
@@ -666,7 +666,7 @@ gistRelocateBuildBuffersOnSplit(GISTBuildBuffers *gfbb, GISTSTATE *giststate,
            zero_penalty = true;
 
            /* Loop over index attributes. */
-           for (j = 0; j < r->rd_att->natts; j++)
+           for (j = 0; j < IndexRelationGetNumberOfKeyAttributes(r); j++)
            {
                float       usize;
 
@@ -692,7 +692,7 @@ gistRelocateBuildBuffersOnSplit(GISTBuildBuffers *gfbb, GISTSTATE *giststate,
                    which = i;
                    best_penalty[j] = usize;
 
-                   if (j < r->rd_att->natts - 1)
+                   if (j < IndexRelationGetNumberOfKeyAttributes(r) - 1)
                        best_penalty[j + 1] = -1;
                }
                else if (best_penalty[j] == usize)