> 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
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;