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 1tkNP7-003Kxo-6u for pgsql-hackers@arkaria.postgresql.org; Tue, 18 Feb 2025 13:12:49 +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 1tkNP5-00ACX2-OA for pgsql-hackers@arkaria.postgresql.org; Tue, 18 Feb 2025 13:12:47 +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 1tkNP5-00ACWu-Bm for pgsql-hackers@lists.postgresql.org; Tue, 18 Feb 2025 13:12:47 +0000 Received: from mail-yb1-xb33.google.com ([2607:f8b0:4864:20::b33]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tkNP3-001Yqf-0C for pgsql-hackers@postgresql.org; Tue, 18 Feb 2025 13:12:47 +0000 Received: by mail-yb1-xb33.google.com with SMTP id 3f1490d57ef6-e5dd697475dso2182220276.3 for ; Tue, 18 Feb 2025 05:12:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739884363; x=1740489163; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=N/u0wp1kuVZ7mu+sHUZZrqygZS/l0nioqM08abtjqt8=; b=PiAZ3V194bsM6jGh3Fu+o2vrhd3rN4pfBEAmYyg9XZBBwgjaxBKrxQXmLc+XS0o73V FTym3DqaZ3lJEqCss2ZNovPStcCgMzN7B5ynilhC0n1X2JHmZMvU6ohDSZ8GBV5jTx9/ +ahf40PMZn7pLddlAkquS+Kkif63ih0riCsHwu0y9c1Yatl0I/qIMYU7WTcdnaClHZl4 7D41PBx1hvTC2fajDDUQGxrxxfz1PbzcHG08zXJq58+kYfUoiNULX6i7PhuaBB2JylZz glRClcjTx+b0YJSwG+FHgQRny27DIo09g6eHQT2NkjCgUmcsEDXGmGtPb0PvULijYdO9 OIBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739884363; x=1740489163; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=N/u0wp1kuVZ7mu+sHUZZrqygZS/l0nioqM08abtjqt8=; b=qz+b+c8rSQ36Xn4n/DCQk6m1kUW9IdsAbCjR739i++M1e9axj3YazRd1ioviCehkIY JQUnHBLzBsjbO5qtgE1IesfyRFPjPLiazRkdfQXzCH1twzyhBOq8wjMHiBqreaOTXZNl bk03zBD8I+Yru/Fm60Lm4D0M9BgGHiVdXDXOtl7gsTYy8ANpuOUZIGlOsfL1ZjdRCCNR iX43dEeQiunBUnTDEeG4LJql3t8h+8Pqd36GOLdcvwIpgNAcARn4TaieKFJdmKUzEgt3 jJ+IxR3tcn2CQ2Kln1dRcmnUaArVQbrdWipsapyVZpguOtnAKEfGsvISGerlqOiDcAuD Fl7g== X-Forwarded-Encrypted: i=1; AJvYcCU5tE1X/Mb0FG1lzdXnXcoRYpGQHdEHserof1DqClG0iYbufj61Yq9s00kWXlAuM2u/047pcvtzRNcT8lIo@postgresql.org X-Gm-Message-State: AOJu0Yz8jGDdCSSLSVA0Tn6QH7VznAN5PgswJXtqXZi4368Wcb6L0uI1 glsPJpDTNA9MTWHmyb23ylBHfYKLjdA7+0jTVboBXet8kr8gdTYyPKfccfwNrG8I8wcVn6MTGZR F4n7wn/Sx1ei6nzf1ZlwLa/qiHNY= X-Gm-Gg: ASbGncsyqWr6+FWugjQ1L6C6dUnUq0SmnOhZxwK3Icy77+zsSRbqHc7/VJxDAVH4Uy/ VgRZU2nuGEhmqDGMBsoYpwQJqPn48tdhSofwWONEZOCZS+d795Oy6680yAB46H6vJOVh9fCetJl 58IgN+vxp0vYGJbgNjiuk5wZTxL2aaFQ== X-Google-Smtp-Source: AGHT+IFnxQl/BLUB6hdyxptPm+evyO14xFwA49aGCv+rPnv+656OD4u0x2zP7xajPFjFtmwIoSWgiG7erGiHYBG4UrQ= X-Received: by 2002:a05:6902:3408:b0:e57:94bd:4e18 with SMTP id 3f1490d57ef6-e5dc91ed50bmr9967107276.33.1739884363489; Tue, 18 Feb 2025 05:12:43 -0800 (PST) MIME-Version: 1.0 References: <831d7f99-0618-48e5-8557-f3d57137f339@eisentraut.org> <64c2468c-3b69-44d7-863a-165931a70c1d@eisentraut.org> <8be3512a-a23f-4088-a9ec-bf68650a2997@eisentraut.org> <75eb1a6f-d59f-42e6-8a78-124ee808cda7@gmail.com> <8d6a3d4c-f630-4cf9-aced-6cead95776e5@Spark> <12d5cce9-917f-4a99-86d3-715bb3b363bb@Spark> In-Reply-To: From: Richard Guo Date: Tue, 18 Feb 2025 22:12:31 +0900 X-Gm-Features: AWEUYZnPcx9tgjCjsspsJKwVfmsLWyf_AgDeoCmGY2JoGM-q6oW54tC2q5tJ9aA Message-ID: Subject: Re: Virtual generated columns To: Dean Rasheed Cc: Peter Eisentraut , jian he , Zhang Mingli , Alexander Lakhin , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000006fd386062e6a657f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006fd386062e6a657f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Feb 18, 2025 at 7:09=E2=80=AFPM Richard Guo wrote: > It seems to me that, for a relation in the rangetable that has virtual > generated columns, we can consider it a subquery to some extent. For > instance, suppose we have a query: > > select ... from ... join t on ...; > > and suppose t.b is a virtual generated column. We can consider this > query as: > > select ... from ... join (select a, expr() as b from t) as t on ...; > > In this sense, I'm wondering if we can leverage the > pullup_replace_vars architecture to expand the virtual generated > columns. I believe this would help avoid a lot of duplicate code with > pullup_replace_vars_callback. I had a try with this idea, and attached is what I came up with. It fixes all the mentioned issues but still requires significant refinement, particularly due to the lack of comments. By leveraging the pullup_replace_vars architecture to expand the virtual generated columns, it saves a lot of duplicate code. Thanks Richard --0000000000006fd386062e6a657f Content-Type: application/octet-stream; name="v2-0001-Expand-virtual-generated-columns-in-planner.patch" Content-Disposition: attachment; filename="v2-0001-Expand-virtual-generated-columns-in-planner.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7ai7pxx0 RnJvbSA5NmM4MjJlMzIyNjUyYTI5ZDBlYWI3OTE1NjVjNTRjOWQwY2Q3M2FmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogV2VkLCAxMiBGZWIgMjAyNSAxNzo1NTozNSArMDkwMApTdWJqZWN0OiBbUEFUQ0ggdjJd IEV4cGFuZCB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW5zIGluIHBsYW5uZXIKCi0tLQogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jICAgICAgfCAgIDYgKwogc3JjL2JhY2tlbmQv b3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMgfCAxODAgKysrKysrKysrKysrKysrKysrKysr Kwogc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRlSGFuZGxlci5jICAgICAgfCAgMTQgKy0KIHNy Yy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMgICAgICAgIHwgICAyICstCiBzcmMvaW5j bHVkZS9vcHRpbWl6ZXIvcHJlcC5oICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9y ZXdyaXRlL3Jld3JpdGVNYW5pcC5oICAgICAgICB8ICAgMiArCiA2IGZpbGVzIGNoYW5nZWQsIDE5 MyBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9w bGFubmVyLmMKaW5kZXggN2IxYThhMGE5Zi4uYzgwMTA4YTA2YyAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXpl ci9wbGFuL3BsYW5uZXIuYwpAQCAtNzQ5LDYgKzc0OSwxMiBAQCBzdWJxdWVyeV9wbGFubmVyKFBs YW5uZXJHbG9iYWwgKmdsb2IsIFF1ZXJ5ICpwYXJzZSwgUGxhbm5lckluZm8gKnBhcmVudF9yb290 LAogCWlmIChwYXJzZS0+c2V0T3BlcmF0aW9ucykKIAkJZmxhdHRlbl9zaW1wbGVfdW5pb25fYWxs KHJvb3QpOwogCisJLyoKKwkgKiBFeHBhbmQgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucy4KKwkg KiBYWFggbW9yZSBjb21tZW50cworCSAqLworCXBhcnNlID0gcm9vdC0+cGFyc2UgPSBleHBhbmRf dmlydHVhbF9nZW5lcmF0ZWRfY29sdW1ucyhyb290KTsKKwogCS8qCiAJICogU3VydmV5IHRoZSBy YW5nZXRhYmxlIHRvIHNlZSB3aGF0IGtpbmRzIG9mIGVudHJpZXMgYXJlIHByZXNlbnQuICBXZSBj YW4KIAkgKiBza2lwIHNvbWUgbGF0ZXIgcHJvY2Vzc2luZyBpZiByZWxldmFudCBTUUwgZmVhdHVy ZXMgYXJlIG5vdCB1c2VkOyBmb3IKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w cmVwL3ByZXBqb2ludHJlZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50 cmVlLmMKaW5kZXggNWQ5MjI1ZTk5MC4uOTllZjU1ZjdhYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3ByZXAvcHJlcGpvaW50cmVlLmMKQEAgLTksNiArOSw3IEBACiAgKgkJcHJlcHJvY2Vzc19m dW5jdGlvbl9ydGVzCiAgKgkJcHVsbF91cF9zdWJxdWVyaWVzCiAgKgkJZmxhdHRlbl9zaW1wbGVf dW5pb25fYWxsCisgKgkJZXhwYW5kX3ZpcnR1YWxfZ2VuZXJhdGVkX2NvbHVtbnMKICAqCQlkbyBl eHByZXNzaW9uIHByZXByb2Nlc3NpbmcgKGluY2x1ZGluZyBmbGF0dGVuaW5nIEpPSU4gYWxpYXMg dmFycykKICAqCQlyZWR1Y2Vfb3V0ZXJfam9pbnMKICAqCQlyZW1vdmVfdXNlbGVzc19yZXN1bHRf cnRlcwpAQCAtMjUsNiArMjYsNyBAQAogICovCiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAorI2lu Y2x1ZGUgImFjY2Vzcy90YWJsZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgogI2lu Y2x1ZGUgImZ1bmNhcGkuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKQEAgLTM5LDcgKzQxLDkg QEAKICNpbmNsdWRlICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJwYXJzZXIvcGFyc2Vf cmVsYXRpb24uaCIKICNpbmNsdWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCisjaW5jbHVkZSAicmV3 cml0ZS9yZXdyaXRlSGFuZGxlci5oIgogI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgi CisjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAKIAogdHlwZWRlZiBzdHJ1Y3QgbnVsbGluZ3JlbF9p bmZvCkBAIC01Nyw2ICs2MSw3IEBAIHR5cGVkZWYgc3RydWN0IHB1bGx1cF9yZXBsYWNlX3ZhcnNf Y29udGV4dAogewogCVBsYW5uZXJJbmZvICpyb290OwogCUxpc3QJICAgKnRhcmdldGxpc3Q7CQkv KiB0bGlzdCBvZiBzdWJxdWVyeSBiZWluZyBwdWxsZWQgdXAgKi8KKwlpbnQgICAgICAgICByZXN1 bHRfcmVsYXRpb247CS8qIHRoZSBpbmRleCBvZiB0aGUgcmVzdWx0IHJlbGF0aW9uICovCiAJUmFu Z2VUYmxFbnRyeSAqdGFyZ2V0X3J0ZTsJLyogUlRFIG9mIHN1YnF1ZXJ5ICovCiAJUmVsaWRzCQly ZWxpZHM7CQkJLyogcmVsaWRzIHdpdGhpbiBzdWJxdWVyeSwgYXMgbnVtYmVyZWQgYWZ0ZXIKIAkJ CQkJCQkJICogcHVsbHVwIChzZXQgb25seSBpZiB0YXJnZXRfcnRlLT5sYXRlcmFsKSAqLwpAQCAt MTI3Myw2ICsxMjc4LDcgQEAgcHVsbF91cF9zaW1wbGVfc3VicXVlcnkoUGxhbm5lckluZm8gKnJv b3QsIE5vZGUgKmp0bm9kZSwgUmFuZ2VUYmxFbnRyeSAqcnRlLAogCSAqLwogCXJ2Y29udGV4dC5y b290ID0gcm9vdDsKIAlydmNvbnRleHQudGFyZ2V0bGlzdCA9IHN1YnF1ZXJ5LT50YXJnZXRMaXN0 OworCXJ2Y29udGV4dC5yZXN1bHRfcmVsYXRpb24gPSAwOwogCXJ2Y29udGV4dC50YXJnZXRfcnRl ID0gcnRlOwogCWlmIChydGUtPmxhdGVyYWwpCiAJewpAQCAtMTgzMyw2ICsxODM5LDcgQEAgcHVs bF91cF9zaW1wbGVfdmFsdWVzKFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpqdG5vZGUsIFJhbmdl VGJsRW50cnkgKnJ0ZSkKIAl9CiAJcnZjb250ZXh0LnJvb3QgPSByb290OwogCXJ2Y29udGV4dC50 YXJnZXRsaXN0ID0gdGxpc3Q7CisJcnZjb250ZXh0LnJlc3VsdF9yZWxhdGlvbiA9IDA7CiAJcnZj b250ZXh0LnRhcmdldF9ydGUgPSBydGU7CiAJcnZjb250ZXh0LnJlbGlkcyA9IE5VTEw7CS8qIGNh bid0IGJlIGFueSBsYXRlcmFsIHJlZmVyZW5jZXMgaGVyZSAqLwogCXJ2Y29udGV4dC5udWxsaW5m byA9IE5VTEw7CkBAIC0xOTkyLDYgKzE5OTksNyBAQCBwdWxsX3VwX2NvbnN0YW50X2Z1bmN0aW9u KFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpqdG5vZGUsCiAJCQkJCQkJCQkJCQkJICAxLAkvKiBy ZXNubyAqLwogCQkJCQkJCQkJCQkJCSAgTlVMTCwgLyogcmVzbmFtZSAqLwogCQkJCQkJCQkJCQkJ CSAgZmFsc2UpKTsJLyogcmVzanVuayAqLworCXJ2Y29udGV4dC5yZXN1bHRfcmVsYXRpb24gPSAw OwogCXJ2Y29udGV4dC50YXJnZXRfcnRlID0gcnRlOwogCiAJLyoKQEAgLTI0OTksNiArMjUwNywx MCBAQCBwdWxsdXBfcmVwbGFjZV92YXJzX2NhbGxiYWNrKFZhciAqdmFyLAogCSAqLwogCW5lZWRf cGh2ID0gKHZhci0+dmFybnVsbGluZ3JlbHMgIT0gTlVMTCkgfHwgcmNvbi0+d3JhcF9ub25fdmFy czsKIAorCS8qIFN5c3RlbSBjb2x1bW5zIGFyZSBub3QgcmVwbGFjZWQuICovCisJaWYgKHZhcmF0 dG5vIDwgSW52YWxpZEF0dHJOdW1iZXIpCisJCXJldHVybiAoTm9kZSAqKSBjb3B5T2JqZWN0KHZh cik7CisKIAkvKgogCSAqIElmIFBsYWNlSG9sZGVyVmFycyBhcmUgbmVlZGVkLCB3ZSBjYWNoZSB0 aGUgbW9kaWZpZWQgZXhwcmVzc2lvbnMgaW4KIAkgKiByY29uLT5ydl9jYWNoZVtdLiAgVGhpcyBp cyBub3QgaW4gaG9wZXMgb2YgYW55IG1hdGVyaWFsIHNwZWVkIGdhaW4KQEAgLTI1NTksNiArMjU3 MSwyMiBAQCBwdWxsdXBfcmVwbGFjZV92YXJzX2NhbGxiYWNrKFZhciAqdmFyLAogCQlyb3dleHBy LT5sb2NhdGlvbiA9IHZhci0+bG9jYXRpb247CiAJCW5ld25vZGUgPSAoTm9kZSAqKSByb3dleHBy OwogCisJCS8qCisJCSAqIEhhbmRsZSBhbnkgT0xEL05FVyBSRVRVUk5JTkcgbGlzdCBWYXJzCisJ CSAqCisJCSAqIFhYWCBjb21tZW50cyBhYm91dCB3cmFwcGluZyBpdCBpbnRvIFJldHVybmluZ0V4 cHIKKwkJICovCisJCWlmICh2YXItPnZhcnJldHVybmluZ3R5cGUgIT0gVkFSX1JFVFVSTklOR19E RUZBVUxUKQorCQl7CisJCQlSZXR1cm5pbmdFeHByICpyZXhwciA9IG1ha2VOb2RlKFJldHVybmlu Z0V4cHIpOworCisJCQlyZXhwci0+cmV0bGV2ZWxzdXAgPSB2YXItPnZhcmxldmVsc3VwOworCQkJ cmV4cHItPnJldG9sZCA9ICh2YXItPnZhcnJldHVybmluZ3R5cGUgPT0gVkFSX1JFVFVSTklOR19P TEQpOworCQkJcmV4cHItPnJldGV4cHIgPSAoRXhwciAqKSByb3dleHByOworCisJCQluZXdub2Rl ID0gKE5vZGUgKikgcmV4cHI7CisJCX0KKwogCQkvKgogCQkgKiBJbnNlcnQgUGxhY2VIb2xkZXJW YXIgaWYgbmVlZGVkLiAgTm90aWNlIHRoYXQgd2UgYXJlIHdyYXBwaW5nIG9uZQogCQkgKiBQbGFj ZUhvbGRlclZhciBhcm91bmQgdGhlIHdob2xlIFJvd0V4cHIsIHJhdGhlciB0aGFuIHB1dHRpbmcg b25lCkBAIC0yNTg4LDYgKzI2MTYsMzcgQEAgcHVsbHVwX3JlcGxhY2VfdmFyc19jYWxsYmFjayhW YXIgKnZhciwKIAkJLyogTWFrZSBhIGNvcHkgb2YgdGhlIHRsaXN0IGl0ZW0gdG8gcmV0dXJuICov CiAJCW5ld25vZGUgPSAoTm9kZSAqKSBjb3B5T2JqZWN0KHRsZS0+ZXhwcik7CiAKKwkJLyoKKwkJ ICogSGFuZGxlIGFueSBPTEQvTkVXIFJFVFVSTklORyBsaXN0IFZhcnMKKwkJICoKKwkJICogWFhY IGNvbW1lbnRzIGFib3V0IHdyYXBwaW5nIGl0IGludG8gUmV0dXJuaW5nRXhwcgorCQkgKi8KKwkJ aWYgKHZhci0+dmFycmV0dXJuaW5ndHlwZSAhPSBWQVJfUkVUVVJOSU5HX0RFRkFVTFQpCisJCXsK KwkJCS8qCisJCQkgKiBDb3B5IHZhcnJldHVybmluZ3R5cGUgb250byBhbnkgVmFycyBpbiB0aGUg dGxpc3QgaXRlbSB0aGF0CisJCQkgKiByZWZlciB0byByZXN1bHRfcmVsYXRpb24gKHdoaWNoIGhh ZCBiZXR0ZXIgYmUgbm9uLXplcm8pLgorCQkJICovCisJCQlpZiAocmNvbi0+cmVzdWx0X3JlbGF0 aW9uID09IDApCisJCQkJZWxvZyhFUlJPUiwgInZhcmlhYmxlIHJldHVybmluZyBvbGQvbmV3IGZv dW5kIG91dHNpZGUgUkVUVVJOSU5HIGxpc3QiKTsKKworCQkJU2V0VmFyUmV0dXJuaW5nVHlwZSgo Tm9kZSAqKSBuZXdub2RlLCByY29uLT5yZXN1bHRfcmVsYXRpb24sCisJCQkJCQkJCXZhci0+dmFy bGV2ZWxzdXAsIHZhci0+dmFycmV0dXJuaW5ndHlwZSk7CisKKwkJCWlmICghSXNBKG5ld25vZGUs IFZhcikgfHwKKwkJCQkoKFZhciAqKSBuZXdub2RlKS0+dmFybm8gIT0gcmNvbi0+cmVzdWx0X3Jl bGF0aW9uIHx8CisJCQkJKChWYXIgKikgbmV3bm9kZSktPnZhcmxldmVsc3VwICE9IHZhci0+dmFy bGV2ZWxzdXApCisJCQl7CisJCQkJUmV0dXJuaW5nRXhwciAqcmV4cHIgPSBtYWtlTm9kZShSZXR1 cm5pbmdFeHByKTsKKworCQkJCXJleHByLT5yZXRsZXZlbHN1cCA9IHZhci0+dmFybGV2ZWxzdXA7 CisJCQkJcmV4cHItPnJldG9sZCA9ICh2YXItPnZhcnJldHVybmluZ3R5cGUgPT0gVkFSX1JFVFVS TklOR19PTEQpOworCQkJCXJleHByLT5yZXRleHByID0gKEV4cHIgKikgbmV3bm9kZTsKKworCQkJ CW5ld25vZGUgPSAoTm9kZSAqKSByZXhwcjsKKwkJCX0KKwkJfQorCiAJCS8qIEluc2VydCBQbGFj ZUhvbGRlclZhciBpZiBuZWVkZWQgKi8KIAkJaWYgKG5lZWRfcGh2KQogCQl7CkBAIC0yOTQ3LDYg KzMwMDYsMTI3IEBAIGZsYXR0ZW5fc2ltcGxlX3VuaW9uX2FsbChQbGFubmVySW5mbyAqcm9vdCkK IH0KIAogCisvKgorICogZXhwYW5kX3ZpcnR1YWxfZ2VuZXJhdGVkX2NvbHVtbnMKKyAqCQlFeHBh bmQgYWxsIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiByZWZlcmVuY2VzIGluIGEgcXVlcnkuCisg KgorICogWFhYIG1vcmUgY29tbWVudHMKKyAqLworUXVlcnkgKgorZXhwYW5kX3ZpcnR1YWxfZ2Vu ZXJhdGVkX2NvbHVtbnMoUGxhbm5lckluZm8gKnJvb3QpCit7CisJUXVlcnkJICAgKnBhcnNlID0g cm9vdC0+cGFyc2U7CisJaW50CQkJcnRfaW5kZXg7CisJTGlzdENlbGwgICAqbGM7CisKKwlydF9p bmRleCA9IDA7CisJZm9yZWFjaChsYywgcGFyc2UtPnJ0YWJsZSkKKwl7CisJCVJhbmdlVGJsRW50 cnkgKnJ0ZSA9IChSYW5nZVRibEVudHJ5ICopIGxmaXJzdChsYyk7CisJCVJlbGF0aW9uCXJlbDsK KwkJVHVwbGVEZXNjCXR1cGRlc2M7CisKKwkJKytydF9pbmRleDsKKworCQkvKgorCQkgKiBPbmx5 IG5vcm1hbCByZWxhdGlvbnMgY2FuIGhhdmUgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucy4KKwkJ ICovCisJCWlmIChydGUtPnJ0ZWtpbmQgIT0gUlRFX1JFTEFUSU9OKQorCQkJY29udGludWU7CisK KwkJcmVsID0gdGFibGVfb3BlbihydGUtPnJlbGlkLCBOb0xvY2spOworCisJCXR1cGRlc2MgPSBS ZWxhdGlvbkdldERlc2NyKHJlbCk7CisJCWlmICh0dXBkZXNjLT5jb25zdHIgJiYgdHVwZGVzYy0+ Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3ZpcnR1YWwpCisJCXsKKwkJCUxpc3QJICAgKnRsaXN0ID0g TklMOworCQkJcHVsbHVwX3JlcGxhY2VfdmFyc19jb250ZXh0IHJ2Y29udGV4dDsKKworCQkJZm9y IChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCQkJeworCQkJCUZvcm1fcGdf YXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOworCQkJCWludAkJCQlh dHRudW0gPSBpICsgMTsKKwkJCQlUYXJnZXRFbnRyeQkgICAqdGU7CisKKwkJCQlpZiAoYXR0ci0+ YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKKwkJCQl7CisJCQkJ CU5vZGUJICAgKmRlZmV4cHI7CisJCQkJCU9pZAkJCWF0dGNvbGxpZDsKKworCQkJCQlkZWZleHBy ID0gYnVpbGRfY29sdW1uX2RlZmF1bHQocmVsLCBhdHRudW0pOworCQkJCQlpZiAoZGVmZXhwciA9 PSBOVUxMKQorCQkJCQkJZWxvZyhFUlJPUiwgIm5vIGdlbmVyYXRpb24gZXhwcmVzc2lvbiBmb3Vu ZCBmb3IgY29sdW1uIG51bWJlciAlZCBvZiB0YWJsZSBcIiVzXCIiLAorCQkJCQkJCSBhdHRudW0s IFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpOworCisJCQkJCS8qCisJCQkJCSAqIElmIHRo ZSBjb2x1bW4gZGVmaW5pdGlvbiBoYXMgYSBjb2xsYXRpb24gYW5kIGl0IGlzCisJCQkJCSAqIGRp ZmZlcmVudCBmcm9tIHRoZSBjb2xsYXRpb24gb2YgdGhlIGdlbmVyYXRpb24gZXhwcmVzc2lvbiwK KwkJCQkJICogcHV0IGEgQ09MTEFURSBjbGF1c2UgYXJvdW5kIHRoZSBleHByZXNzaW9uLgorCQkJ CQkgKi8KKwkJCQkJYXR0Y29sbGlkID0gYXR0ci0+YXR0Y29sbGF0aW9uOworCQkJCQlpZiAoYXR0 Y29sbGlkICYmIGF0dGNvbGxpZCAhPSBleHByQ29sbGF0aW9uKGRlZmV4cHIpKQorCQkJCQl7CisJ CQkJCQlDb2xsYXRlRXhwciAqY2UgPSBtYWtlTm9kZShDb2xsYXRlRXhwcik7CisKKwkJCQkJCWNl LT5hcmcgPSAoRXhwciAqKSBkZWZleHByOworCQkJCQkJY2UtPmNvbGxPaWQgPSBhdHRjb2xsaWQ7 CisJCQkJCQljZS0+bG9jYXRpb24gPSAtMTsKKworCQkJCQkJZGVmZXhwciA9IChOb2RlICopIGNl OworCQkJCQl9CisKKwkJCQkJQ2hhbmdlVmFyTm9kZXMoZGVmZXhwciwgMSwgcnRfaW5kZXgsIDAp OworCisJCQkJCXRlID0gbWFrZVRhcmdldEVudHJ5KChFeHByICopIGRlZmV4cHIsIGF0dG51bSwg MCwgZmFsc2UpOworCQkJCQl0bGlzdCA9IGxhcHBlbmQodGxpc3QsIHRlKTsKKwkJCQl9CisJCQkJ ZWxzZQorCQkJCXsKKwkJCQkJVmFyCQkgICAqdmFyOworCisJCQkJCXZhciA9IG1ha2VWYXIocnRf aW5kZXgsCisJCQkJCQkJCSAgYXR0bnVtLAorCQkJCQkJCQkgIGF0dHItPmF0dHR5cGlkLAorCQkJ CQkJCQkgIGF0dHItPmF0dHR5cG1vZCwKKwkJCQkJCQkJICBhdHRyLT5hdHRjb2xsYXRpb24sCisJ CQkJCQkJCSAgMCk7CisJCQkJCXRlID0gbWFrZVRhcmdldEVudHJ5KChFeHByICopIHZhciwgYXR0 bnVtLCAwLCBmYWxzZSk7CisJCQkJCXRsaXN0ID0gbGFwcGVuZCh0bGlzdCwgdGUpOworCQkJCX0K KwkJCX0KKworCQkJQXNzZXJ0KGxpc3RfbGVuZ3RoKHRsaXN0KSA+IDApOworCisJCQlydmNvbnRl eHQucm9vdCA9IHJvb3Q7CisJCQlydmNvbnRleHQudGFyZ2V0bGlzdCA9IHRsaXN0OworCQkJcnZj b250ZXh0LnJlc3VsdF9yZWxhdGlvbiA9IHBhcnNlLT5yZXN1bHRSZWxhdGlvbjsKKwkJCXJ2Y29u dGV4dC50YXJnZXRfcnRlID0gcnRlOworCQkJcnZjb250ZXh0LnJlbGlkcyA9IE5VTEw7CisJCQly dmNvbnRleHQubnVsbGluZm8gPSBOVUxMOworCQkJcnZjb250ZXh0Lm91dGVyX2hhc1N1Ykxpbmtz ID0gTlVMTDsKKwkJCXJ2Y29udGV4dC52YXJubyA9IHJ0X2luZGV4OworCQkJcnZjb250ZXh0Lndy YXBfbm9uX3ZhcnMgPSBmYWxzZTsKKwkJCXJ2Y29udGV4dC5ydl9jYWNoZSA9IHBhbGxvYzAoKGxp c3RfbGVuZ3RoKHRsaXN0KSArIDEpICoKKwkJCQkJCQkJCQkgc2l6ZW9mKE5vZGUgKikpOworCQkJ LyoKKwkJCSAqIElmIHRoZSBxdWVyeSB1c2VzIGdyb3VwaW5nIHNldHMsIHdlIG5lZWQgYSBQbGFj ZUhvbGRlclZhciBmb3IKKwkJCSAqIGFueXRoaW5nIHRoYXQncyBub3QgYSBzaW1wbGUgVmFyLiAg VGhpcyBlbnN1cmVzIHRoYXQgZXhwcmVzc2lvbnMKKwkJCSAqIHJldGFpbiB0aGVpciBzZXBhcmF0 ZSBpZGVudGl0eSBzbyB0aGF0IHRoZXkgd2lsbCBtYXRjaCBncm91cGluZworCQkJICogc2V0IGNv bHVtbnMgd2hlbiBhcHByb3ByaWF0ZS4KKwkJCSAqLworCQkJaWYgKHBhcnNlLT5ncm91cGluZ1Nl dHMpCisJCQkJcnZjb250ZXh0LndyYXBfbm9uX3ZhcnMgPSB0cnVlOworCisJCQlwYXJzZSA9IChR dWVyeSAqKSBwdWxsdXBfcmVwbGFjZV92YXJzKChOb2RlICopIHBhcnNlLCAmcnZjb250ZXh0KTsK KwkJfQorCisJCXRhYmxlX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwl9CisKKwlyZXR1cm4gcGFyc2U7 Cit9CisKKwogLyoKICAqIHJlZHVjZV9vdXRlcl9qb2lucwogICoJCUF0dGVtcHQgdG8gcmVkdWNl IG91dGVyIGpvaW5zIHRvIHBsYWluIGlubmVyIGpvaW5zLgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvcmV3cml0ZS9yZXdyaXRlSGFuZGxlci5jIGIvc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRl SGFuZGxlci5jCmluZGV4IGU5OTZiZGMwZDIuLjBiMWZjYjM3NTggMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3Jld3JpdGUvcmV3cml0ZUhhbmRsZXIuYworKysgYi9zcmMvYmFja2VuZC9yZXdyaXRl L3Jld3JpdGVIYW5kbGVyLmMKQEAgLTIyMTEsNyArMjIxMSw5IEBAIGZpcmVSSVJydWxlcyhRdWVy eSAqcGFyc2V0cmVlLCBMaXN0ICphY3RpdmVSSVJzKQogCQkgKiBPbmx5IG5vcm1hbCByZWxhdGlv bnMgY2FuIGhhdmUgUkxTIHBvbGljaWVzIG9yIHZpcnR1YWwgZ2VuZXJhdGVkCiAJCSAqIGNvbHVt bnMuCiAJCSAqLwotCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTikKKwkJaWYgKHJ0 ZS0+cnRla2luZCAhPSBSVEVfUkVMQVRJT04gfHwKKwkJCShydGUtPnJlbGtpbmQgIT0gUkVMS0lO RF9SRUxBVElPTiAmJgorCQkJIHJ0ZS0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX1RB QkxFKSkKIAkJCWNvbnRpbnVlOwogCiAJCXJlbCA9IHRhYmxlX29wZW4ocnRlLT5yZWxpZCwgTm9M b2NrKTsKQEAgLTIzMDAsMTYgKzIzMDIsNiBAQCBmaXJlUklScnVsZXMoUXVlcnkgKnBhcnNldHJl ZSwgTGlzdCAqYWN0aXZlUklScykKIAkJaWYgKGhhc1N1YkxpbmtzKQogCQkJcGFyc2V0cmVlLT5o YXNTdWJMaW5rcyA9IHRydWU7CiAKLQkJLyoKLQkJICogRXhwYW5kIGFueSByZWZlcmVuY2VzIHRv IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgb2YgdGhpcyB0YWJsZS4KLQkJICogTm90ZSB0aGF0 IHN1YnF1ZXJpZXMgaW4gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uIGV4cHJlc3Npb25zIGFyZQot CQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgc28gdGhpcyBjYW5ub3QgYWRkIGFueSBtb3Jl IHN1YmxpbmtzLgotCQkgKi8KLQkJcGFyc2V0cmVlID0gKFF1ZXJ5ICopCi0JCQlleHBhbmRfZ2Vu ZXJhdGVkX2NvbHVtbnNfaW50ZXJuYWwoKE5vZGUgKikgcGFyc2V0cmVlLAotCQkJCQkJCQkJCQkg IHJlbCwgcnRfaW5kZXgsIHJ0ZSwKLQkJCQkJCQkJCQkJICBwYXJzZXRyZWUtPnJlc3VsdFJlbGF0 aW9uKTsKLQogCQl0YWJsZV9jbG9zZShyZWwsIE5vTG9jayk7CiAJfQogCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5jIGIvc3JjL2JhY2tlbmQvcmV3cml0ZS9y ZXdyaXRlTWFuaXAuYwppbmRleCA5NDMzNTQ4ZDI3Li42OTk0YjhjNTQyIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5jCisrKyBiL3NyYy9iYWNrZW5kL3Jld3Jp dGUvcmV3cml0ZU1hbmlwLmMKQEAgLTEwMTAsNyArMTAxMCw3IEBAIFNldFZhclJldHVybmluZ1R5 cGVfd2Fsa2VyKE5vZGUgKm5vZGUsIFNldFZhclJldHVybmluZ1R5cGVfY29udGV4dCAqY29udGV4 dCkKIAlyZXR1cm4gZXhwcmVzc2lvbl90cmVlX3dhbGtlcihub2RlLCBTZXRWYXJSZXR1cm5pbmdU eXBlX3dhbGtlciwgY29udGV4dCk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBTZXRWYXJSZXR1 cm5pbmdUeXBlKE5vZGUgKm5vZGUsIGludCByZXN1bHRfcmVsYXRpb24sIGludCBzdWJsZXZlbHNf dXAsCiAJCQkJCVZhclJldHVybmluZ1R5cGUgcmV0dXJuaW5nX3R5cGUpCiB7CmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcHJlcC5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3By ZXAuaAppbmRleCAwYWU1N2VjMjRhLi42YmM3NWFjOWYzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9vcHRpbWl6ZXIvcHJlcC5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wcmVwLmgKQEAg LTI3LDYgKzI3LDcgQEAgZXh0ZXJuIHZvaWQgcHVsbF91cF9zdWJsaW5rcyhQbGFubmVySW5mbyAq cm9vdCk7CiBleHRlcm4gdm9pZCBwcmVwcm9jZXNzX2Z1bmN0aW9uX3J0ZXMoUGxhbm5lckluZm8g KnJvb3QpOwogZXh0ZXJuIHZvaWQgcHVsbF91cF9zdWJxdWVyaWVzKFBsYW5uZXJJbmZvICpyb290 KTsKIGV4dGVybiB2b2lkIGZsYXR0ZW5fc2ltcGxlX3VuaW9uX2FsbChQbGFubmVySW5mbyAqcm9v dCk7CitleHRlcm4gUXVlcnkgKmV4cGFuZF92aXJ0dWFsX2dlbmVyYXRlZF9jb2x1bW5zKFBsYW5u ZXJJbmZvICpyb290KTsKIGV4dGVybiB2b2lkIHJlZHVjZV9vdXRlcl9qb2lucyhQbGFubmVySW5m byAqcm9vdCk7CiBleHRlcm4gdm9pZCByZW1vdmVfdXNlbGVzc19yZXN1bHRfcnRlcyhQbGFubmVy SW5mbyAqcm9vdCk7CiBleHRlcm4gUmVsaWRzIGdldF9yZWxpZHNfaW5fam9pbnRyZWUoTm9kZSAq anRub2RlLCBib29sIGluY2x1ZGVfb3V0ZXJfam9pbnMsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9yZXdyaXRlL3Jld3JpdGVNYW5pcC5oIGIvc3JjL2luY2x1ZGUvcmV3cml0ZS9yZXdyaXRlTWFu aXAuaAppbmRleCA1ZWM0NzVjNjNlLi4yZjA5NjU3YWIyIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9yZXdyaXRlL3Jld3JpdGVNYW5pcC5oCisrKyBiL3NyYy9pbmNsdWRlL3Jld3JpdGUvcmV3cml0 ZU1hbmlwLmgKQEAgLTk3LDUgKzk3LDcgQEAgZXh0ZXJuIE5vZGUgKlJlcGxhY2VWYXJzRnJvbVRh cmdldExpc3QoTm9kZSAqbm9kZSwKIAkJCQkJCQkJCSAgIFJlcGxhY2VWYXJzTm9NYXRjaE9wdGlv biBub21hdGNoX29wdGlvbiwKIAkJCQkJCQkJCSAgIGludCBub21hdGNoX3Zhcm5vLAogCQkJCQkJ CQkJICAgYm9vbCAqb3V0ZXJfaGFzU3ViTGlua3MpOworZXh0ZXJuIHZvaWQgU2V0VmFyUmV0dXJu aW5nVHlwZShOb2RlICpub2RlLCBpbnQgcmVzdWx0X3JlbGF0aW9uLCBpbnQgc3VibGV2ZWxzX3Vw LAorCQkJCQlWYXJSZXR1cm5pbmdUeXBlIHJldHVybmluZ190eXBlKTsKIAogI2VuZGlmCQkJCQkJ CS8qIFJFV1JJVEVNQU5JUF9IICovCi0tIAoyLjQzLjAKCg== --0000000000006fd386062e6a657f--