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 1qJqVO-0002JJ-Ns for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Jul 2023 07:12:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qJqVN-0001mz-Gi for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Jul 2023 07:12:49 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qJqVN-0001mq-4j for pgsql-hackers@lists.postgresql.org; Thu, 13 Jul 2023 07:12:49 +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.94.2) (envelope-from ) id 1qJqVH-000BLm-Hw for pgsql-hackers@postgresql.org; Thu, 13 Jul 2023 07:12:48 +0000 Received: by mail-yb1-xb33.google.com with SMTP id 3f1490d57ef6-cabf1dbafc4so340657276.2 for ; Thu, 13 Jul 2023 00:12:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689232361; x=1691824361; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=nU1fFLr6pgqzG3/fAQnBriIvEJDkNBKYITieVVBbpCw=; b=XuPHf9WjO6F89KmBn8e67zFCs1RVenA6P3WyXcQwEcdSmBAI5psSayljriFqHkcKAI vJ1jvA0aYx1Iszl3p4o+Y6/8/ICbZgnikYsObDtZga3ou8+fxAsqcAhQXYrVRUb8bJQ3 f1dE9M4HWKQG4tzkylQQsDN3MLR3XVjG61YXifJ0uNvmE/XkSTGXi1HeBK18s73oOyXg MhXb3PzANZCmXXgPEdmsWzYycyOcIoJdhuHmA03re+A/EXq9OyH+c3ezRPgQNGIKB95L +IcPwTyOTjWxXq2yEiI/nx1ukHZ0aDIWKEnPB+rceNyTw4Lf7m//itRLDL0blmKpQZ7s dKaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689232361; x=1691824361; 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=nU1fFLr6pgqzG3/fAQnBriIvEJDkNBKYITieVVBbpCw=; b=ikNhc/ZIs8gPAAn6uCricjhzpn99V9Q51GE0WswxWI1g6JAKkVcYBqMq57xf5tcFh6 8Llb0aKm0gKr11q/ccpLEwdbPoELVwigZLxqyn6ggL9BUGxyiElrzARKIBelvDUn8Xj3 SM5WLgkRCr5r8C7SXntXakzZQNswmmRbZ2Sg5InFKr+W1U8LjV/0ucKLRyrnWK/+uWfQ Sjtt7KxEDIIYNM20o5yt8PwnK7y1sgf0U5eV4Rqu+CMRgRA/QUhCX0bIV2OrD8Kuqffc xKRQNDq2htpJ0uETvic3fbAO0wDGDYrDd5ZSv9LHNXR/abPe3lsP6aNUk8dfM3+bJu4O Gz+g== X-Gm-Message-State: ABy/qLYcW3g2cyJJO3MpOyUV1mEHDV7DcfPQpDdGDcsapEdJCNGFqiP6 EIX1P/fBEPM1dxTVeb3UTEQ32NDSWVeoZr7bWD4= X-Google-Smtp-Source: APBJJlHcF+3XOGU9l74cyS/r8dTfNwj5+OWNp6HR8pMnd3yZjTep/9DErR8QUHOkNWJI8ofXfkcxbdee1Z3ybegDwyI= X-Received: by 2002:a5b:804:0:b0:c8f:3a56:ac7b with SMTP id x4-20020a5b0804000000b00c8f3a56ac7bmr610593ybp.18.1689232361057; Thu, 13 Jul 2023 00:12:41 -0700 (PDT) MIME-Version: 1.0 References: <1724688.1688837323@sss.pgh.pa.us> In-Reply-To: <1724688.1688837323@sss.pgh.pa.us> From: Richard Guo Date: Thu, 13 Jul 2023 15:12:29 +0800 Message-ID: Subject: Re: Check lateral references within PHVs for memoize cache keys To: Tom Lane Cc: PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000d30c990600590e6a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d30c990600590e6a Content-Type: multipart/alternative; boundary="000000000000d30c970600590e68" --000000000000d30c970600590e68 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Jul 9, 2023 at 1:28=E2=80=AFAM Tom Lane wrote: > Richard Guo writes: > > Rebase the patch on HEAD as cfbot reminds. > > This fix seems like a mess. The function that is in charge of filling > RelOptInfo.lateral_vars is extract_lateral_references; or at least > that was how it was done up to now. Can't we compute these additional > references there? If not, maybe we ought to just merge > extract_lateral_references into create_lateral_join_info, rather than > having the responsibility split. I also wonder whether this change > isn't creating hidden dependencies on RTE order (which would likely be > bugs), since create_lateral_join_info itself examines the lateral_vars > lists as it walks the rtable. Yeah, you're right. Currently all RelOptInfo.lateral_vars are filled in extract_lateral_references. And then in create_lateral_join_info these lateral_vars, together with all PlaceHolderInfos, are examined to compute the per-base-relation lateral refs relids. However, in the process of extract_lateral_references, it's possible that we create new PlaceHolderInfos. So I think it may not be a good idea to extract the lateral references within PHVs there. But I agree with you that it's also not a good idea to compute these additional lateral Vars within PHVs in create_lateral_join_info as the patch does. Actually with the patch I find that with PHVs that are due to be evaluated at a join we may get a problematic plan. For instance explain (costs off) select * from t t1 left join lateral (select t1.a as t1a, t2.a as t2a from t t2 join t t3 on true) s on true where s.t1a =3D s.t2a; QUERY PLAN ------------------------------------ Nested Loop -> Seq Scan on t t1 -> Nested Loop Join Filter: (t1.a =3D t2.a) -> Seq Scan on t t2 -> Memoize Cache Key: t1.a Cache Mode: binary -> Seq Scan on t t3 (9 rows) There are no lateral refs in the subtree of the Memoize node, so it should be a Materialize node rather than a Memoize node. This is caused by that for a PHV that is due to be evaluated at a join, we fill its lateral refs in each baserel in the join, which is wrong. So I'm wondering if it'd be better that we move all this logic of computing additional lateral references within PHVs to get_memoize_path, where we can examine only PHVs that are evaluated at innerrel. And considering that these lateral refs are only used by Memoize, it seems more sensible to compute them there. But I'm a little worried that doing this would make get_memoize_path too expensive. Please see v4 patch for this change. Thanks Richard --000000000000d30c970600590e68 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

