pg.ddx.io  pgsql-bugs@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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/505157218
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 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.c
index 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 */

view thread (8+ messages)  latest in thread

Message-ID: <ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp>
Permalink:  ../ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp/
Also on:    postgresql.org/message-id/ea5c78a9-badc-b766-06bf-aec38ea5f17d@lab.ntt.co.jp

 ·  · 

reply

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