Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hDPUs-0000QK-AH for pgsql-bugs@arkaria.postgresql.org; Mon, 08 Apr 2019 08:19:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hDPUr-0005nh-1A for pgsql-bugs@arkaria.postgresql.org; Mon, 08 Apr 2019 08:19:17 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hDPUq-0005nU-Lg for pgsql-bugs@lists.postgresql.org; Mon, 08 Apr 2019 08:19:16 +0000 Received: from tama50.ecl.ntt.co.jp ([129.60.39.147]) by makus.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hDPUn-00082W-Vs for pgsql-bugs@lists.postgresql.org; Mon, 08 Apr 2019 08:19:15 +0000 Received: from vc2.ecl.ntt.co.jp (vc2.ecl.ntt.co.jp [129.60.86.154]) by tama50.ecl.ntt.co.jp (8.13.8/8.13.8) with ESMTP id x388J4Km004903; Mon, 8 Apr 2019 17:19:04 +0900 Received: from vc2.ecl.ntt.co.jp (localhost [127.0.0.1]) by vc2.ecl.ntt.co.jp (Postfix) with ESMTP id D2111638BB1; Mon, 8 Apr 2019 17:19:04 +0900 (JST) Received: from jcms-pop21.ecl.ntt.co.jp (jcms-pop21.ecl.ntt.co.jp [129.60.87.134]) by vc2.ecl.ntt.co.jp (Postfix) with ESMTP id B7B33638DF9; Mon, 8 Apr 2019 17:19:04 +0900 (JST) Received: from [127.0.0.1] (unknown [129.60.241.61]) by jcms-pop21.ecl.ntt.co.jp (Postfix) with ESMTPSA id A5DAE400576; Mon, 8 Apr 2019 17:19:04 +0900 (JST) Subject: Re: BUG #15727: PANIC: cannot abort transaction 295144144, it was already committed From: Amit Langote References: <20190403122027.GA17929@alvherre.pgsql> <994bff111c549f45041cd1dc7473548e@postgrespro.ru> <19321.1554567786@sss.pgh.pa.us> Message-ID: <223f3fa6-3075-47fd-3caa-0d5e8dee1baa@lab.ntt.co.jp> Date: Mon, 8 Apr 2019 17:18:48 +0900 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------937ACB2DCCDB534E4AD4DAF9" Content-Language: en-US X-CC-Mail-RelayStamp: 1 To: Tom Lane , r.zharkov@postgrespro.ru Cc: Alvaro Herrera , Andres Freund , pgsql-bugs@lists.postgresql.org X-TM-AS-MML: disable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------937ACB2DCCDB534E4AD4DAF9 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 2019/04/08 16:21, Amit Langote wrote: > Now that Andres has taken care of the other issues [1], maybe this one's > good to go? The isolation test part needed to be rebased over Andres' > commit, which I've done in the attached updated patch. The patch I attached in the previous email doesn't apply as-is to back-branches due to rebasing. I've attached another patch here, which applies to both PG 11 and 10 branches. Thanks, Amit --------------937ACB2DCCDB534E4AD4DAF9 Content-Type: text/plain; charset=UTF-8; name="pg11-10-bug-15677-fix-with-test_v2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pg11-10-bug-15677-fix-with-test_v2.patch" diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 572506e7c2..bec5b34455 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -3152,15 +3152,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 */ diff --git a/src/test/isolation/expected/eval-plan-qual.out b/src/test/isolation/expected/eval-plan-qual.out index 49b3fb3446..0095a5fcdf 100644 --- a/src/test/isolation/expected/eval-plan-qual.out +++ b/src/test/isolation/expected/eval-plan-qual.out @@ -283,3 +283,15 @@ step multireadwcte: <... completed> subid id 1 1 + +starting permutation: simplepartupdate complexpartupdate c1 c2 +step simplepartupdate: + update parttbl set a = a; + +step complexpartupdate: + with u as (update parttbl set a = a returning parttbl.*) + update parttbl set a = u.a from u; + +step c1: COMMIT; +step complexpartupdate: <... completed> +step c2: COMMIT; diff --git a/src/test/isolation/specs/eval-plan-qual.spec b/src/test/isolation/specs/eval-plan-qual.spec index 367922de75..ebe5bee4a5 100644 --- a/src/test/isolation/specs/eval-plan-qual.spec +++ b/src/test/isolation/specs/eval-plan-qual.spec @@ -29,6 +29,10 @@ setup CREATE TABLE jointest AS SELECT generate_series(1,10) AS id, 0 AS data; CREATE INDEX ON jointest(id); + + CREATE TABLE parttbl (a int) PARTITION BY LIST (a); + CREATE TABLE parttbl1 PARTITION OF parttbl FOR VALUES IN (1); + INSERT INTO parttbl VALUES (1); } teardown @@ -37,6 +41,7 @@ teardown DROP TABLE accounts_ext; DROP TABLE p CASCADE; DROP TABLE table_a, table_b, jointest; + DROP TABLE parttbl; } session "s1" @@ -110,6 +115,12 @@ step "selectjoinforupdate" { select * from jointest a join jointest b on a.id=b.id for update; } +# test for EPQ on a partitioned result table + +step "simplepartupdate" { + update parttbl set a = a; +} + session "s2" setup { BEGIN ISOLATION LEVEL READ COMMITTED; } @@ -146,6 +157,10 @@ step "updateforcip3" { step "wrtwcte" { UPDATE table_a SET value = 'tableAValue2' WHERE id = 1; } step "wrjt" { UPDATE jointest SET data = 42 WHERE id = 7; } step "c2" { COMMIT; } +step "complexpartupdate" { + with u as (update parttbl set a = a returning parttbl.*) + update parttbl set a = u.a from u; +} session "s3" setup { BEGIN ISOLATION LEVEL READ COMMITTED; } @@ -191,3 +206,5 @@ permutation "updateforcip" "updateforcip3" "c1" "c2" "read_a" permutation "wrtwcte" "readwcte" "c1" "c2" permutation "wrjt" "selectjoinforupdate" "c2" "c1" permutation "wrtwcte" "multireadwcte" "c1" "c2" + +permutation "simplepartupdate" "complexpartupdate" "c1" "c2" --------------937ACB2DCCDB534E4AD4DAF9--