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 1svD3P-00DCLt-5x for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Sep 2024 09:50:56 +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 1svD3O-00FWWH-D4 for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Sep 2024 09:50:54 +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 1svD3O-00FWVs-0j for pgsql-hackers@lists.postgresql.org; Mon, 30 Sep 2024 09:50:54 +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 1svD3F-001oqG-Va for pgsql-hackers@postgresql.org; Mon, 30 Sep 2024 09:50:53 +0000 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-2e0b93157caso2162228a91.0 for ; Mon, 30 Sep 2024 02:50:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727689845; x=1728294645; 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=r1440iqCGIhvT1c70WW71KeK1QRzO6T/qTReNEhohE4=; b=IVDt9wPRSYdZRxjC2uz0O1wqPk8T8+78DYD2b2e8M2gMsMYcIV+6gNpRy83CPMuuFB D/ihgz/n1UxG/2Uv9TuaFyQ6i8eLxT4KlqdlgcI0+WOQIJeU23Jck26u+WzaOC+piM9K nguRIZxNoY520IaIbAu+RhUx9SLjoeVQcwdbT9GzKtPtLlnuxsNo25EQM/2OHNWMcYel X97f8XH9Q7OYXXl4i5Bknz4PcyesYKumiYn4/N1VxJmCkhEClmcQkUZ1jDRuH6IYP1L3 bruYJlKn3vsVoO/O4m0P32MrZ6r51ZZAp2nDtoMrE4bYaaAd1jIdYcp1I3F3Cx8HY139 Swtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727689845; x=1728294645; 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=r1440iqCGIhvT1c70WW71KeK1QRzO6T/qTReNEhohE4=; b=kztm1SRkW6CubdSast8b3ilYtBb4LEy25L5Js5pyPuQ9rfXSkZpnycuajsYsg9R2ue GM6CS8LZk1S6kYe47gR95M8nPF5U471GSQ8Tjiz/vYGKicalYa9gqbG0lfMml7jVOw52 OT87rdFo28sdA9BEHBePsD+zuWfRZECDLCT4ghkC4Ow/7pH/Eh3z2i7p95z/LZj4d8UF ZRM2n1LerOwzCM+loYkWwaRBzegTHL8iv1X35PqeVv/0C0bfEvGAJzozi9Ea0/TYGmR3 jsk8tfNH/JW5k12Y1lmSaNeurdrX4zpl2Cq0HD5fg6K4QYaPVlFtCwKMcXibzUxdt5iD 1KZg== X-Gm-Message-State: AOJu0YxNaXRdzP/ApI/iwIevyJY1mmkkUwbPV8+EDU4Zy5UJtqLFh5xt 4PUYo4KPMPqAJolAUIWNI0f2LZfruPE+JabWO0Cjd3uvWgasYiN/ X-Google-Smtp-Source: AGHT+IGcQLVUzawC0yq0voiOFpEUUQTr3nvtUUcDplXQUkzWNk3nLRNmQkMaAaKr/tybIANyJ/bXUA== X-Received: by 2002:a17:90a:784f:b0:2d8:719d:98a2 with SMTP id 98e67ed59e1d1-2e0b716e419mr17825030a91.7.1727689845000; Mon, 30 Sep 2024 02:50:45 -0700 (PDT) Received: from [192.168.1.49] (cm-171-100-240-255.revip10.asianet.co.th. [171.100.240.255]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e06e2d794csm10992428a91.45.2024.09.30.02.50.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 30 Sep 2024 02:50:44 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------0N2B5IFlUcSu30Om0EmpAi33" Message-ID: <74e26c13-98d8-4890-a6a6-061c38aff8c1@gmail.com> Date: Mon, 30 Sep 2024 16:50:40 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: allowing extensions to control planner behavior To: Robert Haas Cc: "pgsql-hackers@postgresql.org" , Tom Lane , Michael Paquier References: <2909615.1724693854@sss.pgh.pa.us> Content-Language: en-US From: Andrei Lepikhov 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. --------------0N2B5IFlUcSu30Om0EmpAi33 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 18/9/2024 17:48, Robert Haas wrote: > Comments? Let me share my personal experience on path management in the planner. The main thing important for extensions is flexibility - I would discuss a decision that is not limited by join ordering but could be applied to implement an index picking strategy, Memoize/Material choice versus a non-cached one, choice of custom paths, etc. The most flexible way I have found to this moment is a collaboration between the get_relation_info_hook and add_path hook. In get_relation_info, we have enough context and can add some information to RelOptInfo - I added an extra list to this structure where extensions can add helpful info. Using extensible nodes, we can tackle interference between extensions. The add_path hook can analyse new and old paths and also look into the extensible data inside RelOptInfo. The issue with lots of calls eases by quick return on the out-of-scope paths: usually extensions manage some specific path type or relation and quick test of RelOptInfo::extra_list allow to sort out unnecessary cases. Being flexible, this approach is less invasive. Now, I use it to implement heuristics demanded by clients for cases when the estimator predicts only one row - usually, it means that the optimiser underestimates cardinality. For example, in-place switch-off of NestLoop if it uses too many clauses, or rules to pick up index scan if we have alternative scans, each of them predicts only one tuple. Positive outcomes includes: we don't alter path costs; extension may be sure that core doesn't remove path from the list if the extension forbids it. In attachment - hooks for add_path and add_partial_path. As you can see, because of differences in these routines hooks also implemented differently. Also the compare_path_costs_fuzzily is exported, but it is really good stuff for an extension. -- regards, Andrei Lepikhov --------------0N2B5IFlUcSu30Om0EmpAi33 Content-Type: text/plain; charset=UTF-8; name="0001-Introduce-compare_path_hook.patch" Content-Disposition: attachment; filename="0001-Introduce-compare_path_hook.patch" Content-Transfer-Encoding: base64 RnJvbSBhZjhmNWJkNjVlMzNjODE5NzIzMjMxY2U0MzNkY2Q1MTQzOGI3ZWYwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFRodSwgMjYgU2VwIDIwMjQgMTA6MzQ6MDggKzAyMDAKU3ViamVj dDogW1BBVENIIDEvMl0gSW50cm9kdWNlIGNvbXBhcmVfcGF0aF9ob29rLgoKVGhlIGFkZF9w YXRoIGZ1bmN0aW9uIGlzIHRoZSBvbmx5IGludGVyZmFjZSB0byBzYWZlbHkgYWRkIGFuZCBy ZW1vdmUgcGF0aHMgaW4KdGhlIHBhdGhsaXN0LiBQb3N0Z3JlcyBjb3JlIHByb3ZpZGVzIGEg ZmV3IG9wdGltaXNhdGlvbiBob29rcyB0aGF0IGFuIGV4dGVuc2lvbgpjYW4gdXNlIHRvIG9m ZmVyIGFkZGl0aW9uYWwgcGF0aHMuIEhvd2V2ZXIsIGl0IGlzIHN0aWxsIHVuY2VydGFpbiB3 aGV0aGVyIHN1Y2gKYSBwYXRoIHdpbGwgYmUgcmVwbGFjZWQgdW50aWwgdGhlIGVuZCBvZiB0 aGUgcGF0aCBwb3B1bGF0aW9uIHByb2Nlc3MuClRoaXMgaG9vayBhbGxvd3MgdGhlIGV4dGVu c2lvbiB0byBjb250cm9sIHRoZSBjb21wYXJpc29uIG9mIGEgbmV3IHBhdGggd2l0aAplYWNo IHBhdGhsaXN0J3MgcGF0aCBhbmQgZGVub3RlIHRoZSBvcHRpbWlzZXIgd2hpY2ggcGF0aCBp cyBiZXR0ZXIuCkl0IGRvZXNuJ3QgcG9pbnQgdG8gdGhlIG9wdGltaXNlciBkaXJlY3RseSBh Ym91dCB3aGF0IGV4YWN0bHkgdG8gZG8gd2l0aCB0aGUKaW5jb21pbmcgcGF0aCBhbmQgcGF0 aHMsIGFscmVhZHkgZXhpc3RlZCBpbiBwYXRobGlzdC4KClRhZzogb3B0aW1pemVyLgpjYXVz ZWQgYnk6IFBHUFJPLTEwNDQ1LCBQR1BSTy0xMTAxNy4KLS0tCiBzcmMvYmFja2VuZC9vcHRp bWl6ZXIvdXRpbC9wYXRobm9kZS5jIHwgMjEgKysrKysrKysrKystLS0tLS0tLS0tCiBzcmMv aW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaCAgICAgIHwgMTcgKysrKysrKysrKysrKysr KysKIDIgZmlsZXMgY2hhbmdlZCwgMjggaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYyBi L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKaW5kZXggZmM5N2JmNmVl Mi4uYWU1NzkzMjg2MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv cGF0aG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5j CkBAIC0zMSwxMyArMzEsNiBAQAogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAjaW5j bHVkZSAidXRpbHMvc2VsZnVuY3MuaCIKIAotdHlwZWRlZiBlbnVtCi17Ci0JQ09TVFNfRVFV QUwsCQkJCS8qIHBhdGggY29zdHMgYXJlIGZ1enppbHkgZXF1YWwgKi8KLQlDT1NUU19CRVRU RVIxLAkJCQkvKiBmaXJzdCBwYXRoIGlzIGNoZWFwZXIgdGhhbiBzZWNvbmQgKi8KLQlDT1NU U19CRVRURVIyLAkJCQkvKiBzZWNvbmQgcGF0aCBpcyBjaGVhcGVyIHRoYW4gZmlyc3QgKi8K LQlDT1NUU19ESUZGRVJFTlQsCQkJLyogbmVpdGhlciBwYXRoIGRvbWluYXRlcyB0aGUgb3Ro ZXIgb24gY29zdCAqLwotfSBQYXRoQ29zdENvbXBhcmlzb247CiAKIC8qCiAgKiBTVERfRlVa Wl9GQUNUT1IgaXMgdGhlIG5vcm1hbCBmdXp6IGZhY3RvciBmb3IgY29tcGFyZV9wYXRoX2Nv c3RzX2Z1enppbHkuCkBAIC00Niw2ICszOSw5IEBAIHR5cGVkZWYgZW51bQogICovCiAjZGVm aW5lIFNURF9GVVpaX0ZBQ1RPUiAxLjAxCiAKKy8qIEhvb2sgZm9yIHBsdWdpbnMgdG8gZ2V0 IGNvbnRyb2wgb3ZlciB0aGUgYWRkX3BhdGggZGVjaXNpb24gKi8KK2NvbXBhcmVfcGF0aF9o b29rX3R5cGUgY29tcGFyZV9wYXRoX2hvb2sgPSBOVUxMOworCiBzdGF0aWMgTGlzdCAqdHJh bnNsYXRlX3N1Yl90bGlzdChMaXN0ICp0bGlzdCwgaW50IHJlbGlkKTsKIHN0YXRpYyBpbnQJ YXBwZW5kX3RvdGFsX2Nvc3RfY29tcGFyZShjb25zdCBMaXN0Q2VsbCAqYSwgY29uc3QgTGlz dENlbGwgKmIpOwogc3RhdGljIGludAlhcHBlbmRfc3RhcnR1cF9jb3N0X2NvbXBhcmUoY29u c3QgTGlzdENlbGwgKmEsIGNvbnN0IExpc3RDZWxsICpiKTsKQEAgLTE3OCw3ICsxNzQsNyBA QCBjb21wYXJlX2ZyYWN0aW9uYWxfcGF0aF9jb3N0cyhQYXRoICpwYXRoMSwgUGF0aCAqcGF0 aDIsCiAgKiAoQnV0IGlmIHRvdGFsIGNvc3RzIGFyZSBmdXp6aWx5IGVxdWFsLCB3ZSBjb21w YXJlIHN0YXJ0dXAgY29zdHMgYW55d2F5LAogICogaW4gaG9wZXMgb2YgZWxpbWluYXRpbmcg b25lIHBhdGggb3IgdGhlIG90aGVyLikKICAqLwotc3RhdGljIFBhdGhDb3N0Q29tcGFyaXNv bgorUGF0aENvc3RDb21wYXJpc29uCiBjb21wYXJlX3BhdGhfY29zdHNfZnV6emlseShQYXRo ICpwYXRoMSwgUGF0aCAqcGF0aDIsIGRvdWJsZSBmdXp6X2ZhY3RvcikKIHsKICNkZWZpbmUg Q09OU0lERVJfUEFUSF9TVEFSVFVQX0NPU1QocCkgIFwKQEAgLTQ5MCw4ICs0ODYsMTMgQEAg YWRkX3BhdGgoUmVsT3B0SW5mbyAqcGFyZW50X3JlbCwgUGF0aCAqbmV3X3BhdGgpCiAJCS8q CiAJCSAqIERvIGEgZnV6enkgY29zdCBjb21wYXJpc29uIHdpdGggc3RhbmRhcmQgZnV6emlu ZXNzIGxpbWl0LgogCQkgKi8KLQkJY29zdGNtcCA9IGNvbXBhcmVfcGF0aF9jb3N0c19mdXp6 aWx5KG5ld19wYXRoLCBvbGRfcGF0aCwKLQkJCQkJCQkJCQkJIFNURF9GVVpaX0ZBQ1RPUik7 CisKKwkJaWYgKGNvbXBhcmVfcGF0aF9ob29rKQorCQkJY29zdGNtcCA9ICgqY29tcGFyZV9w YXRoX2hvb2spIChwYXJlbnRfcmVsLCBuZXdfcGF0aCwgb2xkX3BhdGgsCisJCQkJCQkJCQkJ CVNURF9GVVpaX0ZBQ1RPUik7CisJCWVsc2UKKwkJCWNvc3RjbXAgPSBjb21wYXJlX3BhdGhf Y29zdHNfZnV6emlseShuZXdfcGF0aCwgb2xkX3BhdGgsCisJCQkJCQkJCQkJCQkgU1REX0ZV WlpfRkFDVE9SKTsKIAogCQkvKgogCQkgKiBJZiB0aGUgdHdvIHBhdGhzIGNvbXBhcmUgZGlm ZmVyZW50bHkgZm9yIHN0YXJ0dXAgYW5kIHRvdGFsIGNvc3QsCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9w YXRobm9kZS5oCmluZGV4IDEwMzVlNjU2MGMuLjRiOTVkODVlMWEgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGlt aXplci9wYXRobm9kZS5oCkBAIC0xOCwxMSArMTgsMjggQEAKICNpbmNsdWRlICJub2Rlcy9w YXRobm9kZXMuaCIKIAogCit0eXBlZGVmIGVudW0KK3sKKwlDT1NUU19FUVVBTCwJCQkJLyog cGF0aCBjb3N0cyBhcmUgZnV6emlseSBlcXVhbCAqLworCUNPU1RTX0JFVFRFUjEsCQkJCS8q IGZpcnN0IHBhdGggaXMgY2hlYXBlciB0aGFuIHNlY29uZCAqLworCUNPU1RTX0JFVFRFUjIs CQkJCS8qIHNlY29uZCBwYXRoIGlzIGNoZWFwZXIgdGhhbiBmaXJzdCAqLworCUNPU1RTX0RJ RkZFUkVOVCwJCQkvKiBuZWl0aGVyIHBhdGggZG9taW5hdGVzIHRoZSBvdGhlciBvbiBjb3N0 ICovCit9IFBhdGhDb3N0Q29tcGFyaXNvbjsKKworLyogSG9vayBmb3IgcGx1Z2lucyB0byBn ZXQgY29udHJvbCB3aGVuIGdyb3VwaW5nX3BsYW5uZXIoKSBwbGFucyB1cHBlciByZWxzICov Cit0eXBlZGVmIFBhdGhDb3N0Q29tcGFyaXNvbiAoKmNvbXBhcmVfcGF0aF9ob29rX3R5cGUp IChSZWxPcHRJbmZvICpwYXJlbnRfcmVsLAorCQkJCQkJCQkJCQkJCSAgUGF0aCAqbmV3X3Bh dGgsCisJCQkJCQkJCQkJCQkJICBQYXRoICpvbGRfcGF0aCwKKwkJCQkJCQkJCQkJCQkgIGRv dWJsZSBmdXp6X2ZhY3Rvcik7CitleHRlcm4gUEdETExJTVBPUlQgY29tcGFyZV9wYXRoX2hv b2tfdHlwZSBjb21wYXJlX3BhdGhfaG9vazsKKwogLyoKICAqIHByb3RvdHlwZXMgZm9yIHBh dGhub2RlLmMKICAqLwogZXh0ZXJuIGludAljb21wYXJlX3BhdGhfY29zdHMoUGF0aCAqcGF0 aDEsIFBhdGggKnBhdGgyLAogCQkJCQkJCSAgIENvc3RTZWxlY3RvciBjcml0ZXJpb24pOwor ZXh0ZXJuIFBhdGhDb3N0Q29tcGFyaXNvbgorY29tcGFyZV9wYXRoX2Nvc3RzX2Z1enppbHko UGF0aCAqcGF0aDEsIFBhdGggKnBhdGgyLCBkb3VibGUgZnV6el9mYWN0b3IpOwogZXh0ZXJu IGludAljb21wYXJlX2ZyYWN0aW9uYWxfcGF0aF9jb3N0cyhQYXRoICpwYXRoMSwgUGF0aCAq cGF0aDIsCiAJCQkJCQkJCQkJICBkb3VibGUgZnJhY3Rpb24pOwogZXh0ZXJuIHZvaWQgc2V0 X2NoZWFwZXN0KFJlbE9wdEluZm8gKnBhcmVudF9yZWwpOwotLSAKMi40Ni4yCgo= --------------0N2B5IFlUcSu30Om0EmpAi33 Content-Type: text/plain; charset=UTF-8; name="0002-Introduce-compare_partial_path_hook.patch" Content-Disposition: attachment; filename="0002-Introduce-compare_partial_path_hook.patch" Content-Transfer-Encoding: base64 RnJvbSBmNjNjOTNhNDA0NTU0ZjdlNDhhMDFlZDE0NjYxYTExOWFlMTBiNjA0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IE1vbiwgMzAgU2VwIDIwMjQgMTM6MzI6NDMgKzA3MDAKU3ViamVj dDogW1BBVENIIDIvMl0gSW50cm9kdWNlIGNvbXBhcmVfcGFydGlhbF9wYXRoX2hvb2suCgpC eSBhbmFsb2d5IG9mIGNvbXBhcmVfcGF0aF9ob29rLCBsZXQgYW4gZXh0ZW5zaW9uIHRvIGFs dGVyIGRlY2lzaW9ucyBvbgphY2NlcHRpbmcgbmV3IGFuZCByZW1vdmluZyBvbGQgcGF0aC4g VGhlIGFkZF9wYXJ0aWFsX3BhdGgoKSByb3V0aW5lIGhhcwpkaWZmZXJlbnQgbG9naWMuIEhl bmNlLCB0aGUgaG9vayBhbHNvIGRpZmZlcnMgZnJvbSBub24tcGFydGlhbCBjYXNlLgoKQWxz bywgbW92ZSBob29rcyBhbmQgbmV3bHkgZXhwb3J0ZWQgZnVuY3Rpb25zIHRvIHBhdGhzLmgu IERvIHdlIG5lZWQgdG8KcmV2ZXJ0IGl0IGFuZCBhbGxvdyB0byBzdGF5IGluIHRoZSBwYXRo bm9kZS5oPwotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMgfCAg NSArKysrKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggICAgICB8IDE3IC0t LS0tLS0tLS0tLS0tLS0tCiBzcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCAgICAgICAg IHwgMjQgKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDI5IGlu c2VydGlvbnMoKyksIDE3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3BhdGhub2RlLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9wYXRobm9kZS5jCmluZGV4IGFlNTc5MzI4NjIuLjVmOTFlYWQyMjYgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYwpAQCAtNDEsNiArNDEsNyBAQAogCiAvKiBI b29rIGZvciBwbHVnaW5zIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGFkZF9wYXRoIGRlY2lz aW9uICovCiBjb21wYXJlX3BhdGhfaG9va190eXBlIGNvbXBhcmVfcGF0aF9ob29rID0gTlVM TDsKK2NvbXBhcmVfcGFydGlhbF9wYXRoX2hvb2tfdHlwZSBjb21wYXJlX3BhcnRpYWxfcGF0 aF9ob29rID0gTlVMTDsKIAogc3RhdGljIExpc3QgKnRyYW5zbGF0ZV9zdWJfdGxpc3QoTGlz dCAqdGxpc3QsIGludCByZWxpZCk7CiBzdGF0aWMgaW50CWFwcGVuZF90b3RhbF9jb3N0X2Nv bXBhcmUoY29uc3QgTGlzdENlbGwgKmEsIGNvbnN0IExpc3RDZWxsICpiKTsKQEAgLTg3MCw2 ICs4NzEsMTAgQEAgYWRkX3BhcnRpYWxfcGF0aChSZWxPcHRJbmZvICpwYXJlbnRfcmVsLCBQ YXRoICpuZXdfcGF0aCkKIAkJCX0KIAkJfQogCisJCWlmIChjb21wYXJlX3BhcnRpYWxfcGF0 aF9ob29rKQorCQkJKCpjb21wYXJlX3BhcnRpYWxfcGF0aF9ob29rKShwYXJlbnRfcmVsLCBu ZXdfcGF0aCwgb2xkX3BhdGgsCisJCQkJCQkJCQkJICZhY2NlcHRfbmV3LCAmcmVtb3ZlX29s ZCk7CisKIAkJLyoKIAkJICogUmVtb3ZlIGN1cnJlbnQgZWxlbWVudCBmcm9tIHBhcnRpYWxf cGF0aGxpc3QgaWYgZG9taW5hdGVkIGJ5IG5ldy4KIAkJICovCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9w YXRobm9kZS5oCmluZGV4IDRiOTVkODVlMWEuLjEwMzVlNjU2MGMgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGlt aXplci9wYXRobm9kZS5oCkBAIC0xOCwyOCArMTgsMTEgQEAKICNpbmNsdWRlICJub2Rlcy9w YXRobm9kZXMuaCIKIAogCi10eXBlZGVmIGVudW0KLXsKLQlDT1NUU19FUVVBTCwJCQkJLyog cGF0aCBjb3N0cyBhcmUgZnV6emlseSBlcXVhbCAqLwotCUNPU1RTX0JFVFRFUjEsCQkJCS8q IGZpcnN0IHBhdGggaXMgY2hlYXBlciB0aGFuIHNlY29uZCAqLwotCUNPU1RTX0JFVFRFUjIs CQkJCS8qIHNlY29uZCBwYXRoIGlzIGNoZWFwZXIgdGhhbiBmaXJzdCAqLwotCUNPU1RTX0RJ RkZFUkVOVCwJCQkvKiBuZWl0aGVyIHBhdGggZG9taW5hdGVzIHRoZSBvdGhlciBvbiBjb3N0 ICovCi19IFBhdGhDb3N0Q29tcGFyaXNvbjsKLQotLyogSG9vayBmb3IgcGx1Z2lucyB0byBn ZXQgY29udHJvbCB3aGVuIGdyb3VwaW5nX3BsYW5uZXIoKSBwbGFucyB1cHBlciByZWxzICov Ci10eXBlZGVmIFBhdGhDb3N0Q29tcGFyaXNvbiAoKmNvbXBhcmVfcGF0aF9ob29rX3R5cGUp IChSZWxPcHRJbmZvICpwYXJlbnRfcmVsLAotCQkJCQkJCQkJCQkJCSAgUGF0aCAqbmV3X3Bh dGgsCi0JCQkJCQkJCQkJCQkJICBQYXRoICpvbGRfcGF0aCwKLQkJCQkJCQkJCQkJCQkgIGRv dWJsZSBmdXp6X2ZhY3Rvcik7Ci1leHRlcm4gUEdETExJTVBPUlQgY29tcGFyZV9wYXRoX2hv b2tfdHlwZSBjb21wYXJlX3BhdGhfaG9vazsKLQogLyoKICAqIHByb3RvdHlwZXMgZm9yIHBh dGhub2RlLmMKICAqLwogZXh0ZXJuIGludAljb21wYXJlX3BhdGhfY29zdHMoUGF0aCAqcGF0 aDEsIFBhdGggKnBhdGgyLAogCQkJCQkJCSAgIENvc3RTZWxlY3RvciBjcml0ZXJpb24pOwot ZXh0ZXJuIFBhdGhDb3N0Q29tcGFyaXNvbgotY29tcGFyZV9wYXRoX2Nvc3RzX2Z1enppbHko UGF0aCAqcGF0aDEsIFBhdGggKnBhdGgyLCBkb3VibGUgZnV6el9mYWN0b3IpOwogZXh0ZXJu IGludAljb21wYXJlX2ZyYWN0aW9uYWxfcGF0aF9jb3N0cyhQYXRoICpwYXRoMSwgUGF0aCAq cGF0aDIsCiAJCQkJCQkJCQkJICBkb3VibGUgZnJhY3Rpb24pOwogZXh0ZXJuIHZvaWQgc2V0 X2NoZWFwZXN0KFJlbE9wdEluZm8gKnBhcmVudF9yZWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMu aAppbmRleCA1NDg2OWQ0NDAxLi40N2FlMjYwMzNjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9vcHRpbWl6ZXIvcGF0aHMuaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMu aApAQCAtMjcxLDQgKzI3MSwyOCBAQCBleHRlcm4gUGF0aEtleSAqbWFrZV9jYW5vbmljYWxf cGF0aGtleShQbGFubmVySW5mbyAqcm9vdCwKIGV4dGVybiB2b2lkIGFkZF9wYXRoc190b19h cHBlbmRfcmVsKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJ CQlMaXN0ICpsaXZlX2NoaWxkcmVscyk7CiAKKwordHlwZWRlZiBlbnVtCit7CisJQ09TVFNf RVFVQUwsCQkJCS8qIHBhdGggY29zdHMgYXJlIGZ1enppbHkgZXF1YWwgKi8KKwlDT1NUU19C RVRURVIxLAkJCQkvKiBmaXJzdCBwYXRoIGlzIGNoZWFwZXIgdGhhbiBzZWNvbmQgKi8KKwlD T1NUU19CRVRURVIyLAkJCQkvKiBzZWNvbmQgcGF0aCBpcyBjaGVhcGVyIHRoYW4gZmlyc3Qg Ki8KKwlDT1NUU19ESUZGRVJFTlQsCQkJLyogbmVpdGhlciBwYXRoIGRvbWluYXRlcyB0aGUg b3RoZXIgb24gY29zdCAqLworfSBQYXRoQ29zdENvbXBhcmlzb247CisKK2V4dGVybiBQYXRo Q29zdENvbXBhcmlzb24gY29tcGFyZV9wYXRoX2Nvc3RzX2Z1enppbHkoUGF0aCAqcGF0aDEs IFBhdGggKnBhdGgyLAorCQkJCQkJCQkJCQkJCSBkb3VibGUgZnV6el9mYWN0b3IpOworLyog SG9vayBmb3IgcGx1Z2lucyB0byBnZXQgY29udHJvbCB3aGVuIGdyb3VwaW5nX3BsYW5uZXIo KSBwbGFucyB1cHBlciByZWxzICovCit0eXBlZGVmIFBhdGhDb3N0Q29tcGFyaXNvbiAoKmNv bXBhcmVfcGF0aF9ob29rX3R5cGUpIChSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJCQkJCQkJ ICBQYXRoICpuZXdfcGF0aCwKKwkJCQkJCQkJCQkJCQkgIFBhdGggKm9sZF9wYXRoLAorCQkJ CQkJCQkJCQkJCSAgZG91YmxlIGZ1enpfZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoKmNvbXBh cmVfcGFydGlhbF9wYXRoX2hvb2tfdHlwZSkgKFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJCQkJ CQkJCVBhdGggKm5ld19wYXRoLAorCQkJCQkJCQkJCQkJUGF0aCAqb2xkX3BhdGgsCisJCQkJ CQkJCQkJCQlib29sICphY2NlcHRfbmV3LAorCQkJCQkJCQkJCQkJYm9vbCAqcmVtb3ZlX29s ZCk7CitleHRlcm4gUEdETExJTVBPUlQgY29tcGFyZV9wYXRoX2hvb2tfdHlwZSBjb21wYXJl X3BhdGhfaG9vazsKK2V4dGVybiBQR0RMTElNUE9SVCBjb21wYXJlX3BhcnRpYWxfcGF0aF9o b29rX3R5cGUgY29tcGFyZV9wYXJ0aWFsX3BhdGhfaG9vazsKKwogI2VuZGlmCQkJCQkJCS8q IFBBVEhTX0ggKi8KLS0gCjIuNDYuMgoK --------------0N2B5IFlUcSu30Om0EmpAi33--