Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qDbKj-0001DS-Pk for pgsql-hackers@arkaria.postgresql.org; Mon, 26 Jun 2023 01:48:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qDbKh-0006J8-HE for pgsql-hackers@arkaria.postgresql.org; Mon, 26 Jun 2023 01:47:59 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qDbKg-0006Iy-TL for pgsql-hackers@lists.postgresql.org; Mon, 26 Jun 2023 01:47:59 +0000 Received: from forward502a.mail.yandex.net ([178.154.239.82]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qDbKX-000SYm-Au for pgsql-hackers@postgresql.org; Mon, 26 Jun 2023 01:47:57 +0000 Received: from mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net [IPv6:2a02:6b8:c18:58f:0:640:3768:0]) by forward502a.mail.yandex.net (Yandex) with ESMTP id 424265E6BC; Mon, 26 Jun 2023 04:47:45 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id hl8kkIwDfSw0-W39U0zAc; Mon, 26 Jun 2023 04:47:44 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1687744064; bh=QHxLSR75vtYba8yPiftCMAxTJu0GW6QQg8NMm1nnVCQ=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=q8cvtmcjhHsyMYrHzTANvCKeRsnkpcXoOMWRpQEl7cVqu9aXXQpAbPJAowqBh3es9 Cg7eHYGoc+0gjM3jByjva2flX1OQjhe4b5jvj7PUg6ckZ6qI45MyG4Nsv0wdTA3duM bZA2lCZn3CwshRPmvrXHlgwKrOqvi2qokywfKWzc= Authentication-Results: mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Content-Type: multipart/mixed; boundary="------------69odNoMiC0oZv9UJuX50leTG" Message-ID: Date: Mon, 26 Jun 2023 04:47:43 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Subject: Re: POC, WIP: OR-clause support for indexes Content-Language: en-US To: Marcos Pegoraro , Alena Rybakina Cc: Andrey Lepikhov , pgsql-hackers@postgresql.org, teodor@sigaev.ru References: <567ED6CA.2040504@sigaev.ru> <05838ca5-1c78-af81-34c1-19cae2516b61@postgrespro.ru> <919bfbcb-f812-758d-d687-71f89f0d9a68@postgrespro.ru> 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. --------------69odNoMiC0oZv9UJuX50leTG Content-Type: multipart/alternative; boundary="------------2OmCUaRMY8sa9qyrYyHQSbP0" --------------2OmCUaRMY8sa9qyrYyHQSbP0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, all! Sorry I haven't written for a long time. I finished writing the code patch for transformation "Or" expressions to "Any" expressions. I didn't see any problems in regression tests, even when I changed the constant at which the minimum or expression is replaced by any at 0. I ran my patch on sqlancer and so far the code has never fallen. On 14.01.2023 18:45, Marcos Pegoraro wrote: > > I agree with your idea and try to implement it and will soon > attach a patch with a solution. > > Additionally, if those OR constants repeat you'll see ... > If all constants are the same value, fine > explain select * from x where ((ID = 1) OR (ID = 1) OR (ID = 1)); > Index Only Scan using x_id on x  (cost=0.42..4.44 rows=1 width=4) >   Index Cond: (id = 1) > > if all values are almost the same, ops > explain select * from x where ((ID = 1) OR (ID = 1) OR (ID = 1) OR (ID > = 2)); > Bitmap Heap Scan on x  (cost=17.73..33.45 rows=4 width=4) >   Recheck Cond: ((id = 1) OR (id = 1) OR (id = 1) OR (id = 2)) >   ->  BitmapOr  (cost=17.73..17.73 rows=4 width=0) >         ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0) >               Index Cond: (id = 1) >         ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0) >               Index Cond: (id = 1) >         ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0) >               Index Cond: (id = 1) >         ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0) >               Index Cond: (id = 2) > > thanks > Marcos > -- Regards, Alena Rybakina --------------2OmCUaRMY8sa9qyrYyHQSbP0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi, all! Sorry I haven't written for a long time.

I finished writing the code patch for transformation "Or" expressions to "Any" expressions. I didn't see any problems in regression tests, even when I changed the constant at which the minimum or expression is replaced by any at 0. I ran my patch on sqlancer and so far the code has never fallen.

On 14.01.2023 18:45, Marcos Pegoraro wrote:

I agree with your idea and try to implement it and will soon attach a patch with a solution.

Additionally, if those OR constants repeat you'll see ...
If all constants are the same value, fine
explain select * from x where ((ID = 1) OR (ID = 1) OR (ID = 1)); 
Index Only Scan using x_id on x  (cost=0.42..4.44 rows=1 width=4)
  Index Cond: (id = 1)

