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.96) (envelope-from ) id 1wTwvl-000qjh-0x for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jun 2026 07:19:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wTwvj-009IeX-00 for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jun 2026 07:19:23 +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.96) (envelope-from ) id 1wTwvi-009IeP-25 for pgsql-hackers@lists.postgresql.org; Mon, 01 Jun 2026 07:19:23 +0000 Received: from mail-oo1-xc2b.google.com ([2607:f8b0:4864:20::c2b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wTwvc-00000000cAA-3cXH for pgsql-hackers@postgresql.org; Mon, 01 Jun 2026 07:19:22 +0000 Received: by mail-oo1-xc2b.google.com with SMTP id 006d021491bc7-69d694cecd2so3246363eaf.3 for ; Mon, 01 Jun 2026 00:19:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780298355; cv=none; d=google.com; s=arc-20240605; b=QPF83JFpiyphT/rmZAfoYOI4WMe5QNJSXXVe5w4/eNEIFTzqK/A4qtVgayiThHofHU AjpT0ySAw3EmzzGduXUiIjhve1ZBaTiTjzdPH0Tr0o9T0RY2PqAxhqmBffvDmFOy1hml AqAbo3c80/CyQ5DnhJnkihIFzygCQTzpxW0TU1ybCQ8nC9q/OaTjezRPRdmHTM4x1o+y tTO2wo+TsVwMbkNQZMAGSaNCeYx6z2l75osam3b9/M+S8g4chXGX79N26x+D6AYQ5FiZ HRCRGSil9u/9nTRb6mekezSmUN6f2dU/+CtADaOK72vvi82C8EBmeurjgNFI0ClbT9TF baEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=CpH7YXpGa1fx9g36jYqfBMih9deKpAxZq//SzDN/lGg=; fh=/2xHye58H5BL2lgX8xGqBps4/d5PirKleiqqNVKDM0Q=; b=KF7C1MKMOtZtpJBuoO5XBGMiRPn9xfszRdodU7BZdjYdIjMI4XfY6i7P1sZgqm+n44 F3wAq501RnXdIJFfbu9UxwM7UtvMo84prKrOhTH7K1xVfA5EBo2C7IgsBLEg6HeNihtT c5XekRgD8AwDQUFUENoZV3yndt69YqAGmyKll5/zdlzIbw/ocR/ahJY09G50EXlgHnj/ zu2nwIbdkBlEjD+z+0Qje+P9sLvCDB4T4mfzibnjpTYMPmhxWjofMs6u+5uM8n1iCEBi TlZUeLH/ZgCI5JuxaTThtZF/7hpBf4bom5dB1/TniQbi+SrZ3pfivdCAUfu0I+qU6PBk ZGBw==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780298355; x=1780903155; darn=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=CpH7YXpGa1fx9g36jYqfBMih9deKpAxZq//SzDN/lGg=; b=cojTJ5nabF0v7PQ6H3DSUVlp2uEksH05Xwkr4Mzey49gDN1fe+mVV5CZFQZrdzDsLe UtUq+wqiRg0Og4gPv6RGnr4BQXj3lQtTSDJ6kQdv42MHkCtuEkcc2sTt1FDIgqXuGKTD cm+12kxUpOtFHnF8ifNJTlWl+Zp4O+g0+eGY++OBfl2SyMhSZDM3WHIalgkbuarhGmlI zUnp8AZ7uS/yEYt6JOOEBO+utwXPjicWIwN9WwC16SFOlmztgCUwAr9R5ThIfefxsqa6 UcRElwJYFlBI0gW8fPhEQkuzA7+bDyRxSPRpOSk2pq5Kf5uCOLfEXjsmlHHNLFrdXkqF 84Dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780298355; x=1780903155; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=CpH7YXpGa1fx9g36jYqfBMih9deKpAxZq//SzDN/lGg=; b=ssFjWEd7hOU/zRM0iAUTzC8R/EO1uJz6R5QUwYRwDtIJn05a+DuzS53pnCXydUkbe8 Ujc30sjCq4ClTScG1Mqc8Tbwg5IPeoBhpWmj0JLLB9pF2ML38yoKA1tg6j4vVZQYo+dS ZBRbY6EqhFNXIjgktUkfu82dyFsDg0vZAW07BJBsITyEoLFf9gEQ/SQWsQcde/EW8buC F9WrvCaLcYbxNrbuxAuw0Bab4CuxPI58ftqqDicUKeL+vRlaG0GOVq6IXlmia6EdkgDP ngRjeYH6bxKbpXT4KXFS4X7L0FLn/akIJDFglPZ//v3M0DAgTA4PVmOguzYp0z+mkZtH u7Vw== X-Forwarded-Encrypted: i=1; AFNElJ8d5bpHLg/Y3rZZqQd/LOb6R68fSmwts/xe8zUYS1Bj62wcMGBLxilxIAqe6+3n5QrXLKVUr5r/3Ye8wsrd@postgresql.org X-Gm-Message-State: AOJu0Yw753Aitm7GtDoI1gSiQXfeSmQ2Szw37xdydjo0P/PSUSOv+hYZ zSDlLYZTx/ZrYw4ggtUOcJLWWs0X9h5N1yr3QWs1hSAJeMZ+gPnrdqQVjZWdUkgbDBMZWYswgux SY9zcXs/qrvyeYQBA3QBZIdpKKvo/0mk= X-Gm-Gg: Acq92OHZ4h2fY3qxip0brF2taQobkxmpskOAC7DAKxoGdXuKL4yQ2bYlbgEaIT1wKnA r+atm4wmbZztUqC1hOza56W3wlyVDzynuByX+Mt723e8CvMoGF23VmdUyPwQc8vrEuCohl4PShq GoMtoWH6WEJpMYWR3xMWt2dRIHePvC6dfeUQ/POdDIrbkCL9ft/ittwM24s+rdvUagInv+jPrLe wWqWSb0HAeuRJhsZFWoHE0t1suVLmwnvCuD4FCTAgvSIaaBlkkWMWNMwvbIElGoXMrKgpa7M14i VS1ti4txuQdh8DNo6Z0HxCypk6HkYtI= X-Received: by 2002:a05:6820:a04:b0:69b:5696:e64d with SMTP id 006d021491bc7-69e104a77f2mr4714672eaf.13.1780298354837; Mon, 01 Jun 2026 00:19:14 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Richard Guo Date: Mon, 1 Jun 2026 16:19:03 +0900 X-Gm-Features: AVHnY4Lrp9l7fDihsYQyht8ZCAB1AezBqlmaBQG_1XWM1UXaZgPs9F_J3X4-dHQ Message-ID: Subject: Re: Eager aggregation, take 3 To: Tender Wang Cc: Radim Marek , PostgreSQL-development Content-Type: multipart/mixed; boundary="00000000000009700b06532c03ed" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000009700b06532c03ed Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, May 31, 2026 at 8:28=E2=80=AFPM Tender Wang wr= ote: > Radim Marek =E4=BA=8E2026=E5=B9=B45=E6=9C=8829=E6= =97=A5=E5=91=A8=E4=BA=94 23:55=E5=86=99=E9=81=93=EF=BC=9A > > =3D=3D How to reproduce > > > > CREATE TEMP TABLE c(id int, country text); > > CREATE TEMP TABLE o(customer_id int); > > INSERT INTO c VALUES (1,'US'),(2,'US'),(3,'DE'),(4,'DE'),(5,'DE'); > > INSERT INTO o VALUES (1),(3); -- only customers 1 and 3 have a row = in o > > > > SELECT c.country, count(*) AS n > > FROM c > > WHERE NOT EXISTS (SELECT 1 FROM o WHERE o.customer_id =3D c.id) > > GROUP BY c.country > > ORDER BY c.country; > > > > Expected results (everywhere except master) > > > > country | n > > ---------+--- > > DE | 2 > > US | 1 > > (2 rows) > > > > The actual result with enable_eager_aggregate =3D on (default) > > > > country | n > > ---------+--- > > DE | 0 > > US | 0 > > (2 rows) Thanks for the report. This is a bug. We should never push a partial aggregation down to a relation on the inner (RHS) side of a semi/anti join. A semi/anti join does not preserve its inner rows in the join output, so a partial aggregate computed on the inner side would not survive the join and could not be combined by the final aggregation. > I haven't thought about it too deeply yet. Maybe we can do something > in the make_grouped_join_rel(). > ... > if (sjinfo->jointype =3D=3D JOIN_ANTI || sjinfo->jointype =3D=3D JOIN_SEM= I) > return; > ... That does fix the reported case, but I think it's too broad: it also disables pushing a partial aggregate to the outer side of a semi/anti join, which is valid. And by the time we reach make_grouped_join_rel the grouped relation for the inner-side relation has already been built, so it would just go unused. So I'd rather fix it in eager_aggregation_possible_for_relation, right next to the existing outer-join check, by rejecting a relation that lies on the inner side of a semijoin/antijoin. See attached. - Richard --00000000000009700b06532c03ed Content-Type: application/octet-stream; name="v1-0001-Fix-eager-aggregation-for-semi-antijoin-inner-rel.patch" Content-Disposition: attachment; filename="v1-0001-Fix-eager-aggregation-for-semi-antijoin-inner-rel.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpuvnx600 RnJvbSBmMjQzOTkxYjQzNjE0ZTU2ZWYyYmUwYmQ1ZjBjOTJmODA3Y2RkZTNlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogTW9uLCAxIEp1biAyMDI2IDE0OjQ5OjMzICswOTAwClN1YmplY3Q6IFtQQVRDSCB2MV0g Rml4IGVhZ2VyIGFnZ3JlZ2F0aW9uIGZvciBzZW1pL2FudGlqb2luIGlubmVyIHJlbHMKCkVhZ2Vy IGFnZ3JlZ2F0aW9uIHB1c2hlcyBhIHBhcnRpYWwgYWdncmVnYXRlIGRvd24gdG8gYSBiYXNlIG9y IGpvaW4KcmVsYXRpb24sIHRvIGJlIGZpbmFsaXplZCBhZnRlciB0aGF0IHJlbGF0aW9uIGlzIGpv aW5lZCB3aXRoIHRoZSByZXN0Cm9mIHRoZSBxdWVyeS4gIGVhZ2VyX2FnZ3JlZ2F0aW9uX3Bvc3Np YmxlX2Zvcl9yZWxhdGlvbigpIGFscmVhZHkKcmVmdXNlcyB0byBkbyB0aGlzIGZvciBhIHJlbGF0 aW9uIG9uIHRoZSBudWxsYWJsZSBzaWRlIG9mIGFuIG91dGVyCmpvaW4sIGJ1dCBpdCBmYWlsZWQg dG8gYWxzbyByZWZ1c2UgaXQgZm9yIGEgcmVsYXRpb24gb24gdGhlIGlubmVyIHNpZGUKb2YgYSBz ZW1pam9pbiBvciBhbnRpam9pbi4KClN1Y2ggYSBqb2luIGRvZXMgbm90IGVtaXQgaXRzIGlubmVy IHJvd3MsIHNvIGEgcGFydGlhbCBhZ2dyZWdhdGUKY29tcHV0ZWQgb24gdGhlIGlubmVyIHNpZGUg ZG9lcyBub3Qgc3Vydml2ZSB0aGUgam9pbiBhbmQgY2Fubm90IGJlCmNvbWJpbmVkIGJ5IHRoZSBm aW5hbCBhZ2dyZWdhdGlvbi4gIFRoaXMgY2FuIGhhcHBlbiBvbmx5IGZvciBhbgphZ2dyZWdhdGUg dGhhdCByZWZlcmVuY2VzIG5vIHRhYmxlIGNvbHVtbiwgc3VjaCBhcyBjb3VudCgqKTogaXQgaXMK Y29uc2lkZXJlZCBjb21wdXRhYmxlIG9uIGFueSByZWxhdGlvbiwgaW5jbHVkaW5nIHRoZSBpbm5l ciBvbmUsCndoZXJlYXMgYW4gYWdncmVnYXRlIHRoYXQgcmVmZXJlbmNlcyBhIGNvbHVtbiBpcyBh bmNob3JlZCB0byB0aGUgb3V0ZXIKc2lkZSBhbmQgbmV2ZXIgcmVhY2hlcyB0aGUgaW5uZXIgcmVs YXRpb24uCgpUaGUgZXhpc3Rpbmcgb3V0ZXItam9pbiBjaGVjayBkaWQgbm90IGNhdGNoIHRoaXMg YmVjYXVzZSBpdCBjb25zdWx0cwpudWxsaW5nX3JlbGlkcywgd2hpY2ggb25seSB0cmFja3Mgam9p bnMgdGhhdCBudWxsLWV4dGVuZCB0aGVpciBpbm5lcgpzaWRlLiAgU2VtaWpvaW5zIGFuZCBhbnRp am9pbnMgZm9ybWVkIGZyb20gRVhJU1RTLCBJTiwgTk9UIEVYSVNUUywgb3IKTk9UIElOIHN1Ymxp bmtzIGRvIG5vdCBudWxsLWV4dGVuZCBhbmQgY2Fycnkgbm8gb2pyZWxpZCwgc28gdGhleSBhcmUK aW52aXNpYmxlIHRvIHRoYXQgY2hlY2suCgpGaXggYnkgYWRkaXRpb25hbGx5IHJlamVjdGluZyBh bnkgcmVsYXRpb24gdGhhdCBpbmNsdWRlcyBpbm5lci1zaWRlCnJlbGF0aW9ucyBvZiBhIHNlbWlq b2luIG9yIGFudGlqb2luIGJ1dCBub3QgdGhlIGpvaW4ncyBvdXRlciBzaWRlLgpQdXNoaW5nIGEg cGFydGlhbCBhZ2dyZWdhdGUgdG8gdGhlIG91dGVyIHNpZGUgb2Ygc3VjaCBhIGpvaW4sIGdyb3Vw ZWQKYnkgdGhlIGpvaW4ga2V5LCByZW1haW5zIHZhbGlkIGFuZCBpcyBzdGlsbCBhbGxvd2VkLgot LS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9SRUFETUUgICAgICAgICAgICAgICAgICB8IDExICsr Kwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jICAgICAgICAgIHwgMjYgKysr KysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VhZ2VyX2FnZ3JlZ2F0ZS5vdXQgfCA5MCAr KysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9lYWdlcl9hZ2dyZWdhdGUu c3FsICAgICAgfCAyNiArKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTUzIGluc2VydGlvbnMoKykK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvUkVBRE1FIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL1JFQURNRQppbmRleCA2YzM1YmFjZWVkYi4uNzhhMzA3Y2M1MjMgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9SRUFETUUKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL1JFQURNRQpAQCAtMTU4OCw2ICsxNTg4LDE3IEBAIGFnZ3JlZ2F0aW9uLiAgUHVzaGluZyBw YXJ0aWFsIGFnZ3JlZ2F0aW9uIGluIHRoaXMgY2FzZSBtYXkgcmVzdWx0IGluCiB0aGUgcm93cyBi ZWluZyBncm91cGVkIGRpZmZlcmVudGx5IHRoYW4gZXhwZWN0ZWQsIG9yIHByb2R1Y2UgaW5jb3Jy ZWN0CiB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlIGZ1bmN0aW9ucy4KIAorU2VtaSBqb2lucyBh bmQgYW50aSBqb2lucyBpbXBvc2UgYSBzaW1pbGFyIHJlc3RyaWN0aW9uLiAgU3VjaCBhIGpvaW4K K2RvZXMgbm90IHByZXNlcnZlIGl0cyBpbm5lciByb3dzIGluIHRoZSBqb2luIG91dHB1dCwgc28g YSBwYXJ0aWFsCithZ2dyZWdhdGUgY29tcHV0ZWQgb24gdGhlIGlubmVyIHNpZGUgd291bGQgbm90 IHN1cnZpdmUgdGhlIGpvaW4gYW5kCitjb3VsZCBub3QgYmUgY29tYmluZWQgYnkgdGhlIGZpbmFs IGFnZ3JlZ2F0aW9uLiAgV2UgdGhlcmVmb3JlIGRvIG5vdAorcHVzaCBwYXJ0aWFsIGFnZ3JlZ2F0 aW9uIGRvd24gdG8gdGhlIGlubmVyIHNpZGUgb2YgYSBzZW1pL2FudGkgam9pbi4KKyhBbiBhbnRp IGpvaW4gcmVkdWNlZCBmcm9tIGFuIG91dGVyIGpvaW4gbnVsbC1leHRlbmRzIGl0cyBpbm5lciBz aWRlLAorc28gdGhhdCBpbm5lciByZWxhdGlvbiBpcyBhbHJlYWR5IGV4Y2x1ZGVkIGJ5IHRoZSBv dXRlci1qb2luIGNvbmRpdGlvbgorYWJvdmU7IHRoZSBjYXNlIHNwZWNpZmljYWxseSBhZGRyZXNz ZWQgaGVyZSBpcyBhIHNlbWkvYW50aSBqb2luIHRoYXQKK2RvZXMgbm90IG51bGwtZXh0ZW5kIGl0 cyBpbm5lciBzaWRlLCBzdWNoIGFzIG9uZSBmb3JtZWQgZnJvbSBhbgorRVhJU1RTLCBJTiwgTk9U IEVYSVNUUywgb3IgTk9UIElOIHN1YmxpbmsuKQorCiBEdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBv ZiB0aGUgam9pbiB0cmVlLCB3ZSBldmFsdWF0ZSBlYWNoIGJhc2Ugb3IKIGpvaW4gcmVsYXRpb24g dG8gZGV0ZXJtaW5lIGlmIGVhZ2VyIGFnZ3JlZ2F0aW9uIGNhbiBiZSBhcHBsaWVkLiAgSWYKIGZl YXNpYmxlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBSZWxPcHRJbmZvIGNhbGxlZCBhICJncm91cGVk IHJlbGF0aW9uIgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9k ZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jCmluZGV4IDNmYzJjMmY3 MWQwLi42ODdlOTIzYzQ2YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv cmVsbm9kZS5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYwpAQCAt Mjg0NSw2ICsyODQ1LDMyIEBAIGVhZ2VyX2FnZ3JlZ2F0aW9uX3Bvc3NpYmxlX2Zvcl9yZWxhdGlv bihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQogCQkJcmV0dXJuIGZhbHNlOwog CX0KIAorCS8qCisJICogU2ltaWxhcmx5LCB3ZSBjYW5ub3QgcHVzaCBhIHBhcnRpYWwgYWdncmVn YXRpb24gZG93biB0byBhIHJlbGF0aW9uIG9uCisJICogdGhlIGlubmVyIChSSFMpIHNpZGUgb2Yg YSBzZW1pL2FudGkgam9pbi4gIEEgc2VtaS9hbnRpIGpvaW4gZG9lcyBub3QKKwkgKiBwcmVzZXJ2 ZSBpdHMgaW5uZXIgcm93cyBpbiB0aGUgam9pbiBvdXRwdXQsIHNvIGEgcGFydGlhbCBhZ2dyZWdh dGUKKwkgKiBjb21wdXRlZCBvbiB0aGUgaW5uZXIgc2lkZSB3b3VsZCBub3Qgc3Vydml2ZSB0aGUg am9pbiBhbmQgY291bGQgbm90IGJlCisJICogY29tYmluZWQgYnkgdGhlIGZpbmFsIGFnZ3JlZ2F0 aW9uLgorCSAqCisJICogTm90ZSB0aGF0IGFuIGFudGkgam9pbiByZWR1Y2VkIGZyb20gYW4gb3V0 ZXIgam9pbiBudWxsLWV4dGVuZHMgaXRzCisJICogaW5uZXIgc2lkZSwgc28gdGhhdCBpbm5lciBy ZWxhdGlvbiBhbHJlYWR5IGNhcnJpZXMgbnVsbGluZ19yZWxpZHMgYW5kCisJICogaXMgaGFuZGxl ZCBieSB0aGUgb3V0ZXItam9pbiBjaGVjayBhYm92ZS4gIFRoZSBjYXNlIHRoaXMgY2hlY2sgYWRk cyBpcworCSAqIGEgc2VtaS9hbnRpIGpvaW4gdGhhdCBkb2VzIG5vdCBudWxsLWV4dGVuZCBpdHMg aW5uZXIgc2lkZSwgc3VjaCBhcyBvbmUKKwkgKiBmb3JtZWQgZnJvbSBhbiBFWElTVFMsIElOLCBO T1QgRVhJU1RTLCBvciBOT1QgSU4gc3VibGluay4KKwkgKi8KKwlmb3JlYWNoKGxjLCByb290LT5q b2luX2luZm9fbGlzdCkKKwl7CisJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gbGZpcnN0X25v ZGUoU3BlY2lhbEpvaW5JbmZvLCBsYyk7CisKKwkJaWYgKHNqaW5mby0+am9pbnR5cGUgIT0gSk9J Tl9TRU1JICYmIHNqaW5mby0+am9pbnR5cGUgIT0gSk9JTl9BTlRJKQorCQkJY29udGludWU7CisK KwkJLyogcmVsIGluY2x1ZGVzIGlubmVyLXNpZGUgcmVscyBvZiB0aGlzIGpvaW4gYnV0IG5vdCBp dHMgb3V0ZXIgc2lkZSAqLworCQlpZiAoYm1zX292ZXJsYXAocmVsLT5yZWxpZHMsIHNqaW5mby0+ bWluX3JpZ2h0aGFuZCkgJiYKKwkJCSFibXNfaXNfc3Vic2V0KHNqaW5mby0+bWluX2xlZnRoYW5k LCByZWwtPnJlbGlkcykpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJLyoKIAkgKiBGb3Igbm93 IHdlIGRvbid0IHRyeSB0byBzdXBwb3J0IFBsYWNlSG9sZGVyVmFycy4KIAkgKi8KZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZWFnZXJfYWdncmVnYXRlLm91dCBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZWFnZXJfYWdncmVnYXRlLm91dAppbmRleCA0NTZkMzJlYjEz ZC4uMDkxYWU0OGE5MmIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZWFn ZXJfYWdncmVnYXRlLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VhZ2VyX2Fn Z3JlZ2F0ZS5vdXQKQEAgLTQ2Niw2ICs0NjYsOTYgQEAgR1JPVVAgQlkgdDEuYSBPUkRFUiBCWSB0 MS5hOwogICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVhZ2VyX2FnZ190MSB0 MQogKDkgcm93cykKIAorLS0gRWFnZXIgYWdncmVnYXRpb24gbXVzdCBub3QgcHVzaCBhIHBhcnRp YWwgYWdncmVnYXRlIG9udG8gdGhlIGlubmVyIHNpZGUgb2YgYQorLS0gU0VNSSBvciBBTlRJIGpv aW4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0Mi5iLCBjb3VudCgqKQor ICBGUk9NIGVhZ2VyX2FnZ190MiB0MgorICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9N IGVhZ2VyX2FnZ190MyB0MyBXSEVSRSB0My5hID0gdDIuYSkKK0dST1VQIEJZIHQyLmIgT1JERVIg QlkgdDIuYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU29ydAorICAgT3V0cHV0OiB0Mi5iLCAoY291bnQoKikpCisg ICBTb3J0IEtleTogdDIuYgorICAgLT4gIEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgIE91dHB1dDog dDIuYiwgY291bnQoKikKKyAgICAgICAgIEdyb3VwIEtleTogdDIuYgorICAgICAgICAgLT4gIEhh c2ggQW50aSBKb2luCisgICAgICAgICAgICAgICBPdXRwdXQ6IHQyLmIKKyAgICAgICAgICAgICAg IEhhc2ggQ29uZDogKHQyLmEgPSB0My5hKQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHB1YmxpYy5lYWdlcl9hZ2dfdDIgdDIKKyAgICAgICAgICAgICAgICAgICAgIE91dHB1dDogdDIu YSwgdDIuYiwgdDIuYworICAgICAgICAgICAgICAgLT4gIEhhc2gKKyAgICAgICAgICAgICAgICAg ICAgIE91dHB1dDogdDMuYQorICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHB1 YmxpYy5lYWdlcl9hZ2dfdDMgdDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dDog dDMuYQorKDE1IHJvd3MpCisKK1NFTEVDVCB0Mi5iLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2Fn Z190MiB0MgorICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGVhZ2VyX2FnZ190MyB0 MyBXSEVSRSB0My5hID0gdDIuYSkKK0dST1VQIEJZIHQyLmIgT1JERVIgQlkgdDIuYjsKKyBiIHwg Y291bnQgCistLS0rLS0tLS0tLQorIDAgfCAgIDEwMAorIDEgfCAgICA5OQorIDIgfCAgICA5OQor IDMgfCAgICA5OQorIDQgfCAgICA5OQorIDUgfCAgICA5OQorIDYgfCAgICA5OQorIDcgfCAgICA5 OQorIDggfCAgICA5OQorIDkgfCAgICA5OQorKDEwIHJvd3MpCisKKy0tIEVhZ2VyIGFnZ3JlZ2F0 aW9uIG1heSBzdGlsbCBwdXNoIGEgcGFydGlhbCBhZ2dyZWdhdGUgb250byB0aGUgb3V0ZXIgc2lk ZSBvZgorLS0gYSBTRU1JIG9yIEFOVEkgam9pbgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZG KQorU0VMRUNUIHQyLmIsIGNvdW50KCopCisgIEZST00gZWFnZXJfYWdnX3QyIHQyCisgIFdIRVJF IEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBlYWdlcl9hZ2dfdDEgdDEgV0hFUkUgdDEuYiA9IHQyLmIp CitHUk9VUCBCWSB0Mi5iIE9SREVSIEJZIHQyLmI7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZp bmFsaXplIEdyb3VwQWdncmVnYXRlCisgICBPdXRwdXQ6IHQyLmIsIGNvdW50KCopCisgICBHcm91 cCBLZXk6IHQyLmIKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQyLmIsIChQQVJUSUFM IGNvdW50KCopKQorICAgICAgICAgU29ydCBLZXk6IHQyLmIKKyAgICAgICAgIC0+ICBIYXNoIFJp Z2h0IFNlbWkgSm9pbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5iLCAoUEFSVElBTCBjb3Vu dCgqKSkKKyAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKHQxLmIgPSB0Mi5iKQorICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5lYWdlcl9hZ2dfdDEgdDEKKyAgICAgICAgICAg ICAgICAgICAgIE91dHB1dDogdDEuYSwgdDEuYiwgdDEuYworICAgICAgICAgICAgICAgLT4gIEhh c2gKKyAgICAgICAgICAgICAgICAgICAgIE91dHB1dDogdDIuYiwgKFBBUlRJQUwgY291bnQoKikp CisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFydGlhbCBIYXNoQWdncmVnYXRlCisgICAgICAg ICAgICAgICAgICAgICAgICAgICBPdXRwdXQ6IHQyLmIsIFBBUlRJQUwgY291bnQoKikKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIEtleTogdDIuYgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5lYWdlcl9hZ2dfdDIgdDIKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dDogdDIuYSwgdDIuYiwgdDIuYworKDE4IHJv d3MpCisKK1NFTEVDVCB0Mi5iLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190MiB0MgorICBX SEVSRSBFWElTVFMgKFNFTEVDVCAxIEZST00gZWFnZXJfYWdnX3QxIHQxIFdIRVJFIHQxLmIgPSB0 Mi5iKQorR1JPVVAgQlkgdDIuYiBPUkRFUiBCWSB0Mi5iOworIGIgfCBjb3VudCAKKy0tLSstLS0t LS0tCisgMSB8ICAgMTAwCisgMiB8ICAgMTAwCisgMyB8ICAgMTAwCisgNCB8ICAgMTAwCisgNSB8 ICAgMTAwCisgNiB8ICAgMTAwCisgNyB8ICAgMTAwCisgOCB8ICAgMTAwCisgOSB8ICAgMTAwCiso OSByb3dzKQorCiBEUk9QIFRBQkxFIGVhZ2VyX2FnZ190MTsKIERST1AgVEFCTEUgZWFnZXJfYWdn X3QyOwogRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDM7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9lYWdlcl9hZ2dyZWdhdGUuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZWFnZXJf YWdncmVnYXRlLnNxbAppbmRleCA1M2Q5YjM3N2E2NC4uN2JjYTljNTI0ZGEgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VhZ2VyX2FnZ3JlZ2F0ZS5zcWwKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvZWFnZXJfYWdncmVnYXRlLnNxbApAQCAtMTc3LDYgKzE3NywzMiBAQCBTRUxF Q1QgdDEuYSwgYXZnKHQyLmMpIEZJTFRFUiAoV0hFUkUgcmFuZG9tKCkgPiAwLjUpCiAgIEpPSU4g ZWFnZXJfYWdnX3QyIHQyIE9OIHQxLmIgPSB0Mi5iCiBHUk9VUCBCWSB0MS5hIE9SREVSIEJZIHQx LmE7CiAKKy0tIEVhZ2VyIGFnZ3JlZ2F0aW9uIG11c3Qgbm90IHB1c2ggYSBwYXJ0aWFsIGFnZ3Jl Z2F0ZSBvbnRvIHRoZSBpbm5lciBzaWRlIG9mIGEKKy0tIFNFTUkgb3IgQU5USSBqb2luCitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDIuYiwgY291bnQoKikKKyAgRlJPTSBl YWdlcl9hZ2dfdDIgdDIKKyAgV0hFUkUgTk9UIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBlYWdlcl9h Z2dfdDMgdDMgV0hFUkUgdDMuYSA9IHQyLmEpCitHUk9VUCBCWSB0Mi5iIE9SREVSIEJZIHQyLmI7 CisKK1NFTEVDVCB0Mi5iLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190MiB0MgorICBXSEVS RSBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGVhZ2VyX2FnZ190MyB0MyBXSEVSRSB0My5hID0g dDIuYSkKK0dST1VQIEJZIHQyLmIgT1JERVIgQlkgdDIuYjsKKworLS0gRWFnZXIgYWdncmVnYXRp b24gbWF5IHN0aWxsIHB1c2ggYSBwYXJ0aWFsIGFnZ3JlZ2F0ZSBvbnRvIHRoZSBvdXRlciBzaWRl IG9mCistLSBhIFNFTUkgb3IgQU5USSBqb2luCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYp CitTRUxFQ1QgdDIuYiwgY291bnQoKikKKyAgRlJPTSBlYWdlcl9hZ2dfdDIgdDIKKyAgV0hFUkUg RVhJU1RTIChTRUxFQ1QgMSBGUk9NIGVhZ2VyX2FnZ190MSB0MSBXSEVSRSB0MS5iID0gdDIuYikK K0dST1VQIEJZIHQyLmIgT1JERVIgQlkgdDIuYjsKKworU0VMRUNUIHQyLmIsIGNvdW50KCopCisg IEZST00gZWFnZXJfYWdnX3QyIHQyCisgIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBlYWdl cl9hZ2dfdDEgdDEgV0hFUkUgdDEuYiA9IHQyLmIpCitHUk9VUCBCWSB0Mi5iIE9SREVSIEJZIHQy LmI7CisKIERST1AgVEFCTEUgZWFnZXJfYWdnX3QxOwogRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDI7 CiBEUk9QIFRBQkxFIGVhZ2VyX2FnZ190MzsKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --00000000000009700b06532c03ed--