On Sun, Jul 9, 2023 at 1:28=E2=80=AFAM To= m Lane <tgl@sss.pgh.pa.us> w= rote:
Richard Gu= o <guofengli= nux@gmail.com> writes:
> Rebase the patch on HEAD as cfbot reminds.

This fix seems like a mess.=C2=A0 The function that is in charge of filling=
RelOptInfo.lateral_vars is extract_lateral_references; or at least
that was how it was done up to now.=C2=A0 Can't we compute these additi= onal
references there?=C2=A0 If not, maybe we ought to just merge
extract_lateral_references into create_lateral_join_info, rather than
having the responsibility split.=C2=A0 I also wonder whether this change isn't creating hidden dependencies on RTE order (which would likely be<= br> bugs), since create_lateral_join_info itself examines the lateral_vars
lists as it walks the rtable.

Yeah, you'= ;re right.=C2=A0 Currently all RelOptInfo.lateral_vars are filled in
ext= ract_lateral_references.=C2=A0 And then in create_lateral_join_info theselateral_vars, together with all PlaceHolderInfos, are examined to
comp= ute the per-base-relation lateral refs relids.=C2=A0 However, in the
pro= cess of extract_lateral_references, it's possible that we create newPlaceHolderInfos.=C2=A0 So I think it may not be a good idea to extract th= e
lateral references within PHVs there.=C2=A0 But I agree with you that = it's
also not a good idea to compute these additional lateral Vars w= ithin
PHVs in create_lateral_join_info as the patch does.=C2=A0 Actually= with the
patch I find that with PHVs that are due to be evaluated at a = join we
may get a problematic plan.=C2=A0 For instance

explain (c= osts off)
select * from t t1 left join lateral
(select t1.a as t1a, t= 2.a as t2a from t t2 join t t3 on true) s on true
where s.t1a =3D s.t2a;=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0QUERY PLAN
---------= ---------------------------
=C2=A0Nested Loop
=C2=A0 =C2=A0-> =C2= =A0Seq Scan on t t1
=C2=A0 =C2=A0-> =C2=A0Nested Loop
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0Join Filter: (t1.a =3D t2.a)
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on t t2
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0-> =C2=A0Memoize
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0Cache Key: t1.a
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0Cache Mode: binary
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on t t3
(9 rows)

There are = no lateral refs in the subtree of the Memoize node, so it
should be a Ma= terialize node rather than a Memoize node.=C2=A0 This is caused
by that = for a PHV that is due to be evaluated at a join, we fill its
lateral ref= s in each baserel in the join, which is wrong.

So I'm wondering = if it'd be better that we move all this logic of
computing additiona= l lateral references within PHVs to get_memoize_path,
where we can exami= ne only PHVs that are evaluated at innerrel.=C2=A0 And
considering that = these lateral refs are only used by Memoize, it seems
more sensible to c= ompute them there.=C2=A0 But I'm a little worried that
doing this wo= uld make get_memoize_path too expensive.

Please see v4 patch for thi= s change.

