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 1sy2Kx-00DtI1-Us for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Oct 2024 05:00:44 +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 1sy2Kv-002v5T-Lb for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Oct 2024 05:00:41 +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 1sy2Kv-002v3q-A9 for pgsql-hackers@lists.postgresql.org; Tue, 08 Oct 2024 05:00:41 +0000 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sy2Kp-0038Xe-86 for pgsql-hackers@postgresql.org; Tue, 08 Oct 2024 05:00:40 +0000 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-2e0af6e5da9so3828503a91.2 for ; Mon, 07 Oct 2024 22:00:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1728363632; x=1728968432; darn=postgresql.org; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=8IPfVN35KX2Xyzn+ZXAWfiGPNyzc1Gy0vB8yMRqUxYE=; b=O+7ApVWvFLUyWOhTCx+xzvHflXnXTABizrz4oRspiVasnP9FR/Sq85CecOFux96oS+ FCaxb9nIly0teni4UW53Q14Xgx13a3yCqbwBnTXSuIRvjDRUSljBtIduvJ/SklN3yp9u /mQJsbtLliWZl4L9wQ30klb58VJSG4EBgSN8sYmzQRMS7FADDF16xhA7wO4aoBrm4Cqh c7Vs8/XwQ+nu5A5zsWAnoLb6bhaMlKJle6z9LyHnf+LusLTdu37dEjPiLyb4wBSalwd4 iLpL54E1MaON7VSbF48cdF+vIs+RDeRYg1jnU4H5ur6L/w/nxsYUgkXHwnCWiqnwuJET zeew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728363632; x=1728968432; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=8IPfVN35KX2Xyzn+ZXAWfiGPNyzc1Gy0vB8yMRqUxYE=; b=i9FYFF2Xqem8LlzRFMwerFH50kKkAyr6lSsn4sCHX+INe+L8Hj3OXI60dvrzqW2ppz XnxkIR06MnC6udSLeUr0EoW4QEkmJhrq655Hu1r08EDuwqA3VGuunqZ4Cal6iRx5MYZA zvORBQLY9+AfouSsReqhuwo7KPOxfzZLnWI63KsarX1wQ+DAW9HW5W/Brdhm8OeyL7mw EsqfCQpwTW75V67XWAzpPhme5ZBYqIGzD4HfAcASo8FcyLRCNg+RZVnWxU7vT511a20Q InCDqn8l3pe+F96jntEBGQph0CoJjpQ2z81HiSfx0Ee199MdWeex+si3z1/hJotdbgqm Y+dA== X-Gm-Message-State: AOJu0Yyau0udPkN2QF8vJ7ze+HyjURTB/l5iNW5LBisnB7yjmuWrB47A u/a0zaYlxVrv3BcfdsT7EGfd/WzabWcNZMHaVt1EN2hd7G3HvTI0 X-Google-Smtp-Source: AGHT+IHRyFdjFGnxfQE6a7uoEWemwKoCaoN+Tjt1DbscFumiZETx0ArlCSfiTogMw6P1GLIUqQmJMg== X-Received: by 2002:a17:90b:1a8d:b0:2e0:f896:9d6d with SMTP id 98e67ed59e1d1-2e1e622484fmr16646404a91.16.1728363632380; Mon, 07 Oct 2024 22:00:32 -0700 (PDT) Received: from [10.10.20.99] (node-oie.pool-125-26.dynamic.totinternet.net. [125.26.124.22]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e1e8665529sm8182710a91.39.2024.10.07.22.00.29 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 07 Oct 2024 22:00:31 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------VQdy8WI6kVmSqhrrbF0kk40j" Message-ID: <6b5c342d-45b8-4e01-8ff1-3032b80564ee@gmail.com> Date: Tue, 8 Oct 2024 12:00:27 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: MergeJoin beats HashJoin in the case of multiple hash clauses From: Andrei Lepikhov To: Tomas Vondra , Andy Fan Cc: PostgreSQL-development , Tom Lane , "a.rybakina" References: <52257607-57f6-850d-399a-ec33a654457b@postgrespro.ru> <84114cba-97e9-49f8-952f-04cf321125c1@app.fastmail.com> <1de52b5f-e4a6-5729-eeef-51d524534665@enterprisedb.com> Content-Language: en-AU 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. --------------VQdy8WI6kVmSqhrrbF0kk40j Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 7/8/24 19:45, Andrei Lepikhov wrote: > On 3/11/2023 23:43, Tomas Vondra wrote: >> On 9/11/23 10:04, Lepikhov Andrei wrote: >>   * Determine bucketsize fraction and MCV frequency for the inner >>   * relation. We use the smallest bucketsize or MCV frequency estimated >>   * for any individual hashclause; this is undoubtedly conservative. >> >> I'm sure this may lead to inflated cost for "good" cases (where the >> actual bucket size really is a product), which may push the optimizer to >> use the less efficient/slower join method. > Yes, It was contradictory idea, though. >> IMHO the only principled way forward is to get a better ndistinct >> estimate (which this implicitly does), perhaps by using extended >> statistics. I haven't tried, but I guess it'd need to extract the >> clauses for the inner side, and call estimate_num_groups() on it. > And I've done it. Sorry for so long response. This patch employs of > extended statistics for estimation of the HashJoin bucket_size. In > addition, I describe the idea in more convenient form here [1]. > Obviously, it needs the only ndistinct to make a prediction that allows > to reduce computational cost of this statistic. Minor change to make cfbot happier. -- regards, Andrei Lepikhov --------------VQdy8WI6kVmSqhrrbF0kk40j Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Use-extended-statistics-for-precise-estimation-of.patch" Content-Disposition: attachment; filename*0="v1-0001-Use-extended-statistics-for-precise-estimation-of.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3M2U0ZDE2ODEyNDMxYjkxZmI3NjBkOTk0ZDAxOThiYWFiMmZlMDM0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IE1vbiwgMTMgTWF5IDIwMjQgMTY6MTU6MDIgKzA3MDAKU3ViamVj dDogW1BBVENIIHYxXSBVc2UgZXh0ZW5kZWQgc3RhdGlzdGljcyBmb3IgcHJlY2lzZSBlc3Rp bWF0aW9uIG9mIGJ1Y2tldAogc2l6ZSBpbiBoYXNoIGpvaW4uCgpSZWNvZ25pemluZyB0aGUg cmVhbC1saWZlIGNvbXBsZXhpdHkgd2hlcmUgY29sdW1ucyBpbiB0aGUgdGFibGUgb2Z0ZW4g aGF2ZQpmdW5jdGlvbmFsIGRlcGVuZGVuY2llcywgUG9zdGdyZVNRTCdzIGVzdGltYXRpb24g b2YgdGhlIG51bWJlciBvZiBkaXN0aW5jdAp2YWx1ZXMgb3ZlciBhIHNldCBvZiBjb2x1bW5z IGNhbiBiZSB1bmRlcmVzdGltYXRlZCAob3IgbXVjaCByYXJlbHksCm92ZXJlc3RpbWF0ZWQp IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpLWNsYXVzZSBKT0lOLgpJbiB0aGUgY2FzZSBvZiBo YXNoIGpvaW4sIGl0IGNhbiBlbmQgdXAgd2l0aCBhIHNtYWxsIG51bWJlciBvZiBwcmVkaWN0 ZWQgaGFzaApidWNrZXRzIGFuZCwgYXMgYSByZXN1bHQsIHBpY2tpbmcgbm9uLW9wdGltYWwg bWVyZ2Ugam9pbi4KClRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbiwgd2UgaW50cm9kdWNlIG9u ZSBhZGRpdGlvbmFsIHN0YWdlIG9mIGJ1Y2tldCBzaXplCmVzdGltYXRpb24gLSBoYXZpbmcg dHdvIG9yIG1vcmUgam9pbiBjbGF1c2VzIGVzdGltYXRvciBsb29rdXAgZm9yIGV4dGVuZGVk CnN0YXRpc3RpY3MgYW5kIHVzZSBpdCBmb3IgbXVsdGljb2x1bW4gZXN0aW1hdGlvbi4KQ2xh dXNlcyBhcmUgZ3JvdXBlZCBpbnRvIGxpc3RzLCBlYWNoIGNvbnRhaW5pbmcgZXhwcmVzc2lv bnMgcmVmZXJlbmNpbmcgdGhlCnNhbWUgcmVsYXRpb24uIFRoZSByZXN1bHQgb2YgdGhlIG11 bHRpY29sdW1uIGVzdGltYXRpb24gbWFkZSBvdmVyIHN1Y2ggYSBsaXN0CmlzIGNvbWJpbmVk IHdpdGggb3RoZXJzIGFjY29yZGluZyB0byB0aGUgY2FsbGVyJ3MgbG9naWMuCkNsYXVzZXMg dGhhdCBhcmUgbm90IGVzdGltYXRlZCBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBmb3Ig ZnVydGhlcgplc3RpbWF0aW9uLgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nv c3RzaXplLmMgfCAgMTIgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jICAg ICAgfCAxNzIgKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL3V0aWxz L3NlbGZ1bmNzLmggICAgICAgICAgfCAgIDQgKwogMyBmaWxlcyBjaGFuZ2VkLCAxODcgaW5z ZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29w dGltaXplci9wYXRoL2Nvc3RzaXplLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9j b3N0c2l6ZS5jCmluZGV4IGUxNTIzZDE1ZGYuLmFmMWNiOGJhNzggMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpAQCAtNDI5NCw5ICs0Mjk0LDE5IEBAIGZpbmFs X2Nvc3RfaGFzaGpvaW4oUGxhbm5lckluZm8gKnJvb3QsIEhhc2hQYXRoICpwYXRoLAogCX0K IAllbHNlCiAJeworCQlMaXN0ICpvdGhlcmNsYXVzZXM7CisKIAkJaW5uZXJidWNrZXRzaXpl ID0gMS4wOwogCQlpbm5lcm1jdmZyZXEgPSAxLjA7Ci0JCWZvcmVhY2goaGNsLCBoYXNoY2xh dXNlcykKKworCQkvKiBBdCBmaXJzdCwgdHJ5IHRvIGVzdGltYXRlIGJ1Y2tldCBzaXplIHVz aW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MuICovCisJCW90aGVyY2xhdXNlcyA9IGVzdGltYXRl X211bHRpdmFyaWF0ZV9idWNrZXRzaXplKHJvb3QsCisJCQkJCQkJCQkJCQkJCWlubmVyX3Bh dGgtPnBhcmVudCwKKwkJCQkJCQkJCQkJCQkJaGFzaGNsYXVzZXMsCisJCQkJCQkJCQkJCQkJ CSZpbm5lcmJ1Y2tldHNpemUpOworCisJCS8qIFBhc3MgdGhyb3VnaCB0aGUgcmVtYWluaW5n IGNsYXVzZXMgKi8KKwkJZm9yZWFjaChoY2wsIG90aGVyY2xhdXNlcykKIAkJewogCQkJUmVz dHJpY3RJbmZvICpyZXN0cmljdGluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGhj bCk7CiAJCQlTZWxlY3Rpdml0eSB0aGlzYnVja2V0c2l6ZTsKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Nl bGZ1bmNzLmMKaW5kZXggMDNkN2ZiNWY0OC4uN2E1N2Y0NDRjOCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3NlbGZ1bmNzLmMKQEAgLTM3NTIsNiArMzc1MiwxNzggQEAgZXN0aW1hdGVfbnVtX2dy b3VwcyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqZ3JvdXBFeHBycywgZG91YmxlIGlucHV0 X3Jvd3MsCiAJcmV0dXJuIG51bWRpc3RpbmN0OwogfQogCisvKgorICogVHJ5IHRvIGVzdGlt YXRlIHRoZSBidWNrZXQgc2l6ZSBvZiB0aGUgaGFzaCBqb2luIGlubmVyIHNpZGUgd2hlbiB0 aGUgam9pbgorICogY29uZGl0aW9uIGNvbnRhaW5zIHR3byBvciBtb3JlIGNsYXVzZXMgYnkg ZW1wbG95aW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MuCisgKgorICogVGhlIG1haW4gaWRlYSBv ZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlIGRpc3RpbmN0IHZhbHVlIGdlbmVyYXRlZCBi eQorICogbXVsdGl2YXJpYXRlIGVzdGltYXRpb24gb24gdHdvIG9yIG1vcmUgY29sdW1ucyB3 b3VsZCBwcm92aWRlIGxlc3MgYnVja2V0IHNpemUKKyAqIHRoYW4gZXN0aW1hdGlvbiBvbiBv bmUgc2VwYXJhdGUgY29sdW1uLgorICoKKyAqIElNUE9SVEFOVDogSXQgaXMgY3J1Y2lhbCB0 byBzeW5jaHJvbmlzZSB0aGUgYXBwcm9hY2ggb2YgY29tYmluaW5nIGRpZmZlcmVudAorICog ZXN0aW1hdGlvbnMgd2l0aCB0aGUgY2FsbGVyJ3MgbWV0aG9kLgorICogUmV0dXJuIGEgbGlz dCBvZiBjbGF1c2VzIHRoYXQgZGlkbid0IGZldGNoIGFueSBleHRlbmRlZCBzdGF0aXN0aWNz LgorICovCitMaXN0ICoKK2VzdGltYXRlX211bHRpdmFyaWF0ZV9idWNrZXRzaXplKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICppbm5lciwKKwkJCQkJCQkJIExpc3QgKmhhc2hj bGF1c2VzLAorCQkJCQkJCQkgU2VsZWN0aXZpdHkgKmlubmVyYnVja2V0c2l6ZSkKK3sKKwlM aXN0ICAgKmNsYXVzZXMgPSBsaXN0X2NvcHkoaGFzaGNsYXVzZXMpOworCUxpc3QgICAqb3Ro ZXJjbGF1c2VzID0gTklMOworCWRvdWJsZQluZGlzdGluY3QgPSAxLjA7CisKKwlpZiAobGlz dF9sZW5ndGgoaGFzaGNsYXVzZXMpIDw9IDEpCisJCS8qCisJCSAqIE5vdGhpbmcgdG8gZG8g Zm9yIGEgc2luZ2xlIGNsYXVzZS4gQ291bGQgd2UgZW1wbG95IHVuaXZhcmlhdGUKKwkJICog ZXh0ZW5kZWQgc3RhdCBoZXJlPworCQkgKi8KKwkJcmV0dXJuIGhhc2hjbGF1c2VzOworCisJ d2hpbGUgKGNsYXVzZXMgIT0gTklMKQorCXsKKwkJTGlzdENlbGwgICAqbGM7CisJCWludAkJ CXJlbGlkID0gLTE7CisJCUxpc3QJICAgKnZhcmluZm9zID0gTklMOworCQlMaXN0CSAgICpz YXZlTGlzdCA9IE5JTDsKKwkJZG91YmxlCQltdm5kaXN0aW5jdDsKKwkJTGlzdAkgICAqb3Jp Z2luX3ZhcmluZm9zOworCQlpbnQJCQlncm91cF9yZWxpZCA9IC0xOworCQlSZWxPcHRJbmZv ICpncm91cF9yZWwgPSBOVUxMOworCQlMaXN0Q2VsbCAgICpsYzEsICpsYzI7CisKKwkJLyoK KwkJICogRmluZCBjbGF1c2VzLCByZWZlcmVuY2luZyB0aGUgc2FtZSBzaW5nbGUgYmFzZSBy ZWxhdGlvbiBhbmQgdHJ5IHRvCisJCSAqIGVzdGltYXRlIHN1Y2ggYSBncm91cCB3aXRoIGV4 dGVuZGVkIHN0YXRpc3RpY3MuCisJCSAqIENyZWF0ZSB2YXJpbmZvIGZvciBhbiBhcHByb3Zl ZCBjbGF1c2UsIHB1c2ggaXQgdG8gb3RoZXJjbGF1c2VzLCBpZiBpdAorCQkgKiBjYW4ndCBi ZSBlc3RpbWF0ZWQgaGVyZSBvciBpZ25vcmUgdG8gcHJvY2VzcyBhdCB0aGUgbmV4dCBpdGVy YXRpb24uCisJCSAqLworCQlmb3JlYWNoKGxjLCBjbGF1c2VzKQorCQl7CisJCQlSZXN0cmlj dEluZm8gICAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKwkJCU5v ZGUJCSAgICpleHByOworCQkJUmVsaWRzCQkJcmVsaWRzOworCQkJR3JvdXBWYXJJbmZvICAg KnZhcmluZm87CisKKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBpbm5lciBzaWRlIG9mIHRoZSBq b2luIHdoaWNoIHdlIG5lZWQgdG8gZXN0aW1hdGUgdGhlCisJCQkgKiBudW1iZXIgb2YgYnVj a2V0cy4gVXNlIG91dGVyX2lzX2xlZnQgYmVjYXVzZSB0aGUKKwkJCSAqIGNsYXVzZV9zaWRl c19tYXRjaF9qb2luIHJvdXRpbmUgaGFzIGNhbGxlZCBvbiBoYXNoIGNsYXVzZXMuCisJCQkg Ki8KKwkJCXJlbGlkcyA9IHJpbmZvLT5vdXRlcl9pc19sZWZ0ID8KKwkJCQkJCXJpbmZvLT5y aWdodF9yZWxpZHMgOiByaW5mby0+bGVmdF9yZWxpZHM7CisJCQlleHByID0gcmluZm8tPm91 dGVyX2lzX2xlZnQgPworCQkJCQkJZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSkgOiBnZXRf bGVmdG9wKHJpbmZvLT5jbGF1c2UpOworCisJCQlpZiAoYm1zX2dldF9zaW5nbGV0b25fbWVt YmVyKHJlbGlkcywgJnJlbGlkKSAmJgorCQkJCXJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcmVs aWRdLT5zdGF0bGlzdCAhPSBOSUwpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlubmVy LXNpZGUgZXhwcmVzc2lvbiByZWZlcmVuY2VzIG9ubHkgb25lIHJlbGF0aW9uLgorCQkJCSAq IEV4dGVuZGVkIHN0YXRpc3RpY3Mgb24gdGhpcyBjbGF1c2UgY2FuIGV4aXN0LgorCQkJCSAq LworCisJCQkJaWYgKGdyb3VwX3JlbGlkIDwgMCkKKwkJCQl7CisJCQkJCVJhbmdlVGJsRW50 cnkgKnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmVsaWRdOworCisJCQkJCWlmICgh cnRlIHx8IChydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiAmJgorCQkJCQkJcnRl LT5yZWxraW5kICE9IFJFTEtJTkRfTUFUVklFVyAmJgorCQkJCQkJcnRlLT5yZWxraW5kICE9 IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSAmJgorCQkJCQkJcnRlLT5yZWxraW5kICE9IFJFTEtJ TkRfUEFSVElUSU9ORURfVEFCTEUpKQorCQkJCQl7CisJCQkJCQkvKiBFeHRlbmRlZCBzdGF0 aXN0aWNzIGNhbid0IGV4aXN0IGluIHByaW5jaXBsZSAqLworCQkJCQkJb3RoZXJjbGF1c2Vz ID0gbGFwcGVuZChvdGhlcmNsYXVzZXMsIHJpbmZvKTsKKwkJCQkJCWNsYXVzZXMgPSBmb3Jl YWNoX2RlbGV0ZV9jdXJyZW50KGNsYXVzZXMsIGxjKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJ CQl9CisKKwkJCQkJZ3JvdXBfcmVsaWQgPSByZWxpZDsKKwkJCQkJZ3JvdXBfcmVsID0gcm9v dC0+c2ltcGxlX3JlbF9hcnJheVtyZWxpZF07CisJCQkJfQorCQkJCWVsc2UgaWYgKGdyb3Vw X3JlbGlkICE9IHJlbGlkKQorCQkJCQkvKgorCQkJCQkgKiBCZWluZyBpbiB0aGUgZ3JvdXAg Zm9ybWluZyBzdGF0ZSB3ZSBkb24ndAorCQkJCQkgKiBuZWVkIG90aGVyIGNsYXVzZXMuCisJ CQkJCSAqLworCQkJCQljb250aW51ZTsKKworCQkJCXZhcmluZm8gPSAoR3JvdXBWYXJJbmZv ICopIHBhbGxvYyhzaXplb2YoR3JvdXBWYXJJbmZvKSk7CisJCQkJdmFyaW5mby0+dmFyID0g ZXhwcjsKKwkJCQl2YXJpbmZvLT5yZWwgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W3JlbGlk XTsKKwkJCQl2YXJpbmZvLT5uZGlzdGluY3QgPSAwLjA7CisJCQkJdmFyaW5mby0+aXNkZWZh dWx0ID0gZmFsc2U7CisJCQkJdmFyaW5mb3MgPSBsYXBwZW5kKHZhcmluZm9zLCB2YXJpbmZv KTsKKworCQkJCS8qCisJCQkJICogUmVtZW1iZXIgdGhlIGxpbmsgdG8gUmVzdHJpY3RJbmZv IGZvciB0aGUgY2FzZSB0aGUgY2xhdXNlIGlzCisJCQkJICogZmFpbGVkIHRvIGJlIGVzdGlt YXRlZC4KKwkJCQkgKi8KKwkJCQlzYXZlTGlzdCA9IGxhcHBlbmQoc2F2ZUxpc3QsIHJpbmZv KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQkvKiBUaGlzIGNsYXVzZSBjYW4ndCBiZSBlc3RpbWF0 ZWQgd2l0aCBleHRlbmRlZCBzdGF0aXN0aWNzICovCisJCQkJb3RoZXJjbGF1c2VzID0gbGFw cGVuZChvdGhlcmNsYXVzZXMsIHJpbmZvKTsKKworCQkJY2xhdXNlcyA9IGZvcmVhY2hfZGVs ZXRlX2N1cnJlbnQoY2xhdXNlcywgbGMpOworCQl9CisKKwkJaWYgKGxpc3RfbGVuZ3RoKHZh cmluZm9zKSA8IDIpCisJCXsKKwkJCS8qCisJCQkgKiBNdWx0aXZhcmlhdGUgc3RhdGlzdGlj cyBkb2Vzbid0IGFwcGx5IHRvIHNpbmdsZSBjb2x1bW4gZXhjZXB0CisJCQkgKiBleHByZXNz aW9ucywgYnV0IGl0IGhhcyBub3QgaW1wbGVtZW50ZWQgeWV0LgorCQkJICovCisJCQlvdGhl cmNsYXVzZXMgPSBsaXN0X2NvbmNhdChvdGhlcmNsYXVzZXMsIHNhdmVMaXN0KTsKKwkJCWxp c3RfZnJlZV9kZWVwKHZhcmluZm9zKTsKKwkJCWxpc3RfZnJlZShzYXZlTGlzdCk7CisJCQlj b250aW51ZTsKKwkJfQorCisJCUFzc2VydChncm91cF9yZWwgIT0gTlVMTCk7CisKKwkJLyog TGV0J3MgZW1wbG95IGV4dGVuZGVkIHN0YXRpc3RpY3MuICovCisJCW9yaWdpbl92YXJpbmZv cyA9IHZhcmluZm9zOworCQlmb3IgKDs7KQorCQl7CisJCQlib29sCWVzdGltYXRlZCA9IGVz dGltYXRlX211bHRpdmFyaWF0ZV9uZGlzdGluY3Qocm9vdCwKKwkJCQkJCQkJCQkJCQkJCQln cm91cF9yZWwsCisJCQkJCQkJCQkJCQkJCQkJJnZhcmluZm9zLAorCQkJCQkJCQkJCQkJCQkJ CSZtdm5kaXN0aW5jdCk7CisJCQlpZiAoIWVzdGltYXRlZCkKKwkJCQlicmVhazsKKworCQkJ LyoKKwkJCSAqIFdlJ3ZlIGdvdCBhbiBlc3RpbWF0aW9uLiBVc2UgbmRpc3RpbmN0IHZhbHVl IGluIGNvbnNpc3RlbnQgd2F5IC0KKwkJCSAqIGFjY29yZGluZyB0byB0aGUgY2FsbGVyJ3Mg bG9naWMgKHNlZSBmaW5hbF9jb3N0X2hhc2hqb2luKS4KKwkJCSAqLworCQkJaWYgKG5kaXN0 aW5jdCA8IG12bmRpc3RpbmN0KQorCQkJCW5kaXN0aW5jdCA9IG12bmRpc3RpbmN0OworCQkJ QXNzZXJ0KG5kaXN0aW5jdCA+PSAxLjApOworCQl9CisKKwkJQXNzZXJ0KGxpc3RfbGVuZ3Ro KG9yaWdpbl92YXJpbmZvcykgPT0gbGlzdF9sZW5ndGgoc2F2ZUxpc3QpKTsKKworCQkvKgor CQkgKiBSZW1vdmUgYWxyZWFkeSBlc3RpbWF0ZWQgY2xhdXNlcyBmcm9tIHRoZSBzYXZlTGlz dAorCQkgKi8KKwkJZm9yYm90aChsYzEsIG9yaWdpbl92YXJpbmZvcywgbGMyLCBzYXZlTGlz dCkKKwkJeworCQkJR3JvdXBWYXJJbmZvICp2aW5mbyA9IGxmaXJzdChsYzEpOworCisJCQlp ZiAoIWxpc3RfbWVtYmVyX3B0cih2YXJpbmZvcywgdmluZm8pKQorCQkJCS8qIEFscmVhZHkg ZXN0aW1hdGVkICovCisJCQkJY29udGludWU7CisKKwkJCS8qIENhbid0IGJlIGVzdGltYXRl ZCBoZXJlIC0gcHVzaCB0byB0aGUgcmV0dXJuaW5nIGxpc3QgKi8KKwkJCW90aGVyY2xhdXNl cyA9IGxhcHBlbmQob3RoZXJjbGF1c2VzLCBsZmlyc3QobGMyKSk7CisJCX0KKwl9CisKKwkq aW5uZXJidWNrZXRzaXplID0gMS4wIC8gbmRpc3RpbmN0OworCXJldHVybiBvdGhlcmNsYXVz ZXM7Cit9CisKIC8qCiAgKiBFc3RpbWF0ZSBoYXNoIGJ1Y2tldCBzdGF0aXN0aWNzIHdoZW4g dGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIHVzZWQKICAqIGFzIGEgaGFzaCBrZXkgZm9y IHRoZSBnaXZlbiBudW1iZXIgb2YgYnVja2V0cy4KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L3V0aWxzL3NlbGZ1bmNzLmggYi9zcmMvaW5jbHVkZS91dGlscy9zZWxmdW5jcy5oCmluZGV4 IGYyNTYzYWQxY2IuLmFjNjJkMmZhMGUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxz L3NlbGZ1bmNzLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvc2VsZnVuY3MuaApAQCAtMjE3 LDYgKzIxNywxMCBAQCBleHRlcm4gZG91YmxlIGVzdGltYXRlX251bV9ncm91cHMoUGxhbm5l ckluZm8gKnJvb3QsIExpc3QgKmdyb3VwRXhwcnMsCiAJCQkJCQkJCSAgZG91YmxlIGlucHV0 X3Jvd3MsIExpc3QgKipwZ3NldCwKIAkJCQkJCQkJICBFc3RpbWF0aW9uSW5mbyAqZXN0aW5m byk7CiAKK2V4dGVybiBMaXN0ICplc3RpbWF0ZV9tdWx0aXZhcmlhdGVfYnVja2V0c2l6ZShQ bGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICppbm5lciwKKwkJ CQkJCQkJCQkJICBMaXN0ICpoYXNoY2xhdXNlcywKKwkJCQkJCQkJCQkJICBTZWxlY3Rpdml0 eSAqaW5uZXJidWNrZXRzaXplKTsKIGV4dGVybiB2b2lkIGVzdGltYXRlX2hhc2hfYnVja2V0 X3N0YXRzKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJICAgTm9kZSAqaGFzaGtleSwg ZG91YmxlIG5idWNrZXRzLAogCQkJCQkJCQkJICAgU2VsZWN0aXZpdHkgKm1jdl9mcmVxLAot LSAKMi4zOS41Cgo= --------------VQdy8WI6kVmSqhrrbF0kk40j--