From: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
To: Michael Paquier <michael@paquier.xyz>
Cc: infernorb@gmail.com, pgsql-bugs@lists.postgresql.org, PG Bug reporting form <noreply@postgresql.org>
Subject: Re: BUG #15677: Crash while deleting from partitioned table
Date: Wed, 13 Mar 2019 13:45:51 +0900
Message-ID: <ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp> (raw)
In-Reply-To: <27a7a849-c576-35f6-eb1e-5ff858841f65@lab.ntt.co.jp>
References: <15677-0bf089579b4cd02d@postgresql.org>
<3ad5ba71-d200-96da-f903-7e3b16416140@lab.ntt.co.jp>
<fb946563-ebf1-6bdb-1180-2c392ef31312@lab.ntt.co.jp>
<20190311045521.GF1818@paquier.xyz>
<27a7a849-c576-35f6-eb1e-5ff858841f65@lab.ntt.co.jp>
On 2019/03/11 14:04, Amit Langote wrote:
> On 2019/03/11 13:55, Michael Paquier wrote:
>> On Mon, Mar 11, 2019 at 12:55:05PM +0900, Amit Langote wrote:
>>> Forgot to mention that this bug exists in PG 10, 11, and HEAD. The same
>>> patch applies to all three branches.
>>
>> Could you add that to the future CF so as we don't forget?
>
> Done:
>
> * update/delete on partitioned tables may crash under concurrency *
> https://commitfest.postgresql.org/23/2057/
Thanks to cfbot [1], I came to know about a silly typo I had made in the
patch.
Attached updated patch.
Thanks,
Amit
[1] https://travis-ci.org/postgresql-cfbot/postgresql/builds/505157218diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.cindex 499917d45f..7740306aca 100644--- a/src/backend/executor/execMain.c+++ b/src/backend/executor/execMain.c@@ -3059,15 +3059,24 @@ EvalPlanQualStart(EPQState *epqstate, EState *parentestate, Plan *planTree)
estate->es_output_cid = parentestate->es_output_cid;
if (parentestate->es_num_result_relations > 0)
{
- int numResultRelations = parentestate->es_num_result_relations;+ int numResultRels = parentestate->es_num_result_relations;+ int numRootResultRels = parentestate->es_num_root_result_relations;
ResultRelInfo *resultRelInfos;
resultRelInfos = (ResultRelInfo *)
- palloc(numResultRelations * sizeof(ResultRelInfo));+ palloc(numResultRels * sizeof(ResultRelInfo));
memcpy(resultRelInfos, parentestate->es_result_relations,
- numResultRelations * sizeof(ResultRelInfo));+ numResultRels * sizeof(ResultRelInfo));
estate->es_result_relations = resultRelInfos;
- estate->es_num_result_relations = numResultRelations;+ estate->es_num_result_relations = numResultRels;++ /* Also transfer partitioned root result relations. */+ resultRelInfos = (ResultRelInfo *)+ palloc(numRootResultRels * sizeof(ResultRelInfo));+ memcpy(resultRelInfos, parentestate->es_root_result_relations,+ numRootResultRels * sizeof(ResultRelInfo));+ estate->es_root_result_relations = resultRelInfos;+ estate->es_num_root_result_relations = numRootResultRels;
}
/* es_result_relation_info must NOT be copied */
/* es_trig_target_relations must NOT be copied */
Attachments:
[text/plain] EvalPlanQualStart-bug-v2.patch (1.6K, ../ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp/2-EvalPlanQualStart-bug-v2.patch)
download | inline diff:diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.cindex 499917d45f..7740306aca 100644--- a/src/backend/executor/execMain.c+++ b/src/backend/executor/execMain.c@@ -3059,15 +3059,24 @@ EvalPlanQualStart(EPQState *epqstate, EState *parentestate, Plan *planTree)
estate->es_output_cid = parentestate->es_output_cid;
if (parentestate->es_num_result_relations > 0)
{
- int numResultRelations = parentestate->es_num_result_relations;+ int numResultRels = parentestate->es_num_result_relations;+ int numRootResultRels = parentestate->es_num_root_result_relations;
ResultRelInfo *resultRelInfos;
resultRelInfos = (ResultRelInfo *)
- palloc(numResultRelations * sizeof(ResultRelInfo));+ palloc(numResultRels * sizeof(ResultRelInfo));
memcpy(resultRelInfos, parentestate->es_result_relations,
- numResultRelations * sizeof(ResultRelInfo));+ numResultRels * sizeof(ResultRelInfo));
estate->es_result_relations = resultRelInfos;
- estate->es_num_result_relations = numResultRelations;+ estate->es_num_result_relations = numResultRels;++ /* Also transfer partitioned root result relations. */+ resultRelInfos = (ResultRelInfo *)+ palloc(numRootResultRels * sizeof(ResultRelInfo));+ memcpy(resultRelInfos, parentestate->es_root_result_relations,+ numRootResultRels * sizeof(ResultRelInfo));+ estate->es_root_result_relations = resultRelInfos;+ estate->es_num_root_result_relations = numRootResultRels;
}
/* es_result_relation_info must NOT be copied */
/* es_trig_target_relations must NOT be copied */
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: Langote_Amit_f8@lab.ntt.co.jp, michael@paquier.xyz, noreply@postgresql.org
Subject: Re: BUG #15677: Crash while deleting from partitioned table
In-Reply-To: <ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox