Hi, See attached patch which is along the line Alvaro outlined. Cheers
On Mon, Nov 30, 2020 at 3:01 PM Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote: > On 2020-Nov-30, Zhihong Yu wrote: > > > This was the line runtime error was raised: > > > > memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts); > > > > From RelationBuildPartitionDesc we can see that: > > > > if (nparts > 0) > > { > > PartitionBoundInfo boundinfo; > > int *mapping; > > int next_index = 0; > > > > result->oids = (Oid *) palloc0(nparts * sizeof(Oid)); > > > > The cause was oids field was not assigned due to nparts being 0. > > This is verified by additional logging added just prior to the memcpy > call. > > > > I want to get the community's opinion on whether a null check should be > > added prior to the memcpy() call. > > As far as I understand, we do want to avoid memcpy's of null pointers; > see [1]. > > In this case I think it'd be sane to skip the complete block, not just > the memcpy, something like > > diff --git a/src/backend/commands/indexcmds.c > b/src/backend/commands/indexcmds.c > index ca24620fd0..d35deb433a 100644 > --- a/src/backend/commands/indexcmds.c > +++ b/src/backend/commands/indexcmds.c > @@ -1163,15 +1163,17 @@ DefineIndex(Oid relationId, > > if (partitioned) > { > + PartitionDesc partdesc; > + > /* > * Unless caller specified to skip this step (via ONLY), > process each > * partition to make sure they all contain a corresponding > index. > * > * If we're called internally (no stmt->relation), recurse > always. > */ > - if (!stmt->relation || stmt->relation->inh) > + partdesc = RelationGetPartitionDesc(rel); > + if ((!stmt->relation || stmt->relation->inh) && > partdesc->nparts > 0) > { > - PartitionDesc partdesc = > RelationGetPartitionDesc(rel); > int nparts = partdesc->nparts; > Oid *part_oids = palloc(sizeof(Oid) > * nparts); > bool invalidate_parent = false; > > [1] > https://www.postgresql.org/message-id/flat/20200904023648.GB3426768%40rfd.leadboat.com >
v01-check-nparts-for-defining-idx.patch
Description: Binary data