From: | Zhihong Yu <zyu(at)yugabyte(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
Subject: | Re: runtime error copying oids field |
Date: | 2020-11-30 23:24:42 |
Message-ID: | CALNJ-vQ+ga2d81PuvWOZKc7ucGQ+xe+98swjL1L4Xerqc_F3MQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
See attached patch which is along the line Alvaro outlined.
Cheers
On Mon, Nov 30, 2020 at 3:01 PM Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)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
>
Attachment | Content-Type | Size |
---|---|---|
v01-check-nparts-for-defining-idx.patch | application/octet-stream | 701 bytes |
From | Date | Subject | |
---|---|---|---|
Next Message | Masahiko Sawada | 2020-11-30 23:35:53 | Re: Add Information during standby recovery conflicts |
Previous Message | Masahiko Sawada | 2020-11-30 23:08:13 | Re: 回复: [PATCH] BUG FIX: Core dump could happen when VACUUM FULL in standalone mode |