Thanks
Richard
--000000000000d30c970600590e68-- --000000000000d30c990600590e6a Content-Type: application/octet-stream; name="v4-0001-Check-lateral-refs-within-PHVs-for-memoize-cache-keys.patch" Content-Disposition: attachment; filename="v4-0001-Check-lateral-refs-within-PHVs-for-memoize-cache-keys.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lk0tbkav0 RnJvbSAzOWEzODE3MTUxZTNkZWMxODkwOTIzYjdlNWFlMmI2YjBiNjEyZTEyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSaWNoYXJkIEd1byA8Z3VvZmVuZ2xpbnV4QGdtYWlsLmNvbT4K RGF0ZTogRnJpLCAzMCBEZWMgMjAyMiAxMDozNTozNiArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjRd IENoZWNrIGxhdGVyYWwgcmVmcyB3aXRoaW4gUEhWcyBmb3IgbWVtb2l6ZSBjYWNoZSBrZXlzCgot LS0KIC4uLi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCAgICB8IDEyICsr LQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvam9pbnBhdGguYyAgICAgICAgIHwgODUgKysr KysrKysrKysrKysrKysrLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9tZW1vaXplLm91dCAg ICAgICAgIHwgNjggKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXpl LnNxbCAgICAgICAgICAgICAgfCAyNCArKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTgxIGluc2Vy dGlvbnMoKyksIDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVj dGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggODUyYjViNDcwNy4uNGU2NTRmZmEzYSAxMDA2NDQK LS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAorKysg Yi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC0zNjg3 LDE1ICszNjg3LDE5IEBAIE9SREVSIEJZIHJlZl8wLiJDIDEiOwogICAgICAgICAgLT4gIEluZGV4 IFNjYW4gdXNpbmcgdDFfcGtleSBvbiAiUyAxIi4iVCAxIiByZWZfMAogICAgICAgICAgICAgICAg T3V0cHV0OiByZWZfMC4iQyAxIiwgcmVmXzAuYzIsIHJlZl8wLmMzLCByZWZfMC5jNCwgcmVmXzAu YzUsIHJlZl8wLmM2LCByZWZfMC5jNywgcmVmXzAuYzgKICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6IChyZWZfMC4iQyAxIiA8IDEwKQotICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJs aWMuZnQxIHJlZl8xCi0gICAgICAgICAgICAgICBPdXRwdXQ6IHJlZl8xLmMzLCByZWZfMC5jMgot ICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGMzIEZST00gIlMgMSIuIlQgMSIgV0hF UkUgKChjMyA9ICcwMDAwMScpKQorICAgICAgICAgLT4gIE1lbW9pemUKKyAgICAgICAgICAgICAg IE91dHB1dDogcmVmXzEuYzMsIChyZWZfMC5jMikKKyAgICAgICAgICAgICAgIENhY2hlIEtleTog cmVmXzAuYzIKKyAgICAgICAgICAgICAgIENhY2hlIE1vZGU6IGJpbmFyeQorICAgICAgICAgICAg ICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHJlZl8xCisgICAgICAgICAgICAgICAg ICAgICBPdXRwdXQ6IHJlZl8xLmMzLCByZWZfMC5jMgorICAgICAgICAgICAgICAgICAgICAgUmVt b3RlIFNRTDogU0VMRUNUIGMzIEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKChjMyA9ICcwMDAwMScp KQogICAgLT4gIE1hdGVyaWFsaXplCiAgICAgICAgICBPdXRwdXQ6IHJlZl8zLmMzCiAgICAgICAg ICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mdDIgcmVmXzMKICAgICAgICAgICAgICAgIE91 dHB1dDogcmVmXzMuYzMKICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBjMyBGUk9N ICJTIDEiLiJUIDEiIFdIRVJFICgoYzMgPSAnMDAwMDEnKSkKLSgxNSByb3dzKQorKDE5IHJvd3Mp CiAKIFNFTEVDVCByZWZfMC5jMiwgc3VicV8xLioKIEZST00KZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL29wdGltaXplci9wYXRoL2pvaW5wYXRoLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9qb2lucGF0aC5jCmluZGV4IGYwNDdhZDliYTQuLjdhMGIxNTUwNjUgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pvaW5wYXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvam9pbnBhdGguYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIm9wdGlt aXplci9vcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvcGF0aG5vZGUuaCIKICNpbmNs dWRlICJvcHRpbWl6ZXIvcGF0aHMuaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvcGxhY2Vob2xkZXIu aCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvcGxhbm1haW4uaCIKICNpbmNsdWRlICJ1dGlscy90eXBj YWNoZS5oIgogCkBAIC00MzQsMTAgKzQzNSwxMSBAQCBoYXZlX3Vuc2FmZV9vdXRlcl9qb2luX3Jl ZihQbGFubmVySW5mbyAqcm9vdCwKIHN0YXRpYyBib29sCiBwYXJhbWluZm9fZ2V0X2VxdWFsX2hh c2hvcHMoUGxhbm5lckluZm8gKnJvb3QsIFBhcmFtUGF0aEluZm8gKnBhcmFtX2luZm8sCiAJCQkJ CQkJUmVsT3B0SW5mbyAqb3V0ZXJyZWwsIFJlbE9wdEluZm8gKmlubmVycmVsLAotCQkJCQkJCUxp c3QgKipwYXJhbV9leHBycywgTGlzdCAqKm9wZXJhdG9ycywKLQkJCQkJCQlib29sICpiaW5hcnlf bW9kZSkKKwkJCQkJCQlMaXN0ICpwaF9sYXRlcmFsX3ZhcnMsIExpc3QgKipwYXJhbV9leHBycywK KwkJCQkJCQlMaXN0ICoqb3BlcmF0b3JzLCBib29sICpiaW5hcnlfbW9kZSkKIAogeworCUxpc3QJ ICAgKmxhdGVyYWxfdmFyczsKIAlMaXN0Q2VsbCAgICpsYzsKIAogCSpwYXJhbV9leHBycyA9IE5J TDsKQEAgLTUwOSw3ICs1MTEsOCBAQCBwYXJhbWluZm9fZ2V0X2VxdWFsX2hhc2hvcHMoUGxhbm5l ckluZm8gKnJvb3QsIFBhcmFtUGF0aEluZm8gKnBhcmFtX2luZm8sCiAJfQogCiAJLyogTm93IGFk ZCBhbnkgbGF0ZXJhbCB2YXJzIHRvIHRoZSBjYWNoZSBrZXkgdG9vICovCi0JZm9yZWFjaChsYywg aW5uZXJyZWwtPmxhdGVyYWxfdmFycykKKwlsYXRlcmFsX3ZhcnMgPSBsaXN0X2NvbmNhdChwaF9s YXRlcmFsX3ZhcnMsIGlubmVycmVsLT5sYXRlcmFsX3ZhcnMpOworCWZvcmVhY2gobGMsIGxhdGVy YWxfdmFycykKIAl7CiAJCU5vZGUJICAgKmV4cHIgPSAoTm9kZSAqKSBsZmlyc3QobGMpOwogCQlU eXBlQ2FjaGVFbnRyeSAqdHlwZW50cnk7CkBAIC01NTIsNiArNTU1LDcxIEBAIHBhcmFtaW5mb19n ZXRfZXF1YWxfaGFzaG9wcyhQbGFubmVySW5mbyAqcm9vdCwgUGFyYW1QYXRoSW5mbyAqcGFyYW1f aW5mbywKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIGV4dHJhY3RfbGF0ZXJhbF92YXJzX2Zy b21fUEhWcworICoJICBFeHRyYWN0IGxhdGVyYWwgcmVmZXJlbmNlcyB3aXRoaW4gUGxhY2VIb2xk ZXJWYXJzIHRoYXQgYXJlIGR1ZSB0byBiZQorICoJICBldmFsdWF0ZWQgYXQgJ2lubmVycmVsaWRz Jy4KKyAqLworc3RhdGljIExpc3QgKgorZXh0cmFjdF9sYXRlcmFsX3ZhcnNfZnJvbV9QSFZzKFBs YW5uZXJJbmZvICpyb290LCBSZWxpZHMgaW5uZXJyZWxpZHMpCit7CisJTGlzdAkgICAqcGhfbGF0 ZXJhbF92YXJzID0gTklMOworCUxpc3RDZWxsICAgKmxjOworCisJLyogTm90aGluZyB3b3VsZCBi ZSBmb3VuZCBpZiB0aGUgcXVlcnkgY29udGFpbnMgbm8gTEFURVJBTCBSVEVzICovCisJaWYgKCFy b290LT5oYXNMYXRlcmFsUlRFcykKKwkJcmV0dXJuIE5JTDsKKworCWZvcmVhY2gobGMsIHJvb3Qt PnBsYWNlaG9sZGVyX2xpc3QpCisJeworCQlQbGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQbGFj ZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKwkJTGlzdAkgICAqdmFyczsKKwkJTGlzdENlbGwg ICAqY2VsbDsKKworCQkvKiBQSFYgaXMgdW5pbnRlcmVzdGluZyBpZiBubyBsYXRlcmFsIHJlZnMg Ki8KKwkJaWYgKHBoaW5mby0+cGhfbGF0ZXJhbCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJ LyogUEhWIGlzIHVuaW50ZXJlc3RpbmcgaWYgbm90IGR1ZSB0byBiZSBldmFsdWF0ZWQgYXQgaW5u ZXJyZWxpZHMgKi8KKwkJaWYgKCFibXNfZXF1YWwocGhpbmZvLT5waF9ldmFsX2F0LCBpbm5lcnJl bGlkcykpCisJCQljb250aW51ZTsKKworCQkvKiBGZXRjaCBWYXJzIGFuZCBQSFZzIG9mIGxhdGVy YWwgcmVmZXJlbmNlcyB3aXRoaW4gUGxhY2VIb2xkZXJWYXJzICovCisJCXZhcnMgPSBwdWxsX3Zh cnNfb2ZfbGV2ZWwoKE5vZGUgKikgcGhpbmZvLT5waF92YXItPnBoZXhwciwgMCk7CisJCWZvcmVh Y2goY2VsbCwgdmFycykKKwkJeworCQkJTm9kZQkgICAqbm9kZSA9IChOb2RlICopIGxmaXJzdChj ZWxsKTsKKworCQkJbm9kZSA9IGNvcHlPYmplY3Qobm9kZSk7CisJCQlpZiAoSXNBKG5vZGUsIFZh cikpCisJCQl7CisJCQkJVmFyCQkgICAqdmFyID0gKFZhciAqKSBub2RlOworCisJCQkJQXNzZXJ0 KHZhci0+dmFybGV2ZWxzdXAgPT0gMCk7CisKKwkJCQlpZiAoYm1zX2lzX21lbWJlcih2YXItPnZh cm5vLCBwaGluZm8tPnBoX2xhdGVyYWwpKQorCQkJCQlwaF9sYXRlcmFsX3ZhcnMgPSBsYXBwZW5k KHBoX2xhdGVyYWxfdmFycywgbm9kZSk7CisJCQl9CisJCQllbHNlIGlmIChJc0Eobm9kZSwgUGxh Y2VIb2xkZXJWYXIpKQorCQkJeworCQkJCVBsYWNlSG9sZGVyVmFyICpwaHYgPSAoUGxhY2VIb2xk ZXJWYXIgKikgbm9kZTsKKworCQkJCUFzc2VydChwaHYtPnBobGV2ZWxzdXAgPT0gMCk7CisKKwkJ CQlpZiAoYm1zX2lzX3N1YnNldChmaW5kX3BsYWNlaG9sZGVyX2luZm8ocm9vdCwgcGh2KS0+cGhf ZXZhbF9hdCwKKwkJCQkJCQkJICBwaGluZm8tPnBoX2xhdGVyYWwpKQorCQkJCQlwaF9sYXRlcmFs X3ZhcnMgPSBsYXBwZW5kKHBoX2xhdGVyYWxfdmFycywgbm9kZSk7CisJCQl9CisJCQllbHNlCisJ CQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCisJCWxpc3RfZnJlZSh2YXJzKTsKKwl9CisKKwlyZXR1 cm4gcGhfbGF0ZXJhbF92YXJzOworfQorCiAvKgogICogZ2V0X21lbW9pemVfcGF0aAogICoJCUlm IHBvc3NpYmxlLCBtYWtlIGFuZCByZXR1cm4gYSBNZW1vaXplIHBhdGggYXRvcCBvZiAnaW5uZXJf cGF0aCcuCkBAIC01NjcsNiArNjM1LDcgQEAgZ2V0X21lbW9pemVfcGF0aChQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJTGlzdAkgICAqaGFzaF9vcGVyYXRvcnM7CiAJ TGlzdENlbGwgICAqbGM7CiAJYm9vbAkJYmluYXJ5X21vZGU7CisJTGlzdAkgICAqcGhfbGF0ZXJh bF92YXJzOwogCiAJLyogT2J2aW91c2x5IG5vdCBpZiBpdCdzIGRpc2FibGVkICovCiAJaWYgKCFl bmFibGVfbWVtb2l6ZSkKQEAgLTU4MSw2ICs2NTAsMTIgQEAgZ2V0X21lbW9pemVfcGF0aChQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJaWYgKG91dGVyX3BhdGgtPnBh cmVudC0+cm93cyA8IDIpCiAJCXJldHVybiBOVUxMOwogCisJLyoKKwkgKiBFeHRyYWN0IGxhdGVy YWwgVmFycyB3aXRoaW4gUGxhY2VIb2xkZXJWYXJzIHRoYXQgYXJlIGR1ZSB0byBiZSBldmFsdWF0 ZWQKKwkgKiBhdCBpbm5lcnJlbC4gIFRoZXNlIGxhdGVyYWwgVmFycyBjb3VsZCBiZSB1c2VkIGFz IG1lbW9pemUgY2FjaGUga2V5cy4KKwkgKi8KKwlwaF9sYXRlcmFsX3ZhcnMgPSBleHRyYWN0X2xh dGVyYWxfdmFyc19mcm9tX1BIVnMocm9vdCwgaW5uZXJyZWwtPnJlbGlkcyk7CisKIAkvKgogCSAq IFdlIGNhbiBvbmx5IGhhdmUgYSBtZW1vaXplIG5vZGUgd2hlbiB0aGVyZSdzIHNvbWUga2luZCBv ZiBjYWNoZSBrZXksCiAJICogZWl0aGVyIHBhcmFtZXRlcml6ZWQgcGF0aCBjbGF1c2VzIG9yIGxh dGVyYWwgVmFycy4gIE5vIGNhY2hlIGtleSBzb3VuZHMKQEAgLTU4OCw3ICs2NjMsOCBAQCBnZXRf bWVtb2l6ZV9wYXRoKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkg Ki8KIAlpZiAoKGlubmVyX3BhdGgtPnBhcmFtX2luZm8gPT0gTlVMTCB8fAogCQkgaW5uZXJfcGF0 aC0+cGFyYW1faW5mby0+cHBpX2NsYXVzZXMgPT0gTklMKSAmJgotCQlpbm5lcnJlbC0+bGF0ZXJh bF92YXJzID09IE5JTCkKKwkJaW5uZXJyZWwtPmxhdGVyYWxfdmFycyA9PSBOSUwgJiYKKwkJcGhf bGF0ZXJhbF92YXJzID09IE5JTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKgpAQCAtNjU4LDYgKzcz NCw3IEBAIGdldF9tZW1vaXplX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmlu bmVycmVsLAogCQkJCQkJCQkJb3V0ZXJyZWwtPnRvcF9wYXJlbnQgPwogCQkJCQkJCQkJb3V0ZXJy ZWwtPnRvcF9wYXJlbnQgOiBvdXRlcnJlbCwKIAkJCQkJCQkJCWlubmVycmVsLAorCQkJCQkJCQkJ cGhfbGF0ZXJhbF92YXJzLAogCQkJCQkJCQkJJnBhcmFtX2V4cHJzLAogCQkJCQkJCQkJJmhhc2hf b3BlcmF0b3JzLAogCQkJCQkJCQkJJmJpbmFyeV9tb2RlKSkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvbWVtb2l6ZS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L21lbW9pemUub3V0CmluZGV4IGY1MjAyNDMwZjguLjM3ZGJlMDczZmUgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWVtb2l6ZS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9tZW1vaXplLm91dApAQCAtOTIsNiArOTIsNzQgQEAgV0hFUkUgdDEudW5pcXVl MSA8IDEwMDA7CiAgIDEwMDAgfCA5LjUwMDAwMDAwMDAwMDAwMDAKICgxIHJvdykKIAorLS0gVHJ5 IHdpdGggTEFURVJBTCByZWZlcmVuY2VzIHdpdGhpbiBQbGFjZUhvbGRlclZhcnMgYXQgYSBiYXNl cmVsCitTRUxFQ1QgZXhwbGFpbl9tZW1vaXplKCcKK1NFTEVDVCBDT1VOVCgqKSxBVkcodDEudHdl bnR5KSBGUk9NIHRlbmsxIHQxIExFRlQgSk9JTgorTEFURVJBTCAoU0VMRUNUIHQxLnR3ZW50eSBh cyBjMSwgdDIudW5pcXVlMSBhcyBjMiBGUk9NIHRlbmsxIHQyKSBzIG9uIHRydWUKK1dIRVJFIHMu YzEgPSBzLmMyIGFuZCB0MS51bmlxdWUxIDwgMTAwMDsnLCBmYWxzZSk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxhaW5fbWVtb2l6ZSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQWdncmVnYXRlIChhY3R1YWwgcm93cz0xIGxvb3BzPU4pCisgICAtPiAgTmVzdGVkIExvb3Ag KGFjdHVhbCByb3dzPTEwMDAgbG9vcHM9TikKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5r MSB0MSAoYWN0dWFsIHJvd3M9MTAwMCBsb29wcz1OKQorICAgICAgICAgICAgICAgRmlsdGVyOiAo dW5pcXVlMSA8IDEwMDApCisgICAgICAgICAgICAgICBSb3dzIFJlbW92ZWQgYnkgRmlsdGVyOiA5 MDAwCisgICAgICAgICAtPiAgTWVtb2l6ZSAoYWN0dWFsIHJvd3M9MSBsb29wcz1OKQorICAgICAg ICAgICAgICAgQ2FjaGUgS2V5OiB0MS50d2VudHkKKyAgICAgICAgICAgICAgIENhY2hlIE1vZGU6 IGJpbmFyeQorICAgICAgICAgICAgICAgSGl0czogOTgwICBNaXNzZXM6IDIwICBFdmljdGlvbnM6 IFplcm8gIE92ZXJmbG93czogMCAgTWVtb3J5IFVzYWdlOiBOa0IKKyAgICAgICAgICAgICAgIC0+ ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGVuazFfdW5pcXVlMSBvbiB0ZW5rMSB0MiAoYWN0dWFs IHJvd3M9MSBsb29wcz1OKQorICAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiAodDEudHdlbnR5 ID0gdW5pcXVlMSkKKyAgICAgICAgICAgICAgICAgICAgIFJvd3MgUmVtb3ZlZCBieSBGaWx0ZXI6 IDk5OTkKKyAgICAgICAgICAgICAgICAgICAgIEhlYXAgRmV0Y2hlczogTgorKDEzIHJvd3MpCisK Ky0tIEFuZCBjaGVjayB3ZSBnZXQgdGhlIGV4cGVjdGVkIHJlc3VsdHMuCitTRUxFQ1QgQ09VTlQo KiksIEFWRyh0MS50d2VudHkpIEZST00gdGVuazEgdDEgTEVGVCBKT0lOCitMQVRFUkFMIChTRUxF Q1QgdDEudHdlbnR5IGFzIGMxLCB0Mi51bmlxdWUxIGFzIGMyIEZST00gdGVuazEgdDIpIHMgb24g dHJ1ZQorV0hFUkUgcy5jMSA9IHMuYzIgYW5kIHQxLnVuaXF1ZTEgPCAxMDAwOworIGNvdW50IHwg ICAgICAgIGF2ZyAgICAgICAgIAorLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLQorICAxMDAw IHwgOS41MDAwMDAwMDAwMDAwMDAwCisoMSByb3cpCisKKy0tIFRyeSB3aXRoIExBVEVSQUwgcmVm ZXJlbmNlcyB3aXRoaW4gUGxhY2VIb2xkZXJWYXJzIGF0IGEgam9pbnJlbAorU0VMRUNUIGV4cGxh aW5fbWVtb2l6ZSgnCitTRUxFQ1QgQ09VTlQoKiksQVZHKHQxLnR3ZW50eSkgRlJPTSB0ZW5rMSB0 MSBMRUZUIEpPSU4KK0xBVEVSQUwgKFNFTEVDVCB0MS50d2VudHkgYXMgYzEsIHQyLnVuaXF1ZTEg YXMgYzIgRlJPTSB0ZW5rMSB0MiwgdGVuazEgdDMKKyAgICAgICAgIFdIRVJFIHQzLnVuaXF1ZTEg PSAxKSBzIG9uIHRydWUKK1dIRVJFIHMuYzEgPSBzLmMyIGFuZCB0MS51bmlxdWUxIDwgMTAwMDsn LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhw bGFpbl9tZW1vaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUg KGFjdHVhbCByb3dzPTEgbG9vcHM9TikKKyAgIC0+ICBOZXN0ZWQgTG9vcCAoYWN0dWFsIHJvd3M9 MTAwMCBsb29wcz1OKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIHQxIChhY3R1YWwg cm93cz0xMDAwIGxvb3BzPU4pCisgICAgICAgICAgICAgICBGaWx0ZXI6ICh1bmlxdWUxIDwgMTAw MCkKKyAgICAgICAgICAgICAgIFJvd3MgUmVtb3ZlZCBieSBGaWx0ZXI6IDkwMDAKKyAgICAgICAg IC0+ICBNZW1vaXplIChhY3R1YWwgcm93cz0xIGxvb3BzPU4pCisgICAgICAgICAgICAgICBDYWNo ZSBLZXk6IHQxLnR3ZW50eQorICAgICAgICAgICAgICAgQ2FjaGUgTW9kZTogYmluYXJ5CisgICAg ICAgICAgICAgICBIaXRzOiA5ODAgIE1pc3NlczogMjAgIEV2aWN0aW9uczogWmVybyAgT3ZlcmZs b3dzOiAwICBNZW1vcnkgVXNhZ2U6IE5rQgorICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29w IChhY3R1YWwgcm93cz0xIGxvb3BzPU4pCisgICAgICAgICAgICAgICAgICAgICBKb2luIEZpbHRl cjogKHQxLnR3ZW50eSA9IHQyLnVuaXF1ZTEpCisgICAgICAgICAgICAgICAgICAgICBSb3dzIFJl bW92ZWQgYnkgSm9pbiBGaWx0ZXI6IDk5OTkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJbmRl eCBPbmx5IFNjYW4gdXNpbmcgdGVuazFfdW5pcXVlMSBvbiB0ZW5rMSB0MyAoYWN0dWFsIHJvd3M9 MSBsb29wcz1OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1 ZTEgPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhcCBGZXRjaGVzOiBOCisgICAg ICAgICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRlbmsxX3VuaXF1ZTEg b24gdGVuazEgdDIgKGFjdHVhbCByb3dzPTEwMDAwIGxvb3BzPU4pCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBIZWFwIEZldGNoZXM6IE4KKygxNyByb3dzKQorCistLSBBbmQgY2hlY2sgd2Ug Z2V0IHRoZSBleHBlY3RlZCByZXN1bHRzLgorU0VMRUNUIENPVU5UKCopLEFWRyh0MS50d2VudHkp IEZST00gdGVuazEgdDEgTEVGVCBKT0lOCitMQVRFUkFMIChTRUxFQ1QgdDEudHdlbnR5IGFzIGMx LCB0Mi51bmlxdWUxIGFzIGMyIEZST00gdGVuazEgdDIsIHRlbmsxIHQzCisgICAgICAgICBXSEVS RSB0My51bmlxdWUxID0gMSkgcyBvbiB0cnVlCitXSEVSRSBzLmMxID0gcy5jMiBhbmQgdDEudW5p cXVlMSA8IDEwMDA7CisgY291bnQgfCAgICAgICAgYXZnICAgICAgICAgCistLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tCisgIDEwMDAgfCA5LjUwMDAwMDAwMDAwMDAwMDAKKygxIHJvdykKKwog LS0gUmVkdWNlIHdvcmtfbWVtIGFuZCBoYXNoX21lbV9tdWx0aXBsaWVyIHNvIHRoYXQgd2Ugc2Vl IHNvbWUgY2FjaGUgZXZpY3Rpb25zCiBTRVQgd29ya19tZW0gVE8gJzY0a0InOwogU0VUIGhhc2hf bWVtX211bHRpcGxpZXIgVE8gMS4wOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwv bWVtb2l6ZS5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbAppbmRleCAyOWFi MWVhNjJkLi4yZWYzMGRlOTg2IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1v aXplLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbApAQCAtNTcsNiAr NTcsMzAgQEAgTEFURVJBTCAoU0VMRUNUIHQyLnVuaXF1ZTEgRlJPTSB0ZW5rMSB0MgogICAgICAg ICAgV0hFUkUgdDEudHdlbnR5ID0gdDIudW5pcXVlMSBPRkZTRVQgMCkgdDIKIFdIRVJFIHQxLnVu aXF1ZTEgPCAxMDAwOwogCistLSBUcnkgd2l0aCBMQVRFUkFMIHJlZmVyZW5jZXMgd2l0aGluIFBs YWNlSG9sZGVyVmFycyBhdCBhIGJhc2VyZWwKK1NFTEVDVCBleHBsYWluX21lbW9pemUoJworU0VM RUNUIENPVU5UKCopLEFWRyh0MS50d2VudHkpIEZST00gdGVuazEgdDEgTEVGVCBKT0lOCitMQVRF UkFMIChTRUxFQ1QgdDEudHdlbnR5IGFzIGMxLCB0Mi51bmlxdWUxIGFzIGMyIEZST00gdGVuazEg dDIpIHMgb24gdHJ1ZQorV0hFUkUgcy5jMSA9IHMuYzIgYW5kIHQxLnVuaXF1ZTEgPCAxMDAwOycs IGZhbHNlKTsKKworLS0gQW5kIGNoZWNrIHdlIGdldCB0aGUgZXhwZWN0ZWQgcmVzdWx0cy4KK1NF TEVDVCBDT1VOVCgqKSwgQVZHKHQxLnR3ZW50eSkgRlJPTSB0ZW5rMSB0MSBMRUZUIEpPSU4KK0xB VEVSQUwgKFNFTEVDVCB0MS50d2VudHkgYXMgYzEsIHQyLnVuaXF1ZTEgYXMgYzIgRlJPTSB0ZW5r MSB0MikgcyBvbiB0cnVlCitXSEVSRSBzLmMxID0gcy5jMiBhbmQgdDEudW5pcXVlMSA8IDEwMDA7 CisKKy0tIFRyeSB3aXRoIExBVEVSQUwgcmVmZXJlbmNlcyB3aXRoaW4gUGxhY2VIb2xkZXJWYXJz IGF0IGEgam9pbnJlbAorU0VMRUNUIGV4cGxhaW5fbWVtb2l6ZSgnCitTRUxFQ1QgQ09VTlQoKiks QVZHKHQxLnR3ZW50eSkgRlJPTSB0ZW5rMSB0MSBMRUZUIEpPSU4KK0xBVEVSQUwgKFNFTEVDVCB0 MS50d2VudHkgYXMgYzEsIHQyLnVuaXF1ZTEgYXMgYzIgRlJPTSB0ZW5rMSB0MiwgdGVuazEgdDMK KyAgICAgICAgIFdIRVJFIHQzLnVuaXF1ZTEgPSAxKSBzIG9uIHRydWUKK1dIRVJFIHMuYzEgPSBz LmMyIGFuZCB0MS51bmlxdWUxIDwgMTAwMDsnLCBmYWxzZSk7CisKKy0tIEFuZCBjaGVjayB3ZSBn ZXQgdGhlIGV4cGVjdGVkIHJlc3VsdHMuCitTRUxFQ1QgQ09VTlQoKiksQVZHKHQxLnR3ZW50eSkg RlJPTSB0ZW5rMSB0MSBMRUZUIEpPSU4KK0xBVEVSQUwgKFNFTEVDVCB0MS50d2VudHkgYXMgYzEs IHQyLnVuaXF1ZTEgYXMgYzIgRlJPTSB0ZW5rMSB0MiwgdGVuazEgdDMKKyAgICAgICAgIFdIRVJF IHQzLnVuaXF1ZTEgPSAxKSBzIG9uIHRydWUKK1dIRVJFIHMuYzEgPSBzLmMyIGFuZCB0MS51bmlx dWUxIDwgMTAwMDsKKwogLS0gUmVkdWNlIHdvcmtfbWVtIGFuZCBoYXNoX21lbV9tdWx0aXBsaWVy IHNvIHRoYXQgd2Ugc2VlIHNvbWUgY2FjaGUgZXZpY3Rpb25zCiBTRVQgd29ya19tZW0gVE8gJzY0 a0InOwogU0VUIGhhc2hfbWVtX211bHRpcGxpZXIgVE8gMS4wOwotLSAKMi4zMS4wCgo= --000000000000d30c990600590e6a--