On Fri, Jan 12, 2018 at 11:43 AM, amul sul <sula...@gmail.com> wrote: > > Thanks for looking at this thread, attached herewith an updated patch rebase > on > 'UPDATE of partition key v35' patch[1]. >
ExecDelete(mtstate, tupleid, oldtuple, planSlot, epqstate, estate, - &tuple_deleted, false, false); + &tuple_deleted, false, false, true); /* * For some reason if DELETE didn't happen (e.g. trigger prevented @@ -1292,6 +1299,11 @@ lreplace:; ereport(ERROR, (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), errmsg("could not serialize access due to concurrent update"))); + if (!BlockNumberIsValid(BlockIdGetBlockNumber(&((hufd.ctid).ip_blkid)))) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("tuple to be locked was already moved to another partition due to concurrent update"))); I have asked to change the message "tuple to be updated .." after heap_lock_tuple call not in nodeModifyTable.c, so please revert the message in nodeModifyTable.c. Have you verified the changes in execReplication.c in some way? It is not clear to me how do you ensure to set the special value (InvalidBlockNumber) in CTID for delete operation via logical replication? The logical replication worker uses function ExecSimpleRelationDelete to perform Delete and there is no way it can pass the correct value of row_moved in heap_delete. Am I missing something due to which we don't need to do this? -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com