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 1vvVX6-005QgM-0U for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 07:11:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvVX4-00AVNd-1h for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 07:11:34 +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 1vvVX4-00AVNU-0I for pgsql-hackers@lists.postgresql.org; Thu, 26 Feb 2026 07:11:34 +0000 Received: from mail-oo1-xc34.google.com ([2607:f8b0:4864:20::c34]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvVX0-00000001Liv-1FGo for pgsql-hackers@lists.postgresql.org; Thu, 26 Feb 2026 07:11:33 +0000 Received: by mail-oo1-xc34.google.com with SMTP id 006d021491bc7-679efb9eb0dso468359eaf.2 for ; Wed, 25 Feb 2026 23:11:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772089889; cv=none; d=google.com; s=arc-20240605; b=gjq8rE7yWNFVO01dRNvcW04y8DoYTSANbZajzEoQdx75LwCM1Q5LLkUBtBRd8bRcEZ /mY0jQmgEXz0UhkScPUMwk9bc/3BaBNaHrnq+gBx4scnTvlC27GrgkY0tnzKOX7AhDLP fbBMT64VQe+3YWU/Jl+gxH4ToQ7vjhDCURvzP1oGPKXlLx9IEcTF8W0vfm0Z2ZpGSCgj MP6dciel/0ScmDAGVAtCMyrtPD3N/IHC/EdLwKfxWG0OFQgHF42UgFsTyiG+i0RUMoet /jo4SBPRkBxgeAxzldenR2IVJq7SElL//aQsWR1+tSE/LjYmARYJYmDiEMhwN8X3ElX5 WfJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=ajyE7XLDYNb1x/NhUzCrbpYp+5BFA4oUoWxxZk8Z0Q0=; fh=pmBMntjmyx6XYOkmIq7jCPL8+6Ex8nEv6KGKxj4+8uc=; b=XT6/EJjA0rYyjM2tyDhcUsrJPi6/Qvtv+/LUaFvRylXeShew0JDHCI+RjBjr08qDDR bEiQDaVhecZ6SUur7qk8earsA88Vzz7L1q5hi6L/Bdeww2YgohxoQyviUS2WTZLOtkfQ 4dbcArXQIPXD3fT0DELKoOHr6GR0SJUBSWwOrOT8ITlcHPbdXuOWDwHJrhF/o2qte4aQ cJteIUMg3+ehWtsajuEeittFv5VOnJMKnufWHckXQheqwKaZjuavkw2P89XgLgzneffk V3zjvACDW5nTzcgB8QBBQ1EXOn2EeGzKmRH/IxZ0I6KhOLACZ7n3Zbwpruq21O4jv80h fnuw==; darn=lists.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=20230601; t=1772089889; x=1772694689; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=ajyE7XLDYNb1x/NhUzCrbpYp+5BFA4oUoWxxZk8Z0Q0=; b=m9hMdJggKEKq1efMZhFJkjgS56AMcbBRhf15K8t56GBPvjoaGeizKTqtXfftuobv7h 8KtJjZ7qu4XZwMHF2OsxUBPWUgkgM6wPes07/6xQYWZCtkAAQJWP6IWDW5djCS3Jyh23 pIPMel1z+1ebUxEPf/Whk771ABFUzRT6ll2emy9eKXHoNGmOxmc+zSJm2hmAP0IiOvec yyWKxTPd27lrT+2NVsHlTdPCU7Zu2mM8RYl6vlgOeO0pCqxWqv68Vx7KYP5erIXwQPFg wZbMAhNQ1irQC+aBjU6BN2vB/XGAEeVENuMAaSDsdOgpOLVUnkbtsVceyfsTi2ZtrWk8 BUgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772089889; x=1772694689; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ajyE7XLDYNb1x/NhUzCrbpYp+5BFA4oUoWxxZk8Z0Q0=; b=soxgDuK7nlMM9b5CzRNfsVoUR8MQaiSviwb3sZlAwSKpLN167GBeRwmpaVYfkJB4FB 4NWlQZXuab+CELUTK+1NpHOrlJMUbzxIRly8MOcLJ2j0qaIXhv8R1cjayTTQPwpAYK7i 3TY5sQaxk0VFMW94V60pq9xRTpvv+guqgropYgX3jUzLpjdK8O5MSUevw4Eh/FWoCpJG uhWHZNAhM4ziF9pzgr7UHoZpVsz3TiuLdWmum6uZ/7pExpX5Mzj8tMjkROhCuGSlY0Yi 2ggInsaq+pf113fxfzN3HTft6V0QGVcSdP/uhBMeBjMaUT+ls7gHxSx7cafRUv/gCv5g IMsA== X-Gm-Message-State: AOJu0YyQQ8cp3g68ihVWUgsMSEQLqc07yVn1gdI79F9GDz+h8Ou2v0yF 5N2UAv8MGBA4je+5ww+6++VN3J0PVgJbQCo5WzfrsaltwydZ86xwPZmjStsw656nP9cYZi7kEqh BTjdlI3n4cAw1yu4w96xHCb2hxQxXMqe7Q5uS X-Gm-Gg: ATEYQzyMpzrXkuyxfXvSn4M+yinnzSY0D82sU7A2WdkB+6TAdPSOi60VgGk2+4VTeKY YemtpBJKDttlfdQaLunnlAB4CgrXRdTr7wN7KaC8NIysVdBMyX02nSj6jn88gDrK3MvP4PhhMaS Uc0Bujxh0PdlIVEleM4mnFB0PmAMYQKX/BD4PBYcy4xVIpSAodjRXQdjnjZOGF5zHmGl2tmNkfj yira09/eqwm9FWpRs7MfSHujVZbqfIIahy4D/oQdXM4B99g9VezK7eaoQeA2lOODCNrbeuoMW8K paNh1prHTQ== X-Received: by 2002:a05:6820:2d0b:b0:676:eb1e:df36 with SMTP id 006d021491bc7-679c4470ec8mr10145641eaf.23.1772089888835; Wed, 25 Feb 2026 23:11:28 -0800 (PST) MIME-Version: 1.0 From: Richard Guo Date: Thu, 26 Feb 2026 16:11:17 +0900 X-Gm-Features: AaiRm51TWflnMpp70w0-CSm9LVUM67NN2_lqjGYaEsQjcoqVH51E7BPDYaUh5YA Message-ID: Subject: Convert ALL SubLinks to ANY SubLinks To: Pg Hackers Content-Type: multipart/mixed; boundary="00000000000055a418064bb4d496" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000055a418064bb4d496 Content-Type: text/plain; charset="UTF-8" I was reading a paper on null-aware anti-joins (section 6 in [1]) and noticed that they use <> ALL to represent NOT IN semantics. We currently execute ALL SubLinks using a nested-loop SubPlan. This made me realize that it could be beneficial to convert ALL SubLinks to ANY SubLinks. According to De Morgan's laws: foo op ALL (sub-SELECT) => NOT (foo negator_op ANY (sub-SELECT)) NOT (foo op ALL (sub-SELECT)) => foo negator_op ANY (sub-SELECT) This conversion makes it possible for the executor to evaluate the sublink using a hashed SubPlan, which replaces a nested loop with a more efficient hash probe. Even better, because our planner already knows how to pull up ANY SubLinks (and pending the other patch, NOT ANY SubLinks), these transformed clauses have the chance to be optimized directly into semijoins or anti-joins. In the worst-case scenario where the transformed ANY sublink cannot be pulled up and cannot be hashed, execution falls back to a nested-loop SubPlan. Performance in this scenario is effectively identical to the legacy ALL SubPlan, so there should be no regressions. Because the operator is negated, the ANY subplan will short-circuit on the exact same inner tuple that the ALL subplan would have short-circuited on. The only added overhead is a single boolean NOT inversion per outer tuple, which is, IMO, computationally negligible compared to the cost of the nested-loop execution itself. Attached is a draft patch illustrating the idea. Any thoughts or interest in this transformation? [1] http://www.vldb.org/pvldb/vol2/vldb09-423.pdf - Richard --00000000000055a418064bb4d496 Content-Type: application/octet-stream; name="v1-0001-Convert-ALL-SubLinks-to-ANY-SubLinks.patch" Content-Disposition: attachment; filename="v1-0001-Convert-ALL-SubLinks-to-ANY-SubLinks.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm34jp8e0 RnJvbSA0ZTg1MGUzN2U4OWE2ZThkMjE3NDAzOTU2YTA0M2QyNGVjMzdiNmYyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogVGh1LCAyNiBGZWIgMjAyNiAwOTo1MTo1NyArMDkwMApTdWJqZWN0OiBbUEFUQ0ggdjFd IENvbnZlcnQgQUxMIFN1YkxpbmtzIHRvIEFOWSBTdWJMaW5rcwoKLS0tCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvcHJlcC9wcmVwam9pbnRyZWUuYyB8IDE2OSArKysrKysrKysrKysrKysrKysrKyst CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQgICB8ICAyOCArKysrCiBz cmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsICAgICAgICB8ICAxMiArKwogMyBmaWxl cyBjaGFuZ2VkLCAyMDYgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwam9pbnRyZWUuYyBiL3NyYy9iYWNrZW5k L29wdGltaXplci9wcmVwL3ByZXBqb2ludHJlZS5jCmluZGV4IGM5MGY0YjMyNzMzLi4wMDhiYjQ2 OWQyZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVl LmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMKQEAgLTQ0 LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCiAjaW5jbHVkZSAicmV3 cml0ZS9yZXdyaXRlSGFuZGxlci5oIgogI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgi CisjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAK IApAQCAtMTEzLDYgKzExNCw3IEBAIHN0YXRpYyBOb2RlICpwdWxsX3VwX3N1YmxpbmtzX2pvaW50 cmVlX3JlY3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmp0bm9kZSwKIHN0YXRpYyBOb2Rl ICpwdWxsX3VwX3N1YmxpbmtzX3F1YWxfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAq bm9kZSwKIAkJCQkJCQkJCQkgICBOb2RlICoqanRsaW5rMSwgUmVsaWRzIGF2YWlsYWJsZV9yZWxz MSwKIAkJCQkJCQkJCQkgICBOb2RlICoqanRsaW5rMiwgUmVsaWRzIGF2YWlsYWJsZV9yZWxzMik7 CitzdGF0aWMgTm9kZSAqbmVnYXRlX3N1YmxpbmtfdGVzdGV4cHIoTm9kZSAqdGVzdGV4cHIpOwog c3RhdGljIE5vZGUgKnB1bGxfdXBfc3VicXVlcmllc19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290 LCBOb2RlICpqdG5vZGUsCiAJCQkJCQkJCQkJSm9pbkV4cHIgKmxvd2VzdF9vdXRlcl9qb2luLAog CQkJCQkJCQkJCUFwcGVuZFJlbEluZm8gKmNvbnRhaW5pbmdfYXBwZW5kcmVsKTsKQEAgLTYyMSw3 ICs2MjMsNyBAQCByZXBsYWNlX2VtcHR5X2pvaW50cmVlKFF1ZXJ5ICpwYXJzZSkKIAogLyoKICAq IHB1bGxfdXBfc3VibGlua3MKLSAqCQlBdHRlbXB0IHRvIHB1bGwgdXAgQU5ZIGFuZCBFWElTVFMg U3ViTGlua3MgdG8gYmUgdHJlYXRlZCBhcworICoJCUF0dGVtcHQgdG8gcHVsbCB1cCBBTlksIEVY SVNUUyBhbmQgQUxMIFN1YkxpbmtzIHRvIGJlIHRyZWF0ZWQgYXMKICAqCQlzZW1pam9pbnMgb3Ig YW50aS1zZW1pam9pbnMuCiAgKgogICogQSBjbGF1c2UgImZvbyBvcCBBTlkgKHN1Yi1TRUxFQ1Qp IiBjYW4gYmUgcHJvY2Vzc2VkIGJ5IHB1bGxpbmcgdGhlCkBAIC02MzksNiArNjQxLDEyIEBAIHJl cGxhY2VfZW1wdHlfam9pbnRyZWUoUXVlcnkgKnBhcnNlKQogICogVW5kZXIgc2ltaWxhciBjb25k aXRpb25zLCBFWElTVFMgYW5kIE5PVCBFWElTVFMgY2xhdXNlcyBjYW4gYmUgaGFuZGxlZAogICog YnkgcHVsbGluZyB1cCB0aGUgc3ViLVNFTEVDVCBhbmQgY3JlYXRpbmcgYSBzZW1pam9pbiBvciBh bnRpLXNlbWlqb2luLgogICoKKyAqIEEgY2xhdXNlICJmb28gb3AgQUxMIChzdWItU0VMRUNUKSIg Y2FuIGJlIGxvZ2ljYWxseSByZXdyaXR0ZW4gaW50byAiTk9UIChmb28KKyAqIG5lZ2F0b3Jfb3Ag QU5ZIChzdWItU0VMRUNUKSkiLiAgVGhpcyBjb252ZXJzaW9uIG1ha2VzIGl0IHBvc3NpYmxlIGZv ciB0aGUKKyAqIGV4ZWN1dG9yIHRvIGV2YWx1YXRlIHRoZSB1bmZsYXR0ZW5lZCBzdWJsaW5rIHVz aW5nIGEgaGFzaGVkIFN1YlBsYW4uCisgKiBGdXJ0aGVybW9yZSwgaXQgZXhwb3NlcyB0aGUgc3Vi bGluayB0byB0aGUgc3RhbmRhcmQgcHVsbC11cCBtYWNoaW5lcnksCisgKiBwb3RlbnRpYWxseSBm bGF0dGVuaW5nIGl0IGludG8gYSBzZW1pam9pbiBvciBhbnRpLXNlbWlqb2luLgorICoKICAqIFRo aXMgcm91dGluZSBzZWFyY2hlcyBmb3Igc3VjaCBjbGF1c2VzIGFuZCBkb2VzIHRoZSBuZWNlc3Nh cnkgcGFyc2V0cmVlCiAgKiB0cmFuc2Zvcm1hdGlvbnMgaWYgYW55IGFyZSBmb3VuZC4KICAqCkBA IC04NDQsNyArODUyLDcgQEAgcHVsbF91cF9zdWJsaW5rc19xdWFsX3JlY3Vyc2UoUGxhbm5lcklu Zm8gKnJvb3QsIE5vZGUgKm5vZGUsCiAJCUpvaW5FeHByICAgKmo7CiAJCVJlbGlkcwkJY2hpbGRf cmVsczsKIAotCQkvKiBJcyBpdCBhIGNvbnZlcnRpYmxlIEFOWSBvciBFWElTVFMgY2xhdXNlPyAq LworCQkvKiBJcyBpdCBhIGNvbnZlcnRpYmxlIEFOWSwgRVhJU1RTIG9yIEFMTCBjbGF1c2U/ICov CiAJCWlmIChzdWJsaW5rLT5zdWJMaW5rVHlwZSA9PSBBTllfU1VCTElOSykKIAkJewogCQkJU2Nh bGFyQXJyYXlPcEV4cHIgKnNhb3A7CkBAIC05NjUsMTIgKzk3MywzNyBAQCBwdWxsX3VwX3N1Ymxp bmtzX3F1YWxfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqbm9kZSwKIAkJCQlyZXR1 cm4gTlVMTDsKIAkJCX0KIAkJfQorCQllbHNlIGlmIChzdWJsaW5rLT5zdWJMaW5rVHlwZSA9PSBB TExfU1VCTElOSykKKwkJeworCQkJTm9kZQkgICAqbmVnYXRlZF9leHByID0gbmVnYXRlX3N1Ymxp bmtfdGVzdGV4cHIoc3VibGluay0+dGVzdGV4cHIpOworCisJCQlpZiAobmVnYXRlZF9leHByICE9 IE5VTEwpCisJCQl7CisJCQkJU3ViTGluayAgICAqYW55X3N1YmxpbmsgPSBjb3B5T2JqZWN0KHN1 YmxpbmspOworCQkJCU5vZGUJICAgKm5vdF9leHByOworCisJCQkJYW55X3N1YmxpbmstPnRlc3Rl eHByID0gbmVnYXRlZF9leHByOworCQkJCWFueV9zdWJsaW5rLT5zdWJMaW5rVHlwZSA9IEFOWV9T VUJMSU5LOworCQkJCS8qIFhYWCBzaG91bGQgd2UgdXBkYXRlIG9wZXJOYW1lIGFjY29yZGluZ2x5 ICovCisKKwkJCQlub3RfZXhwciA9IChOb2RlICopIG1ha2VCb29sRXhwcihOT1RfRVhQUiwKKwkJ CQkJCQkJCQkJCSBsaXN0X21ha2UxKGFueV9zdWJsaW5rKSwKKwkJCQkJCQkJCQkJCSBhbnlfc3Vi bGluay0+bG9jYXRpb24pOworCisJCQkJcmV0dXJuIHB1bGxfdXBfc3VibGlua3NfcXVhbF9yZWN1 cnNlKHJvb3QsCisJCQkJCQkJCQkJCQkJIG5vdF9leHByLAorCQkJCQkJCQkJCQkJCSBqdGxpbmsx LAorCQkJCQkJCQkJCQkJCSBhdmFpbGFibGVfcmVsczEsCisJCQkJCQkJCQkJCQkJIGp0bGluazIs CisJCQkJCQkJCQkJCQkJIGF2YWlsYWJsZV9yZWxzMik7CisJCQl9CisJCX0KIAkJLyogRWxzZSBy ZXR1cm4gaXQgdW5tb2RpZmllZCAqLwogCQlyZXR1cm4gbm9kZTsKIAl9CiAJaWYgKGlzX25vdGNs YXVzZShub2RlKSkKIAl7Ci0JCS8qIElmIHRoZSBpbW1lZGlhdGUgYXJndW1lbnQgb2YgTk9UIGlz IEVYSVNUUywgdHJ5IHRvIGNvbnZlcnQgKi8KKwkJLyogSWYgdGhlIGltbWVkaWF0ZSBhcmd1bWVu dCBvZiBOT1QgaXMgRVhJU1RTIG9yIEFMTCwgdHJ5IHRvIGNvbnZlcnQgKi8KIAkJU3ViTGluayAg ICAqc3VibGluayA9IChTdWJMaW5rICopIGdldF9ub3RjbGF1c2VhcmcoKEV4cHIgKikgbm9kZSk7 CiAJCUpvaW5FeHByICAgKmo7CiAJCVJlbGlkcwkJY2hpbGRfcmVsczsKQEAgLTEwMzEsNiArMTA2 NCwyNiBAQCBwdWxsX3VwX3N1YmxpbmtzX3F1YWxfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwg Tm9kZSAqbm9kZSwKIAkJCQkJcmV0dXJuIE5VTEw7CiAJCQkJfQogCQkJfQorCQkJZWxzZSBpZiAo c3VibGluay0+c3ViTGlua1R5cGUgPT0gQUxMX1NVQkxJTkspCisJCQl7CisJCQkJTm9kZQkgICAq bmVnYXRlZF9leHByID0gbmVnYXRlX3N1YmxpbmtfdGVzdGV4cHIoc3VibGluay0+dGVzdGV4cHIp OworCisJCQkJaWYgKG5lZ2F0ZWRfZXhwciAhPSBOVUxMKQorCQkJCXsKKwkJCQkJU3ViTGluayAg ICAqYW55X3N1YmxpbmsgPSBjb3B5T2JqZWN0KHN1YmxpbmspOworCisJCQkJCWFueV9zdWJsaW5r LT50ZXN0ZXhwciA9IG5lZ2F0ZWRfZXhwcjsKKwkJCQkJYW55X3N1YmxpbmstPnN1YkxpbmtUeXBl ID0gQU5ZX1NVQkxJTks7CisJCQkJCS8qIFhYWCBzaG91bGQgd2UgdXBkYXRlIG9wZXJOYW1lIGFj Y29yZGluZ2x5ICovCisKKwkJCQkJcmV0dXJuIHB1bGxfdXBfc3VibGlua3NfcXVhbF9yZWN1cnNl KHJvb3QsCisJCQkJCQkJCQkJCQkJCSAoTm9kZSAqKSBhbnlfc3VibGluaywKKwkJCQkJCQkJCQkJ CQkJIGp0bGluazEsCisJCQkJCQkJCQkJCQkJCSBhdmFpbGFibGVfcmVsczEsCisJCQkJCQkJCQkJ CQkJCSBqdGxpbmsyLAorCQkJCQkJCQkJCQkJCQkgYXZhaWxhYmxlX3JlbHMyKTsKKwkJCQl9CisJ CQl9CiAJCX0KIAkJLyogRWxzZSByZXR1cm4gaXQgdW5tb2RpZmllZCAqLwogCQlyZXR1cm4gbm9k ZTsKQEAgLTEwNjcsNiArMTEyMCwxMTYgQEAgcHVsbF91cF9zdWJsaW5rc19xdWFsX3JlY3Vyc2Uo UGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKm5vZGUsCiAJcmV0dXJuIG5vZGU7CiB9CiAKKy8qCisg KiBuZWdhdGVfc3VibGlua190ZXN0ZXhwcgorICoJCUF0dGVtcHQgdG8gbG9naWNhbGx5IG5lZ2F0 ZSB0aGUgdGVzdGV4cHIgb2YgYW4gQUxMX1NVQkxJTksuCisgKgorICogVGhpcyBoZWxwZXIgaXMg dXNlZCB0byB0cmFuc2Zvcm0gQUxMIHN1YmxpbmtzIGludG8gQU5ZIHN1YmxpbmtzLiAgSXQgcmV0 dXJucworICogYSBuZXdseSBhbGxvY2F0ZWQgbmVnYXRlZCBleHByZXNzaW9uIHRyZWUsIG9yIE5V TEwgaWYgbmVnYXRpb24gaXMgbm90CisgKiBwb3NzaWJsZS4KKyAqLworc3RhdGljIE5vZGUgKgor bmVnYXRlX3N1YmxpbmtfdGVzdGV4cHIoTm9kZSAqdGVzdGV4cHIpCit7CisJaWYgKHRlc3RleHBy ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmIChJc0EodGVzdGV4cHIsIE9wRXhwcikpCisJ eworCQkvKiBzaW5nbGUtY29sdW1uIGNvbXBhcmlzb24gKi8KKwkJT3BFeHByCSAgICpvcGV4cHIg PSAoT3BFeHByICopIHRlc3RleHByOworCQlPaWQJCQluZWdhdG9yID0gZ2V0X25lZ2F0b3Iob3Bl eHByLT5vcG5vKTsKKworCQlpZiAoT2lkSXNWYWxpZChuZWdhdG9yKSkKKwkJeworCQkJT3BFeHBy CSAgICpuZXdvcGV4cHIgPSBjb3B5T2JqZWN0KG9wZXhwcik7CisKKwkJCW5ld29wZXhwci0+b3Bu byA9IG5lZ2F0b3I7CisJCQluZXdvcGV4cHItPm9wZnVuY2lkID0gSW52YWxpZE9pZDsKKworCQkJ cmV0dXJuIChOb2RlICopIG5ld29wZXhwcjsKKwkJfQorCX0KKwllbHNlIGlmIChpc19hbmRjbGF1 c2UodGVzdGV4cHIpIHx8IGlzX29yY2xhdXNlKHRlc3RleHByKSkKKwl7CisJCS8qIG11bHRpLWNv bHVtbiBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGNoZWNrcyAqLworCQlCb29sRXhwciAgICpiZXhw ciA9IChCb29sRXhwciAqKSB0ZXN0ZXhwcjsKKwkJTGlzdAkgICAqbmFyZ3MgPSBOSUw7CisJCUxp c3RDZWxsICAgKmxjOworCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICogQXBwbHkgRGVN b3JnYW4ncyBMYXdzOgorCQkgKgkJKE5PVCAoQU5EIEEgQikpID0+IChPUiAoTk9UIEEpIChOT1Qg QikpCisJCSAqCQkoTk9UIChPUiBBIEIpKQk9PiAoQU5EIChOT1QgQSkgKE5PVCBCKSkKKwkJICog aS5lLiwgc3dhcCBBTkQgZm9yIE9SIGFuZCBuZWdhdGUgZWFjaCBzdWJjbGF1c2UuCisJCSAqLS0t LS0tLS0tLS0tLS0tLS0tLS0KKwkJICovCisJCWZvcmVhY2gobGMsIGJleHByLT5hcmdzKQorCQl7 CisJCQlOb2RlCSAgICpuZWdhdGVkX2FyZyA9IG5lZ2F0ZV9zdWJsaW5rX3Rlc3RleHByKChOb2Rl ICopIGxmaXJzdChsYykpOworCisJCQlpZiAobmVnYXRlZF9hcmcgPT0gTlVMTCkKKwkJCQlyZXR1 cm4gTlVMTDsKKworCQkJbmFyZ3MgPSBsYXBwZW5kKG5hcmdzLCBuZWdhdGVkX2FyZyk7CisJCX0K KworCQlyZXR1cm4gKGJleHByLT5ib29sb3AgPT0gQU5EX0VYUFIpID8KKwkJCShOb2RlICopIG1h a2VCb29sRXhwcihPUl9FWFBSLCBuYXJncywgYmV4cHItPmxvY2F0aW9uKSA6CisJCQkoTm9kZSAq KSBtYWtlQm9vbEV4cHIoQU5EX0VYUFIsIG5hcmdzLCBiZXhwci0+bG9jYXRpb24pOworCX0KKwll bHNlIGlmIChJc0EodGVzdGV4cHIsIFJvd0NvbXBhcmVFeHByKSkKKwl7CisJCS8qIG11bHRpLWNv bHVtbiBvcmRlcmluZyBjaGVja3MgKi8KKwkJUm93Q29tcGFyZUV4cHIgKnJjZXhwciA9IChSb3dD b21wYXJlRXhwciAqKSB0ZXN0ZXhwcjsKKwkJUm93Q29tcGFyZUV4cHIgKm5ld3JjZXhwcjsKKwkJ TGlzdAkgICAqbmVnYXRlZF9vcG5vcyA9IE5JTDsKKwkJQ29tcGFyZVR5cGUgbmVnYXRlZF9jbXB0 eXBlOworCisJCWZvcmVhY2hfb2lkKG9wbm8sIHJjZXhwci0+b3Bub3MpCisJCXsKKwkJCU9pZAkJ CW5lZ2F0b3IgPSBnZXRfbmVnYXRvcihvcG5vKTsKKworCQkJaWYgKCFPaWRJc1ZhbGlkKG5lZ2F0 b3IpKQorCQkJCXJldHVybiBOVUxMOworCisJCQluZWdhdGVkX29wbm9zID0gbGFwcGVuZF9vaWQo bmVnYXRlZF9vcG5vcywgbmVnYXRvcik7CisJCX0KKworCQlzd2l0Y2ggKHJjZXhwci0+Y21wdHlw ZSkKKwkJeworCQkJY2FzZSBDT01QQVJFX0xUOgorCQkJCW5lZ2F0ZWRfY21wdHlwZSA9IENPTVBB UkVfR0U7CisJCQkJYnJlYWs7CisJCQljYXNlIENPTVBBUkVfTEU6CisJCQkJbmVnYXRlZF9jbXB0 eXBlID0gQ09NUEFSRV9HVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ09NUEFSRV9FUToKKwkJCQlu ZWdhdGVkX2NtcHR5cGUgPSBDT01QQVJFX05FOworCQkJCWJyZWFrOworCQkJY2FzZSBDT01QQVJF X0dFOgorCQkJCW5lZ2F0ZWRfY21wdHlwZSA9IENPTVBBUkVfTFQ7CisJCQkJYnJlYWs7CisJCQlj YXNlIENPTVBBUkVfR1Q6CisJCQkJbmVnYXRlZF9jbXB0eXBlID0gQ09NUEFSRV9MRTsKKwkJCQli cmVhazsKKwkJCWNhc2UgQ09NUEFSRV9ORToKKwkJCQluZWdhdGVkX2NtcHR5cGUgPSBDT01QQVJF X0VROworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCQlicmVh azsKKwkJfQorCisJCW5ld3JjZXhwciA9IGNvcHlPYmplY3QocmNleHByKTsKKwkJbmV3cmNleHBy LT5vcG5vcyA9IG5lZ2F0ZWRfb3Bub3M7CisJCW5ld3JjZXhwci0+Y21wdHlwZSA9IG5lZ2F0ZWRf Y21wdHlwZTsKKworCQlyZXR1cm4gKE5vZGUgKikgbmV3cmNleHByOworCX0KKworCXJldHVybiBO VUxMOworfQorCiAvKgogICogcHJlcHJvY2Vzc19mdW5jdGlvbl9ydGVzCiAgKgkJQ29uc3RhbnQt c2ltcGxpZnkgYW55IEZVTkNUSU9OIFJURXMgaW4gdGhlIEZST00gY2xhdXNlLCBhbmQgdGhlbgpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0CmluZGV4IDIxMzVkODI4ODRkLi42 NTQ0MjJjYTk1MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxl Y3Qub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dApAQCAt MzMyMywzICszMzIzLDMxIEBAIFNFTEVDVCB0ZW4gRlJPTSBvbmVrIHQgV0hFUkUgMS4wOjppbnRl Z2VyIElOICgoVkFMVUVTICgxKSwgKDMpKSk7CiAgU2VxIFNjYW4gb24gb25layB0CiAoMSByb3cp CiAKKy0tCistLSBUZXN0IEFMTCBTdWJMaW5rIHRvIEFOWSBTdWJMaW5rIHRyYW5zZm9ybWF0aW9u CistLQorLS0gRW5zdXJlIHdlIGdldCBhIGhhc2hlZCBBTlktU3ViUGxhbgorRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUICogRlJPTSB0ZW5rMSB0MSBXSEVSRSB0d28gPD4gQUxMIChTRUxFQ1Qg dHdvIEZST00gdGVuazEgdDIpOworICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gdGVuazEgdDEKKyAgIEZp bHRlcjogKE5PVCAoQU5ZICh0d28gPSAoaGFzaGVkIFN1YlBsYW4gYW55XzEpLmNvbDEpKSkKKyAg IFN1YlBsYW4gYW55XzEKKyAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIHQyCisoNCByb3dzKQor CistLSBFbnN1cmUgd2UgZ2V0IGEgam9pbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICog RlJPTSB0ZW5rMSB0MSBXSEVSRSBOT1QgdHdvIDw+IEFMTCAoU0VMRUNUIHR3byBGUk9NIHRlbmsx IHQyKTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoIEpvaW4KKyAgIEhhc2ggQ29u ZDogKHQxLnR3byA9IHQyLnR3bykKKyAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMSB0MQorICAgLT4g IEhhc2gKKyAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICBHcm91cCBL ZXk6IHQyLnR3bworICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIHQyCisoNyBy b3dzKQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbAppbmRleCBjYWRjMzI5MzY4Ny4uNThi ZTkzOWRkMjAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbApAQCAtMTQ0OCwzICsxNDQ4 LDE1IEBAIFNFTEVDVCAqIEZST00gb25layB0MSwgbGF0ZXJhbCAoU0VMRUNUICogRlJPTSBvbmVr IHQyIFdIRVJFIHQyLnRlbiBJTiAodmFsdWVzICh0CiAtLSBWdEEgY2F1c2VzIHRoZSB3aG9sZSBl eHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZCBhcyBhIGNvbnN0YW50CiBFWFBMQUlOIChDT1NUUyBP RkYpCiBTRUxFQ1QgdGVuIEZST00gb25layB0IFdIRVJFIDEuMDo6aW50ZWdlciBJTiAoKFZBTFVF UyAoMSksICgzKSkpOworCistLQorLS0gVGVzdCBBTEwgU3ViTGluayB0byBBTlkgU3ViTGluayB0 cmFuc2Zvcm1hdGlvbgorLS0KKworLS0gRW5zdXJlIHdlIGdldCBhIGhhc2hlZCBBTlktU3ViUGxh bgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSB0ZW5rMSB0MSBXSEVSRSB0d28g PD4gQUxMIChTRUxFQ1QgdHdvIEZST00gdGVuazEgdDIpOworCistLSBFbnN1cmUgd2UgZ2V0IGEg am9pbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSB0ZW5rMSB0MSBXSEVSRSBO T1QgdHdvIDw+IEFMTCAoU0VMRUNUIHR3byBGUk9NIHRlbmsxIHQyKTsKLS0gCjIuMzkuNSAoQXBw bGUgR2l0LTE1NCkKCg== --00000000000055a418064bb4d496--