if all values are almost the same, ops
explain select * from x where ((ID = 1) OR (ID = 1) OR (ID = 1) OR (ID = 2));
Bitmap Heap Scan on x  (cost=17.73..33.45 rows=4 width=4)
  Recheck Cond: ((id = 1) OR (id = 1) OR (id = 1) OR (id = 2))
  ->  BitmapOr  (cost=17.73..17.73 rows=4 width=0)
        ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0)
              Index Cond: (id = 1)
        ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0)
              Index Cond: (id = 1)
        ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0)
              Index Cond: (id = 1)
        ->  Bitmap Index Scan on x_id  (cost=0.00..4.43 rows=1 width=0)
              Index Cond: (id = 2)

thanks
Marcos

--

Regards,

Alena Rybakina

--------------2OmCUaRMY8sa9qyrYyHQSbP0-- --------------69odNoMiC0oZv9UJuX50leTG Content-Type: text/x-patch; charset=UTF-8; name="0001-Replace-clause-X-N1-OR-X-N2-.-with-X-ANY-N1-N2-on.patch" Content-Disposition: attachment; filename*0="0001-Replace-clause-X-N1-OR-X-N2-.-with-X-ANY-N1-N2-on.patch" Content-Transfer-Encoding: base64 RnJvbSA1NmZiYTNiZWZlNGY2YjA0MWQwOTdkODg4NDgxNWZlOTQzZmIyMWY5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0 Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAyNiBKdW4gMjAyMyAwNDoxODoxNSArMDMwMApTdWJq ZWN0OiBbUEFUQ0hdIFJlcGxhY2UgY2xhdXNlIChYPU4xKSBPUiAoWD1OMikgLi4uIHdpdGgg WCA9IEFOWShOMSwgTjIpIG9uIAogdGhlIHN0YWdlIG9mIHRoZSBvcHRpbWlzZXIgd2hlbiB3 ZSBhcmUgc3RpbGwgd29ya2luZyB3aXRoIGEgdHJlZSBleHByZXNzaW9uLgoKRmlyc3RseSwg d2UgZG8gbm90IHRyeSB0byBtYWtlIGEgdHJhbnNmb3JtYXRpb24gZm9yICJub24tb3IiCmV4 cHJlc3Npb25zIG9yIGluZXF1YWxpdGllcyBhbmQgdGhlIGNyZWF0aW9uIG9mIGEgcmVsYXRp b24Kd2l0aCAib3IiIGV4cHJlc3Npb25zIG9jY3VycyBhY2NvcmRpbmcgdG8gdGhlIHNhbWUg c2NlbmFyaW87CnNlY29uZGx5LCB3ZSBkbyBub3QgbWFrZSB0cmFuc2Zvcm1hdGlvbnMgaWYg dGhlcmUgYXJlIGxlc3MKdGhhbiAxNSBvciBleHByZXNzaW9ucyAoaGVyZSB5b3UgY2FuIHB1 dCBhbm90aGVyIG51bWJlciwgYnV0CmR1cmluZyB0ZXN0aW5nLCBhbHJlYWR5IHN0YXJ0aW5n IHdpdGggMyBleHByZXNzaW9ucywgdGhlIGV4ZWN1dGlvbgp0aW1lIGFuZCBwbGFubmluZyB0 aW1lIHdpdGggdHJhbnNmb3JtZWQgb3Igd2VyZSBmYXN0ZXIpOwp0aGlyZGx5LCBpdCBpcyB3 b3J0aCBjb25zaWRlcmluZyB0aGF0IHdlIGNvbnNpZGVyICJvciIgZXhwcmVzc2lvbnMKb25s eSBhdCB0aGUgY3VycmVudCBsZXZlbC4KVGhlIHRyYW5zZm9ybWF0aW9uIHRha2VzIHBsYWNl IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNjaGVtZToKZmlyc3Qgd2UgZGVmaW5lIHRo ZSBncm91cHMgb24gdGhlIGxlZnQgc2lkZSwgY29sbGVjdCB0aGUgY29uc3RhbnRzCmluIGEg bGlzdCBmb3IgZWFjaCBncm91cCwgdGhlbiBjb25zaWRlcmluZyBlYWNoIGdyb3VwIHdlIG1h a2UgdGhlCmNvbGxlY3RlZCBjb25zdGFudHMgdG8gb25lIHR5cGUsIGZpbmQgYSBjb21tb24g dHlwZSBmb3IgYXJyYXkgYW5kCnVzaW5nIHRoZSBtYWtlX3NjYWxhcl9hcnJheV9vcCBmdW5j dGlvbiB3ZSBmb3JtIFNjYWxhckFycmF5T3BFeHByLAppZiBwb3NzaWJsZS4gSWYgaXQgaXMg bm90IHBvc3NpYmxlLCB0aGVuIHRoZXNlIGNvbnN0YW50cyBib3RoIHJlbWFpbgppbiB0aGUg c2FtZSBleHByIGFzIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4gQWxsIHN1Y2Nlc3NmdWwg YXR0ZW1wdHMKKHJlY2VpdmVkIFNjYWxhckFycmF5T3BFeHByIHRvZ2V0aGVyIHdpdGggdW5m b3JtdWxhdGVkIEV4cHIgYXJlIGNvbWJpbmVkCnZpYSBPUiBvcGVyYXRpb24pLgotLS0KIHNy Yy9iYWNrZW5kL3BhcnNlci9wYXJzZV9leHByLmMgIHwgMjg5ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKy0KIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IHwgICAx ICsKIDIgZmlsZXMgY2hhbmdlZCwgMjg5IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfZXhwci5jIGIvc3JjL2Jh Y2tlbmQvcGFyc2VyL3BhcnNlX2V4cHIuYwppbmRleCAzNDZmZDI3MmI2ZC4uYzVmNThhZWU5 ZWMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9leHByLmMKKysrIGIv c3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2V4cHIuYwpAQCAtOTUsNiArOTUsMjkzIEBAIHN0 YXRpYyBFeHByICptYWtlX2Rpc3RpbmN0X29wKFBhcnNlU3RhdGUgKnBzdGF0ZSwgTGlzdCAq b3BuYW1lLAogc3RhdGljIE5vZGUgKm1ha2VfbnVsbHRlc3RfZnJvbV9kaXN0aW5jdChQYXJz ZVN0YXRlICpwc3RhdGUsCiAJCQkJCQkJCQkJIEFfRXhwciAqZGlzdGluY3RhLCBOb2RlICph cmcpOwogCit0eXBlZGVmIHN0cnVjdCBPckNsYXVzZUdyb3VwRW50cnkKK3sKKwlOb2RlCQkg ICAqbm9kZTsKKwlMaXN0CQkgICAqY29uc3RzOworCU9pZAkJCQlzY2FsYXJfdHlwZTsKKwlP aWQJCQkJb3BubzsKKwlFeHByIAkJICAgKmV4cHI7Cit9IE9yQ2xhdXNlR3JvdXBFbnRyeTsK KworaW50IGNvbnN0X3RyYW5zZm9ybV9vcl9saW1pdCA9IDE1OworCitzdGF0aWMgTm9kZSAq Cit0cmFuc2Zvcm1Cb29sRXhwck9yKFBhcnNlU3RhdGUgKnBzdGF0ZSwgRXhwciAqZXhwcl9v cmlnKQoreworCUxpc3QJCSAgICpvcl9saXN0ID0gTklMOworCUxpc3RDZWxsCSAgICpsY19l YXJncywKKwkJCQkgICAqbGNfYXJnczsKKwlMaXN0CQkgICAqZ3JvdXBzX2xpc3QgPSBOSUw7 CisJYm9vbAkJCWNoYW5nZV9hcHBseSA9IGZhbHNlOworCWNvbnN0IGNoYXIgCSAgICpvcG5h bWU7CisJTm9kZSAJCSAgICpyZXN1bHQ7CisJYm9vbAkJCW9yX3N0YXRlbWVudD1mYWxzZTsK KwlCb29sRXhwciAJICAgKmV4cHIgPSAoQm9vbEV4cHIgKiljb3B5T2JqZWN0KGV4cHJfb3Jp Zyk7CisKKwlBc3NlcnQoSXNBKGV4cHIsIEJvb2xFeHByKSk7CisKKwkvKiBJZiB0aGlzIGlz IG5vdCBleHByZXNzaW9uICJPciIsIHRoZW4gd2lsbCBkbyBpdCB0aGUgb2xkIHdheS4gKi8K Kwlzd2l0Y2ggKGV4cHItPmJvb2xvcCkKKwl7CisJCWNhc2UgQU5EX0VYUFI6CisJCQlvcG5h bWUgPSAiQU5EIjsKKwkJCWJyZWFrOworCQljYXNlIE9SX0VYUFI6CisJCQlvcG5hbWUgPSAi T1IiOworCQkJb3Jfc3RhdGVtZW50ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIE5PVF9F WFBSOgorCQkJb3BuYW1lID0gIk5PVCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVs b2coRVJST1IsICJ1bnJlY29nbml6ZWQgYm9vbG9wOiAlZCIsIChpbnQpIGV4cHItPmJvb2xv cCk7CisJCQlvcG5hbWUgPSBOVUxMOwkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLworCQkJ YnJlYWs7CisJfQorCisJaWYgKCFvcl9zdGF0ZW1lbnQgfHwgbGlzdF9sZW5ndGgoZXhwci0+ YXJncykgPCBjb25zdF90cmFuc2Zvcm1fb3JfbGltaXQpCisJCXJldHVybiB0cmFuc2Zvcm1C b29sRXhwcihwc3RhdGUsIChCb29sRXhwciAqKWV4cHJfb3JpZyk7CisKKwkvKgorCQkqIE5P VEU6CisJCSogSXQgaXMgYW4gT1ItY2xhdXNlLiBTbywgcmluZm8tPm9yY2xhdXNlIGlzIGEg Qm9vbEV4cHIgbm9kZSwgY29udGFpbnMKKwkJKiBhIGxpc3Qgb2Ygc3ViLXJlc3RyaWN0aW5m byBhcmdzLCBhbmQgcmluZm8tPmNsYXVzZSAtIHdoaWNoIGlzIHRoZQorCQkqIHNhbWUgZXhw cmVzc2lvbiwgbWFkZSBmcm9tIGJhcmUgY2xhdXNlcy4gVG8gbm90IGJyZWFrIHNlbGVjdGl2 aXR5CisJCSogY2FjaGVzIGFuZCBvdGhlciBvcHRpbWl6YXRpb25zLCB1c2UgYm90aDoKKwkJ KiAtIHVzZSByaW5mb3MgZnJvbSBvcmNsYXVzZSBpZiBubyB0cmFuc2Zvcm1hdGlvbiBuZWVk ZWQKKwkJKiAtIHVzZSAgYmFyZSBxdWFscyBmcm9tIHJpbmZvLT5jbGF1c2UgaW4gdGhlIGNh c2Ugb2YgdHJhbnNmb3JtYXRpb24sCisJCSogdG8gY3JlYXRlIG5ldyBSZXN0cmljdEluZm86 IGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIG9wdGlvbnMgdG8gYXZvaWQKKwkJKiBzZWxlY3Rp dml0eSBlc3RpbWF0aW9uIHByb2NlZHVyZS4KKwkJKi8KKwlmb3JlYWNoKGxjX2VhcmdzLCBl eHByLT5hcmdzKQorCXsKKwkJQV9FeHByCQkJICAgKmFyZyA9IChBX0V4cHIgKikgbGZpcnN0 KGxjX2VhcmdzKTsKKwkJTm9kZQkJCSAgICpiYXJlX29yYXJnOworCQlOb2RlCQkJICAgKmNv bnN0X2V4cHI7CisJCU5vZGUJCQkgICAqbm9uX2NvbnN0X2V4cHI7CisJCUxpc3RDZWxsCQkg ICAqbGNfZ3JvdXBzOworCQlPckNsYXVzZUdyb3VwRW50cnkgKmdlbnRyeTsKKwkJYm9vbCAJ CQkJYWxsb3dfdHJhbnNmb3JtYXRpb247CisKKwkJLyoKKwkJICogVGhlIGZpcnN0IHN0ZXA6 IGNoZWNraW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gY29uc2lzdHMgb25seSBvZiBlcXVhbGl0 eS4KKwkJICogV2UgY2FuIG9ubHkgZG8gdGhpcyBoZXJlLCB3aGlsZSBhcmcgaXMgc3RpbGwg cm93IGRhdGEgdHlwZSwgbmFtZWx5IEFfRXhwci4KKwkJICogQWZ0ZXIgYXBwbHlpbmcgdHJh bnNmb3JtRXhwclJlY3VyY2UsIHdlIGFscmVhZHkga25vdyB0aGF0IGl0IHdpbGwgYmUgT3BF eHIgdHlwZSwKKwkJICogYnV0IGNoZWNraW5nIHRoZSBleHByZXNzaW9uIGZvciBlcXVhbGl0 eSBpcyBhbHJlYWR5IGJlY29taW5nIGltcG9zc2libGUgZm9yIHVzLgorCQkgKiBTb21ldGlt ZXMgd2UgaGF2ZSB0aGUgY2hhbmNlIHRvIGRldmlkZSBleHByZXNzaW9uIGludG8gdGhlIGdy b3VwcyBvbgorCQkgKiBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eS4gVGhpcyBpcyBwb3NzaWJs ZSBpZiBhbGwgbGlzdCBpdGVtcyBhcmUgbm90IGF0IHRoZQorCQkgKiBzYW1lIGxldmVsIG9m IGEgc2luZ2xlIEJvb2xFeHByIGV4cHJlc3Npb24sIG90aGVyd2lzZSBhbGwgb2YgdGhlbSBj YW5ub3QgYmUgY29udmVydGVkLgorCQkgKi8KKworCQlpZiAoIWFyZykKKwkJCWJyZWFrOwor CisJCWFsbG93X3RyYW5zZm9ybWF0aW9uID0gKAorCQkJICAgICAgICAgICAgICAgICAgICBv cl9zdGF0ZW1lbnQgJiYKKwkJICAgICAgICAgICAgICAgICAgICAgICAgYXJnLT50eXBlID09 IFRfQV9FeHByICYmIChhcmcpLT5raW5kID09IEFFWFBSX09QICYmCisJCQkJCQkJICAgIGxp c3RfbGVuZ3RoKChhcmcpLT5uYW1lKSA+PTEgJiYgc3RyY21wKHN0clZhbChsaW5pdGlhbCgo YXJnKS0+bmFtZSkpLCAiPSIpID09IDAKKwkJCQkJCQkgICApOworCisKKwkJYmFyZV9vcmFy ZyA9IHRyYW5zZm9ybUV4cHJSZWN1cnNlKHBzdGF0ZSwgKE5vZGUgKilhcmcpOworCQliYXJl X29yYXJnID0gY29lcmNlX3RvX2Jvb2xlYW4ocHN0YXRlLCBiYXJlX29yYXJnLCBvcG5hbWUp OworCisJCS8qCisJCSAqIFRoZSBuZXh0IHN0ZXA6IHRyYW5zZm9ybSBhbGwgdGhlIGlucHV0 cywgYW5kIGRldGVjdCB3aGV0aGVyIGFueSBjb250YWluCisJIAkgKiBWYXJzLgorCQkgKi8K KwkJaWYgKCFhbGxvd190cmFuc2Zvcm1hdGlvbiB8fCAhYmFyZV9vcmFyZyB8fCAhSXNBKGJh cmVfb3JhcmcsIE9wRXhwcikgfHwgIWNvbnRhaW5fdmFyc19vZl9sZXZlbChiYXJlX29yYXJn LCAwKSkKKwkJeworCQkJLyogQWdhaW4sIGl0J3Mgbm90IHRoZSBleHByIHdlIGNhbiB0cmFu c2Zvcm0gKi8KKwkJCW9yX2xpc3QgPSBsYXBwZW5kKG9yX2xpc3QsIGJhcmVfb3JhcmcpOwor CQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBHZXQgcG9pbnRlcnMgdG8gY29uc3Rh bnQgYW5kIGV4cHJlc3Npb24gc2lkZXMgb2YgdGhlIGNsYXVzZQorCQkgKi8KKwkJbm9uX2Nv bnN0X2V4cHIgPSBnZXRfbGVmdG9wKGJhcmVfb3JhcmcpOworCQljb25zdF9leHByID0gZ2V0 X3JpZ2h0b3AoYmFyZV9vcmFyZyk7CisKKwkJLyoKKwkJCSogQXQgdGhpcyBwb2ludCB3ZSBk ZWZpbml0ZWx5IGhhdmUgYSB0cmFuc2Zvcm1hYmxlIGNsYXVzZS4KKwkJCSogQ2xhc3NpZnkg aXQgYW5kIGFkZCBpbnRvIHNwZWNpZmljIGdyb3VwIG9mIGNsYXVzZXMsIG9yIGNyZWF0ZSBu ZXcKKwkJCSogZ3JvdXAuCisJCQkqIFRPRE86IHRvIG1hbmFnZSBjb21wbGV4aXR5IGluIHRo ZSBjYXNlIG9mIG1hbnkgZGlmZmVyZW50IGNsYXVzZXMKKwkJCSogKFgxPUMxKSBPUiAoWDI9 QzIgT1IpIC4uLiAoWE4gPSBDTikgd2UgY291bGQgaW52ZW50IHNvbWV0aGluZworCQkJKiBs aWtlIGEgaGFzaCB0YWJsZSAoaHRhYiBrZXkgPz8/KS4KKwkJCSovCisJCWZvcmVhY2gobGNf Z3JvdXBzLCBncm91cHNfbGlzdCkKKwkJeworCQkJT3JDbGF1c2VHcm91cEVudHJ5ICp2ID0g KE9yQ2xhdXNlR3JvdXBFbnRyeSAqKSBsZmlyc3QobGNfZ3JvdXBzKTsKKworCQkJQXNzZXJ0 KHYtPm5vZGUgIT0gTlVMTCk7CisKKwkJCWlmIChlcXVhbCh2LT5ub2RlLCBub25fY29uc3Rf ZXhwcikpCisJCQl7CisJCQkJdi0+Y29uc3RzID0gbGFwcGVuZCh2LT5jb25zdHMsIGNvbnN0 X2V4cHIpOworCQkJCW5vbl9jb25zdF9leHByID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0K KwkJfQorCisJCWlmIChub25fY29uc3RfZXhwciA9PSBOVUxMKQorCQkJLyoKKwkJCQkqIFRo ZSBjbGF1c2UgY2xhc3NpZmllZCBzdWNjZXNzZnVsbHkgYW5kIGFkZGVkIGludG8gZXhpc3Rl ZAorCQkJCSogY2xhdXNlIGdyb3VwLgorCQkJCSovCisJCQljb250aW51ZTsKKworCQkvKiBO ZXcgY2xhdXNlIGdyb3VwIG5lZWRlZCAqLworCQlnZW50cnkgPSBwYWxsb2Moc2l6ZW9mKE9y Q2xhdXNlR3JvdXBFbnRyeSkpOworCQlnZW50cnktPm5vZGUgPSBub25fY29uc3RfZXhwcjsK KwkJZ2VudHJ5LT5jb25zdHMgPSBsaXN0X21ha2UxKGNvbnN0X2V4cHIpOworCQlnZW50cnkt Pm9wbm8gPSAoKE9wRXhwciAqKWJhcmVfb3JhcmcpLT5vcG5vOworCQlnZW50cnktPmV4cHIg PSAoRXhwciAqKWJhcmVfb3Jhcmc7CisJCWdyb3Vwc19saXN0ID0gbGFwcGVuZChncm91cHNf bGlzdCwgICh2b2lkICopIGdlbnRyeSk7CisJfQorCisJaWYgKGdyb3Vwc19saXN0ID09IE5J TCkKKwl7CisJCS8qCisJCSogTm8gYW55IHRyYW5zZm9ybWF0aW9ucyBwb3NzaWJsZSB3aXRo IHRoaXMgcmluZm8sIGp1c3QgYWRkIGl0c2VsZgorCQkqIHRvIHRoZSBsaXN0IGFuZCBnbyBm dXJ0aGVyLgorCQkqLworCQlvcl9zdGF0ZW1lbnQgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsK KwkJLyogTGV0J3MgY29udmVydCBlYWNoIGdyb3VwIG9mIGNsYXVzZXMgdG8gYW4gSU4gb3Bl cmF0aW9uLiAqLworCisJCS8qCisJCSogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBncm91cHMg YW5kIGNvbnZlcnQgZWFjaCwgd2hlcmUgbnVtYmVyIG9mCisJCSogY29uc3RzIG1vcmUgdGhh biAxLiB0cml2aWFsIGdyb3VwcyBtb3ZlIHRvIE9SLWxpc3QgYWdhaW4KKwkJKi8KKworCQlm b3JlYWNoKGxjX2FyZ3MsIGdyb3Vwc19saXN0KQorCQl7CisJCQlPckNsYXVzZUdyb3VwRW50 cnkgKmdlbnRyeSA9IChPckNsYXVzZUdyb3VwRW50cnkgKikgbGZpcnN0KGxjX2FyZ3MpOwor CQkJTGlzdAkJCSAgICphbGxleHByczsKKwkJCU9pZAkJCQkgICAgc2NhbGFyX3R5cGUsCisJ CQkJCQkJCWFycmF5X3R5cGU7CisKKwkJCUFzc2VydChsaXN0X2xlbmd0aChnZW50cnktPmNv bnN0cykgPiAwKTsKKworCQkJaWYgKGxpc3RfbGVuZ3RoKGdlbnRyeS0+Y29uc3RzKSA9PSAx KQorCQkJeworCQkJCS8qCisJCQkJICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2xhc3Mu IFJldHVybiByaW5mbyBpbnRvIHRoZSBCb29sRXhwcgorCQkJCSAqIGFyZ3MgbGlzdCB1bmNo YW5nZWQuCisJCQkJICovCisJCQkJbGlzdF9mcmVlKGdlbnRyeS0+Y29uc3RzKTsKKwkJCQlv cl9saXN0ID0gbGFwcGVuZChvcl9saXN0LCBnZW50cnktPmV4cHIpOworCQkJCWNvbnRpbnVl OworCQkJfQorCisJCQkvKgorCQkJICogRG8gdGhlIHRyYW5zZm9ybWF0aW9uLiBJdCdzIGJl ZW4gYSBsb25nIHdheSA7KQorCQkJICoKKwkJCSAqIEZpcnN0IG9mIGFsbCwgdHJ5IHRvIHNl bGVjdCBhIGNvbW1vbiB0eXBlIGZvciB0aGUgYXJyYXkgZWxlbWVudHMuICBOb3RlIHRoYXQK KwkJCSAqIHNpbmNlIHRoZSBMSFMnIHR5cGUgaXMgZmlyc3QgaW4gdGhlIGxpc3QsIGl0IHdp bGwgYmUgcHJlZmVycmVkIHdoZW4KKwkJCSAqIHRoZXJlIGlzIGRvdWJ0IChlZywgd2hlbiBh bGwgdGhlIFJIUyBpdGVtcyBhcmUgdW5rbm93biBsaXRlcmFscykuCisJCQkgKgorCQkJICog Tm90ZTogdXNlIGxpc3RfY29uY2F0IGhlcmUgbm90IGxjb25zLCB0byBhdm9pZCBkYW1hZ2lu ZyBybm9udmFycy4KKwkJCSAqCisJCQkgKiBBcyBhIHNvdXJjZSBvZiBpbnNpZGVzLCB1c2Ug bWFrZV9zY2FsYXJfYXJyYXlfb3AoKQorCQkJICovCisJCQlhbGxleHBycyA9IGxpc3RfY29u Y2F0KGxpc3RfbWFrZTEoZ2VudHJ5LT5ub2RlKSwgZ2VudHJ5LT5jb25zdHMpOworCQkJc2Nh bGFyX3R5cGUgPSBzZWxlY3RfY29tbW9uX3R5cGUoTlVMTCwgYWxsZXhwcnMsIE5VTEwsIE5V TEwpOworCQkJaWYgKE9pZElzVmFsaWQoc2NhbGFyX3R5cGUpICYmCisJCQkJIXZlcmlmeV9j b21tb25fdHlwZShzY2FsYXJfdHlwZSwgYWxsZXhwcnMpKQorCQkJCXNjYWxhcl90eXBlID0g SW52YWxpZE9pZDsKKworCQkJaWYgKE9pZElzVmFsaWQoc2NhbGFyX3R5cGUpICYmIHNjYWxh cl90eXBlICE9IFJFQ09SRE9JRCkKKwkJCQlhcnJheV90eXBlID0gZ2V0X2FycmF5X3R5cGUo c2NhbGFyX3R5cGUpOworCQkJZWxzZQorCQkJCWFycmF5X3R5cGUgPSBJbnZhbGlkT2lkOwor CQkJaWYgKGFycmF5X3R5cGUgIT0gSW52YWxpZE9pZCkKKwkJCXsKKwkJCQkvKgorCQkJIAkg KiBPSzogY29lcmNlIGFsbCB0aGUgcmlnaHQtaGFuZCBub24tVmFyIGlucHV0cyB0byB0aGUg Y29tbW9uIHR5cGUKKwkJCSAJICogYW5kIGJ1aWxkIGFuIEFycmF5RXhwciBmb3IgdGhlbS4K KwkJCQkgKi8KKwkJCQlMaXN0CSAgICphZXhwcnM7CisJCQkJQXJyYXlFeHByICAqbmV3YTsK KwkJCQlTY2FsYXJBcnJheU9wRXhwciAqc2FvcGV4cHI7CisJCQkJTGlzdENlbGwgKmw7CisK KwkJCQlhZXhwcnMgPSBOSUw7CisKKwkJCQlmb3JlYWNoKGwsIGdlbnRyeS0+Y29uc3RzKQor CQkJCXsKKwkJCQkJTm9kZQkgICAqcmV4cHIgPSAoTm9kZSAqKSBsZmlyc3QobCk7CisKKwkJ CQkJcmV4cHIgPSBjb2VyY2VfdG9fY29tbW9uX3R5cGUocHN0YXRlLCByZXhwciwKKwkJCQkJ CQkJCQkJCXNjYWxhcl90eXBlLAorCQkJCQkJCQkJCQkJIklOIik7CisJCQkJCWFleHBycyA9 IGxhcHBlbmQoYWV4cHJzLCByZXhwcik7CisJCQkJfQorCisJCQkJbmV3YSA9IG1ha2VOb2Rl KEFycmF5RXhwcik7CisJCQkJLyogYXJyYXlfY29sbGlkIHdpbGwgYmUgc2V0IGJ5IHBhcnNl X2NvbGxhdGUuYyAqLworCQkJCW5ld2EtPmVsZW1lbnRfdHlwZWlkID0gc2NhbGFyX3R5cGU7 CisJCQkJbmV3YS0+YXJyYXlfdHlwZWlkID0gYXJyYXlfdHlwZTsKKwkJCQluZXdhLT5tdWx0 aWRpbXMgPSBmYWxzZTsKKwkJCQluZXdhLT5lbGVtZW50cyA9IGFleHByczsKKwkJCQluZXdh LT5sb2NhdGlvbiA9IC0xOyAvKiBQb3NpdGlvbiBvZiB0aGUgbmV3IGNsYXVzZSBpcyB1bmRl ZmluZWQgKi8KKworCQkJCXNhb3BleHByID0gKFNjYWxhckFycmF5T3BFeHByICopbWFrZV9z Y2FsYXJfYXJyYXlfb3AocHN0YXRlLAorCQkJCQkJCQkJCQkJICAgbGlzdF9tYWtlMShtYWtl U3RyaW5nKChjaGFyICopICI9IikpLAorCQkJCQkJCQkJCQkJICAgdHJ1ZSwKKwkJCQkJCQkJ CQkJCSAgIGdlbnRyeS0+bm9kZSwKKwkJCQkJCQkJCQkJCSAgIChOb2RlICopIG5ld2EsCisJ CQkJCQkJCQkJCQkgICAtMSk7IC8qIFBvc2l0aW9uIG9mIHRoZSBuZXcgY2xhdXNlIGlzIHVu ZGVmaW5lZCAqLworCisJCQkJLyoKKwkJCQkqIFRPRE86IGhlcmUgd2UgY2FuIHRyeSB0byBj b2VyY2UgdGhlIGFycmF5IHRvIGEgQ29uc3QgYW5kIGZpbmQKKwkJCQkqIGhhc2ggZnVuYyBp bnN0ZWFkIG9mIGxpbmVhciBzZWFyY2ggKHNlZSA1MGUxN2FkMjgxYikuCisJCQkJKiBjb252 ZXJ0X3Nhb3BfdG9faGFzaGVkX3Nhb3AoKE5vZGUgKikgc2FvcGV4cHIpOworCQkJCSogV2Ug ZG9uJ3QgaGF2ZSB0byBkbyB0aGlzIGFueW1vcmUsIGRvIHdlPworCQkJCSovCisKKwkJCQlv cl9saXN0ID0gbGFwcGVuZChvcl9saXN0LCAodm9pZCAqKSBzYW9wZXhwcik7CisJCQkJY2hh bmdlX2FwcGx5ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsaXN0X2ZyZWUo Z2VudHJ5LT5jb25zdHMpOworCQkJCW9yX2xpc3QgPSBsYXBwZW5kKG9yX2xpc3QsIGdlbnRy eS0+ZXhwcik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoIWNoYW5nZV9h cHBseSkKKwkJeworCQkJb3Jfc3RhdGVtZW50ID0gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAo b3Jfc3RhdGVtZW50KQorCXsKKwkJLyogT25lIG1vcmUgdHJpY2s6IGFzc2VtYmxlIGNvcnJl Y3QgY2xhdXNlICovCisJCWV4cHIgPSBsaXN0X2xlbmd0aChvcl9saXN0KSA+IDEgPyBtYWtl Qm9vbEV4cHIoT1JfRVhQUiwgbGlzdF9jb3B5KG9yX2xpc3QpLCAtMSkgOiBsaW5pdGlhbChv cl9saXN0KTsKKwkJcmVzdWx0ID0gKE5vZGUgKilleHByOworCX0KKwkvKgorCSAqIFRoZXJl IHdhcyBubyByZWFzb25zIHRvIGNyZWF0ZSBhIG5ldyBleHByZXNpb24sIHNvCisJICogcnVu IHRoZSBvcmlnaW5hbCBCb29sRXhwciBjb252ZXJzaW9uIHdpdGggdXNpbmcKKwkgKiB0cmFu c2Zvcm1Cb29sRXhwciBmdW5jdGlvbgorCSAqLworCWVsc2UKKwl7CisJCXJlc3VsdCA9IHRy YW5zZm9ybUJvb2xFeHByKHBzdGF0ZSwgKEJvb2xFeHByICopZXhwcl9vcmlnKTsKKwl9CisJ bGlzdF9mcmVlKG9yX2xpc3QpOworCWxpc3RfZnJlZV9kZWVwKGdyb3Vwc19saXN0KTsKKwor CXJldHVybiByZXN1bHQ7Cit9CiAKIC8qCiAgKiB0cmFuc2Zvcm1FeHByIC0KQEAgLTIwOCw3 ICs0OTUsNyBAQCB0cmFuc2Zvcm1FeHByUmVjdXJzZShQYXJzZVN0YXRlICpwc3RhdGUsIE5v ZGUgKmV4cHIpCiAJCQl9CiAKIAkJY2FzZSBUX0Jvb2xFeHByOgotCQkJcmVzdWx0ID0gdHJh bnNmb3JtQm9vbEV4cHIocHN0YXRlLCAoQm9vbEV4cHIgKikgZXhwcik7CisJCQlyZXN1bHQg PSAoTm9kZSAqKXRyYW5zZm9ybUJvb2xFeHByT3IocHN0YXRlLCAoRXhwciAqKWV4cHIpOwog CQkJYnJlYWs7CiAKIAkJY2FzZSBUX0Z1bmNDYWxsOgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdAppbmRleCAyNjA4NTQ3NDdiNC4uMDE5MThlNmFlYWMgMTAwNjQ0Ci0tLSBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90 eXBlZGVmcy5saXN0CkBAIC0xNjMwLDYgKzE2MzAsNyBAQCBOdW1lcmljU3VtQWNjdW0KIE51 bWVyaWNWYXIKIE9NX3VpbnQzMgogT1AKK09yQ2xhdXNlR3JvdXBFbnRyeQogT1NBUGVyR3Jv dXBTdGF0ZQogT1NBUGVyUXVlcnlTdGF0ZQogT1NJbmZvCi0tIAoyLjM0LjEKCg== --------------69odNoMiC0oZv9UJuX50leTG--