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 1sQnkE-00BiEv-QN for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jul 2024 12:45:26 +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 1sQnkD-005flb-Fp for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Jul 2024 12:45:25 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sQnkC-005flT-Tp for pgsql-hackers@lists.postgresql.org; Mon, 08 Jul 2024 12:45:25 +0000 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sQnk9-0011jb-Kd for pgsql-hackers@postgresql.org; Mon, 08 Jul 2024 12:45:23 +0000 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-70b2a0542c2so874350b3a.3 for ; Mon, 08 Jul 2024 05:45:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720442720; x=1721047520; darn=postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=M909TOnS8BFH80FKok5+SCCbg8Y9MuA8YaMQ9us63Lo=; b=MUetKpaFOuDIdZ3zVAfgLfTWIvJ60YJ4RxZs6/bWsmWBO9d6I3HTkAWa4MV9mLEnyF HYy3JjeOgeiUF1OI49H2R0LhN0qKqzSV/GtTsfoUefB7XD2ChuJhWvpbqfOCu/AWL37+ tDJ/wE/5yPrjlg4jWvhZXhQvzZR6VulZJT61cdY2gJm5HPSEBNloaZVcsgYrBEMVjlUd OovuUFTRFVNfLMama72RF8bKDE1wyQm5bmfhBLaLu4ZgejpOTIh3o+CDU0wAzm2y407M NNvwcvuDr7wk3eO0cZvC1b80TpBWnZHBHyb3nVvFVMgjyF1bJl1SuK6Z+4OU1QLT0Vz3 g1vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720442720; x=1721047520; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=M909TOnS8BFH80FKok5+SCCbg8Y9MuA8YaMQ9us63Lo=; b=YfhcOHEVzvQPUYVozUcCwg38Mbr9u51d2NtCGHf0eErOwk+pvwEgCnHy64f06sIc3Y Cu6PxRthlg16ZLJUwSzB1lSSSKvfkxx/3kdnrHvUUTySaC4Hg8+xteGQjXxqC1XmDQJB DKpK/rxwhW7hmsmirqrUkUk7GCEMLD3EehaXxFKWq5nB+otB7HPmDvV2p0z8vqsttcEy iv28hcp8XJceIH2dK6X47eTSrGjlXdgEYeh7d4WQDCll8AmjTeg8gNWHaPHLOkbj+Il1 YaXJsssRVVorzG7sqZGAHhhs2tUCsG3z7LR/Mo12PbNQLhagJUUNW0nBkDLxwyf8emxk XZ8g== X-Gm-Message-State: AOJu0YzIbJuy6R8YTIs1xUBZYFM+MskxotgQj5ttzLW+w8fKdwYdFbU/ g5l4ipRRpudw+iDS147mV0KVOsr/wtDcXg3Ao1U4X8z13DwumPki X-Google-Smtp-Source: AGHT+IFlgIv+OiW+WY6OC/nk+pXcZDK+d5oqD2Op8x4ZNXuoLfCOOmfX2nEWxKYotBne/ffYwEJasQ== X-Received: by 2002:a05:6a00:c8c:b0:705:c0a1:61d8 with SMTP id d2e1a72fcca58-70b00915013mr13849799b3a.4.1720442720337; Mon, 08 Jul 2024 05:45:20 -0700 (PDT) Received: from [192.168.1.40] (cm-27-145-156-195.revip12.asianet.co.th. [27.145.156.195]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b093233basm6963673b3a.215.2024.07.08.05.45.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 08 Jul 2024 05:45:19 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------Xp2QLkLiIAy6Bl2aXiDg2fqd" Message-ID: Date: Mon, 8 Jul 2024 19:45:15 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: MergeJoin beats HashJoin in the case of multiple hash clauses 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-US From: Andrei Lepikhov In-Reply-To: <1de52b5f-e4a6-5729-eeef-51d524534665@enterprisedb.com> 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. --------------Xp2QLkLiIAy6Bl2aXiDg2fqd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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. [1] https://open.substack.com/pub/danolivo/p/why-postgresql-prefers-mergejoin?r=34q1yy&utm_campaign=post&utm_medium=web -- regards, Andrei Lepikhov --------------Xp2QLkLiIAy6Bl2aXiDg2fqd Content-Type: text/plain; charset=UTF-8; name="0001-Use-extended-statistics-for-precise-estimation-of-bu.patch" Content-Disposition: attachment; filename*0="0001-Use-extended-statistics-for-precise-estimation-of-bu.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBiNGIwMDc5NzBiMWQ5Yjk5NjAyYjg0MjJmMjEyMmM4ZTU3Mzg4MjhlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IE1vbiwgMTMgTWF5IDIwMjQgMTY6MTU6MDIgKzA3MDAKU3ViamVj dDogW1BBVENIXSBVc2UgZXh0ZW5kZWQgc3RhdGlzdGljcyBmb3IgcHJlY2lzZSBlc3RpbWF0 aW9uIG9mIGJ1Y2tldCBzaXplCiBpbiBoYXNoIGpvaW4uCgpSZWNvZ25pemluZyB0aGUgcmVh bC1saWZlIGNvbXBsZXhpdHkgd2hlcmUgY29sdW1ucyBpbiB0aGUgdGFibGUgb2Z0ZW4gaGF2 ZQpmdW5jdGlvbmFsIGRlcGVuZGVuY2llcywgUG9zdGdyZVNRTCdzIGVzdGltYXRpb24gb2Yg dGhlIG51bWJlciBvZiBkaXN0aW5jdAp2YWx1ZXMgb3ZlciBhIHNldCBvZiBjb2x1bW5zIGNh biBiZSB1bmRlcmVzdGltYXRlZCAob3IgbXVjaCByYXJlbHksCm92ZXJlc3RpbWF0ZWQpIHdo ZW4gZGVhbGluZyB3aXRoIG11bHRpLWNsYXVzZSBKT0lOLgpJbiB0aGUgY2FzZSBvZiBoYXNo IGpvaW4sIGl0IGNhbiBlbmQgdXAgd2l0aCBhIHNtYWxsIG51bWJlciBvZiBwcmVkaWN0ZWQg aGFzaApidWNrZXRzIGFuZCwgYXMgYSByZXN1bHQsIHBpY2tpbmcgbm9uLW9wdGltYWwgbWVy Z2Ugam9pbi4KClRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbiwgd2UgaW50cm9kdWNlIG9uZSBh ZGRpdGlvbmFsIHN0YWdlIG9mIGJ1Y2tldCBzaXplCmVzdGltYXRpb24gLSBoYXZpbmcgdHdv IG9yIG1vcmUgam9pbiBjbGF1c2VzIGVzdGltYXRvciBsb29rdXAgZm9yIGV4dGVuZGVkCnN0 YXRpc3RpY3MgYW5kIHVzZSBpdCBmb3IgbXVsdGljb2x1bW4gZXN0aW1hdGlvbi4KQ2xhdXNl cyBhcmUgZ3JvdXBlZCBpbnRvIGxpc3RzLCBlYWNoIGNvbnRhaW5pbmcgZXhwcmVzc2lvbnMg cmVmZXJlbmNpbmcgdGhlCnNhbWUgcmVsYXRpb24uIFRoZSByZXN1bHQgb2YgdGhlIG11bHRp Y29sdW1uIGVzdGltYXRpb24gbWFkZSBvdmVyIHN1Y2ggYSBsaXN0CmlzIGNvbWJpbmVkIHdp dGggb3RoZXJzIGFjY29yZGluZyB0byB0aGUgY2FsbGVyJ3MgbG9naWMuCkNsYXVzZXMgdGhh dCBhcmUgbm90IGVzdGltYXRlZCBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBmb3IgZnVy dGhlcgplc3RpbWF0aW9uLgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3Rz aXplLmMgfCAgMTIgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jICAgICAg fCAxNzEgKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL3V0aWxzL3Nl bGZ1bmNzLmggICAgICAgICAgfCAgIDQgKwogMyBmaWxlcyBjaGFuZ2VkLCAxODYgaW5zZXJ0 aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wYXRoL2Nvc3RzaXplLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0 c2l6ZS5jCmluZGV4IGVlMjNlZDc4MzUuLmVhZmRlOTBkNGMgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvY29zdHNpemUuYwpAQCAtNDI1MCw5ICs0MjUwLDE5IEBAIGZpbmFsX2Nv c3RfaGFzaGpvaW4oUGxhbm5lckluZm8gKnJvb3QsIEhhc2hQYXRoICpwYXRoLAogCX0KIAll bHNlCiAJeworCQlMaXN0ICpvdGhlcmNsYXVzZXM7CisKIAkJaW5uZXJidWNrZXRzaXplID0g MS4wOwogCQlpbm5lcm1jdmZyZXEgPSAxLjA7Ci0JCWZvcmVhY2goaGNsLCBoYXNoY2xhdXNl cykKKworCQkvKiBBdCBmaXJzdCwgdHJ5IHRvIGVzdGltYXRlIGJ1Y2tldCBzaXplIHVzaW5n IGV4dGVuZGVkIHN0YXRpc3RpY3MuICovCisJCW90aGVyY2xhdXNlcyA9IGVzdGltYXRlX211 bHRpdmFyaWF0ZV9idWNrZXRzaXplKHJvb3QsCisJCQkJCQkJCQkJCQkJCWlubmVyX3BhdGgt PnBhcmVudCwKKwkJCQkJCQkJCQkJCQkJaGFzaGNsYXVzZXMsCisJCQkJCQkJCQkJCQkJCSZp bm5lcmJ1Y2tldHNpemUpOworCisJCS8qIFBhc3MgdGhyb3VnaCB0aGUgcmVtYWluaW5nIGNs YXVzZXMgKi8KKwkJZm9yZWFjaChoY2wsIG90aGVyY2xhdXNlcykKIAkJewogCQkJUmVzdHJp Y3RJbmZvICpyZXN0cmljdGluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGhjbCk7 CiAJCQlTZWxlY3Rpdml0eSB0aGlzYnVja2V0c2l6ZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1 bmNzLmMKaW5kZXggNWY1ZDc5NTlkOC4uODllZDJkMTM2YSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3NlbGZ1bmNzLmMKQEAgLTM3NTEsNiArMzc1MSwxNzcgQEAgZXN0aW1hdGVfbnVtX2dyb3Vw cyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqZ3JvdXBFeHBycywgZG91YmxlIGlucHV0X3Jv d3MsCiAJcmV0dXJuIG51bWRpc3RpbmN0OwogfQogCisvKgorICogVHJ5IHRvIGVzdGltYXRl IHRoZSBidWNrZXQgc2l6ZSBvZiB0aGUgaGFzaCBqb2luIGlubmVyIHNpZGUgd2hlbiB0aGUg am9pbgorICogY29uZGl0aW9uIGNvbnRhaW5zIHR3byBvciBtb3JlIGNsYXVzZXMgYnkgZW1w bG95aW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MuCisgKgorICogVGhlIG1haW4gaWRlYSBvZiB0 aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlIGRpc3RpbmN0IHZhbHVlIGdlbmVyYXRlZCBieQor ICogbXVsdGl2YXJpYXRlIGVzdGltYXRpb24gb24gdHdvIG9yIG1vcmUgY29sdW1ucyB3b3Vs ZCBwcm92aWRlIGxlc3MgYnVja2V0IHNpemUKKyAqIHRoYW4gZXN0aW1hdGlvbiBvbiBvbmUg c2VwYXJhdGUgY29sdW1uLgorICoKKyAqIElNUE9SVEFOVDogSXQgaXMgY3J1Y2lhbCB0byBz eW5jaHJvbmlzZSB0aGUgYXBwcm9hY2ggb2YgY29tYmluaW5nIGRpZmZlcmVudAorICogZXN0 aW1hdGlvbnMgd2l0aCB0aGUgY2FsbGVyJ3MgbWV0aG9kLgorICogUmV0dXJuIGEgbGlzdCBv ZiBjbGF1c2VzIHRoYXQgZGlkbid0IGZldGNoIGFueSBleHRlbmRlZCBzdGF0aXN0aWNzLgor ICovCitMaXN0ICoKK2VzdGltYXRlX211bHRpdmFyaWF0ZV9idWNrZXRzaXplKFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICppbm5lciwKKwkJCQkJCQkJIExpc3QgKmhhc2hjbGF1 c2VzLAorCQkJCQkJCQkgU2VsZWN0aXZpdHkgKmlubmVyYnVja2V0c2l6ZSkKK3sKKwlMaXN0 ICAgKmNsYXVzZXMgPSBsaXN0X2NvcHkoaGFzaGNsYXVzZXMpOworCUxpc3QgICAqb3RoZXJj bGF1c2VzID0gTklMOworCWRvdWJsZQluZGlzdGluY3QgPSAxLjA7CisKKwlpZiAobGlzdF9s ZW5ndGgoaGFzaGNsYXVzZXMpIDw9IDEpCisJCS8qCisJCSAqIE5vdGhpbmcgdG8gZG8gZm9y IGEgc2luZ2xlIGNsYXVzZS4gQ291bGQgd2UgZW1wbG95IHVuaXZhcmlhdGUKKwkJICogZXh0 ZW5kZWQgc3RhdCBoZXJlPworCQkgKi8KKwkJcmV0dXJuIGhhc2hjbGF1c2VzOworCisJd2hp bGUgKGNsYXVzZXMgIT0gTklMKQorCXsKKwkJTGlzdENlbGwgICAqbGM7CisJCWludAkJCXJl bGlkID0gLTE7CisJCUxpc3QJICAgKnZhcmluZm9zID0gTklMOworCQlMaXN0CSAgICpzYXZl TGlzdCA9IE5JTDsKKwkJZG91YmxlCQltdm5kaXN0aW5jdDsKKwkJTGlzdAkgICAqb3JpZ2lu X3ZhcmluZm9zOworCQlpbnQJCQlncm91cF9yZWxpZCA9IC0xOworCQlSZWxPcHRJbmZvICpn cm91cF9yZWw7CisJCUxpc3RDZWxsICAgKmxjMSwgKmxjMjsKKworCQkvKgorCQkgKiBGaW5k IGNsYXVzZXMsIHJlZmVyZW5jaW5nIHRoZSBzYW1lIHNpbmdsZSBiYXNlIHJlbGF0aW9uIGFu ZCB0cnkgdG8KKwkJICogZXN0aW1hdGUgc3VjaCBhIGdyb3VwIHdpdGggZXh0ZW5kZWQgc3Rh dGlzdGljcy4KKwkJICogQ3JlYXRlIHZhcmluZm8gZm9yIGFuIGFwcHJvdmVkIGNsYXVzZSwg cHVzaCBpdCB0byBvdGhlcmNsYXVzZXMsIGlmIGl0CisJCSAqIGNhbid0IGJlIGVzdGltYXRl ZCBoZXJlIG9yIGlnbm9yZSB0byBwcm9jZXNzIGF0IHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkJ ICovCisJCWZvcmVhY2gobGMsIGNsYXVzZXMpCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAgICpy aW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQkJTm9kZQkJICAgKmV4 cHI7CisJCQlSZWxpZHMJCQlyZWxpZHM7CisJCQlHcm91cFZhckluZm8gICAqdmFyaW5mbzsK KworCQkJLyoKKwkJCSAqIEZpbmQgdGhlIGlubmVyIHNpZGUgb2YgdGhlIGpvaW4gd2hpY2gg d2UgbmVlZCB0byBlc3RpbWF0ZSB0aGUKKwkJCSAqIG51bWJlciBvZiBidWNrZXRzLiBVc2Ug b3V0ZXJfaXNfbGVmdCBiZWNhdXNlIHRoZQorCQkJICogY2xhdXNlX3NpZGVzX21hdGNoX2pv aW4gcm91dGluZSBoYXMgY2FsbGVkIG9uIGhhc2ggY2xhdXNlcy4KKwkJCSAqLworCQkJcmVs aWRzID0gcmluZm8tPm91dGVyX2lzX2xlZnQgPworCQkJCQkJcmluZm8tPnJpZ2h0X3JlbGlk cyA6IHJpbmZvLT5sZWZ0X3JlbGlkczsKKwkJCWV4cHIgPSByaW5mby0+b3V0ZXJfaXNfbGVm dCA/CisJCQkJCQlnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKSA6IGdldF9sZWZ0b3Aocmlu Zm8tPmNsYXVzZSk7CisKKwkJCWlmIChibXNfZ2V0X3NpbmdsZXRvbl9tZW1iZXIocmVsaWRz LCAmcmVsaWQpICYmCisJCQkJcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyZWxpZF0tPnN0YXRs aXN0ICE9IE5JTCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaW5uZXItc2lkZSBleHBy ZXNzaW9uIHJlZmVyZW5jZXMgb25seSBvbmUgcmVsYXRpb24uCisJCQkJICogRXh0ZW5kZWQg c3RhdGlzdGljcyBvbiB0aGlzIGNsYXVzZSBjYW4gZXhpc3QuCisJCQkJICovCisKKwkJCQlp ZiAoZ3JvdXBfcmVsaWQgPCAwKQorCQkJCXsKKwkJCQkJUmFuZ2VUYmxFbnRyeSAqcnRlID0g cm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtyZWxpZF07CisKKwkJCQkJaWYgKCFydGUgfHwgKHJ0 ZS0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OICYmCisJCQkJCQlydGUtPnJlbGtpbmQg IT0gUkVMS0lORF9NQVRWSUVXICYmCisJCQkJCQlydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9G T1JFSUdOX1RBQkxFICYmCisJCQkJCQlydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9QQVJUSVRJ T05FRF9UQUJMRSkpCisJCQkJCXsKKwkJCQkJCS8qIEV4dGVuZGVkIHN0YXRpc3RpY3MgY2Fu J3QgZXhpc3QgaW4gcHJpbmNpcGxlICovCisJCQkJCQlvdGhlcmNsYXVzZXMgPSBsYXBwZW5k KG90aGVyY2xhdXNlcywgcmluZm8pOworCQkJCQkJY2xhdXNlcyA9IGZvcmVhY2hfZGVsZXRl X2N1cnJlbnQoY2xhdXNlcywgbGMpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJ CQlncm91cF9yZWxpZCA9IHJlbGlkOworCQkJCQlncm91cF9yZWwgPSByb290LT5zaW1wbGVf cmVsX2FycmF5W3JlbGlkXTsKKwkJCQkJQXNzZXJ0KGdyb3VwX3JlbCAhPSBOVUxMKTsKKwkJ CQl9CisJCQkJZWxzZSBpZiAoZ3JvdXBfcmVsaWQgIT0gcmVsaWQpCisJCQkJCS8qCisJCQkJ CSAqIEJlaW5nIGluIHRoZSBncm91cCBmb3JtaW5nIHN0YXRlIHdlIGRvbid0CisJCQkJCSAq IG5lZWQgb3RoZXIgY2xhdXNlcy4KKwkJCQkJICovCisJCQkJCWNvbnRpbnVlOworCisJCQkJ dmFyaW5mbyA9IChHcm91cFZhckluZm8gKikgcGFsbG9jKHNpemVvZihHcm91cFZhckluZm8p KTsKKwkJCQl2YXJpbmZvLT52YXIgPSBleHByOworCQkJCXZhcmluZm8tPnJlbCA9IHJvb3Qt PnNpbXBsZV9yZWxfYXJyYXlbcmVsaWRdOworCQkJCXZhcmluZm8tPm5kaXN0aW5jdCA9IDAu MDsKKwkJCQl2YXJpbmZvLT5pc2RlZmF1bHQgPSBmYWxzZTsKKwkJCQl2YXJpbmZvcyA9IGxh cHBlbmQodmFyaW5mb3MsIHZhcmluZm8pOworCisJCQkJLyoKKwkJCQkgKiBSZW1lbWJlciB0 aGUgbGluayB0byBSZXN0cmljdEluZm8gZm9yIHRoZSBjYXNlIHRoZSBjbGF1c2UgaXMKKwkJ CQkgKiBmYWlsZWQgdG8gYmUgZXN0aW1hdGVkLgorCQkJCSAqLworCQkJCXNhdmVMaXN0ID0g bGFwcGVuZChzYXZlTGlzdCwgcmluZm8pOworCQkJfQorCQkJZWxzZQorCQkJCS8qIFRoaXMg Y2xhdXNlIGNhbid0IGJlIGVzdGltYXRlZCB3aXRoIGV4dGVuZGVkIHN0YXRpc3RpY3MgKi8K KwkJCQlvdGhlcmNsYXVzZXMgPSBsYXBwZW5kKG90aGVyY2xhdXNlcywgcmluZm8pOworCisJ CQljbGF1c2VzID0gZm9yZWFjaF9kZWxldGVfY3VycmVudChjbGF1c2VzLCBsYyk7CisJCX0K KworCQlpZiAobGlzdF9sZW5ndGgodmFyaW5mb3MpIDwgMikKKwkJeworCQkJLyoKKwkJCSAq IE11bHRpdmFyaWF0ZSBzdGF0aXN0aWNzIGRvZXNuJ3QgYXBwbHkgdG8gc2luZ2xlIGNvbHVt biBleGNlcHQKKwkJCSAqIGV4cHJlc3Npb25zLCBidXQgaXQgaGFzIG5vdCBpbXBsZW1lbnRl ZCB5ZXQuCisJCQkgKi8KKwkJCW90aGVyY2xhdXNlcyA9IGxpc3RfY29uY2F0KG90aGVyY2xh dXNlcywgc2F2ZUxpc3QpOworCQkJbGlzdF9mcmVlX2RlZXAodmFyaW5mb3MpOworCQkJbGlz dF9mcmVlKHNhdmVMaXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTGV0J3MgZW1w bG95IGV4dGVuZGVkIHN0YXRpc3RpY3MuICovCisJCW9yaWdpbl92YXJpbmZvcyA9IHZhcmlu Zm9zOworCQlmb3IgKDs7KQorCQl7CisJCQlib29sCWVzdGltYXRlZCA9IGVzdGltYXRlX211 bHRpdmFyaWF0ZV9uZGlzdGluY3Qocm9vdCwKKwkJCQkJCQkJCQkJCQkJCQlncm91cF9yZWws CisJCQkJCQkJCQkJCQkJCQkJJnZhcmluZm9zLAorCQkJCQkJCQkJCQkJCQkJCSZtdm5kaXN0 aW5jdCk7CisJCQlpZiAoIWVzdGltYXRlZCkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAq IFdlJ3ZlIGdvdCBhbiBlc3RpbWF0aW9uLiBVc2UgbmRpc3RpbmN0IHZhbHVlIGluIGNvbnNp c3RlbnQgd2F5IC0KKwkJCSAqIGFjY29yZGluZyB0byB0aGUgY2FsbGVyJ3MgbG9naWMgKHNl ZSBmaW5hbF9jb3N0X2hhc2hqb2luKS4KKwkJCSAqLworCQkJaWYgKG5kaXN0aW5jdCA8IG12 bmRpc3RpbmN0KQorCQkJCW5kaXN0aW5jdCA9IG12bmRpc3RpbmN0OworCQkJQXNzZXJ0KG5k aXN0aW5jdCA+PSAxLjApOworCQl9CisKKwkJQXNzZXJ0KGxpc3RfbGVuZ3RoKG9yaWdpbl92 YXJpbmZvcykgPT0gbGlzdF9sZW5ndGgoc2F2ZUxpc3QpKTsKKworCQkvKgorCQkgKiBSZW1v dmUgYWxyZWFkeSBlc3RpbWF0ZWQgY2xhdXNlcyBmcm9tIHRoZSBzYXZlTGlzdAorCQkgKi8K KwkJZm9yYm90aChsYzEsIG9yaWdpbl92YXJpbmZvcywgbGMyLCBzYXZlTGlzdCkKKwkJewor CQkJR3JvdXBWYXJJbmZvICp2aW5mbyA9IGxmaXJzdChsYzEpOworCisJCQlpZiAoIWxpc3Rf bWVtYmVyX3B0cih2YXJpbmZvcywgdmluZm8pKQorCQkJCS8qIEFscmVhZHkgZXN0aW1hdGVk ICovCisJCQkJY29udGludWU7CisKKwkJCS8qIENhbid0IGJlIGVzdGltYXRlZCBoZXJlIC0g cHVzaCB0byB0aGUgcmV0dXJuaW5nIGxpc3QgKi8KKwkJCW90aGVyY2xhdXNlcyA9IGxhcHBl bmQob3RoZXJjbGF1c2VzLCBsZmlyc3QobGMyKSk7CisJCX0KKwl9CisKKwkqaW5uZXJidWNr ZXRzaXplID0gMS4wIC8gbmRpc3RpbmN0OworCXJldHVybiBvdGhlcmNsYXVzZXM7Cit9CisK IC8qCiAgKiBFc3RpbWF0ZSBoYXNoIGJ1Y2tldCBzdGF0aXN0aWNzIHdoZW4gdGhlIHNwZWNp ZmllZCBleHByZXNzaW9uIGlzIHVzZWQKICAqIGFzIGEgaGFzaCBrZXkgZm9yIHRoZSBnaXZl biBudW1iZXIgb2YgYnVja2V0cy4KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3Nl bGZ1bmNzLmggYi9zcmMvaW5jbHVkZS91dGlscy9zZWxmdW5jcy5oCmluZGV4IGYyNTYzYWQx Y2IuLmFjNjJkMmZhMGUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNz LmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvc2VsZnVuY3MuaApAQCAtMjE3LDYgKzIxNywx MCBAQCBleHRlcm4gZG91YmxlIGVzdGltYXRlX251bV9ncm91cHMoUGxhbm5lckluZm8gKnJv b3QsIExpc3QgKmdyb3VwRXhwcnMsCiAJCQkJCQkJCSAgZG91YmxlIGlucHV0X3Jvd3MsIExp c3QgKipwZ3NldCwKIAkJCQkJCQkJICBFc3RpbWF0aW9uSW5mbyAqZXN0aW5mbyk7CiAKK2V4 dGVybiBMaXN0ICplc3RpbWF0ZV9tdWx0aXZhcmlhdGVfYnVja2V0c2l6ZShQbGFubmVySW5m byAqcm9vdCwKKwkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICppbm5lciwKKwkJCQkJCQkJCQkJ ICBMaXN0ICpoYXNoY2xhdXNlcywKKwkJCQkJCQkJCQkJICBTZWxlY3Rpdml0eSAqaW5uZXJi dWNrZXRzaXplKTsKIGV4dGVybiB2b2lkIGVzdGltYXRlX2hhc2hfYnVja2V0X3N0YXRzKFBs YW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJICAgTm9kZSAqaGFzaGtleSwgZG91YmxlIG5i dWNrZXRzLAogCQkJCQkJCQkJICAgU2VsZWN0aXZpdHkgKm1jdl9mcmVxLAotLSAKMi40NS4y Cgo= --------------Xp2QLkLiIAy6Bl2aXiDg2fqd--