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 1tiYwP-00HOv4-NZ for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Feb 2025 13:07:41 +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 1tiYwN-0078eX-Mg for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Feb 2025 13:07:40 +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 1tiYwN-0078eO-BT for pgsql-hackers@lists.postgresql.org; Thu, 13 Feb 2025 13:07:40 +0000 Received: from mail-vk1-xa2e.google.com ([2607:f8b0:4864:20::a2e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tiYwL-000c2h-0y for pgsql-hackers@postgresql.org; Thu, 13 Feb 2025 13:07:39 +0000 Received: by mail-vk1-xa2e.google.com with SMTP id 71dfb90a1353d-520335ff378so244512e0c.3 for ; Thu, 13 Feb 2025 05:07:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739452055; x=1740056855; 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=aNyrRcG5ZawYN89iLT2/6Nm4xHG4tB5TPhx8zFj08pg=; b=mRxz+gxg/FKSDWEvhps5xrxt6T5jSYjEq3jkRjYaVJDKwbTantD7f4RyhxQOSQmtPV 2bhr8SGUoGZakwPup0hXIsv/UYr399rTstAUNR33EOMgRXmlfsNdMxVqFZ2p4zhN0sEP MM/iz7L/E481bg7XRhxOv2dYULVqMUMXe8UT35oLBpY7BwsmJEeT953hjeoc6p05bjP1 sxd1Wlu/TJLc/Qy2q3bQCqC658qcRgppQmpRQ4sVf2Fnp4tZJTyTMJDej9ZVxGny3tx8 NtHjJydQWPMD8avtitrLLrStUuOTL60gvDkBuxElDet9qZG6CWdVKfOy35z+rihbLIxr QjPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739452055; x=1740056855; 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=aNyrRcG5ZawYN89iLT2/6Nm4xHG4tB5TPhx8zFj08pg=; b=Z0a/PxnqTdMvmiwIGZOVn8d4h1NKnhr52EFwLglsVKpgvVCErKdcWqA0PR/R++tnfO 2S6uqbcFzkcV5vLudgeh8DZRQBX1cKRjBtSOb9AwuUZoHo98CZXl4sKl/LtoI9Rkt8XN XPMyYfytPXD/C3HP8BCqHtPGuEDdcRkPYHA+5WAr0+hG7u35BUoW7L8MlpNBX5hsCtnx 0hkmyzpv0ctkpea7HBNsQdSD+hD/xMvGs2Q/7+DyYgI3hQ6K0AhAv5qwmHkmaAfixHse feaN6EUWcK8pCj1xd+EBZVPQbjHZ7hEI6Xfphe+Y3SGGAATPsM7vk3c5TRah1BCRToeT qK/w== X-Forwarded-Encrypted: i=1; AJvYcCVO4tAQJRiksmayjXldha1tH9qOTINHFBi9C6qNYZcLDiOk5AVDKSKYHYB5IvG7+u6SFswcpy01Qlnqqg4B@postgresql.org X-Gm-Message-State: AOJu0YzOqhiFgnCwdERNxKdLbxmv16lu5iOCxTZ5VRCYDepNd1BBhkGr HGlg7dFLEOW71RMOcDz+0Bl0hJWvDFYenfSGAe2jwZcOBAW7LWnaPmdOvaK/qbkzAkiPGloC/Jl 4UxaBULSDfhWCOK3QuXfEJqbhSco= X-Gm-Gg: ASbGnct8sXywPZmnj4AwtHsz8OkHFFjZU/6n5AEPTlAPGZAjKnKR9IdPZ/32ZZIWrGU oeW9aMmCy88M6i/OJttUDiwUy/XAl5qiWTJ+49zl8pixSAiZsTdw4ao0b7XXYq9wjPQ3XN8aY X-Google-Smtp-Source: AGHT+IF+Uy3V5Lf8GJwN8Ul3nQZr9tcr7NTKCkY/SKpaK5w3CC+KsmC9j4HOhj8l1lCWCGWt4MnqWKohc3U/f2hwoew= X-Received: by 2002:a05:6122:8c0c:b0:51f:405e:866e with SMTP id 71dfb90a1353d-52077dbf86dmr1766559e0c.1.1739452055279; Thu, 13 Feb 2025 05:07:35 -0800 (PST) MIME-Version: 1.0 References: <09800cb1-43aa-4239-8918-46b71ede4900@eisentraut.org> <536b281b-2cb3-4477-971f-c64838bc6263@eisentraut.org> <51875199-d5f5-41ed-92dc-3e7b1b996991@eisentraut.org> <84adfb1b-826c-42b2-a907-b327d3760c7e@eisentraut.org> <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: jian he Date: Thu, 13 Feb 2025 21:06:59 +0800 X-Gm-Features: AWEUYZly7-u5cB5PmfsgHVuzxItrFcrW24r097dpKwCO0ZB6c8VjzUiQky5oo0A Message-ID: Subject: Re: Virtual generated columns To: Richard Guo Cc: Zhang Mingli , Peter Eisentraut , Dean Rasheed , Alexander Lakhin , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000dbfbc3062e05bd71" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000dbfbc3062e05bd71 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Feb 11, 2025 at 10:34=E2=80=AFAM Richard Guo wrote: > > On Mon, Feb 10, 2025 at 1:16=E2=80=AFPM Zhang Mingli wrote: > > I believe virtual columns should behave like stored columns, except the= y don't actually use storage. > > Virtual columns are computed when the table is read, and they should ad= here to the same rules of join semantics. > > I agree with Richard, the result seems incorrect. The right outcome sho= uld be: > > gpadmin=3D# SELECT t2.a, t2.b FROM t t1 LEFT JOIN t t2 ON FALSE; > > a | b > > ------+------ > > NULL | NULL > > NULL | NULL > > (2 rows) > > Yeah, I also feel that the virtual generated columns should adhere to > outer join semantics, rather than being unconditionally replaced by > the generation expressions. But maybe I'm wrong. > > If that's the case, this incorrect-result issue isn't limited to > constant expressions; it could also occur with non-strict ones. > > CREATE TABLE t (a int, b int GENERATED ALWAYS AS (COALESCE(a, 100))); > INSERT INTO t VALUES (1); > INSERT INTO t VALUES (2); > > # SELECT t2.a, t2.b FROM t t1 LEFT JOIN t t2 ON FALSE; > a | b > ---+----- > | 100 > | 100 > (2 rows) > Now I agree with you. I think the following two should return the same result. SELECT t2.a, t2.b FROM t t1 LEFT JOIN t t2 ON FALSE; SELECT t2.a, t2.b FROM t t1 LEFT JOIN (select * from t) t2 ON FALSE; ------------------------ atatch refined patch solves the failure to copy the nullingrel bits for the virtual generated columns. in ReplaceVarsFromTargetList_callback. I tried to just use add_nulling_relids, but failed, so I did the similar thing as SetVarReturningType. I didn't solve the out join semantic issue. i am wondering, can we do the virtual generated column expansion in the rewrite stage as is, and wrap the expressions in PHVs if the virtual generated columns come from the nullable side of an outer join. I am looking at pullup_replace_vars_callback, but it seems not very helpful to us. --000000000000dbfbc3062e05bd71 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-fix-expand-virtual-generated-column-Var-node-varn.patch" Content-Disposition: attachment; filename="v2-0001-fix-expand-virtual-generated-column-Var-node-varn.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m73cqoth0 RnJvbSAyZjliZDllYzczNzIyN2IxYjJkYzUyYTQ4MDBkMDA2YmZhMjI4MDAzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFRodSwgMTMgRmViIDIwMjUgMTE6Mjg6NTcgKzA4MDAKU3ViamVjdDogW1BBVENIIHYy IDEvMV0gZml4IGV4cGFuZCB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW4gVmFyIG5vZGUKIHZhcm51 bGxpbmdyZWxzIGZpZWxkCgpUbyBleHBhbmQgdGhlIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiBW YXIgbm9kZSwKd2UgbmVlZCB0byBjb3B5IHRoZSBmaWVsZHMgb2YgdGhlIG9yaWdpbmFsIHZpcnR1 YWwgZ2VuZXJhdGVkIGNvbHVtbiBWYXIgbm9kZSwKaW5jbHVkaW5nIHZhcm51bGxpbmdyZWxzLCB2 YXJsZXZlbHN1cCwgdmFycmV0dXJuaW5ndHlwZSwgYW5kIHZhcmF0dG5vLAp0byB0aGUgbmV3bHkg ZXhwYW5kZWQgVmFyIG5vZGUuCgpSZXBsYWNlVmFyc0Zyb21UYXJnZXRMaXN0X2NhbGxiYWNrIGRp ZG4ndCB0YWtlbiBjYXJlIG9mIHZhcm51bGxpbmdyZWxzLAp0aGlzIHBhdGNoIGZpeCB0aGlzIGlz c3VlLgoKZGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS83NWViMWE2Zi1kNTlmLTQyZTYt OGE3OC0xMjRlZTgwOGNkYTdAZ21haWwuY29tCi0tLQogc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdy aXRlTWFuaXAuYyAgICAgICAgICAgIHwgNjIgKysrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1 ZGUvcmV3cml0ZS9yZXdyaXRlTWFuaXAuaCAgICAgICAgICAgIHwgIDMgKwogLi4uL3JlZ3Jlc3Mv ZXhwZWN0ZWQvZ2VuZXJhdGVkX3ZpcnR1YWwub3V0ICAgIHwgNDUgKysrKysrKysrKysrKysKIHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2dlbmVyYXRlZF92aXJ0dWFsLnNxbCAgICB8IDExICsrKysKIHNy Yy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAgICAgICB8ICAxICsKIDUgZmls ZXMgY2hhbmdlZCwgMTIyIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9y ZXdyaXRlL3Jld3JpdGVNYW5pcC5jIGIvc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRlTWFuaXAu YwppbmRleCBhMTE1YjIxN2M5MS4uNjk3MDFjZTZlY2QgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMKKysrIGIvc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRl TWFuaXAuYwpAQCAtODg0LDYgKzg4NCw2NCBAQCBJbmNyZW1lbnRWYXJTdWJsZXZlbHNVcF9ydGFi bGUoTGlzdCAqcnRhYmxlLCBpbnQgZGVsdGFfc3VibGV2ZWxzX3VwLAogCQkJCQkgICBRVFdfRVhB TUlORV9SVEVTX0JFRk9SRSk7CiB9CiAKKy8qCisgKiBTZXRWYXJOdWxsaW5ncmVscyAtIGFkanVz dCBWYXIgbm9kZXMgZm9yIGEgc3BlY2lmaWVkIHZhcm51bGxpbmdyZWxzLgorICoKKyAqIEZpbmQg YWxsIFZhciBub2RlcyByZWZlcnJpbmcgdG8gdGhlIHNwZWNpZmllZCB2YXJubyBpbiB0aGUgZ2l2 ZW4KKyAqIGV4cHJlc3Npb24gYW5kIHNldCB0aGVpciB2YXJudWxsaW5ncmVscyB0byB0aGUgc3Bl Y2lmaWVkIHZhbHVlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworCWludAkJCXN1YmxldmVsc191 cDsKKwlpbnQJCQl2YXJubzsKKwlCaXRtYXBzZXQgKnZhcm51bGxpbmdyZWxzOworfSBTZXRWYXJO dWxsaW5ncmVsc19jb250ZXh0OworCitzdGF0aWMgYm9vbAorU2V0VmFyTnVsbGluZ3JlbHNfd2Fs a2VyKE5vZGUgKm5vZGUsCisJCQkJCQkgU2V0VmFyTnVsbGluZ3JlbHNfY29udGV4dCAqY29udGV4 dCkKK3sKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoSXNBKG5v ZGUsIFZhcikpCisJeworCQlWYXIJCSAgICp2YXIgPSAoVmFyICopIG5vZGU7CisKKwkJaWYgKHZh ci0+dmFybGV2ZWxzdXAgPT0gY29udGV4dC0+c3VibGV2ZWxzX3VwICYmCisJCQl2YXItPnZhcm5v ID09IGNvbnRleHQtPnZhcm5vKQorCQkJdmFyLT52YXJudWxsaW5ncmVscyA9IGJtc191bmlvbihj b250ZXh0LT52YXJudWxsaW5ncmVscywKKwkJCQkJCQkJCQkJdmFyLT52YXJudWxsaW5ncmVscyk7 CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChJc0Eobm9kZSwgUXVlcnkpKQorCXsKKwkJ LyogUmVjdXJzZSBpbnRvIHN1YnNlbGVjdHMgKi8KKwkJYm9vbAkJcmVzdWx0OworCisJCWNvbnRl eHQtPnN1YmxldmVsc191cCsrOworCQlyZXN1bHQgPSBxdWVyeV90cmVlX3dhbGtlcigoUXVlcnkg Kikgbm9kZSwgU2V0VmFyTnVsbGluZ3JlbHNfd2Fsa2VyLAorCQkJCQkJCQkgICBjb250ZXh0LCAw KTsKKwkJY29udGV4dC0+c3VibGV2ZWxzX3VwLS07CisJCXJldHVybiByZXN1bHQ7CisJfQorCXJl dHVybiBleHByZXNzaW9uX3RyZWVfd2Fsa2VyKG5vZGUsIFNldFZhck51bGxpbmdyZWxzX3dhbGtl ciwgY29udGV4dCk7Cit9Cit2b2lkCitTZXRWYXJOdWxsaW5ncmVscyhOb2RlICpub2RlLCBpbnQg c3VibGV2ZWxzX3VwLCBpbnQgdmFybm8sIEJpdG1hcHNldCAqdmFybnVsbGluZ3JlbHMpCit7CisJ U2V0VmFyTnVsbGluZ3JlbHNfY29udGV4dCBjb250ZXh0OworCisJY29udGV4dC5zdWJsZXZlbHNf dXAgPSBzdWJsZXZlbHNfdXA7CisJY29udGV4dC52YXJubyA9IHZhcm5vOworCWNvbnRleHQudmFy bnVsbGluZ3JlbHMgPSB2YXJudWxsaW5ncmVsczsKKworCS8qIEV4cGVjdCB0byBzdGFydCB3aXRo IGFuIGV4cHJlc3Npb24gKi8KKwlTZXRWYXJOdWxsaW5ncmVsc193YWxrZXIobm9kZSwgJmNvbnRl eHQpOworfQorCiAvKgogICogU2V0VmFyUmV0dXJuaW5nVHlwZSAtIGFkanVzdCBWYXIgbm9kZXMg Zm9yIGEgc3BlY2lmaWVkIHZhcnJldHVybmluZ3R5cGUuCiAgKgpAQCAtMTgzMiw2ICsxODkwLDEw IEBAIFJlcGxhY2VWYXJzRnJvbVRhcmdldExpc3RfY2FsbGJhY2soVmFyICp2YXIsCiAJCWlmICh2 YXItPnZhcmxldmVsc3VwID4gMCkKIAkJCUluY3JlbWVudFZhclN1YmxldmVsc1VwKChOb2RlICop IG5ld25vZGUsIHZhci0+dmFybGV2ZWxzdXAsIDApOwogCisJCWlmICh2YXItPnZhcm51bGxpbmdy ZWxzICE9IE5VTEwpCisJCQlTZXRWYXJOdWxsaW5ncmVscygoTm9kZSAqKSBuZXdub2RlLCB2YXIt PnZhcmxldmVsc3VwLAorCQkJCQkJCSAgdmFyLT52YXJubywKKwkJCQkJCQkgIHZhci0+dmFybnVs bGluZ3JlbHMpOwogCQkvKgogCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHRsaXN0IGl0ZW0gY29u dGFpbnMgYSBQQVJBTV9NVUxUSUVYUFIgUGFyYW0sCiAJCSAqIGFuZCB0aHJvdyBlcnJvciBpZiBz by4gIFRoaXMgY2FzZSBjb3VsZCBvbmx5IGhhcHBlbiB3aGVuIGV4cGFuZGluZwpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvcmV3cml0ZS9yZXdyaXRlTWFuaXAuaCBiL3NyYy9pbmNsdWRlL3Jld3Jp dGUvcmV3cml0ZU1hbmlwLmgKaW5kZXggNTEyODIzMDMzYjkuLmU4NjlmNjUxZmM4IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9yZXdyaXRlL3Jld3JpdGVNYW5pcC5oCisrKyBiL3NyYy9pbmNsdWRl L3Jld3JpdGUvcmV3cml0ZU1hbmlwLmgKQEAgLTQ4LDYgKzQ4LDkgQEAgZXh0ZXJuIHZvaWQgQ2hh bmdlVmFyTm9kZXMoTm9kZSAqbm9kZSwgaW50IHJ0X2luZGV4LCBpbnQgbmV3X2luZGV4LAogCQkJ CQkJICAgaW50IHN1YmxldmVsc191cCk7CiBleHRlcm4gdm9pZCBJbmNyZW1lbnRWYXJTdWJsZXZl bHNVcChOb2RlICpub2RlLCBpbnQgZGVsdGFfc3VibGV2ZWxzX3VwLAogCQkJCQkJCQkJaW50IG1p bl9zdWJsZXZlbHNfdXApOworZXh0ZXJuIHZvaWQgU2V0VmFyTnVsbGluZ3JlbHMoTm9kZSAqbm9k ZSwgaW50IHN1YmxldmVsc191cCwKKwkJCQkJCQkgIGludCB2YXJubywKKwkJCQkJCQkgIEJpdG1h cHNldCAqdmFybnVsbGluZ3JlbHMpOwogZXh0ZXJuIHZvaWQgSW5jcmVtZW50VmFyU3VibGV2ZWxz VXBfcnRhYmxlKExpc3QgKnJ0YWJsZSwKIAkJCQkJCQkJCQkgICBpbnQgZGVsdGFfc3VibGV2ZWxz X3VwLCBpbnQgbWluX3N1YmxldmVsc191cCk7CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvZ2VuZXJhdGVkX3ZpcnR1YWwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9nZW5lcmF0ZWRfdmlydHVhbC5vdXQKaW5kZXggMzU2Mzg4MTJiZTkuLjU2ZTdlNmZkNmIw IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVyYXRlZF92aXJ0dWFs Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVyYXRlZF92aXJ0dWFsLm91 dApAQCAtMTgxLDYgKzE4MSw1MSBAQCBTRUxFQ1QgKiBGUk9NIGd0ZXN0eCwgZ3Rlc3QxIFdIRVJF IGd0ZXN0eC55ID0gZ3Rlc3QxLmE7CiAgMjIgfCAyIHwgMiB8IDQKICgyIHJvd3MpCiAKKy0tYnVn OiBodHRwczovL3Bvc3Rnci5lcy9tLzc1ZWIxYTZmLWQ1OWYtNDJlNi04YTc4LTEyNGVlODA4Y2Rh N0BnbWFpbC5jb20KK1NFTEVDVCBTVU0odC5iKSBPVkVSIChQQVJUSVRJT04gQlkgdC5hKSBGUk9N IGd0ZXN0eCBBUyB0MSBsZWZ0IEpPSU4gZ3Rlc3QxIFQgT04gdHJ1ZTsKKyBzdW0gCistLS0tLQor ICAgNgorICAgNgorICAgNgorICAxMgorICAxMgorICAxMgorKDYgcm93cykKKworLS10aGlzIHF1 ZXJ5IHJlc3VsdCBzaG91bGQgYmUgc2FtZSBhcyBhcyB0aGUgYWJvdmUKK1NFTEVDVCBTVU0oKHNl bGVjdCB0LmIgZnJvbSAoKHNlbGVjdCB0LmIgZnJvbSBndGVzdDEgYXMgdCBvcmRlciBieSB0LmIg bGltaXQgMSkpKSkgT1ZFUiAoUEFSVElUSU9OIEJZIHQuYSkKK0ZST00gZ3Rlc3R4IEFTIHQxIGxl ZnQgSk9JTiBndGVzdDEgVCBPTiB0cnVlOworIHN1bSAKKy0tLS0tCisgICA2CisgICA2CisgICA2 CisgIDEyCisgIDEyCisgIDEyCisoNiByb3dzKQorCitTRUxFQ1QgU1VNKChzZWxlY3QgdC5iIGZy b20gZ3Rlc3QxIGFzIHQgb3JkZXIgYnkgdC5iIGxpbWl0IDEpKSBPVkVSIChQQVJUSVRJT04gQlkg dC5hKQorRlJPTSBndGVzdHggQVMgdDEgbGVmdCBKT0lOIGd0ZXN0MSBUIE9OIHRydWU7Cisgc3Vt IAorLS0tLS0KKyAgIDYKKyAgIDYKKyAgIDYKKyAgIDYKKyAgIDYKKyAgIDYKKyg2IHJvd3MpCisK K1NFTEVDVCB0LnggRlJPTSBndGVzdHggdCBMRUZUIEpPSU4gZ3Rlc3QxIHZ0IG9uIHQueCA9IHZ0 LmEgV0hFUkUgY29hbGVzY2UodnQuYiwgMSkgPSAxIE9SIHQueCBJUyBOVUxMOworIHggIAorLS0t LQorIDExCisgMjIKKyAzMworKDMgcm93cykKKwogRFJPUCBUQUJMRSBndGVzdHg7CiAtLSB0ZXN0 IFVQREFURS9ERUxFVEUgcXVhbHMKIFNFTEVDVCAqIEZST00gZ3Rlc3QxIE9SREVSIEJZIGE7CmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwgYi9z cmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwKaW5kZXggMzQ4NzA4MTM5 MTAuLmQ3NjQzOWNhOTkzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0 ZWRfdmlydHVhbC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZ2VuZXJhdGVkX3ZpcnR1 YWwuc3FsCkBAIC04MCw2ICs4MCwxNyBAQCBERUxFVEUgRlJPTSBndGVzdDEgV0hFUkUgYSA9IDIw MDAwMDAwMDA7CiBDUkVBVEUgVEFCTEUgZ3Rlc3R4ICh4IGludCwgeSBpbnQpOwogSU5TRVJUIElO VE8gZ3Rlc3R4IFZBTFVFUyAoMTEsIDEpLCAoMjIsIDIpLCAoMzMsIDMpOwogU0VMRUNUICogRlJP TSBndGVzdHgsIGd0ZXN0MSBXSEVSRSBndGVzdHgueSA9IGd0ZXN0MS5hOworLS1idWc6IGh0dHBz Oi8vcG9zdGdyLmVzL20vNzVlYjFhNmYtZDU5Zi00MmU2LThhNzgtMTI0ZWU4MDhjZGE3QGdtYWls LmNvbQorU0VMRUNUIFNVTSh0LmIpIE9WRVIgKFBBUlRJVElPTiBCWSB0LmEpIEZST00gZ3Rlc3R4 IEFTIHQxIGxlZnQgSk9JTiBndGVzdDEgVCBPTiB0cnVlOworLS10aGlzIHF1ZXJ5IHJlc3VsdCBz aG91bGQgYmUgc2FtZSBhcyBhcyB0aGUgYWJvdmUKK1NFTEVDVCBTVU0oKHNlbGVjdCB0LmIgZnJv bSAoKHNlbGVjdCB0LmIgZnJvbSBndGVzdDEgYXMgdCBvcmRlciBieSB0LmIgbGltaXQgMSkpKSkg T1ZFUiAoUEFSVElUSU9OIEJZIHQuYSkKK0ZST00gZ3Rlc3R4IEFTIHQxIGxlZnQgSk9JTiBndGVz dDEgVCBPTiB0cnVlOworCitTRUxFQ1QgU1VNKChzZWxlY3QgdC5iIGZyb20gZ3Rlc3QxIGFzIHQg b3JkZXIgYnkgdC5iIGxpbWl0IDEpKSBPVkVSIChQQVJUSVRJT04gQlkgdC5hKQorRlJPTSBndGVz dHggQVMgdDEgbGVmdCBKT0lOIGd0ZXN0MSBUIE9OIHRydWU7CisKK1NFTEVDVCB0LnggRlJPTSBn dGVzdHggdCBMRUZUIEpPSU4gZ3Rlc3QxIHZ0IG9uIHQueCA9IHZ0LmEgV0hFUkUgY29hbGVzY2Uo dnQuYiwgMSkgPSAxIE9SIHQueCBJUyBOVUxMOworCiBEUk9QIFRBQkxFIGd0ZXN0eDsKIAogLS0g dGVzdCBVUERBVEUvREVMRVRFIHF1YWxzCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQv dHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IGI2 YzE3MGFjMjQ5Li42Y2IzOWFjNzZjNSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5 cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTI2 MzMsNiArMjYzMyw3IEBAIFNldE9wZXJhdGlvbgogU2V0T3BlcmF0aW9uU3RtdAogU2V0UXVhbnRp ZmllcgogU2V0VG9EZWZhdWx0CitTZXRWYXJOdWxsaW5ncmVsc19jb250ZXh0CiBTZXRWYXJSZXR1 cm5pbmdUeXBlX2NvbnRleHQKIFNldHVwV29ya2VyUHRyVHlwZQogU2hEZXBlbmRPYmplY3RJbmZv Ci0tIAoyLjM0LjEKCg== --000000000000dbfbc3062e05bd71--