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.96) (envelope-from ) id 1wa2Vc-001UJN-0V for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2026 02:29:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wa2Vb-008jr8-0S for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2026 02:29:35 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wa2Va-008jqz-1d for pgsql-hackers@lists.postgresql.org; Thu, 18 Jun 2026 02:29:34 +0000 Received: from mail-oi1-x22f.google.com ([2607:f8b0:4864:20::22f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wa2VY-00000000tpP-1Wwm for pgsql-hackers@lists.postgresql.org; Thu, 18 Jun 2026 02:29:33 +0000 Received: by mail-oi1-x22f.google.com with SMTP id 5614622812f47-4865e953031so1168340b6e.0 for ; Wed, 17 Jun 2026 19:29:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1781749770; cv=none; d=google.com; s=arc-20240605; b=HyzBDVPeBWx7gUyl+yNmKWOVFY639qhs6byaMBoQO6ps/wlRUy7XPYL5/ME5ClxHXq pTh5+qBePiAd35Fre24jMS6qqUOP+KygRvMGsQCYunuDPYe8BQAplQBI292+P7XXLXjE 2eUfCqsV9B/kFhQMJXXquQ6qX7EqHBkgktkxw6PQwXPRzVW3XZ3ZJqpBp2Kft0PM9Qsb i8s3I301t7Ot8SS6KaaAFqt9KZzmw1ro/o6KHfzYwbIxFU9gX8qfDLyVXWwBcxQpkfRf tsyaRzvV5rzPZxNWr1LzTlOrJdYrE1E0uqv0WD+tCMy2oLhNk+5tKAFrbzOQbHNcdtkN 4UAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Lf8OSDQiaeIqDEE6jt8WCqPn5u98whuSYmJP2+TATeY=; fh=/cHLBdqKEqNU94YGjRW0zkaOMLzGCD4dj9/fsu3X5gk=; b=H6oRpGMsSnngKbXk59U5u02S6Q0u76RmBrm2iJjS0xWL0OY97+t0OjETFP3XXYD2ZL MkIzFbEtEEIZaQxCGWWs6FkO5LdsshDt2Y66Wx9S/CGdFEnP2KHpfSMQwHzBMVaPQerT 0j1wcKWb6EzJ7WVEOXw6H8TWBY8YrEffgxldxzU7gLeIoiVpg/5v9PaKiC0fe0AlXX32 vDywvRGkZIof/ln5XI00sizyIRArVXCD+arH1V2u8EKwtLWRzqUlsnqOlwen0oD1CE8F zgVyjmczeFs/UqUKUdJZ0NQbMbLgObeeB9y+g0YyFAQtzoXCBBBaJa/0t8B9cJPsPdJx cAfw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20251104.gappssmtp.com; s=20251104; t=1781749770; x=1782354570; darn=lists.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=Lf8OSDQiaeIqDEE6jt8WCqPn5u98whuSYmJP2+TATeY=; b=LfYa8RL/3ESOWcPRF4FxhkI62RJVLCyILNaWnzYDHcQVkLOVmXJ1tz2XV7cMOyRkt2 Hy+egbwOLjz+VAcqwMeAb/kZStdnM9RVdvM7OY4yTB2YkyhY10uNGWhnQGYrMz1mxWqo 2d0fS2YtnntHueowg+fcWZdMzVD+mmOYOzlYhwx9Z6wZilFDDk68z8Y05502+DkBI4It 3Dc2Yi3nf4fPsHmVVwQNPEgbHkaw7FNS1CRaNLuU7soUIwrCGa3YhYtXO0ECRXYa/Fsc xpd2w7BhoRNWiEv8SRTaiMBJ3jiHo80CSCbMEn3ZTSGxi0fHzF2GmKhCjNUYFw6/R18Y gTHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781749770; x=1782354570; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Lf8OSDQiaeIqDEE6jt8WCqPn5u98whuSYmJP2+TATeY=; b=lf/Yea1OIcaIdVo0ni0OwaJhXqZ0iySVTOu7LnOI0cUEDskXeNZwYaDKAG1epU6IXz aV8O7dmvYYGBDk2gGTi8Egmvlhlw8mMnlaKFeFCtAvLVJkFsaa+HcmrNcaTZlI/juWmG /ldpetsHwBd/vf9ucNJSlPqhnUybOFrDTMv+/0oFXNqpKXJz5YvTY0BEKvcFXojYcijS 4t+SNSQ5o9/tszZjTkuD1v6yZlRJN5a5SoiHHuylQtq2OJh2uV/fZs7ENvzVf3btk8YL Fgm+1CXeSQVKe3T1y+sG5y4QCDJ8uGKoMu8xlEC6WZav8Jd205Qzme2LF4nwm+aPkbgt rM2A== X-Forwarded-Encrypted: i=1; AFNElJ87YxbkpW7mVKs96RLgLOvb4D7LnaeIq0h05ZCzaF2S2E4/bu0eMXmnupoUX7KnXtQdCzXpa5YmSOYc8rvG@lists.postgresql.org X-Gm-Message-State: AOJu0YzJar1PIGkb/Z5BncPmi0rdlgTz08SDKuXpVJI6EA8yMXMDrEyX RlYokYGzm6Zl2yN3L2Vj5EiOB0bvIPtm1E3VPKpFPQmA1Vk0J/Yfdj5uiYliXd7X/j8FIOPyXww D0ygYG3aum/7vdVRJHScLBMiZP4WcMni2Apo6NVP/wg== X-Gm-Gg: Acq92OG74LY0rqzDGqTRHqEwNvGr56k/hUgGue400y22iAV0D9vNIC1AEGXvi2527ib FTg/ZawaIfG831CxLBpZZmUqfL/E8/HAt2QDt+EM2uV6hpi+34Fby6FzEQUAK73NGHnBbFGg9Uc 1gGma7kck1fwyOfhDqBhlDoMWo0udJPrtTs9oLStc642mYl81662ksNAWHcnhXgHNU5GBcgM6j/ ejrOJEA2tBWO0PUAuSxMxs/TvA88b1q7FEDcL/39bsG8YOmoJTVLZtsI9ZEY8FjRjdiTSo+ X-Received: by 2002:a05:6808:6a83:b0:485:4f80:1652 with SMTP id 5614622812f47-48956071672mr1528036b6e.2.1781749769868; Wed, 17 Jun 2026 19:29:29 -0700 (PDT) MIME-Version: 1.0 References: <85ac7f0e-d95f-4377-ade0-8941fd328012@eisentraut.org> <7d63ddfa-c735-4dfe-8c7a-4f1e2a621058@eisentraut.org> <4606deaa-7d65-4f22-8a78-356c3180be9d@eisentraut.org> <53f1c094-3c29-4ef6-a9bd-dc2e7894ceb0@eisentraut.org> In-Reply-To: From: Paul A Jungwirth Date: Wed, 17 Jun 2026 19:29:17 -0700 X-Gm-Features: AVVi8CcF15Bfoc6fi7FFhqDn1jrFkpzZ87mRVJB3ShAViziTy6agvuvbsXSmi4Q Message-ID: Subject: Re: SQL:2011 Application Time Update & Delete To: jian he Cc: SATYANARAYANA NARLAPURAM , Peter Eisentraut , Chao Li , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000001cc1d506547df20a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001cc1d506547df20a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Apr 21, 2026 at 2:51=E2=80=AFAM jian he wrote: > > On Sun, Apr 19, 2026 at 7:18=E2=80=AFAM Paul A Jungwirth > wrote: > > > > Here is a patch that forbids changing the valid_at column in a BEFORE > > trigger. It works by capturing the value before triggers run, then > > checking afterwards if it is still the same (using the default btree > > equality operator; probably a simple binary comparison is good > > enough). > > > > ... > The above works as expected, but the below is not what i expected. > > create type textrange as range (subtype =3D text, collation =3D "C"); > CREATE OR REPLACE FUNCTION trg_fpo() > RETURNS TRIGGER LANGUAGE plpgsql AS > $$ > BEGIN > NEW.valid_at =3D '[A,d)'; > raise notice 'old: %, new: %', old, new; > RETURN NEW; > END; > $$; > > create table fpo1(valid_at textrange, b int); > CREATE TRIGGER fpo_before_update_row BEFORE UPDATE ON fpo1 FOR EACH > ROW EXECUTE PROCEDURE trg_fpo(); > insert into fpo1 values ('[a,d]', 1); > > UPDATE fpo1 FOR PORTION OF valid_at FROM 'A' TO 'd' SET b =3D 2; > NOTICE: old: ("[a,d]",1), new: ("[A,d)",2) > ERROR: cannot change column "valid_at" from a BEFORE trigger because > it is used in FOR PORTION OF > > Should I expect this to work without error, just like the table fpo3 > UPDATE FOR PORTION OF statement above? That looks correct to me. In the C collation, uppercase letters come before lowercase. The row started as '[a,d)'. Then FOR PORTION OF valid_at FROM 'A' to 'd' leaves it as '[a,d)' (because the intersection can only narrow). Then your BEFORE trigger changes it to '[A,d)'. Here is a new patch though, rebased and improved in a couple ways. First, we are able to use ExecInitForPortionOf, added by another fix. This reduces a lot of code duplication. Also I moved the check out of ExecForPortionOfLeftovers. Now the time between capturing the pre-trigger value and checking it is shorter: we do the check right after triggers fire. This also means we don't have to add fields to ForPortionOfState. Yours, --=20 Paul ~{:-) pj@illuminatedcomputing.com --0000000000001cc1d506547df20a Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Forbid-BEFORE-UPDATE-triggers-changing-the-FOR-PO.patch" Content-Disposition: attachment; filename="v2-0001-Forbid-BEFORE-UPDATE-triggers-changing-the-FOR-PO.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqivr4yp0 RnJvbSBhYjU3MTlhYjQzMmQ2ZGY1MTQ1OWI0YjY1NTA2NDkwM2I0ODQxMjA5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiUGF1bCBBLiBKdW5nd2lydGgiIDxwakBpbGx1bWluYXRlZGNv bXB1dGluZy5jb20+CkRhdGU6IFdlZCwgMTcgSnVuIDIwMjYgMTc6NDM6MTEgLTA3MDAKU3ViamVj dDogW1BBVENIIHYyXSBGb3JiaWQgQkVGT1JFIFVQREFURSB0cmlnZ2VycyBjaGFuZ2luZyB0aGUg Rk9SIFBPUlRJT04gT0YKIGNvbHVtbgoKSnVzdCBhcyB3ZSBmb3JiaWQgVVBEQVRFIHQgRk9SIFBP UlRJT04gT0YgdmFsaWRfYXQgLi4uIFNFVCB2YWxpZF9hdCwgd2UKc2hvdWxkIGZvcmJpZCBzZXR0 aW5nIHRoZSBhcHBsaWNhdGlvbi10aW1lIGNvbHVtbiB3aXRoIGEgQkVGT1JFIHRyaWdnZXIuCgpX ZSBjYXB0dXJlIHRoZSByYW5nZSBjb2x1bW4gdmFsdWUganVzdCBiZWZvcmUgdGhlIEJFRk9SRSBV UERBVEUgdHJpZ2dlcnMKZmlyZSwgdGhlbiBjb21wYXJlIGl0IGFnYWluc3QgdGhlIHBvc3QtdHJp Z2dlciB2YWx1ZS4gSWYgYSB0cmlnZ2VyCmFsdGVyZWQgaXQsIHdlIHJhaXNlIGFuIGVycm9yLgoK RGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9DQStyZW55 Vmtmc3JOTm5ZcUxwZl9nM21EVjMxS0xGWEF3LVJSVm15TGI3VGNCTFVPN0FAbWFpbC5nbWFpbC5j b20KLS0tCiBzcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTW9kaWZ5VGFibGUuYyAgICAgICB8IDE2 NCArKysrKysrKysrKysrKysrKystCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Zvcl9wb3J0 aW9uX29mLm91dCB8ICAyNyArKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Zvcl9wb3J0aW9uX29m LnNxbCAgICAgIHwgIDMzICsrKysKIDMgZmlsZXMgY2hhbmdlZCwgMjIwIGluc2VydGlvbnMoKyks IDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZU1v ZGlmeVRhYmxlLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTW9kaWZ5VGFibGUuYwppbmRl eCAzM2E2NzM1ZjA4ZC4uODcwNGNkMzc0MDggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1 dG9yL25vZGVNb2RpZnlUYWJsZS5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVNb2Rp ZnlUYWJsZS5jCkBAIC0yMDEsNiArMjAxLDE0IEBAIHN0YXRpYyB2b2lkIGZpcmVCU1RyaWdnZXJz KE1vZGlmeVRhYmxlU3RhdGUgKm5vZGUpOwogc3RhdGljIHZvaWQgZmlyZUFTVHJpZ2dlcnMoTW9k aWZ5VGFibGVTdGF0ZSAqbm9kZSk7CiBzdGF0aWMgdm9pZCBFeGVjSW5pdEZvclBvcnRpb25PZihN b2RpZnlUYWJsZVN0YXRlICptdHN0YXRlLCBFU3RhdGUgKmVzdGF0ZSwKIAkJCQkJCQkJIFJlc3Vs dFJlbEluZm8gKnJlc3VsdFJlbEluZm8pOworc3RhdGljIERhdHVtIEV4ZWNGb3JQb3J0aW9uT2ZT YXZlUmFuZ2UoTW9kaWZ5VGFibGVDb250ZXh0ICpjb250ZXh0LAorCQkJCQkJCQkJICAgUmVzdWx0 UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywKKwkJCQkJCQkJCSAgIFR1cGxlVGFibGVTbG90ICpzbG90 LAorCQkJCQkJCQkJICAgYm9vbCAqaXNOdWxsKTsKK3N0YXRpYyB2b2lkIEV4ZWNGb3JQb3J0aW9u T2ZDaGVja1JhbmdlKE1vZGlmeVRhYmxlQ29udGV4dCAqY29udGV4dCwKKwkJCQkJCQkJCSAgIFJl c3VsdFJlbEluZm8gKnJlc3VsdFJlbEluZm8sCisJCQkJCQkJCQkgICBUdXBsZVRhYmxlU2xvdCAq c2xvdCwKKwkJCQkJCQkJCSAgIERhdHVtIG9yaWdSYW5nZSwgYm9vbCBvcmlnSXNOdWxsKTsKIAog CiAvKgpAQCAtMjM5MCwxNCArMjM5OCw0NiBAQCBFeGVjVXBkYXRlUHJvbG9ndWUoTW9kaWZ5VGFi bGVDb250ZXh0ICpjb250ZXh0LCBSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvLAogCWlmIChy ZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYyAmJgogCQlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVz Yy0+dHJpZ191cGRhdGVfYmVmb3JlX3JvdykKIAl7CisJCU5vZGUJICAgKmZvclBvcnRpb25PZiA9 ICgoTW9kaWZ5VGFibGUgKikgY29udGV4dC0+bXRzdGF0ZS0+cHMucGxhbiktPmZvclBvcnRpb25P ZjsKKwkJRGF0dW0JCW9yaWdSYW5nZSA9IChEYXR1bSkgMDsKKwkJYm9vbAkJb3JpZ0lzTnVsbCA9 IGZhbHNlOworCQlib29sCQlwcm9jZWVkOworCiAJCS8qIEZsdXNoIGFueSBwZW5kaW5nIGluc2Vy dHMsIHNvIHJvd3MgYXJlIHZpc2libGUgdG8gdGhlIHRyaWdnZXJzICovCiAJCWlmIChjb250ZXh0 LT5lc3RhdGUtPmVzX2luc2VydF9wZW5kaW5nX3Jlc3VsdF9yZWxhdGlvbnMgIT0gTklMKQogCQkJ RXhlY1BlbmRpbmdJbnNlcnRzKGNvbnRleHQtPmVzdGF0ZSk7CiAKLQkJcmV0dXJuIEV4ZWNCUlVw ZGF0ZVRyaWdnZXJzKGNvbnRleHQtPmVzdGF0ZSwgY29udGV4dC0+ZXBxc3RhdGUsCi0JCQkJCQkJ CQlyZXN1bHRSZWxJbmZvLCB0dXBsZWlkLCBvbGR0dXBsZSwgc2xvdCwKLQkJCQkJCQkJCXJlc3Vs dCwgJmNvbnRleHQtPnRtZmQsCi0JCQkJCQkJCQljb250ZXh0LT5tdHN0YXRlLT5vcGVyYXRpb24g PT0gQ01EX01FUkdFKTsKKwkJLyoKKwkJICogV2l0aCBGT1IgUE9SVElPTiBPRiwgd2UgbXVzdCBm b3JiaWQgdHJpZ2dlcnMgZnJvbSBjaGFuZ2luZyB0aGUKKwkJICogYXBwbGljYXRpb24gdGltZSBj b2x1bW4sIGp1c3QgYXMgdXNlcnMgY2FuJ3QgU0VUIGl0LiBDYXB0dXJlCisJCSAqIHRoZSBjdXJy ZW50IHZhbHVlLCBydW4gdHJpZ2dlcnMsIHRoZW4gY2hlY2sgYmVsb3cgZm9yIGNoYW5nZXMuCisJ CSAqLworCQlpZiAoZm9yUG9ydGlvbk9mKQorCQkJb3JpZ1JhbmdlID0gRXhlY0ZvclBvcnRpb25P ZlNhdmVSYW5nZShjb250ZXh0LCByZXN1bHRSZWxJbmZvLCBzbG90LAorCQkJCQkJCQkJCQkJICAm b3JpZ0lzTnVsbCk7CisKKwkJcHJvY2VlZCA9IEV4ZWNCUlVwZGF0ZVRyaWdnZXJzKGNvbnRleHQt PmVzdGF0ZSwgY29udGV4dC0+ZXBxc3RhdGUsCisJCQkJCQkJCQkgICByZXN1bHRSZWxJbmZvLCB0 dXBsZWlkLCBvbGR0dXBsZSwgc2xvdCwKKwkJCQkJCQkJCSAgIHJlc3VsdCwgJmNvbnRleHQtPnRt ZmQsCisJCQkJCQkJCQkgICBjb250ZXh0LT5tdHN0YXRlLT5vcGVyYXRpb24gPT0gQ01EX01FUkdF KTsKKworCQkvKgorCQkgKiBDaGVjayBvbmx5IHdoZW4gdGhlIHRyaWdnZXIgbGV0IHRoZSB1cGRh dGUgcHJvY2VlZDsgZWl0aGVyIHdheSwKKwkJICogZnJlZSB0aGUgbWVtb3J5LgorCQkgKi8KKwkJ aWYgKGZvclBvcnRpb25PZikKKwkJeworCQkJRm9yUG9ydGlvbk9mU3RhdGUgKmZwb1N0YXRlID0g cmVzdWx0UmVsSW5mby0+cmlfZm9yUG9ydGlvbk9mOworCisJCQlpZiAocHJvY2VlZCkKKwkJCQlF eGVjRm9yUG9ydGlvbk9mQ2hlY2tSYW5nZShjb250ZXh0LCByZXN1bHRSZWxJbmZvLCBzbG90LAor CQkJCQkJCQkJCSAgIG9yaWdSYW5nZSwgb3JpZ0lzTnVsbCk7CisKKwkJCWlmICghb3JpZ0lzTnVs bCAmJiAhZnBvU3RhdGUtPmZwX2xlZnRvdmVyc3R5cGNhY2hlLT50eXBieXZhbCkKKwkJCQlwZnJl ZShEYXR1bUdldFBvaW50ZXIob3JpZ1JhbmdlKSk7CisJCX0KKworCQlyZXR1cm4gcHJvY2VlZDsK IAl9CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTU5MzEsMyArNTk3MSwxMTkgQEAgRXhlY0luaXRGb3JQ b3J0aW9uT2YoTW9kaWZ5VGFibGVTdGF0ZSAqbXRzdGF0ZSwgRVN0YXRlICplc3RhdGUsCiAKIAlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNG b3JQb3J0aW9uT2ZTYXZlUmFuZ2UKKyAqCisgKgkJQ2FwdHVyZSB0aGUgRk9SIFBPUlRJT04gT0Yg cmFuZ2UgY29sdW1uIHZhbHVlIGZyb20gdGhlIG5ldyB0dXBsZSBzbG90CisgKgkJanVzdCBiZWZv cmUgQkVGT1JFIFVQREFURSB0cmlnZ2VycyBydW4uIEV4ZWNGb3JQb3J0aW9uT2ZDaGVja1Jhbmdl CisgKgkJY29tcGFyZXMgdGhpcyBhZ2FpbnN0IHRoZSBwb3N0LXRyaWdnZXIgdmFsdWUgdG8gZGV0 ZWN0IHdoZXRoZXIgYQorICoJCXRyaWdnZXIgY2hhbmdlZCB0aGUgcmFuZ2UgY29sdW1uLCB3aGlj aCBpcyBub3QgYWxsb3dlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIERhdHVtCitFeGVjRm9y UG9ydGlvbk9mU2F2ZVJhbmdlKE1vZGlmeVRhYmxlQ29udGV4dCAqY29udGV4dCwKKwkJCQkJCSAg UmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywKKwkJCQkJCSAgVHVwbGVUYWJsZVNsb3QgKnNs b3QsCisJCQkJCQkgIGJvb2wgKmlzTnVsbCkKK3sKKwlNb2RpZnlUYWJsZVN0YXRlICptdHN0YXRl ID0gY29udGV4dC0+bXRzdGF0ZTsKKwlNb2RpZnlUYWJsZSAqbm9kZSA9IChNb2RpZnlUYWJsZSAq KSBtdHN0YXRlLT5wcy5wbGFuOworCUZvclBvcnRpb25PZkV4cHIgKmZvclBvcnRpb25PZiA9IChG b3JQb3J0aW9uT2ZFeHByICopIG5vZGUtPmZvclBvcnRpb25PZjsKKwlFU3RhdGUJICAgKmVzdGF0 ZSA9IG10c3RhdGUtPnBzLnN0YXRlOworCUZvclBvcnRpb25PZlN0YXRlICpmcG9TdGF0ZTsKKwlU eXBlQ2FjaGVFbnRyeSAqdHlwY2FjaGU7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCURh dHVtCQlzYXZlZDsKKworCS8qCisJICogTGF6aWx5IGluaXRpYWxpemUgdGhlIHBhcnRpdGlvbiBj aGlsZCdzIEZvclBvcnRpb25PZlN0YXRlLCBsaWtlCisJICogRXhlY0ZvclBvcnRpb25PZkxlZnRv dmVycy4gVGhlIGNoZWNrIHdpbGwgcmVhZCBmcF9yYW5nZUF0dG5vIGFuZCB0aGUKKwkgKiB0eXBj YWNoZSBmcm9tIHRoZSBzYW1lIHN0cnVjdC4KKwkgKi8KKwlpZiAoIXJlc3VsdFJlbEluZm8tPnJp X2ZvclBvcnRpb25PZikKKwkJRXhlY0luaXRGb3JQb3J0aW9uT2YobXRzdGF0ZSwgZXN0YXRlLCBy ZXN1bHRSZWxJbmZvKTsKKworCWZwb1N0YXRlID0gcmVzdWx0UmVsSW5mby0+cmlfZm9yUG9ydGlv bk9mOworCisJc2xvdF9nZXRhbGxhdHRycyhzbG90KTsKKworCS8qCisJICogTG9vayB1cCB0aGUg cmFuZ2UncyB0eXBlIGNhY2hlIGVudHJ5LCByZXF1ZXN0aW5nIHRoZSBlcXVhbGl0eSBvcGVyYXRv cgorCSAqIHRoZSBjaGVjayBuZWVkcyBsYXRlci4gVGhpcyBpcyB3b3J0aCBjYWNoaW5nIGZvciB0 aGUgd2hvbGUgVVBEQVRFLgorCSAqLworCXR5cGNhY2hlID0gZnBvU3RhdGUtPmZwX2xlZnRvdmVy c3R5cGNhY2hlOworCWlmICh0eXBjYWNoZSA9PSBOVUxMKQorCXsKKwkJdHlwY2FjaGUgPSBsb29r dXBfdHlwZV9jYWNoZShmb3JQb3J0aW9uT2YtPnJhbmdlVHlwZSwKKwkJCQkJCQkJCSBUWVBFQ0FD SEVfRVFfT1BSX0ZJTkZPKTsKKwkJZnBvU3RhdGUtPmZwX2xlZnRvdmVyc3R5cGNhY2hlID0gdHlw Y2FjaGU7CisJfQorCisJKmlzTnVsbCA9IHNsb3QtPnR0c19pc251bGxbZnBvU3RhdGUtPmZwX3Jh bmdlQXR0bm8gLSAxXTsKKwlpZiAoKmlzTnVsbCkKKwkJcmV0dXJuIChEYXR1bSkgMDsKKworCS8q CisJICogQ29weSB0aGUgdmFsdWUgaW50byB0aGUgcXVlcnkgbWVtb3J5IGNvbnRleHQgc28gaXQg c3Vydml2ZXMgdGhlIHRyaWdnZXIKKwkgKiBpbnZvY2F0aW9uLiBUaGUgY2FsbGVyIG11c3QgcmVs ZWFzZSBpdCBhZnRlciB0aGUgY2hlY2suCisJICovCisJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhlc3RhdGUtPmVzX3F1ZXJ5X2N4dCk7CisJc2F2ZWQgPSBkYXR1bUNvcHkoc2xv dC0+dHRzX3ZhbHVlc1tmcG9TdGF0ZS0+ZnBfcmFuZ2VBdHRubyAtIDFdLAorCQkJCQkgIHR5cGNh Y2hlLT50eXBieXZhbCwgdHlwY2FjaGUtPnR5cGxlbik7CisJTWVtb3J5Q29udGV4dFN3aXRjaFRv KG9sZGNvbnRleHQpOworCXJldHVybiBzYXZlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNG b3JQb3J0aW9uT2ZDaGVja1JhbmdlCisgKgorICoJCVZlcmlmeSB0aGF0IEJFRk9SRSBVUERBVEUg dHJpZ2dlcnMgZGlkIG5vdCBjaGFuZ2UgdGhlIEZPUiBQT1JUSU9OIE9GCisgKgkJcmFuZ2UgY29s dW1uLiBFeGVjRm9yUG9ydGlvbk9mU2F2ZVJhbmdlIGNhcHR1cmVkIHRoZSB2YWx1ZSBqdXN0IGJl Zm9yZQorICoJCXRoZSB0cmlnZ2VycyByYW47IGhlcmUsIHJpZ2h0IGFmdGVyIHRoZXkgZmluaXNo LCB3ZSBjb21wYXJlIGl0IGFnYWluc3QKKyAqCQl0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmFpc2Ug YW4gZXJyb3IgaWYgYSB0cmlnZ2VyIGFsdGVyZWQgaXQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRp YyB2b2lkCitFeGVjRm9yUG9ydGlvbk9mQ2hlY2tSYW5nZShNb2RpZnlUYWJsZUNvbnRleHQgKmNv bnRleHQsCisJCQkJCQkgICBSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvLAorCQkJCQkJICAg VHVwbGVUYWJsZVNsb3QgKnNsb3QsCisJCQkJCQkgICBEYXR1bSBvcmlnUmFuZ2UsIGJvb2wgb3Jp Z0lzTnVsbCkKK3sKKwlNb2RpZnlUYWJsZVN0YXRlICptdHN0YXRlID0gY29udGV4dC0+bXRzdGF0 ZTsKKwlNb2RpZnlUYWJsZSAqbm9kZSA9IChNb2RpZnlUYWJsZSAqKSBtdHN0YXRlLT5wcy5wbGFu OworCUZvclBvcnRpb25PZkV4cHIgKmZvclBvcnRpb25PZiA9IChGb3JQb3J0aW9uT2ZFeHByICop IG5vZGUtPmZvclBvcnRpb25PZjsKKwlGb3JQb3J0aW9uT2ZTdGF0ZSAqZnBvU3RhdGUgPSByZXN1 bHRSZWxJbmZvLT5yaV9mb3JQb3J0aW9uT2Y7CisJVHlwZUNhY2hlRW50cnkgKnR5cGNhY2hlID0g ZnBvU3RhdGUtPmZwX2xlZnRvdmVyc3R5cGNhY2hlOworCWJvb2wJCW5ld0lzTnVsbDsKKwlEYXR1 bQkJbmV3UmFuZ2U7CisKKwkvKgorCSAqIEV4ZWNGb3JQb3J0aW9uT2ZTYXZlUmFuZ2UgYWx3YXlz IHJ1bnMganVzdCBiZWZvcmUgdGhlIHRyaWdnZXJzIGFuZAorCSAqIHBvcHVsYXRlcyB0aGUgdHlw ZSBjYWNoZSBlbnRyeSwgc28gaXQgbXVzdCBiZSBzZXQgYnkgdGhlIHRpbWUgd2UgZ2V0CisJICog aGVyZS4KKwkgKi8KKwlBc3NlcnQodHlwY2FjaGUgIT0gTlVMTCk7CisKKwlzbG90X2dldGFsbGF0 dHJzKHNsb3QpOworCW5ld0lzTnVsbCA9IHNsb3QtPnR0c19pc251bGxbZnBvU3RhdGUtPmZwX3Jh bmdlQXR0bm8gLSAxXTsKKwluZXdSYW5nZSA9IHNsb3QtPnR0c192YWx1ZXNbZnBvU3RhdGUtPmZw X3JhbmdlQXR0bm8gLSAxXTsKKworCS8qIENvbXBhcmUgd2l0aCB0aGUgZGVmYXVsdCBidHJlZSBl cXVhbGl0eSBvcGVyYXRvci4gKi8KKwlpZiAoIU9pZElzVmFsaWQodHlwY2FjaGUtPmVxX29wcl9m aW5mby5mbl9vaWQpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCWVycmNvZGUoRVJSQ09ERV9VTkRF RklORURfRlVOQ1RJT04pLAorCQkJCWVycm1zZygiY291bGQgbm90IGlkZW50aWZ5IGFuIGVxdWFs aXR5IG9wZXJhdG9yIGZvciB0eXBlICVzIiwKKwkJCQkJICAgZm9ybWF0X3R5cGVfYmUoZm9yUG9y dGlvbk9mLT5yYW5nZVR5cGUpKSk7CisKKwlpZiAobmV3SXNOdWxsICE9IG9yaWdJc051bGwgfHwK KwkJKCFuZXdJc051bGwgJiYKKwkJICFEYXR1bUdldEJvb2woRnVuY3Rpb25DYWxsMkNvbGwoJnR5 cGNhY2hlLT5lcV9vcHJfZmluZm8sCisJCQkJCQkJCQkJIEludmFsaWRPaWQsCisJCQkJCQkJCQkJ IG5ld1JhbmdlLAorCQkJCQkJCQkJCSBvcmlnUmFuZ2UpKSkpCisJCWVyZXBvcnQoRVJST1IsCisJ CQkJZXJyY29kZShFUlJDT0RFX1RSSUdHRVJFRF9EQVRBX0NIQU5HRV9WSU9MQVRJT04pLAorCQkJ CWVycm1zZygiY2Fubm90IGNoYW5nZSBjb2x1bW4gXCIlc1wiIGZyb20gYSBCRUZPUkUgdHJpZ2dl ciBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gRk9SIFBPUlRJT04gT0YiLAorCQkJCQkgICBmb3JQb3J0 aW9uT2YtPnJhbmdlX25hbWUpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvZm9yX3BvcnRpb25fb2Yub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mb3Jf cG9ydGlvbl9vZi5vdXQKaW5kZXggNDM0MDg5NzIxMTcuLmU5YWZhNGNmZjA3IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Zvcl9wb3J0aW9uX29mLm91dAorKysgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Zvcl9wb3J0aW9uX29mLm91dApAQCAtMTg0Myw2ICsxODQz LDMzIEBAIFNFTEVDVCAqIEZST00gZm9yX3BvcnRpb25fb2ZfdGVzdCBPUkRFUiBCWSB2YWxpZF9h dDsKIERST1AgRlVOQ1RJT04gZnBvX2FwcGVuZF9uYW1lX3N1ZmZpeCBDQVNDQURFOwogTk9USUNF OiAgZHJvcCBjYXNjYWRlcyB0byB0cmlnZ2VyIGZwb19iZWZvcmVfaW5zZXJ0X3JvdyBvbiB0YWJs ZSBmb3JfcG9ydGlvbl9vZl90ZXN0CiBEUk9QIFRBQkxFIGZvcl9wb3J0aW9uX29mX3Rlc3Q7Cist LSBBIEJFRk9SRSBVUERBVEUgdHJpZ2dlciB0aGF0IGNoYW5nZXMgdGhlIGFwcGxpY2F0aW9uLXRp bWUgY29sdW1uIG11c3QKKy0tIHJhaXNlIGFuIGVycm9yLCBqdXN0IGFzIGFuIGV4cGxpY2l0IFNF VCBvbiB0aGF0IGNvbHVtbiBkb2VzLgorQ1JFQVRFIFRBQkxFIGZvcl9wb3J0aW9uX29mX3Rlc3Qg KAorICBpZCBpbnQ0cmFuZ2UsCisgIHZhbGlkX2F0IGRhdGVyYW5nZSwKKyAgbmFtZSB0ZXh0Cisp OworQ1JFQVRFIEZVTkNUSU9OIHRyZ19mcG9fY2hhbmdlX3ZhbGlkX2F0KCkKK1JFVFVSTlMgVFJJ R0dFUiBMQU5HVUFHRSBwbHBnc3FsIEFTCiskJAorQkVHSU4KKyAgTkVXLnZhbGlkX2F0ID0gZGF0 ZXJhbmdlKCcyMDE4LTAxLTAxJywgJzIwMTktMDEtMDEnKTsKKyAgUkVUVVJOIE5FVzsKK0VORDsK KyQkOworQ1JFQVRFIFRSSUdHRVIgZnBvX2JlZm9yZV91cGRhdGVfcm93CisgIEJFRk9SRSBVUERB VEUgT04gZm9yX3BvcnRpb25fb2ZfdGVzdAorICBGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURV UkUgdHJnX2Zwb19jaGFuZ2VfdmFsaWRfYXQoKTsKK0lOU0VSVCBJTlRPIGZvcl9wb3J0aW9uX29m X3Rlc3QgVkFMVUVTICgnWzEsMiknLCAnWzIwMTAtMDEtMDEsMjAyMC0wMS0wMSknLCAnZm9vJyk7 CitVUERBVEUgZm9yX3BvcnRpb25fb2ZfdGVzdAorICBGT1IgUE9SVElPTiBPRiB2YWxpZF9hdCBG Uk9NICcyMDE4LTA1LTAxJyBUTyAnMjAxOC0wNi0wMScKKyAgU0VUIG5hbWUgPSBDT05DQVQobmFt ZSwgJyEnKQorICBXSEVSRSBpZCA9ICdbMSwyKSc7CitFUlJPUjogIGNhbm5vdCBjaGFuZ2UgY29s dW1uICJ2YWxpZF9hdCIgZnJvbSBhIEJFRk9SRSB0cmlnZ2VyIGJlY2F1c2UgaXQgaXMgdXNlZCBp biBGT1IgUE9SVElPTiBPRgorRFJPUCBUUklHR0VSIGZwb19iZWZvcmVfdXBkYXRlX3JvdyBPTiBm b3JfcG9ydGlvbl9vZl90ZXN0OworRFJPUCBGVU5DVElPTiB0cmdfZnBvX2NoYW5nZV92YWxpZF9h dCgpOworRFJPUCBUQUJMRSBmb3JfcG9ydGlvbl9vZl90ZXN0OwogLS0gVGVzdCB3aXRoIG11bHRp cmFuZ2VzCiBDUkVBVEUgVEFCTEUgZm9yX3BvcnRpb25fb2ZfdGVzdDIgKAogICBpZCBpbnQ0cmFu Z2UgTk9UIE5VTEwsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JfcG9ydGlv bl9vZi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JfcG9ydGlvbl9vZi5zcWwKaW5kZXgg N2IwOGY4Y2Y0NWUuLjZhNTBhZmNmN2JiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9mb3JfcG9ydGlvbl9vZi5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZm9yX3BvcnRp b25fb2Yuc3FsCkBAIC0xMjE1LDYgKzEyMTUsMzkgQEAgU0VMRUNUICogRlJPTSBmb3JfcG9ydGlv bl9vZl90ZXN0IE9SREVSIEJZIHZhbGlkX2F0OwogRFJPUCBGVU5DVElPTiBmcG9fYXBwZW5kX25h bWVfc3VmZml4IENBU0NBREU7CiBEUk9QIFRBQkxFIGZvcl9wb3J0aW9uX29mX3Rlc3Q7CiAKKy0t IEEgQkVGT1JFIFVQREFURSB0cmlnZ2VyIHRoYXQgY2hhbmdlcyB0aGUgYXBwbGljYXRpb24tdGlt ZSBjb2x1bW4gbXVzdAorLS0gcmFpc2UgYW4gZXJyb3IsIGp1c3QgYXMgYW4gZXhwbGljaXQgU0VU IG9uIHRoYXQgY29sdW1uIGRvZXMuCisKK0NSRUFURSBUQUJMRSBmb3JfcG9ydGlvbl9vZl90ZXN0 ICgKKyAgaWQgaW50NHJhbmdlLAorICB2YWxpZF9hdCBkYXRlcmFuZ2UsCisgIG5hbWUgdGV4dAor KTsKKworQ1JFQVRFIEZVTkNUSU9OIHRyZ19mcG9fY2hhbmdlX3ZhbGlkX2F0KCkKK1JFVFVSTlMg VFJJR0dFUiBMQU5HVUFHRSBwbHBnc3FsIEFTCiskJAorQkVHSU4KKyAgTkVXLnZhbGlkX2F0ID0g ZGF0ZXJhbmdlKCcyMDE4LTAxLTAxJywgJzIwMTktMDEtMDEnKTsKKyAgUkVUVVJOIE5FVzsKK0VO RDsKKyQkOworCitDUkVBVEUgVFJJR0dFUiBmcG9fYmVmb3JlX3VwZGF0ZV9yb3cKKyAgQkVGT1JF IFVQREFURSBPTiBmb3JfcG9ydGlvbl9vZl90ZXN0CisgIEZPUiBFQUNIIFJPVyBFWEVDVVRFIFBS T0NFRFVSRSB0cmdfZnBvX2NoYW5nZV92YWxpZF9hdCgpOworCitJTlNFUlQgSU5UTyBmb3JfcG9y dGlvbl9vZl90ZXN0IFZBTFVFUyAoJ1sxLDIpJywgJ1syMDEwLTAxLTAxLDIwMjAtMDEtMDEpJywg J2ZvbycpOworCitVUERBVEUgZm9yX3BvcnRpb25fb2ZfdGVzdAorICBGT1IgUE9SVElPTiBPRiB2 YWxpZF9hdCBGUk9NICcyMDE4LTA1LTAxJyBUTyAnMjAxOC0wNi0wMScKKyAgU0VUIG5hbWUgPSBD T05DQVQobmFtZSwgJyEnKQorICBXSEVSRSBpZCA9ICdbMSwyKSc7CisKK0RST1AgVFJJR0dFUiBm cG9fYmVmb3JlX3VwZGF0ZV9yb3cgT04gZm9yX3BvcnRpb25fb2ZfdGVzdDsKK0RST1AgRlVOQ1RJ T04gdHJnX2Zwb19jaGFuZ2VfdmFsaWRfYXQoKTsKK0RST1AgVEFCTEUgZm9yX3BvcnRpb25fb2Zf dGVzdDsKKwogLS0gVGVzdCB3aXRoIG11bHRpcmFuZ2VzCiAKIENSRUFURSBUQUJMRSBmb3JfcG9y dGlvbl9vZl90ZXN0MiAoCi0tIAoyLjQ3LjMKCg== --0000000000001cc1d506547df20a--