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 1sMU8W-002cds-5Q for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Jun 2024 15:00:40 +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 1sMU8U-004wFN-Iw for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Jun 2024 15:00:38 +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 1sMU8U-004wFF-6j for pgsql-hackers@lists.postgresql.org; Wed, 26 Jun 2024 15:00:38 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sMU8R-003fS4-S5 for pgsql-hackers@postgresql.org; Wed, 26 Jun 2024 15:00:37 +0000 Received: by mail-pg1-x52d.google.com with SMTP id 41be03b00d2f7-718b714d362so3434373a12.0 for ; Wed, 26 Jun 2024 08:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719414034; x=1720018834; darn=postgresql.org; h=subject:from:cc:content-language:to:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=zo93oPkN4xa3uLXBMYia6ygVAwnfcKqNZp5K7Weq4TY=; b=clTnY8WP4ti0oSiVC3xudvkmeQOrj+mH498J0nkvG+Bg7at+eZCL3Mf3U9e3Wa5kGS cNjrgMqaKzRSRyCcFbQiwLdLe/eSa/H3Vd387eCp3w6aj6VlqkXOwZk7EnQBSF3vVMVx oC8ltIYD4Q7ky7Kr9Y5eQzLVHYNAd+fmaddhYIkatH88um0NQ7k+3fIVeYd5OhnA61Jh pTYJLArHi0zqACyYKtNSxwQmfd1TYJc6mB8+iRwdwJFm+EilkPhCDEdMxi1bPtFuVLgW oQuZQAmIj3/dqIR5whmkB4Xd+49jIRLVD1rDifDmRmyWWhwOpr5j4pNyKpj3ocEXl0Mi av/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719414034; x=1720018834; h=subject:from:cc:content-language:to:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zo93oPkN4xa3uLXBMYia6ygVAwnfcKqNZp5K7Weq4TY=; b=wXjHMo9zgEdWwVkVvAh6Go3xZZCs8fQEx9idQRb2cLs+hJ+g44bNcAtdJDrn+0VL5n /LGASjGPV2He3PpqWmAQZrVKJJpPYyt5uFyanJwuxv21cQvSWVhvUiTAbaRpPn7Gkoce +NFcSjfZqyZWolHkqUAbdYxxMlZmiB+2EiMpCV5gDFMtH7tm2TB0qPEQ9dtXkqXnQ5cr QVDQV9yAzwFa1ULgm2aDNCcHI0R9YrJTR704nLKgx01YkPgKsRG/3LWWAcaz5tuwdNWA ggH45CAJ4kGXQgXwOLaEL9BlgpC2QESIyAbGc3Zvu8eJhBygmCLYvIYWOFUbJ6vuFJzZ eU8w== X-Gm-Message-State: AOJu0Yz5VgRwLTJUeDdoISd+mfgjvylfxNMKu7uzzyMo0Nnh1eun1jap GkSIKa91UAkjTJAM3yTUiOyjUvQsJ6FyWEaiqDLKvEf/GTCm75Z81PewDxd4 X-Google-Smtp-Source: AGHT+IEns51yz/caO2n4VMhLCiWWn0s4MYXh/GhBTpgGfot9LhpzZY7OSpc456YAk7+2Vp1clP05gg== X-Received: by 2002:a05:6a20:2797:b0:1b8:9f3a:c1c9 with SMTP id adf61e73a8af0-1bcf7fea007mr9281567637.57.1719414033485; Wed, 26 Jun 2024 08:00:33 -0700 (PDT) Received: from [192.168.1.40] (cm-171-100-250-52.revip10.asianet.co.th. [171.100.250.52]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-717f662e544sm8064844a12.94.2024.06.26.08.00.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 Jun 2024 08:00:32 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------479HFlnJgCgXNlXEEPL9gpNH" Message-ID: Date: Wed, 26 Jun 2024 22:00:27 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: pgsql-hackers@postgresql.org Content-Language: en-US Cc: Tomas Vondra From: Andrei Lepikhov Subject: Incremental Sort Cost Estimation Instability 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. --------------479HFlnJgCgXNlXEEPL9gpNH Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, While designing an improvement for the cost sort model, I discovered that the query plan can vary if we slightly change the query text without pushing semantic differences. See the example below: CREATE TABLE test(x integer, y integer,z text); INSERT INTO test (x,y) SELECT x, 1 FROM generate_series(1,1000000) AS x; CREATE INDEX ON test(x); CREATE INDEX ON test(y); VACUUM ANALYZE; SET max_parallel_workers_per_gather = 0; First query: EXPLAIN (ANALYZE, TIMING OFF) SELECT count(*) FROM test t1, test t2 WHERE t1.x=t2.y AND t1.y=t2.x GROUP BY t1.x,t1.y; And the second one - just reverse the left and right sides of expressions in the WHERE condition: EXPLAIN (ANALYZE, TIMING OFF) SELECT count(*) FROM test t1, test t2 WHERE t2.y=t1.x AND t2.x=t1.y GROUP BY t1.x,t1.y; You can see two different plans here: GroupAggregate (cost=37824.89..37824.96 rows=1 width=16) Group Key: t1.y, t1.x -> Incremental Sort (cost=37824.89..37824.94 rows=2 width=8) Sort Key: t1.y, t1.x Presorted Key: t1.y -> Merge Join (cost=0.85..37824.88 rows=1 width=8) Merge Cond: (t1.y = t2.x) Join Filter: (t2.y = t1.x) -> Index Scan using test_y_idx on test t1 -> Index Scan using test_x_idx on test t2 GroupAggregate (cost=37824.89..37824.92 rows=1 width=16) Group Key: t1.x, t1.y -> Sort (cost=37824.89..37824.90 rows=1 width=8) Sort Key: t1.x, t1.y Sort Method: quicksort Memory: 25kB -> Merge Join (cost=0.85..37824.88 rows=1 width=8) Merge Cond: (t1.y = t2.x) Join Filter: (t2.y = t1.x) -> Index Scan using test_y_idx on test t1 -> Index Scan using test_x_idx on test t2 Don't mind for now that the best plan is to do IncrementalSort with presorted key t1.x. Just pay attention to the fact that the plan has altered without any valuable reason. The cost_incremental_sort() routine causes such behaviour: it chooses the expression to estimate the number of groups from the first EquivalenceClass member that relies on the syntax. I tried to invent a simple solution to fight this minor case. But the most clear and straightforward way here is to save a reference to the expression that triggered the PathKey creation inside the PathKey itself. See the sketch of the patch in the attachment. I'm not sure this instability is worth fixing this way, but the dependence of the optimisation outcome on the query text looks buggy. -- regards, Andrei Lepikhov --------------479HFlnJgCgXNlXEEPL9gpNH Content-Type: text/plain; charset=UTF-8; name="0001-Add-a-reference-to-the-expression-which-has-triggere.patch" Content-Disposition: attachment; filename*0="0001-Add-a-reference-to-the-expression-which-has-triggere.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA4ZWI5OTk4ZmUzMzA2MDA1ZDUwNjdlNTNmZWY2YTAzMjUxNWViZWQ1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFdlZCwgMjYgSnVuIDIwMjQgMTY6Mjg6MTIgKzA3MDAKU3ViamVj dDogW1BBVENIXSBBZGQgYSByZWZlcmVuY2UgdG8gdGhlIGV4cHJlc3Npb24gd2hpY2ggaGFz IHRyaWdnZXJlZAogY3JlYXRpb24gb2YgdGhpcyBwYXRoa2V5LgoKRm9yIHRoZSBzYWtlIG9m IGNvbnNpc3RlbmN5IGluIG51bWJlciBvZiBncm91cHMgZXN0aW1hdGlvbiBpbiBpbmNyZW1l bnRhbCBzb3J0CndlIG5lZWQgdG8gaGF2ZSBhbiBpbmZvcm1hdGlvbiBhYm91dCBleHByZXNz aW9uIHdoaWNoIGNhdXNlZCB0aGUgcGF0aGtleS4gSXQKZG9lc24ndCBndWFyYW50ZWUgY29y cmVjdCBlc3RpbWF0aW9uIGJ1dCBhdCBsZWFzdCBlc3RpbWF0aW9uIGRvZXNuJ3QgcmVseSBv bgphIFNRTCBzdHJpbmcuCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3 LmMgICB8ICA2ICsrKy0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5j IHwgMjggKysrKysrKysrKysrKysrKysrKy0tLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL3BhdGhrZXlzLmMgfCAzMyArKysrKysrKysrKysrKysrKysrKysrLS0tLS0KIHNyYy9p bmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oICAgICAgICAgfCAgMiArKwogc3JjL2luY2x1ZGUv b3B0aW1pemVyL3BhdGhzLmggICAgICAgICB8ICAzICsrLQogNSBmaWxlcyBjaGFuZ2VkLCA1 OSBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bv c3RncmVzX2Zkdy5jCmluZGV4IDBiYjlhNWFlOGYuLmRhMjZkOTlmYjEgMTAwNjQ0Ci0tLSBh L2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCisrKyBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCkBAIC05NzYsNiArOTc2LDcgQEAgZ2V0X3VzZWZ1 bF9wYXRoa2V5c19mb3JfcmVsYXRpb24oUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCkKIAlmb3JlYWNoKGxjLCB1c2VmdWxfZWNsYXNzX2xpc3QpCiAJewogCQlFcXVpdmFs ZW5jZUNsYXNzICpjdXJfZWMgPSBsZmlyc3QobGMpOworCQlFcXVpdmFsZW5jZU1lbWJlciAq ZW07CiAJCVBhdGhLZXkgICAgKnBhdGhrZXk7CiAKIAkJLyogSWYgcmVkdW5kYW50IHdpdGgg d2hhdCB3ZSBkaWQgYWJvdmUsIHNraXAgaXQuICovCkBAIC05ODgsMTQgKzk4OSwxNSBAQCBn ZXRfdXNlZnVsX3BhdGhrZXlzX2Zvcl9yZWxhdGlvbihQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsKQogCQkJY29udGludWU7CiAKIAkJLyogSWYgbm8gcHVzaGFibGUgZXhw cmVzc2lvbiBmb3IgdGhpcyByZWwsIHNraXAgaXQuICovCi0JCWlmIChmaW5kX2VtX2Zvcl9y ZWwocm9vdCwgY3VyX2VjLCByZWwpID09IE5VTEwpCisJCWlmICgoZW0gPSBmaW5kX2VtX2Zv cl9yZWwocm9vdCwgY3VyX2VjLCByZWwpKSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKIAkJ LyogTG9va3MgbGlrZSB3ZSBjYW4gZ2VuZXJhdGUgYSBwYXRoa2V5LCBzbyBsZXQncyBkbyBp dC4gKi8KIAkJcGF0aGtleSA9IG1ha2VfY2Fub25pY2FsX3BhdGhrZXkocm9vdCwgY3VyX2Vj LAogCQkJCQkJCQkJCSBsaW5pdGlhbF9vaWQoY3VyX2VjLT5lY19vcGZhbWlsaWVzKSwKIAkJ CQkJCQkJCQkgQlRMZXNzU3RyYXRlZ3lOdW1iZXIsCi0JCQkJCQkJCQkJIGZhbHNlKTsKKwkJ CQkJCQkJCQkgZmFsc2UsCisJCQkJCQkJCQkJIGVtLT5lbV9leHByKTsgLyogVE9ETyAqLwog CQl1c2VmdWxfcGF0aGtleXNfbGlzdCA9IGxhcHBlbmQodXNlZnVsX3BhdGhrZXlzX2xpc3Qs CiAJCQkJCQkJCQkgICBsaXN0X21ha2UxKHBhdGhrZXkpKTsKIAl9CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvY29zdHNpemUuYwppbmRleCBlZTIzZWQ3ODM1Li5hNjRmM2U1Nzk3IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCisrKyBi L3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKQEAgLTIwMzgsMjEgKzIw MzgsNDEgQEAgY29zdF9pbmNyZW1lbnRhbF9zb3J0KFBhdGggKnBhdGgsCiAJZm9yZWFjaChs LCBwYXRoa2V5cykKIAl7CiAJCVBhdGhLZXkgICAgKmtleSA9IChQYXRoS2V5ICopIGxmaXJz dChsKTsKLQkJRXF1aXZhbGVuY2VNZW1iZXIgKm1lbWJlciA9IChFcXVpdmFsZW5jZU1lbWJl ciAqKQotCQkJbGluaXRpYWwoa2V5LT5wa19lY2xhc3MtPmVjX21lbWJlcnMpOworCisjaWZk ZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCQlMaXN0Q2VsbCAqbGM7CisKKwkJLyogQmUgcGFy YW5vaWQsIGJ1dCBjYXJpbmcgYWJvdXQgcGVyZm9ybWFjZSBkb24ndCBjaGVjayBvbiBwcm9k ICovCisJCWZvcmVhY2gobGMsIGtleS0+cGtfZWNsYXNzLT5lY19tZW1iZXJzKQorCQl7CisJ CQlpZiAoZmluZF9lY19tZW1iZXJfbWF0Y2hpbmdfZXhwcigKKwkJCQkJCQkJa2V5LT5wa19l Y2xhc3MsIGtleS0+c291cmNlX2V4cHIsCisJCQkJCQkJCXB1bGxfdmFybm9zKHJvb3QsIChO b2RlICopIGtleS0+c291cmNlX2V4cHIpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWxj KQorCQkJLyoKKwkJCSAqIFhYWDogQ2FuIHdlIGJ1aWxkIFBhdGhLZXkgb3ZlciBkZXJpdmVk IGV4cHJlc3Npb24gYW5kIGRvZXMgaXQKKwkJCSAqIHRyaWdnZXIgdGhpcyBlcnJvcj8KKwkJ CSAqLworCQkJZWxvZyhFUlJPUiwgIlBhdGhLZXkgc291cmNlIGV4cHJlc3Npb24gbXVzdCBi ZSBhIHBhcnQgb2YgRVEgY2xhc3MiKTsKKyNlbmRpZgorCisJCS8qIFJlYXNzdXJlIG91cnNl bHZlcyBubyBvbmUgY3JlYXRlZCBwYXRoa2V5cyBhbHRlcm5hdGl2ZSB3YXkgKi8KKwkJQXNz ZXJ0KGtleS0+c291cmNlX2V4cHIgIT0gTlVMTCk7CiAKIAkJLyoKIAkJICogQ2hlY2sgaWYg dGhlIGV4cHJlc3Npb24gY29udGFpbnMgVmFyIHdpdGggInZhcm5vIDAiIHNvIHRoYXQgd2UK IAkJICogZG9uJ3QgY2FsbCBlc3RpbWF0ZV9udW1fZ3JvdXBzIGluIHRoYXQgY2FzZS4KIAkJ ICovCi0JCWlmIChibXNfaXNfbWVtYmVyKDAsIHB1bGxfdmFybm9zKHJvb3QsIChOb2RlICop IG1lbWJlci0+ZW1fZXhwcikpKQorCQlpZiAoYm1zX2lzX21lbWJlcigwLCBwdWxsX3Zhcm5v cyhyb290LCAoTm9kZSAqKSBrZXktPnNvdXJjZV9leHByKSkpCiAJCXsKIAkJCXVua25vd25f dmFybm8gPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBleHByZXNzaW9uIG5vdCBj b250YWluaW5nIGFueSBWYXJzIHdpdGggInZhcm5vIDAiICovCi0JCXByZXNvcnRlZEV4cHJz ID0gbGFwcGVuZChwcmVzb3J0ZWRFeHBycywgbWVtYmVyLT5lbV9leHByKTsKKwkJcHJlc29y dGVkRXhwcnMgPSBsYXBwZW5kKHByZXNvcnRlZEV4cHJzLCBrZXktPnNvdXJjZV9leHByKTsK IAogCQlpZiAoZm9yZWFjaF9jdXJyZW50X2luZGV4KGwpICsgMSA+PSBwcmVzb3J0ZWRfa2V5 cykKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv cGF0aGtleXMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3BhdGhrZXlzLmMKaW5k ZXggNDE2ZmM0ZTI0MC4uZDg1OWU3OTIwOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvcGF0aGtleXMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9wYXRoa2V5cy5jCkBAIC01NCw3ICs1NCw3IEBAIHN0YXRpYyBib29sIHJpZ2h0X21lcmdl X2RpcmVjdGlvbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aEtleSAqcGF0aGtleSk7CiBQYXRo S2V5ICoKIG1ha2VfY2Fub25pY2FsX3BhdGhrZXkoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJ CSAgIEVxdWl2YWxlbmNlQ2xhc3MgKmVjbGFzcywgT2lkIG9wZmFtaWx5LAotCQkJCQkgICBp bnQgc3RyYXRlZ3ksIGJvb2wgbnVsbHNfZmlyc3QpCisJCQkJCSAgIGludCBzdHJhdGVneSwg Ym9vbCBudWxsc19maXJzdCwgRXhwciAqc3JjX2V4cHIpCiB7CiAJUGF0aEtleSAgICAqcGs7 CiAJTGlzdENlbGwgICAqbGM7CkBAIC04OSw2ICs4OSw3IEBAIG1ha2VfY2Fub25pY2FsX3Bh dGhrZXkoUGxhbm5lckluZm8gKnJvb3QsCiAJcGstPnBrX29wZmFtaWx5ID0gb3BmYW1pbHk7 CiAJcGstPnBrX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7CiAJcGstPnBrX251bGxzX2ZpcnN0ID0g bnVsbHNfZmlyc3Q7CisJcGstPnNvdXJjZV9leHByID0gc3JjX2V4cHI7CiAKIAlyb290LT5j YW5vbl9wYXRoa2V5cyA9IGxhcHBlbmQocm9vdC0+Y2Fub25fcGF0aGtleXMsIHBrKTsKIApA QCAtMjQxLDcgKzI0Miw3IEBAIG1ha2VfcGF0aGtleV9mcm9tX3NvcnRpbmZvKFBsYW5uZXJJ bmZvICpyb290LAogCiAJLyogQW5kIGZpbmFsbHkgd2UgY2FuIGZpbmQgb3IgY3JlYXRlIGEg UGF0aEtleSBub2RlICovCiAJcmV0dXJuIG1ha2VfY2Fub25pY2FsX3BhdGhrZXkocm9vdCwg ZWNsYXNzLCBvcGZhbWlseSwKLQkJCQkJCQkJICBzdHJhdGVneSwgbnVsbHNfZmlyc3QpOwor CQkJCQkJCQkgIHN0cmF0ZWd5LCBudWxsc19maXJzdCwgZXhwcik7CiB9CiAKIC8qCkBAIC0x MTE3LDcgKzExMTgsOCBAQCBjb252ZXJ0X3N1YnF1ZXJ5X3BhdGhrZXlzKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkJCSAgIG91dGVyX2VjLAogCQkJ CQkJCQkJCQkgICBzdWJfcGF0aGtleS0+cGtfb3BmYW1pbHksCiAJCQkJCQkJCQkJCSAgIHN1 Yl9wYXRoa2V5LT5wa19zdHJhdGVneSwKLQkJCQkJCQkJCQkJICAgc3ViX3BhdGhrZXktPnBr X251bGxzX2ZpcnN0KTsKKwkJCQkJCQkJCQkJICAgc3ViX3BhdGhrZXktPnBrX251bGxzX2Zp cnN0LAorCQkJCQkJCQkJCQkgICAoRXhwciAqKSBvdXRlcl92YXIpOwogCQkJfQogCQl9CiAJ CWVsc2UKQEAgLTExOTksNyArMTIwMSw4IEBAIGNvbnZlcnRfc3VicXVlcnlfcGF0aGtleXMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCQkJCQkgIG91 dGVyX2VjLAogCQkJCQkJCQkJCQkJCSAgc3ViX3BhdGhrZXktPnBrX29wZmFtaWx5LAogCQkJ CQkJCQkJCQkJCSAgc3ViX3BhdGhrZXktPnBrX3N0cmF0ZWd5LAotCQkJCQkJCQkJCQkJCSAg c3ViX3BhdGhrZXktPnBrX251bGxzX2ZpcnN0KTsKKwkJCQkJCQkJCQkJCQkgIHN1Yl9wYXRo a2V5LT5wa19udWxsc19maXJzdCwKKwkJCQkJCQkJCQkJCQkgIChFeHByICopIG91dGVyX3Zh cik7CiAJCQkJCS8qIHNjb3JlID0gIyBvZiBlcXVpdmFsZW5jZSBwZWVycyAqLwogCQkJCQlz Y29yZSA9IGxpc3RfbGVuZ3RoKG91dGVyX2VjLT5lY19tZW1iZXJzKSAtIDE7CiAJCQkJCS8q ICsxIGlmIGl0IG1hdGNoZXMgdGhlIHByb3BlciBxdWVyeV9wYXRoa2V5cyBpdGVtICovCkBA IC0xNjQzLDYgKzE2NDYsNyBAQCBzZWxlY3Rfb3V0ZXJfcGF0aGtleXNfZm9yX21lcmdlKFBs YW5uZXJJbmZvICpyb290LAogCUxpc3QJICAgKnBhdGhrZXlzID0gTklMOwogCWludAkJCW5D bGF1c2VzID0gbGlzdF9sZW5ndGgobWVyZ2VjbGF1c2VzKTsKIAlFcXVpdmFsZW5jZUNsYXNz ICoqZWNzOworCUV4cHIJCQkgKipleHByczsKIAlpbnQJCSAgICpzY29yZXM7CiAJaW50CQkJ bmVjczsKIAlMaXN0Q2VsbCAgICpsYzsKQEAgLTE2NTcsNiArMTY2MSw3IEBAIHNlbGVjdF9v dXRlcl9wYXRoa2V5c19mb3JfbWVyZ2UoUGxhbm5lckluZm8gKnJvb3QsCiAJICogZHVwbGlj YXRlcykgYW5kIHRoZWlyICJwb3B1bGFyaXR5IiBzY29yZXMuCiAJICovCiAJZWNzID0gKEVx dWl2YWxlbmNlQ2xhc3MgKiopIHBhbGxvYyhuQ2xhdXNlcyAqIHNpemVvZihFcXVpdmFsZW5j ZUNsYXNzICopKTsKKwlleHBycyA9IChFeHByICoqKSBwYWxsb2MobkNsYXVzZXMgKiBzaXpl b2YoRXhwciAqKSk7CiAJc2NvcmVzID0gKGludCAqKSBwYWxsb2MobkNsYXVzZXMgKiBzaXpl b2YoaW50KSk7CiAJbmVjcyA9IDA7CiAKQEAgLTE2NjYsMTQgKzE2NzEsMjEgQEAgc2VsZWN0 X291dGVyX3BhdGhrZXlzX2Zvcl9tZXJnZShQbGFubmVySW5mbyAqcm9vdCwKIAkJRXF1aXZh bGVuY2VDbGFzcyAqb2VjbGFzczsKIAkJaW50CQkJc2NvcmU7CiAJCUxpc3RDZWxsICAgKmxj MjsKKwkJRXhwcgkgICAqZXhwcjsKIAogCQkvKiBnZXQgdGhlIG91dGVyIGVjbGFzcyAqLwog CQl1cGRhdGVfbWVyZ2VjbGF1c2VfZWNsYXNzZXMocm9vdCwgcmluZm8pOwogCiAJCWlmIChy aW5mby0+b3V0ZXJfaXNfbGVmdCkKKwkJewogCQkJb2VjbGFzcyA9IHJpbmZvLT5sZWZ0X2Vj OworCQkJZXhwciA9IChFeHByICopIGxpbml0aWFsKCgoT3BFeHByICopIHJpbmZvLT5jbGF1 c2UpLT5hcmdzKTsKKwkJfQogCQllbHNlCisJCXsKIAkJCW9lY2xhc3MgPSByaW5mby0+cmln aHRfZWM7CisJCQlleHByID0gKEV4cHIgKikgbHNlY29uZCgoKE9wRXhwciAqKSByaW5mby0+ Y2xhdXNlKS0+YXJncyk7CisJCX0KIAogCQkvKiByZWplY3QgZHVwbGljYXRlcyAqLwogCQlm b3IgKGogPSAwOyBqIDwgbmVjczsgaisrKQpAQCAtMTY5Nyw2ICsxNzA5LDggQEAgc2VsZWN0 X291dGVyX3BhdGhrZXlzX2Zvcl9tZXJnZShQbGFubmVySW5mbyAqcm9vdCwKIAkJfQogCiAJ CWVjc1tuZWNzXSA9IG9lY2xhc3M7CisJCWV4cHJzW25lY3NdID0gZXhwcjsKKwogCQlzY29y ZXNbbmVjc10gPSBzY29yZTsKIAkJbmVjcysrOwogCX0KQEAgLTE3OTgsNyArMTgxMiw4IEBA IHNlbGVjdF9vdXRlcl9wYXRoa2V5c19mb3JfbWVyZ2UoUGxhbm5lckluZm8gKnJvb3QsCiAJ CQkJCQkJCQkJIGVjLAogCQkJCQkJCQkJCSBsaW5pdGlhbF9vaWQoZWMtPmVjX29wZmFtaWxp ZXMpLAogCQkJCQkJCQkJCSBCVExlc3NTdHJhdGVneU51bWJlciwKLQkJCQkJCQkJCQkgZmFs c2UpOworCQkJCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkJCQkgZXhwcnNbYmVzdF9qXSk7CiAJ CS8qIGNhbid0IGJlIHJlZHVuZGFudCBiZWNhdXNlIG5vIGR1cGxpY2F0ZSBFQ3MgKi8KIAkJ QXNzZXJ0KCFwYXRoa2V5X2lzX3JlZHVuZGFudChwYXRoa2V5LCBwYXRoa2V5cykpOwogCQlw YXRoa2V5cyA9IGxhcHBlbmQocGF0aGtleXMsIHBhdGhrZXkpOwpAQCAtMTg1MiwxOCArMTg2 NywyMyBAQCBtYWtlX2lubmVyX3BhdGhrZXlzX2Zvcl9tZXJnZShQbGFubmVySW5mbyAqcm9v dCwKIAkJRXF1aXZhbGVuY2VDbGFzcyAqb2VjbGFzczsKIAkJRXF1aXZhbGVuY2VDbGFzcyAq aWVjbGFzczsKIAkJUGF0aEtleSAgICAqcGF0aGtleTsKKwkJRXhwcgkgICAqc3JjX2V4cHI7 CiAKIAkJdXBkYXRlX21lcmdlY2xhdXNlX2VjbGFzc2VzKHJvb3QsIHJpbmZvKTsKIAorCQlB c3NlcnQoSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikgJiYgcmluZm8tPm9yY2xhdXNlID09 IE5VTEwpOworCiAJCWlmIChyaW5mby0+b3V0ZXJfaXNfbGVmdCkKIAkJewogCQkJb2VjbGFz cyA9IHJpbmZvLT5sZWZ0X2VjOwogCQkJaWVjbGFzcyA9IHJpbmZvLT5yaWdodF9lYzsKKwkJ CXNyY19leHByID0gKEV4cHIgKikgbHNlY29uZCgoKE9wRXhwciAqKSByaW5mby0+Y2xhdXNl KS0+YXJncyk7CiAJCX0KIAkJZWxzZQogCQl7CiAJCQlvZWNsYXNzID0gcmluZm8tPnJpZ2h0 X2VjOwogCQkJaWVjbGFzcyA9IHJpbmZvLT5sZWZ0X2VjOworCQkJc3JjX2V4cHIgPSAoRXhw ciAqKSBsaW5pdGlhbCgoKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlKS0+YXJncyk7CiAJCX0K IAogCQkvKiBvdXRlciBlY2xhc3Mgc2hvdWxkIG1hdGNoIGN1cnJlbnQgb3IgbmV4dCBwYXRo a2V5cyAqLwpAQCAtMTg5MSw3ICsxOTExLDggQEAgbWFrZV9pbm5lcl9wYXRoa2V5c19mb3Jf bWVyZ2UoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCSBpZWNsYXNzLAogCQkJCQkJ CQkJCQkgb3BhdGhrZXktPnBrX29wZmFtaWx5LAogCQkJCQkJCQkJCQkgb3BhdGhrZXktPnBr X3N0cmF0ZWd5LAotCQkJCQkJCQkJCQkgb3BhdGhrZXktPnBrX251bGxzX2ZpcnN0KTsKKwkJ CQkJCQkJCQkJIG9wYXRoa2V5LT5wa19udWxsc19maXJzdCwKKwkJCQkJCQkJCQkJIHNyY19l eHByKTsKIAogCQkvKgogCQkgKiBEb24ndCBnZW5lcmF0ZSByZWR1bmRhbnQgcGF0aGtleXMg KHdoaWNoIGNhbiBoYXBwZW4gaWYgbXVsdGlwbGUKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L25vZGVzL3BhdGhub2Rlcy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgKaW5k ZXggMmJhMjk3YzExNy4uN2U5OTcyNWUwMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9k ZXMvcGF0aG5vZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgKQEAg LTE0NjksNiArMTQ2OSw4IEBAIHR5cGVkZWYgc3RydWN0IFBhdGhLZXkKIAlPaWQJCQlwa19v cGZhbWlseTsJLyogYnRyZWUgb3BmYW1pbHkgZGVmaW5pbmcgdGhlIG9yZGVyaW5nICovCiAJ aW50CQkJcGtfc3RyYXRlZ3k7CS8qIHNvcnQgZGlyZWN0aW9uIChBU0Mgb3IgREVTQykgKi8K IAlib29sCQlwa19udWxsc19maXJzdDsgLyogZG8gTlVMTHMgY29tZSBiZWZvcmUgbm9ybWFs IHZhbHVlcz8gKi8KKworCUV4cHIJICAgKnNvdXJjZV9leHByOwkvKiBFeHByZXNzaW9uLCB3 aGljaCB0cmlnZ2VyZWQgdGhpcyBjcmVhdGlvbiAqLwogfSBQYXRoS2V5OwogCiAvKgpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggYi9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvcGF0aHMuaAppbmRleCA1ZTg4YzAyMjRhLi40Yjk5MjI5ZWJmIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAorKysgYi9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvcGF0aHMuaApAQCAtMjY0LDcgKzI2NCw4IEBAIGV4dGVybiBib29sIGhhc191 c2VmdWxfcGF0aGtleXMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBl eHRlcm4gTGlzdCAqYXBwZW5kX3BhdGhrZXlzKExpc3QgKnRhcmdldCwgTGlzdCAqc291cmNl KTsKIGV4dGVybiBQYXRoS2V5ICptYWtlX2Nhbm9uaWNhbF9wYXRoa2V5KFBsYW5uZXJJbmZv ICpyb290LAogCQkJCQkJCQkJICAgRXF1aXZhbGVuY2VDbGFzcyAqZWNsYXNzLCBPaWQgb3Bm YW1pbHksCi0JCQkJCQkJCQkgICBpbnQgc3RyYXRlZ3ksIGJvb2wgbnVsbHNfZmlyc3QpOwor CQkJCQkJCQkJICAgaW50IHN0cmF0ZWd5LCBib29sIG51bGxzX2ZpcnN0LAorCQkJCQkJCQkJ ICAgRXhwciAqc3JjX2V4cHIpOwogZXh0ZXJuIHZvaWQgYWRkX3BhdGhzX3RvX2FwcGVuZF9y ZWwoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCUxpc3Qg KmxpdmVfY2hpbGRyZWxzKTsKIAotLSAKMi40NS4yCgo= --------------479HFlnJgCgXNlXEEPL9gpNH--