Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rhVGR-00BoPG-4u for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Mar 2024 13:55:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rhVGP-00HM8h-BO for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Mar 2024 13:55:25 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rhVGP-00HM8Y-0p for pgsql-hackers@lists.postgresql.org; Tue, 05 Mar 2024 13:55:25 +0000 Received: from mail-io1-xd29.google.com ([2607:f8b0:4864:20::d29]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rhVGM-002uFj-Ii for pgsql-hackers@lists.postgresql.org; Tue, 05 Mar 2024 13:55:24 +0000 Received: by mail-io1-xd29.google.com with SMTP id ca18e2360f4ac-7c7701f95b6so182420639f.1 for ; Tue, 05 Mar 2024 05:55:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709646921; x=1710251721; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=D/5+Bl/d42tAKcJtHA7ZqB5L3aA1MlzNuCqDuaSRCbk=; b=SnGRCOnMCKP0NeBUoGL+ff+u6sf75iG4vh9d1F9LNH/HUeCdTmvpPVaIFlePYSu4Xz NCk9KjjJWqQICnJTfdKiqy1iAROSKqOYZcTqv1czvLJ5JNXmHCP9vUX//oMGCgospKQL LGkiFfA9cYw+K6OWp7mzjHydFq/S8mvl9JjyP04dIO98bve+7ObyaEU8v5Eypvws/Udk t0hqdtUwYFrqCjlBOf5BP2C2IH/SLqiK87rhkJbiZ6D5kRUi1qfyemeiaufRDdIgYD/s viHnDjcpZ2xgRGZgugUEi4TcBzc4ZxxTDMO05Lc42xDgMFYHOamZz/jifMasc985lmUo rFpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709646921; x=1710251721; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=D/5+Bl/d42tAKcJtHA7ZqB5L3aA1MlzNuCqDuaSRCbk=; b=W0JXO7G2iGxcUcM6F6sgqqLghXV5P3KurCf02Kq8rbIEGB8i92mKGHdFFrs90cx7db AyHMVOMPkhqE/+8TScQNVU0MEjFhWkllwd+z7ypTpwlucEXsqnP/1gzmelOoVwGAXuYn bRvjh38LkAPLp4lo+11nP7sdRInvPgDrBE++c5a4Z8FOMCY1vpryfE2dsKJ07DyLPQcv cKG4Yjld1ABDJbE1UQ2g9I1sprVPztrMjlO6bqM/VN3V7JBJ3syZ87D0gfHyYCWPPC+k WgVRM3AgQ9l7l6v8HxL0+G24fpz1zcnWzw2ecHc7nbR4IRy5ZHjXxdCzdA5a8v1hU/G5 deZA== X-Forwarded-Encrypted: i=1; AJvYcCVJujwuLhhDbvjOtpCx3hYRobVms7Nwm+b0+Kd9WAmqS2+t+JHJHCN8IUYie1D0zzCjPqhGvTrSfPbNGbUsa5IwOEghje/X+HjjxbcVNT0cwnlp X-Gm-Message-State: AOJu0Ywx8aBihwBzOn3a11zvLPlPF9+dEsSQvqOXoD2qjIGja34g+lAg bhbkuKChl5T+4qz2+zsu79m2buLt1NEP+mUDyvZn03xEaG5dQkMDEkXSVZMlTMhKCr9sfjmWV5p dl6HSBdt3FqBs5uSDxi6DEZizzNg= X-Google-Smtp-Source: AGHT+IHfHPNfoTKl1fKRJ6nd6jFEuTJt1m5eMiVWaSueb4qICaG5F0CoxPIHhIiJuYLBVkqn3ljh/YqEVvLr5gGxaRU= X-Received: by 2002:a92:c54a:0:b0:365:6167:9dcf with SMTP id a10-20020a92c54a000000b0036561679dcfmr2262696ilj.5.1709646919286; Tue, 05 Mar 2024 05:55:19 -0800 (PST) MIME-Version: 1.0 References: <551454.1708618854@sss.pgh.pa.us> <711158.1708647157@sss.pgh.pa.us> In-Reply-To: From: Dean Rasheed Date: Tue, 5 Mar 2024 13:55:07 +0000 Message-ID: Subject: Re: bug report: some issues about pg_15_stable(8fa4a1ac61189efffb8b851ee77e1bc87360c445) To: zwj Cc: jian he , Tom Lane , pgsql-hackers , Alvaro Herrera Content-Type: multipart/mixed; boundary="00000000000050f8f80612ea316a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000050f8f80612ea316a Content-Type: text/plain; charset="UTF-8" [cc'ing Alvaro] On Tue, 5 Mar 2024 at 10:04, zwj wrote: > > If I only execute merge , I will get the following error: > merge into tgt a using src1 c on a.a = c.a when matched then update set b = c.b when not matched then insert (a,b) values(c.a,c.b); -- excute fail > ERROR: MERGE command cannot affect row a second time > HIINT: Ensure that not more than one source row matches any one target row. > > But when I execute the update and merge concurrently, I will get the following result set. > Yes, this should still produce that error, even after a concurrent update. In the first example without a concurrent update, when we reach the tgt.a = 3 row the second time, ExecUpdateAct() returns TM_SelfModified and we do this: case TM_SelfModified: /* * The SQL standard disallows this for MERGE. */ if (TransactionIdIsCurrentTransactionId(context->tmfd.xmax)) ereport(ERROR, (errcode(ERRCODE_CARDINALITY_VIOLATION), /* translator: %s is a SQL command name */ errmsg("%s command cannot affect row a second time", "MERGE"), errhint("Ensure that not more than one source row matches any one target row."))); /* This shouldn't happen */ elog(ERROR, "attempted to update or delete invisible tuple"); break; whereas in the second case, after a concurrent update, ExecUpdateAct() returns TM_Updated, we attempt to lock the tuple prior to running EPQ, and table_tuple_lock() returns TM_SelfModified, which does this: case TM_SelfModified: /* * This can be reached when following an update * chain from a tuple updated by another session, * reaching a tuple that was already updated in * this transaction. If previously modified by * this command, ignore the redundant update, * otherwise error out. * * See also response to TM_SelfModified in * ExecUpdate(). */ if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be updated or deleted was already modified by an operation triggered by the current command"), errhint("Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows."))); return false; My initial reaction is that neither of those blocks of code is entirely correct, and that they should both be doing both of those checks. I.e., something like the attached (which probably needs some additional test cases). Regards, Dean --00000000000050f8f80612ea316a Content-Type: text/x-patch; charset="US-ASCII"; name="merge-self-modified-tuple.patch" Content-Disposition: attachment; filename="merge-self-modified-tuple.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ltefby530 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVNb2RpZnlUYWJsZS5jIGIvc3Jj L2JhY2tlbmQvZXhlY3V0b3Ivbm9kZU1vZGlmeVRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggZmNiNjEzMy4uOTM1MWZiYwotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTW9k aWZ5VGFibGUuYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTW9kaWZ5VGFibGUuYwpA QCAtMzAwMSw4ICszMDAxLDI5IEBAIGxtZXJnZV9tYXRjaGVkOgogCQkJY2FzZSBUTV9TZWxmTW9k aWZpZWQ6CiAKIAkJCQkvKgotCQkJCSAqIFRoZSBTUUwgc3RhbmRhcmQgZGlzYWxsb3dzIHRoaXMg Zm9yIE1FUkdFLgorCQkJCSAqIFRoZSB0YXJnZXQgdHVwbGUgd2FzIGFscmVhZHkgdXBkYXRlZCBv ciBkZWxldGVkIGJ5IHRoZQorCQkJCSAqIGN1cnJlbnQgY29tbWFuZCwgb3IgYnkgYSBsYXRlciBj b21tYW5kIGluIHRoZSBjdXJyZW50CisJCQkJICogdHJhbnNhY3Rpb24uICBUaGUgZm9ybWVyIGNh c2UgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGJ5CisJCQkJICogdGhlIFNRTCBzdGFuZGFyZCBm b3IgTUVSR0UsIHdoaWNoIGluc2lzdHMgdGhhdCB0aGUgTUVSR0UKKwkJCQkgKiBqb2luIGNvbmRp dGlvbiBzaG91bGQgbm90IGpvaW4gYSB0YXJnZXQgcm93IHRvIG1vcmUgdGhhbgorCQkJCSAqIG9u ZSBzb3VyY2Ugcm93LgorCQkJCSAqCisJCQkJICogVGhlIGxhdHRlciBjYXNlIGFyaXNlcyBpZiB0 aGUgdHVwbGUgaXMgbW9kaWZpZWQgYnkgYQorCQkJCSAqIGNvbW1hbmQgaW4gYSBCRUZPUkUgdHJp Z2dlciwgb3IgcGVyaGFwcyBieSBhIGNvbW1hbmQgaW4gYQorCQkJCSAqIHZvbGF0aWxlIGZ1bmN0 aW9uIHVzZWQgaW4gdGhlIHF1ZXJ5LiAgSW4gc3VjaCBzaXR1YXRpb25zIHdlCisJCQkJICogc2hv dWxkIG5vdCBpZ25vcmUgdGhlIE1FUkdFIGFjdGlvbiwgYnV0IGl0IGlzIGVxdWFsbHkKKwkJCQkg KiB1bnNhZmUgdG8gcHJvY2VlZC4gIFdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCB0aGUgb3JpZ2lu YWwKKwkJCQkgKiBNRVJHRSBhY3Rpb24gd2hpbGUga2VlcGluZyB0aGUgdHJpZ2dlcmVkIGFjdGlv bnMgYmFzZWQgb24KKwkJCQkgKiBpdDsgYW5kIGl0IHdvdWxkIGJlIG5vIGJldHRlciB0byBhbGxv dyB0aGUgb3JpZ2luYWwgTUVSR0UKKwkJCQkgKiBhY3Rpb24gd2hpbGUgZGlzY2FyZGluZyB0aGUg dXBkYXRlcyB0aGF0IGl0IHRyaWdnZXJlZC4gIFNvCisJCQkJICogdGhyb3dpbmcgYW4gZXJyb3Ig aXMgdGhlIG9ubHkgc2FmZSBjb3Vyc2UuCiAJCQkJICovCisJCQkJaWYgKGNvbnRleHQtPnRtZmQu Y21heCAhPSBlc3RhdGUtPmVzX291dHB1dF9jaWQpCisJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJ CQkJKGVycmNvZGUoRVJSQ09ERV9UUklHR0VSRURfREFUQV9DSEFOR0VfVklPTEFUSU9OKSwKKwkJ CQkJCQkgZXJybXNnKCJ0dXBsZSB0byBiZSB1cGRhdGVkIG9yIGRlbGV0ZWQgd2FzIGFscmVhZHkg bW9kaWZpZWQgYnkgYW4gb3BlcmF0aW9uIHRyaWdnZXJlZCBieSB0aGUgY3VycmVudCBjb21tYW5k IiksCisJCQkJCQkJIGVycmhpbnQoIkNvbnNpZGVyIHVzaW5nIGFuIEFGVEVSIHRyaWdnZXIgaW5z dGVhZCBvZiBhIEJFRk9SRSB0cmlnZ2VyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIHRvIG90aGVyIHJv d3MuIikpKTsKKwogCQkJCWlmIChUcmFuc2FjdGlvbklkSXNDdXJyZW50VHJhbnNhY3Rpb25JZChj b250ZXh0LT50bWZkLnhtYXgpKQogCQkJCQllcmVwb3J0KEVSUk9SLAogCQkJCQkJCShlcnJjb2Rl KEVSUkNPREVfQ0FSRElOQUxJVFlfVklPTEFUSU9OKSwKQEAgLTMwMTAsNiArMzAzMSw3IEBAIGxt ZXJnZV9tYXRjaGVkOgogCQkJCQkJCSBlcnJtc2coIiVzIGNvbW1hbmQgY2Fubm90IGFmZmVjdCBy b3cgYSBzZWNvbmQgdGltZSIsCiAJCQkJCQkJCQkiTUVSR0UiKSwKIAkJCQkJCQkgZXJyaGludCgi RW5zdXJlIHRoYXQgbm90IG1vcmUgdGhhbiBvbmUgc291cmNlIHJvdyBtYXRjaGVzIGFueSBvbmUg dGFyZ2V0IHJvdy4iKSkpOworCiAJCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCiAJCQkJ ZWxvZyhFUlJPUiwgImF0dGVtcHRlZCB0byB1cGRhdGUgb3IgZGVsZXRlIGludmlzaWJsZSB0dXBs ZSIpOwogCQkJCWJyZWFrOwpAQCAtMzExOCwxOSArMzE0MCwyNyBAQCBsbWVyZ2VfbWF0Y2hlZDoK IAkJCQkJCQkvKgogCQkJCQkJCSAqIFRoaXMgY2FuIGJlIHJlYWNoZWQgd2hlbiBmb2xsb3dpbmcg YW4gdXBkYXRlCiAJCQkJCQkJICogY2hhaW4gZnJvbSBhIHR1cGxlIHVwZGF0ZWQgYnkgYW5vdGhl ciBzZXNzaW9uLAotCQkJCQkJCSAqIHJlYWNoaW5nIGEgdHVwbGUgdGhhdCB3YXMgYWxyZWFkeSB1 cGRhdGVkIGluCi0JCQkJCQkJICogdGhpcyB0cmFuc2FjdGlvbi4gSWYgcHJldmlvdXNseSBtb2Rp ZmllZCBieQotCQkJCQkJCSAqIHRoaXMgY29tbWFuZCwgaWdub3JlIHRoZSByZWR1bmRhbnQgdXBk YXRlLAotCQkJCQkJCSAqIG90aGVyd2lzZSBlcnJvciBvdXQuCi0JCQkJCQkJICoKLQkJCQkJCQkg KiBTZWUgYWxzbyByZXNwb25zZSB0byBUTV9TZWxmTW9kaWZpZWQgaW4KLQkJCQkJCQkgKiBFeGVj VXBkYXRlKCkuCisJCQkJCQkJICogcmVhY2hpbmcgYSB0dXBsZSB0aGF0IHdhcyBhbHJlYWR5IHVw ZGF0ZWQgb3IKKwkJCQkJCQkgKiBkZWxldGVkIGJ5IHRoZSBjdXJyZW50IGNvbW1hbmQsIG9yIGJ5 IGEgbGF0ZXIKKwkJCQkJCQkgKiBjb21tYW5kIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBB cyBhYm92ZSwKKwkJCQkJCQkgKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgdHJlYXRlZCBhcyBhbiBl cnJvci4KIAkJCQkJCQkgKi8KIAkJCQkJCQlpZiAoY29udGV4dC0+dG1mZC5jbWF4ICE9IGVzdGF0 ZS0+ZXNfb3V0cHV0X2NpZCkKIAkJCQkJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJCQkJCQkoZXJy Y29kZShFUlJDT0RFX1RSSUdHRVJFRF9EQVRBX0NIQU5HRV9WSU9MQVRJT04pLAogCQkJCQkJCQkJ CSBlcnJtc2coInR1cGxlIHRvIGJlIHVwZGF0ZWQgb3IgZGVsZXRlZCB3YXMgYWxyZWFkeSBtb2Rp ZmllZCBieSBhbiBvcGVyYXRpb24gdHJpZ2dlcmVkIGJ5IHRoZSBjdXJyZW50IGNvbW1hbmQiKSwK IAkJCQkJCQkJCQkgZXJyaGludCgiQ29uc2lkZXIgdXNpbmcgYW4gQUZURVIgdHJpZ2dlciBpbnN0 ZWFkIG9mIGEgQkVGT1JFIHRyaWdnZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gb3RoZXIgcm93 cy4iKSkpOworCisJCQkJCQkJaWYgKFRyYW5zYWN0aW9uSWRJc0N1cnJlbnRUcmFuc2FjdGlvbklk KGNvbnRleHQtPnRtZmQueG1heCkpCisJCQkJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCQkJ KGVycmNvZGUoRVJSQ09ERV9DQVJESU5BTElUWV9WSU9MQVRJT04pLAorCQkJCQkJCQkvKiB0cmFu c2xhdG9yOiAlcyBpcyBhIFNRTCBjb21tYW5kIG5hbWUgKi8KKwkJCQkJCQkJCQkgZXJybXNnKCIl cyBjb21tYW5kIGNhbm5vdCBhZmZlY3Qgcm93IGEgc2Vjb25kIHRpbWUiLAorCQkJCQkJCQkJCQkJ Ik1FUkdFIiksCisJCQkJCQkJCQkJIGVycmhpbnQoIkVuc3VyZSB0aGF0IG5vdCBtb3JlIHRoYW4g b25lIHNvdXJjZSByb3cgbWF0Y2hlcyBhbnkgb25lIHRhcmdldCByb3cuIikpKTsKKworCQkJCQkJ CS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQkJCQkJCWVsb2coRVJST1IsICJhdHRlbXB0 ZWQgdG8gdXBkYXRlIG9yIGRlbGV0ZSBpbnZpc2libGUgdHVwbGUiKTsKIAkJCQkJCQlyZXR1cm4g ZmFsc2U7CiAKIAkJCQkJCWRlZmF1bHQ6Cg== --00000000000050f8f80612ea316a--