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 1r8iNM-00BIVm-Gw for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Nov 2023 14:50:49 +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 1r8iNL-000Fw2-80 for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Nov 2023 14:50:47 +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 1r8iNK-000Fvu-Mh for pgsql-hackers@lists.postgresql.org; Thu, 30 Nov 2023 14:50:46 +0000 Received: from forward500b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:d500]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r8iNG-009N25-4o for pgsql-hackers@lists.postgresql.org; Thu, 30 Nov 2023 14:50:44 +0000 Received: from mail-nwsmtp-smtp-production-main-18.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-18.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:ab88:0:640:49ea:0]) by forward500b.mail.yandex.net (Yandex) with ESMTP id CDA5460A5C; Thu, 30 Nov 2023 17:50:38 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-18.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id aoXc4M1Xq4Y0-VKTMvbHL; Thu, 30 Nov 2023 17:50:38 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1701355838; bh=PutMpcb+4MRRV8ek2R5vbSZyg54f6T76vizJOJbl/EU=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=wqDSxJpGPC727xTYDOhKm8tNcHqHCgEN904NcDCR5Q1GgKbBbvImR6/ukJhCCynsb auPP+QjEC+3Uxe7TxCoqCHWv4Eyb/sZCWow8aIIIy+KbK+4GbJ4FQeouqrQdgMfoWJ 1P6gk2OFMu/ghu2G3UOr83nnxAs4nvr1SCoBTSAs= Authentication-Results: mail-nwsmtp-smtp-production-main-18.iva.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Content-Type: multipart/mixed; boundary="------------W9CNA3mH4V68EC7PtT5kPj4S" Message-ID: <5fc8d7f6-9cd5-4da3-8a94-1d06831441fe@yandex.ru> Date: Thu, 30 Nov 2023 17:50:36 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Implement missing join selectivity estimation for range types To: Schoemans Maxime Cc: Damir Belyalov , Tom Lane , PostgreSQL Hackers , SAKR Mahmoud , Diogo Repas , LUO Zhicheng , Tomas Vondra , Andrey Lepikhov References: <8afecd87-d1e5-241c-5e3e-75e1c62c279b@enterprisedb.com> <1bc5e1e4-380b-213d-6e6a-d5e8f7f0c7f5@enterprisedb.com> <84ffb566-8038-ab35-c841-7a5e5728a247@enterprisedb.com> <525ea957-88ff-e2c6-2975-474c849aa234@ulb.be> <48a78946-f380-a279-e75f-711846e509f8@ulb.be> <4c443cf6-96af-0953-fd5b-bd2b5c0c6f00@ulb.be> <2516071.1699991181@sss.pgh.pa.us> Content-Language: en-US From: Alena Rybakina In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------W9CNA3mH4V68EC7PtT5kPj4S Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi! Thank you for your work on the subject, I think it's a really useful feature and it allows optimizer to estimate more correctly clauses with such type of operator. I rewieved your patch and noticed that some comments are repeated into multirangejoinsel functions, I suggest combining them. The proposed changes are in the attached patch. If this topic is about calculating selectivity, have you thought about adding cardinality calculation test for queries with this type of operator? For example, you could form queries similar to those that you use in src/test/regress/sql/multirangetypes.sql and src/test/regress/sql/rangetypes.sql. I added a few in the attached patch. -- Regards, Alena Rybakina --------------W9CNA3mH4V68EC7PtT5kPj4S Content-Type: text/plain; charset=UTF-8; name="changes.diff.txt" Content-Disposition: attachment; filename="changes.diff.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXJhbmdldHlwZXNfc2Vs ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXJhbmdldHlwZXNfc2VsZnVu Y3MuYwppbmRleCBjNjcwZDIyNWEwYy4uNzcwODc2OGI4OWYgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9tdWx0aXJhbmdldHlwZXNfc2VsZnVuY3MuYworKysgYi9zcmMv YmFja2VuZC91dGlscy9hZHQvbXVsdGlyYW5nZXR5cGVzX3NlbGZ1bmNzLmMKQEAgLTE2MjAs MTQgKzE2MjAsMTUgQEAgbXVsdGlyYW5nZWpvaW5zZWwoUEdfRlVOQ1RJT05fQVJHUykKIAkJ CQkJCQkJCQkJCQloaXN0MV9sb3dlciwgbmhpc3QxKTsKIAkJCQlicmVhazsKIAorCQkvKgor CQkgKiBTdGFydCBieSBjb21wYXJpbmcgbG93ZXIgYm91bmRzIGFuZCBpZiB0aGV5IGFyZSBl cXVhbAorCQkgKiBjb21wYXJlIHVwcGVyIGJvdW5kcyBmb3IgY29tcGFyaXNvbiBvcGVyYXRv cnMKKwkJICovCiAJCQljYXNlIE9JRF9NVUxUSVJBTkdFX0xFU1NfRVFVQUxfT1A6CiAKIAkJ CQkvKgogCQkJCSAqIEEgPD0gQgogCQkJCSAqCi0JCQkJICogU3RhcnQgYnkgY29tcGFyaW5n IGxvd2VyIGJvdW5kcyBhbmQgaWYgdGhleSBhcmUgZXF1YWwKLQkJCQkgKiBjb21wYXJlIHVw cGVyIGJvdW5kcwotCQkJCSAqCiAJCQkJICogTmVnYXRpb24gb2YgT0lEX1JBTkdFX0dSRUFU RVJfT1AuCiAJCQkJICoKIAkJCQkgKiBPdmVyZXN0aW1hdGUgYnkgY29tcGFyaW5nIG9ubHkg dGhlIGxvd2VyIGJvdW5kcy4gSGlnaGVyCkBAIC0xNjQ0LDkgKzE2NDUsNiBAQCBtdWx0aXJh bmdlam9pbnNlbChQR19GVU5DVElPTl9BUkdTKQogCQkJCS8qCiAJCQkJICogQSA8IEIKIAkJ CQkgKgotCQkJCSAqIFN0YXJ0IGJ5IGNvbXBhcmluZyBsb3dlciBib3VuZHMgYW5kIGlmIHRo ZXkgYXJlIGVxdWFsCi0JCQkJICogY29tcGFyZSB1cHBlciBib3VuZHMKLQkJCQkgKgogCQkJ CSAqIFVuZGVyZXN0aW1hdGUgYnkgY29tcGFyaW5nIG9ubHkgdGhlIGxvd2VyIGJvdW5kcy4g SGlnaGVyCiAJCQkJICogYWNjdXJhY3kgd291bGQgcmVxdWlyZSB1cyB0byBhZGQgUChsb3dl cjEgPSBsb3dlcjIpICoKIAkJCQkgKiBQKHVwcGVyMSA8IHVwcGVyMikKQEAgLTE2NjEsOSAr MTY1OSw2IEBAIG11bHRpcmFuZ2Vqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCQkJLyoK IAkJCQkgKiBBID49IEIKIAkJCQkgKgotCQkJCSAqIFN0YXJ0IGJ5IGNvbXBhcmluZyBsb3dl ciBib3VuZHMgYW5kIGlmIHRoZXkgYXJlIGVxdWFsCi0JCQkJICogY29tcGFyZSB1cHBlciBi b3VuZHMKLQkJCQkgKgogCQkJCSAqIE5lZ2F0aW9uIG9mIE9JRF9SQU5HRV9MRVNTX09QLgog CQkJCSAqCiAJCQkJICogT3ZlcmVzdGltYXRlIGJ5IGNvbXBhcmluZyBvbmx5IHRoZSBsb3dl ciBib3VuZHMuIEhpZ2hlcgpAQCAtMTY4MCw5ICsxNjc1LDYgQEAgbXVsdGlyYW5nZWpvaW5z ZWwoUEdfRlVOQ1RJT05fQVJHUykKIAkJCQkvKgogCQkJCSAqIEEgPiBCID09IEIgPCBBCiAJ CQkJICoKLQkJCQkgKiBTdGFydCBieSBjb21wYXJpbmcgbG93ZXIgYm91bmRzIGFuZCBpZiB0 aGV5IGFyZSBlcXVhbAotCQkJCSAqIGNvbXBhcmUgdXBwZXIgYm91bmRzCi0JCQkJICoKIAkJ CQkgKiBVbmRlcmVzdGltYXRlIGJ5IGNvbXBhcmluZyBvbmx5IHRoZSBsb3dlciBib3VuZHMu IEhpZ2hlcgogCQkJCSAqIGFjY3VyYWN5IHdvdWxkIHJlcXVpcmUgdXMgdG8gYWRkIFAobG93 ZXIxID0gbG93ZXIyKSAqCiAJCQkJICogUCh1cHBlcjEgPiB1cHBlcjIpCkBAIC0xNzczLDE4 ICsxNzY1LDE2IEBAIG11bHRpcmFuZ2Vqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCQlj YXNlIE9JRF9NVUxUSVJBTkdFX0FESkFDRU5UX01VTFRJUkFOR0VfT1A6CiAJCQljYXNlIE9J RF9NVUxUSVJBTkdFX0FESkFDRU5UX1JBTkdFX09QOgogCQkJY2FzZSBPSURfUkFOR0VfQURK QUNFTlRfTVVMVElSQU5HRV9PUDoKLQotCQkJCS8qCi0JCQkJICoganVzdCBwdW50IGZvciBu b3csIGVzdGltYXRpb24gd291bGQgcmVxdWlyZSBlcXVhbGl0eQotCQkJCSAqIHNlbGVjdGl2 aXR5IGZvciBib3VuZHMKLQkJCQkgKi8KIAkJCWNhc2UgT0lEX01VTFRJUkFOR0VfQ09OVEFJ TlNfRUxFTV9PUDoKIAkJCWNhc2UgT0lEX01VTFRJUkFOR0VfRUxFTV9DT05UQUlORURfT1A6 CiAKLQkJCQkvKgotCQkJCSAqIGp1c3QgcHVudCBmb3Igbm93LCBlc3RpbWF0aW9uIHdvdWxk IHJlcXVpcmUgZXh0cmFjdGlvbiBvZgotCQkJCSAqIGhpc3RvZ3JhbXMgZm9yIHRoZSBhbnll bGVtZW50Ci0JCQkJICovCisJCQkgICAvKgorCQkJCSoganVzdCBwdW50IGZvciBub3c6CisJ CQkJKiBpZiBpdCBpcyBhIHR5cGUgb2YgYWRqdWNlbnQgb3BlcmF0aW9uIGVzdGltYXRpb24K KwkJCQkqIGl0IHdpbGwgcmVxdWlyZSBlcXVhbGl0eSBzZWxlY3Rpdml0eSBmb3IgYm91bmRz OworCQkJCSogaWYgaXQgaXMgb25lIG9mIHR5cGUgb2YgY29udGFpbiBvcGVyYXRpb24KKwkJ CQkqIGl0IHdpbGwgZXh0cmFjdGlvbiBvZiBoaXN0b2dyYW1zIGZvciB0aGUgYW55IGVsZW1l bnQuCisJCQkJKi8KIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbXVsdGlyYW5nZXR5cGVzLm91dCBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbXVsdGlyYW5nZXR5cGVzLm91dAppbmRleCAyMWQ2M2Q5 YmRhYy4uNzJmMTVjZjQ4ZTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvbXVsdGlyYW5nZXR5cGVzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L211bHRpcmFuZ2V0eXBlcy5vdXQKQEAgLTMzNjQsNiArMzM2NCwyNSBAQCBERVRBSUw6ICBB IHJlc3VsdCBvZiB0eXBlIGFueW11bHRpcmFuZ2UgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGlu cHV0IG9mIHR5cGUgYW55cgogLS0KIC0tIHRlc3Qgc2VsZWN0aXZpdHkgb2YgbXVsdGlyYW5n ZSBqb2luIG9wZXJhdG9ycwogLS0KK2NyZWF0ZSBmdW5jdGlvbiBjaGVja19lc3RpbWF0ZWRf cm93cyh0ZXh0KSByZXR1cm5zIHRhYmxlIChlc3RpbWF0ZWQgaW50LCBhY3R1YWwgaW50KQor bGFuZ3VhZ2UgcGxwZ3NxbCBhcworJCQKK2RlY2xhcmUKKyAgICBsbiB0ZXh0OworICAgIHRt cCB0ZXh0W107CisgICAgZmlyc3Rfcm93IGJvb2wgOj0gdHJ1ZTsKK2JlZ2luCisgICAgZm9y IGxuIGluCisgICAgICAgIGV4ZWN1dGUgZm9ybWF0KCdleHBsYWluIGFuYWx5emUgJXMnLCAk MSkKKyAgICBsb29wCisgICAgICAgIGlmIGZpcnN0X3JvdyB0aGVuCisgICAgICAgICAgICBm aXJzdF9yb3cgOj0gZmFsc2U7CisgICAgICAgICAgICB0bXAgOj0gcmVnZXhwX21hdGNoKGxu LCAncm93cz0oXGQqKSAuKiByb3dzPShcZCopJyk7CisgICAgICAgICAgICByZXR1cm4gcXVl cnkgc2VsZWN0IHRtcFsxXTo6aW50LCB0bXBbMl06OmludDsKKyAgICAgICAgZW5kIGlmOwor ICAgIGVuZCBsb29wOworZW5kOworJCQ7CiBjcmVhdGUgdGFibGUgdGVzdF9tdWx0aXJhbmdl X2pvaW5fMSAoaW1yMSBpbnQ0bXVsdGlyYW5nZSk7CiBjcmVhdGUgdGFibGUgdGVzdF9tdWx0 aXJhbmdlX2pvaW5fMiAoaW1yMiBpbnQ0bXVsdGlyYW5nZSk7CiBjcmVhdGUgdGFibGUgdGVz dF9tdWx0aXJhbmdlX2pvaW5fMyAoaW1yMyBpbnQ0bXVsdGlyYW5nZSk7CkBAIC0zNDIxLDYg KzM0NDAsNDAgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgY291bnQoKikgZnJvbSB0 ZXN0X211bHRpcmFuZ2Vfam9pbl8xLCB0ZXN0X211bHRpcmFuZ2UKICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiB0ZXN0X211bHRpcmFuZ2Vfam9pbl8xCiAoOSByb3dzKQogCitTRUxFQ1Qg KiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgIHNlbGVjdCBjb3VudCgqKQorICAg ZnJvbSB0ZXN0X211bHRpcmFuZ2Vfam9pbl8xLAorICAgICAgICB0ZXN0X211bHRpcmFuZ2Vf am9pbl8yCisgICB3aGVyZSBpbXIxICYmIGltcjIKKycpOworIGVzdGltYXRlZCB8IGFjdHVh bCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgICAxIHwgICAgICAxCisoMSByb3cp CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgc2VsZWN0IGNv dW50KCopCisgICBmcm9tIHRlc3RfbXVsdGlyYW5nZV9qb2luXzEsCisgICAgICAgIHRlc3Rf bXVsdGlyYW5nZV9qb2luXzIKKyAgIHdoZXJlIGltcjEgPDwgaW1yMgorJyk7CisgZXN0aW1h dGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAgIDEgfCAgICAg IDEKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisg ICBzZWxlY3QgY291bnQoKikKKyAgIGZyb20gdGVzdF9tdWx0aXJhbmdlX2pvaW5fMSwKKyAg ICAgICAgdGVzdF9tdWx0aXJhbmdlX2pvaW5fMgorICAgd2hlcmUgaW1yMSA+PiBpbXIyCisn KTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAg ICAgMSB8ICAgICAgMQorKDEgcm93KQorCiBkcm9wIHRhYmxlIHRlc3RfbXVsdGlyYW5nZV9q b2luXzE7CiBkcm9wIHRhYmxlIHRlc3RfbXVsdGlyYW5nZV9qb2luXzI7CiBkcm9wIHRhYmxl IHRlc3RfbXVsdGlyYW5nZV9qb2luXzM7Citkcm9wIGZ1bmN0aW9uIGNoZWNrX2VzdGltYXRl ZF9yb3dzOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZXR5 cGVzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcmFuZ2V0eXBlcy5vdXQKaW5k ZXggMzU3YmIzMTU0YjIuLjMxNjhjMTJiMmRjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3JhbmdldHlwZXMub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvcmFuZ2V0eXBlcy5vdXQKQEAgLTE4MzcsNiArMTgzNywyNSBAQCBERVRBSUw6ICBB IHJlc3VsdCBvZiB0eXBlIGFueXJhbmdlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBpbnB1dCBv ZiB0eXBlIGFueXJhbmdlCiAtLQogLS0gdGVzdCBzZWxlY3Rpdml0eSBvZiByYW5nZSBqb2lu IG9wZXJhdG9ycwogLS0KK2NyZWF0ZSBmdW5jdGlvbiBjaGVja19lc3RpbWF0ZWRfcm93cyh0 ZXh0KSByZXR1cm5zIHRhYmxlIChlc3RpbWF0ZWQgaW50LCBhY3R1YWwgaW50KQorbGFuZ3Vh Z2UgcGxwZ3NxbCBhcworJCQKK2RlY2xhcmUKKyAgICBsbiB0ZXh0OworICAgIHRtcCB0ZXh0 W107CisgICAgZmlyc3Rfcm93IGJvb2wgOj0gdHJ1ZTsKK2JlZ2luCisgICAgZm9yIGxuIGlu CisgICAgICAgIGV4ZWN1dGUgZm9ybWF0KCdleHBsYWluIGFuYWx5emUgJXMnLCAkMSkKKyAg ICBsb29wCisgICAgICAgIGlmIGZpcnN0X3JvdyB0aGVuCisgICAgICAgICAgICBmaXJzdF9y b3cgOj0gZmFsc2U7CisgICAgICAgICAgICB0bXAgOj0gcmVnZXhwX21hdGNoKGxuLCAncm93 cz0oXGQqKSAuKiByb3dzPShcZCopJyk7CisgICAgICAgICAgICByZXR1cm4gcXVlcnkgc2Vs ZWN0IHRtcFsxXTo6aW50LCB0bXBbMl06OmludDsKKyAgICAgICAgZW5kIGlmOworICAgIGVu ZCBsb29wOworZW5kOworJCQ7CiBjcmVhdGUgdGFibGUgdGVzdF9yYW5nZV9qb2luXzEgKGly MSBpbnQ0cmFuZ2UpOwogY3JlYXRlIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8yIChpcjIgaW50 NHJhbmdlKTsKIGNyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fMyAoaXIzIGludDRyYW5n ZSk7CkBAIC0xODk0LDYgKzE5MTMsNDAgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3Qg Y291bnQoKikgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fMSwgdGVzdF9yYW5nZV9qb2luXzIsIHQK ICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pvaW5fMQogKDkgcm93cykK IAorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICBzZWxlY3QgY291 bnQoKikKKyAgIGZyb20gdGVzdF9yYW5nZV9qb2luXzEsCisgICAgICAgIHRlc3RfcmFuZ2Vf am9pbl8yCisgICB3aGVyZSBpcjEgJiYgaXIyCisnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwg CistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgICAgMSB8ICAgICAgMQorKDEgcm93KQor CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgIHNlbGVjdCBjb3Vu dCgqKQorICAgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fMSwKKyAgICAgICAgdGVzdF9yYW5nZV9q b2luXzIKKyAgIHdoZXJlIGlyMSA8PCBpcjIKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAK Ky0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgICAxIHwgICAgICAxCisoMSByb3cpCisK K1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgc2VsZWN0IGNvdW50 KCopCisgICBmcm9tIHRlc3RfcmFuZ2Vfam9pbl8xLAorICAgICAgICB0ZXN0X3JhbmdlX2pv aW5fMgorICAgd2hlcmUgaXIxID4+IGlyMgorJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAor LS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAgIDEgfCAgICAgIDEKKygxIHJvdykKKwog ZHJvcCB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fMTsKIGRyb3AgdGFibGUgdGVzdF9yYW5nZV9q b2luXzI7CiBkcm9wIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8zOworZHJvcCBmdW5jdGlvbiBj aGVja19lc3RpbWF0ZWRfcm93czsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L211bHRpcmFuZ2V0eXBlcy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tdWx0aXJhbmdl dHlwZXMuc3FsCmluZGV4IDRjNjJjMzExNjZhLi5jZDgyOGZjNDJjMSAxMDA2NDQKLS0tIGEv c3JjL3Rlc3QvcmVncmVzcy9zcWwvbXVsdGlyYW5nZXR5cGVzLnNxbAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL3NxbC9tdWx0aXJhbmdldHlwZXMuc3FsCkBAIC04NjUsNiArODY1LDI3IEBA IGNyZWF0ZSBmdW5jdGlvbiBtcl90YWJsZV9mYWlsKGkgYW55ZWxlbWVudCkgcmV0dXJucyB0 YWJsZShpIGFueWVsZW1lbnQsIHIgYW55bXVsCiAtLQogLS0gdGVzdCBzZWxlY3Rpdml0eSBv ZiBtdWx0aXJhbmdlIGpvaW4gb3BlcmF0b3JzCiAtLQorCitjcmVhdGUgZnVuY3Rpb24gY2hl Y2tfZXN0aW1hdGVkX3Jvd3ModGV4dCkgcmV0dXJucyB0YWJsZSAoZXN0aW1hdGVkIGludCwg YWN0dWFsIGludCkKK2xhbmd1YWdlIHBscGdzcWwgYXMKKyQkCitkZWNsYXJlCisgICAgbG4g dGV4dDsKKyAgICB0bXAgdGV4dFtdOworICAgIGZpcnN0X3JvdyBib29sIDo9IHRydWU7Citi ZWdpbgorICAgIGZvciBsbiBpbgorICAgICAgICBleGVjdXRlIGZvcm1hdCgnZXhwbGFpbiBh bmFseXplICVzJywgJDEpCisgICAgbG9vcAorICAgICAgICBpZiBmaXJzdF9yb3cgdGhlbgor ICAgICAgICAgICAgZmlyc3Rfcm93IDo9IGZhbHNlOworICAgICAgICAgICAgdG1wIDo9IHJl Z2V4cF9tYXRjaChsbiwgJ3Jvd3M9KFxkKikgLiogcm93cz0oXGQqKScpOworICAgICAgICAg ICAgcmV0dXJuIHF1ZXJ5IHNlbGVjdCB0bXBbMV06OmludCwgdG1wWzJdOjppbnQ7CisgICAg ICAgIGVuZCBpZjsKKyAgICBlbmQgbG9vcDsKK2VuZDsKKyQkOworCiBjcmVhdGUgdGFibGUg dGVzdF9tdWx0aXJhbmdlX2pvaW5fMSAoaW1yMSBpbnQ0bXVsdGlyYW5nZSk7CiBjcmVhdGUg dGFibGUgdGVzdF9tdWx0aXJhbmdlX2pvaW5fMiAoaW1yMiBpbnQ0bXVsdGlyYW5nZSk7CiBj cmVhdGUgdGFibGUgdGVzdF9tdWx0aXJhbmdlX2pvaW5fMyAoaW1yMyBpbnQ0bXVsdGlyYW5n ZSk7CkBAIC04ODUsNiArOTA2LDI4IEBAIGV4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IGNv dW50KCopIGZyb20gdGVzdF9tdWx0aXJhbmdlX2pvaW5fMSwgdGVzdF9tdWx0aXJhbmdlCiBl eHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3RfbXVsdGlyYW5n ZV9qb2luXzEsIHRlc3RfbXVsdGlyYW5nZV9qb2luXzIsIHRlc3RfbXVsdGlyYW5nZV9qb2lu XzMgd2hlcmUgaW1yMSA8PCBpbXIyIGFuZCBpbXIyIDw8IGltcjM7CiBleHBsYWluIChjb3N0 cyBvZmYpIHNlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3RfbXVsdGlyYW5nZV9qb2luXzEsIHRl c3RfbXVsdGlyYW5nZV9qb2luXzIsIHRlc3RfbXVsdGlyYW5nZV9qb2luXzMgd2hlcmUgaW1y MSA+PiBpbXIyIGFuZCBpbXIyID4+IGltcjM7CiAKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0 aW1hdGVkX3Jvd3MoJworICAgc2VsZWN0IGNvdW50KCopCisgICBmcm9tIHRlc3RfbXVsdGly YW5nZV9qb2luXzEsCisgICAgICAgIHRlc3RfbXVsdGlyYW5nZV9qb2luXzIKKyAgIHdoZXJl IGltcjEgJiYgaW1yMgorJyk7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jv d3MoJworICAgc2VsZWN0IGNvdW50KCopCisgICBmcm9tIHRlc3RfbXVsdGlyYW5nZV9qb2lu XzEsCisgICAgICAgIHRlc3RfbXVsdGlyYW5nZV9qb2luXzIKKyAgIHdoZXJlIGltcjEgPDwg aW1yMgorJyk7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAg c2VsZWN0IGNvdW50KCopCisgICBmcm9tIHRlc3RfbXVsdGlyYW5nZV9qb2luXzEsCisgICAg ICAgIHRlc3RfbXVsdGlyYW5nZV9qb2luXzIKKyAgIHdoZXJlIGltcjEgPj4gaW1yMgorJyk7 CisKIGRyb3AgdGFibGUgdGVzdF9tdWx0aXJhbmdlX2pvaW5fMTsKIGRyb3AgdGFibGUgdGVz dF9tdWx0aXJhbmdlX2pvaW5fMjsKIGRyb3AgdGFibGUgdGVzdF9tdWx0aXJhbmdlX2pvaW5f MzsKK2Ryb3AgZnVuY3Rpb24gY2hlY2tfZXN0aW1hdGVkX3Jvd3M7CmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9yYW5nZXR5cGVzLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3JhbmdldHlwZXMuc3FsCmluZGV4IDEwMThhMjM0YTU5Li41MGFiNmM0NTUyYiAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcmFuZ2V0eXBlcy5zcWwKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcmFuZ2V0eXBlcy5zcWwKQEAgLTYzMyw2ICs2MzMsMjcgQEAg Y3JlYXRlIGZ1bmN0aW9uIHRhYmxlX2ZhaWwoaSBhbnllbGVtZW50KSByZXR1cm5zIHRhYmxl KGkgYW55ZWxlbWVudCwgciBhbnlyYW5nZSkKIC0tCiAtLSB0ZXN0IHNlbGVjdGl2aXR5IG9m IHJhbmdlIGpvaW4gb3BlcmF0b3JzCiAtLQorCitjcmVhdGUgZnVuY3Rpb24gY2hlY2tfZXN0 aW1hdGVkX3Jvd3ModGV4dCkgcmV0dXJucyB0YWJsZSAoZXN0aW1hdGVkIGludCwgYWN0dWFs IGludCkKK2xhbmd1YWdlIHBscGdzcWwgYXMKKyQkCitkZWNsYXJlCisgICAgbG4gdGV4dDsK KyAgICB0bXAgdGV4dFtdOworICAgIGZpcnN0X3JvdyBib29sIDo9IHRydWU7CitiZWdpbgor ICAgIGZvciBsbiBpbgorICAgICAgICBleGVjdXRlIGZvcm1hdCgnZXhwbGFpbiBhbmFseXpl ICVzJywgJDEpCisgICAgbG9vcAorICAgICAgICBpZiBmaXJzdF9yb3cgdGhlbgorICAgICAg ICAgICAgZmlyc3Rfcm93IDo9IGZhbHNlOworICAgICAgICAgICAgdG1wIDo9IHJlZ2V4cF9t YXRjaChsbiwgJ3Jvd3M9KFxkKikgLiogcm93cz0oXGQqKScpOworICAgICAgICAgICAgcmV0 dXJuIHF1ZXJ5IHNlbGVjdCB0bXBbMV06OmludCwgdG1wWzJdOjppbnQ7CisgICAgICAgIGVu ZCBpZjsKKyAgICBlbmQgbG9vcDsKK2VuZDsKKyQkOworCiBjcmVhdGUgdGFibGUgdGVzdF9y YW5nZV9qb2luXzEgKGlyMSBpbnQ0cmFuZ2UpOwogY3JlYXRlIHRhYmxlIHRlc3RfcmFuZ2Vf am9pbl8yIChpcjIgaW50NHJhbmdlKTsKIGNyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5f MyAoaXIzIGludDRyYW5nZSk7CkBAIC02NTMsNiArNjc0LDI4IEBAIGV4cGxhaW4gKGNvc3Rz IG9mZikgc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF9yYW5nZV9qb2luXzEsIHRlc3RfcmFu Z2Vfam9pbl8yLCB0CiBleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCBjb3VudCgqKSBmcm9t IHRlc3RfcmFuZ2Vfam9pbl8xLCB0ZXN0X3JhbmdlX2pvaW5fMiwgdGVzdF9yYW5nZV9qb2lu XzMgd2hlcmUgaXIxIDw8IGlyMiBhbmQgaXIyIDw8IGlyMzsKIGV4cGxhaW4gKGNvc3RzIG9m Zikgc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF9yYW5nZV9qb2luXzEsIHRlc3RfcmFuZ2Vf am9pbl8yLCB0ZXN0X3JhbmdlX2pvaW5fMyB3aGVyZSBpcjEgPj4gaXIyIGFuZCBpcjIgPj4g aXIzOwogCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgIHNlbGVj dCBjb3VudCgqKQorICAgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fMSwKKyAgICAgICAgdGVzdF9y YW5nZV9qb2luXzIKKyAgIHdoZXJlIGlyMSAmJiBpcjIKKycpOworCitTRUxFQ1QgKiBGUk9N IGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgIHNlbGVjdCBjb3VudCgqKQorICAgZnJvbSB0 ZXN0X3JhbmdlX2pvaW5fMSwKKyAgICAgICAgdGVzdF9yYW5nZV9qb2luXzIKKyAgIHdoZXJl IGlyMSA8PCBpcjIKKycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCcKKyAgIHNlbGVjdCBjb3VudCgqKQorICAgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fMSwKKyAg ICAgICAgdGVzdF9yYW5nZV9qb2luXzIKKyAgIHdoZXJlIGlyMSA+PiBpcjIKKycpOworCiBk cm9wIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8xOwogZHJvcCB0YWJsZSB0ZXN0X3JhbmdlX2pv aW5fMjsKIGRyb3AgdGFibGUgdGVzdF9yYW5nZV9qb2luXzM7Citkcm9wIGZ1bmN0aW9uIGNo ZWNrX2VzdGltYXRlZF9yb3dzOwo= --------------W9CNA3mH4V68EC7PtT5kPj4S--