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 1uoz3b-00E8lA-L9 for pgsql-hackers@arkaria.postgresql.org; Thu, 21 Aug 2025 06:45:57 +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 1uoz3b-00EWVI-0i for pgsql-hackers@arkaria.postgresql.org; Thu, 21 Aug 2025 06:45:55 +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.94.2) (envelope-from ) id 1uoz3a-00EWV9-Fg for pgsql-hackers@lists.postgresql.org; Thu, 21 Aug 2025 06:45:55 +0000 Received: from mail-vk1-xa29.google.com ([2607:f8b0:4864:20::a29]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uoz3Y-000yai-2H for pgsql-hackers@lists.postgresql.org; Thu, 21 Aug 2025 06:45:54 +0000 Received: by mail-vk1-xa29.google.com with SMTP id 71dfb90a1353d-53b1736eae2so522124e0c.1 for ; Wed, 20 Aug 2025 23:45:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755758752; x=1756363552; 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=oaU+pDABtxch5NueG8ioJKjJb38Yc4DMiVnPiyt3P9g=; b=ZWjeNCp5Tf+pjIdbxgYsdcmU9PhiRQCo3urnNI2g0vMCseVu37TYhx+gliCLkptSyW 3xV3fUvii9m8ehzJZGo+D4VOe+N7A9b8mLywPbs/p/Ls58quK43RJS3g4y9IQaC2XxDh nVlsvg3Wd0cOSQ3z705Raw8ji8+zKjxB0Kphp4yzChEBcDaFcX26nCuwKuA9lzpUzUE7 S/qA3zQ+g+fY+x6LdPN5aO4TJUYU04xnLu+mlsfZOQJF6pKWu1eZ+scjIGwJ17vU41iZ RG2m5fJ6TPsb9jWfNgVrOTJwRuebf6UcAJqYNccB7WGrwC4fY4w0oD1ON2dCDVWcV3aa rWRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755758752; x=1756363552; 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=oaU+pDABtxch5NueG8ioJKjJb38Yc4DMiVnPiyt3P9g=; b=Xucgtd2Nbox2/5YFw/cLiYG49eevFEHlm+8J646rW2Ah2J93nxLNQYF+aS+Vb+gFGQ AKkvPQzmk7aD6uu5As3CRW9Pfw6WW4uYD0roKucFzGl/MUMdCGN7oos46+nuDF8kWQ9q /0NAZgYmSVtF/4yIZTtwFRyAwjXu7whZ8jjf3MrzUaEIeJZ+4kpDMNiRuNyRNicaSmeH jHsbI+9GuMFqksfO2RlAQZlJKh/MG+XofGGk1jPCNjUcjc5SBTWCMHMGQ4Kb9ErdEAyv r+WdqlCQj3YP+zO/omjgE5EzkGV/BMMod+akcLXFYmUH9lii2OoNlwCF3PtVYWGyRTEs f9gQ== X-Forwarded-Encrypted: i=1; AJvYcCXrbbCAVp2n+44BbtLv2AHeInysgzqu4yAMyTBCB4EdDN81nHkt65wIBayiNICjBZ4Am+GZTQdD4LhQEXAz@lists.postgresql.org X-Gm-Message-State: AOJu0YxZBzJ1tosiNv+JaTURpg/rIyI9gK/dP6JcMZ8A01py+FNDX9vg 78wTxgS0r9Pi9dia80Ehy2Sd8FDzu8U/4XXDYVbBDIERxhh6iLRHDSJdrdIzZUHx1qreXbDfSRa qWJiNkEDhKXbCBxqPSSjY/VjMWyHdehI= X-Gm-Gg: ASbGncut9dFbx7kZAstpxsRFnS85OXd6aLznIggQV73ZQJTJsYB6Ljut4jzncdBsB+T paOZpTtw4TS42023DGHj+YyzFQpHsR0ww7chnSarbfHh4QsSp1OyBTvx6kgUtkEPVQiMggF0qok jCqxHoBZXwrOBVywT24s4aD+Qc+dY2xpP7Mcz1R9fhGyefP026CxG4eLUArU+ro+/axjwoUK/Dt riOV5poVseoHdGc3fhawfQjfyh/2Vjd8Yfjyps= X-Google-Smtp-Source: AGHT+IF7ciF8Q4CNrW6C2rz96f3qw8qNlPg8C6HZ0Ak/dg2mq/3jkhEBW0XdCpJGA3V4OfFIWwUr0OfkoWQUnVCEEbo= X-Received: by 2002:a05:6102:8014:b0:4db:e01:f2db with SMTP id ada2fe7eead31-51bdbb5a100mr427492137.0.1755758752334; Wed, 20 Aug 2025 23:45:52 -0700 (PDT) MIME-Version: 1.0 References: <171085360143.2046436.7217841141682511557.pgcf@coridan.postgresql.org> <0b3907b4-83b9-4873-9feb-2b60b29cda33@postgrespro.ru> <4f19550b-eb41-4649-8bf5-566dc020a720@postgrespro.ru> <195b67ee-ef41-4451-9396-844442eef1a4@postgrespro.ru> In-Reply-To: From: jian he Date: Thu, 21 Aug 2025 14:45:12 +0800 X-Gm-Features: Ac12FXznkz4u63filN1_f48kRHGp4Hwch0AO4O5P5wFL-kQF96QWhp2zXyQzoF0 Message-ID: Subject: Re: Add SPLIT PARTITION/MERGE PARTITIONS commands To: Dmitry Koval Cc: Alexander Korotkov , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000bec2f3063cda70e9" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000bec2f3063cda70e9 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Aug 21, 2025 at 10:53=E2=80=AFAM jian he wrote: > > > this time, I only checked > > v52-0001-Implement-ALTER-TABLE-.-MERGE-PARTITIONS-.-comma.patch > > hi. we may need to change checkPartition. +-- ERROR: "sales_apr2022" is not a table +ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_apr2022) INTO sales_feb_mar_apr2022; +ERROR: "sales_apr2022" is not a table +HINT: ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions +ERROR: "sales_apr2022" is not a table the above error message seems not intuitive to me. IMV, the error message pattern should be something like: ERROR: can not merge relation \"%s\" with other partitions DETAIL: "sales_apr2022" is not a table HINT: ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partition +/* + * checkPartition + * Check whether partRelOid is a leaf partition of the parent table (rel). + * Partition with OID partRelOid must be locked before function call. + */ +static void +checkPartition(Relation rel, Oid partRelOid) "Partition with OID partRelOid must be locked before function call." we can remove this sentence. otherwise, "function call" seems confusing? +SET search_path =3D pg_temp, partitions_merge_schema, public; + +BEGIN; +CREATE TABLE t (i int) PARTITION BY RANGE (i); +CREATE TABLE tp_0_1 PARTITION OF t FOR VALUES FROM (0) TO (1); +CREATE TABLE tp_1_2 PARTITION OF t FOR VALUES FROM (1) TO (2); +SELECT c.oid::pg_catalog.regclass, c.relpersistence FROM pg_catalog.pg_class c WHERE c.oid =3D 't'::regclass; +EXECUTE get_partition_info('{t}'); +DEALLOCATE get_partition_info; +SET search_path =3D partitions_merge_schema, pg_temp, public; + +-- Can't merge temporary partitions into a persistent partition +ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; +ROLLBACK; "+-- Can't merge temporary partitions into a persistent partition" means +ALTER TABLE t MERGE PARTITIONS (tp_0_1, tp_1_2) INTO tp_0_2; should error out, but it didn't. then I found out: +/* + * ALTER TABLE MERGE PARTITIONS INTO + */ +static void +ATExecMergePartitions(List **wqueue, AlteredTableInfo *tab, Relation rel, + PartitionCmd *cmd, AlterTableUtilityContext *context) +{ .... + /* + * Look up existing relation by new partition name, check we have + * permission to create there, lock it against concurrent drop, and mark + * stmt->relation as RELPERSISTENCE_TEMP if a temporary namespace is + * selected. + */ + cmd->name->relpersistence =3D rel->rd_rel->relpersistence; + RangeVarGetAndCheckCreationNamespace(cmd->name, NoLock, &existingRelid); ``cmd->name->relpersistence`` will be adjusted in RangeVarGetAndCheckCreationNamespace->RangeVarAdjustRelationPersistence. + cmd->name->relpersistence =3D rel->rd_rel->relpersistence; seems wrong? comments "stmt->relation" not sure what it refers to? attached patch did following the changes: * remove line ``cmd->name->relpersistence =3D rel->rd_rel->relpersistence;= `` * refactor relpersistence, temp schema related regress tests. --000000000000bec2f3063cda70e9 Content-Type: application/octet-stream; name="v52-0001-refactor-relpersistence-related-issue.no-cfbot" Content-Disposition: attachment; filename="v52-0001-refactor-relpersistence-related-issue.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mel1eeut0 RnJvbSBhMWM3NzlmZjAzMGI5YjJmZmFlYjE1ODA2Y2FmZTBjN2ZlZDM0ZjQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFRodSwgMjEgQXVnIDIwMjUgMTQ6Mjg6MzMgKzA4MDAKU3ViamVjdDogW1BBVENIIHY1 MiAxLzFdIHJlZmFjdG9yIHJlbHBlcnNpc3RlbmNlIHJlbGF0ZWQgaXNzdWUKCi0tLQogc3JjL2Jh Y2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgIDEgLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25fbWVyZ2Uub3V0IHwgNjAgKysrKysrKysrKystLS0t LS0tLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX21lcmdlLnNxbCAgICAgIHwgNTEg KysrKysrKystLS0tLS0tLQogMyBmaWxlcyBjaGFuZ2VkLCA2MiBpbnNlcnRpb25zKCspLCA1MCBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMu YyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCmluZGV4IGNjMjRhOTJjNTA0Li4w ZDUyMDc0NTY3MCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMK KysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKQEAgLTIyNzkzLDcgKzIyNzkz LDYgQEAgQVRFeGVjTWVyZ2VQYXJ0aXRpb25zKExpc3QgKip3cXVldWUsIEFsdGVyZWRUYWJsZUlu Zm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCSAqIHN0bXQtPnJlbGF0aW9uIGFzIFJFTFBFUlNJU1RF TkNFX1RFTVAgaWYgYSB0ZW1wb3JhcnkgbmFtZXNwYWNlIGlzCiAJICogc2VsZWN0ZWQuCiAJICov Ci0JY21kLT5uYW1lLT5yZWxwZXJzaXN0ZW5jZSA9IHJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5j ZTsKIAlSYW5nZVZhckdldEFuZENoZWNrQ3JlYXRpb25OYW1lc3BhY2UoY21kLT5uYW1lLCBOb0xv Y2ssICZleGlzdGluZ1JlbGlkKTsKIAogCS8qCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3BhcnRpdGlvbl9tZXJnZS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3BhcnRpdGlvbl9tZXJnZS5vdXQKaW5kZXggNTE1OWZkMzdkODIuLjAwZWQyNTE2YzY4IDEwMDY0 NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9tZXJnZS5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25fbWVyZ2Uub3V0CkBAIC02NTYs MjggKzY1Niw2IEBAIERST1AgVEFCTEUgdDM7CiBEUk9QIFRBQkxFIHQyOwogRFJPUCBUQUJMRSB0 MTsKIC0tCi0tLSBUcnkgdG8gTUVSR0UgcGFydGl0aW9ucyBvZiB0ZW1wb3JhcnkgdGFibGUuCi0t LQotQ1JFQVRFIFRFTVAgVEFCTEUgdCAoaSBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaSk7Ci1D UkVBVEUgVEVNUCBUQUJMRSB0cF8wXzEgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgw KSBUTyAoMSk7Ci1DUkVBVEUgVEVNUCBUQUJMRSB0cF8xXzIgUEFSVElUSU9OIE9GIHQgRk9SIFZB TFVFUyBGUk9NICgxKSBUTyAoMik7Ci1FWEVDVVRFIGdldF9wYXJ0aXRpb25faW5mbygne3R9Jyk7 Ci0gIG9pZCAgIHwgcmVscGVyc2lzdGVuY2UgfCByZWxraW5kIHwgaW5oZGV0YWNocGVuZGluZyB8 ICAgICAgICBwZ19nZXRfZXhwciAgICAgICAgIAotLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K LSB0cF8wXzEgfCB0ICAgICAgICAgICAgICB8IHIgICAgICAgfCBmICAgICAgICAgICAgICAgIHwg Rk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMSkKLSB0cF8xXzIgfCB0ICAgICAgICAgICAgICB8IHIg ICAgICAgfCBmICAgICAgICAgICAgICAgIHwgRk9SIFZBTFVFUyBGUk9NICgxKSBUTyAoMikKLSgy IHJvd3MpCi0KLUFMVEVSIFRBQkxFIHQgTUVSR0UgUEFSVElUSU9OUyAodHBfMF8xLCB0cF8xXzIp IElOVE8gdHBfMF8yOwotLS0gUGFydGl0aW9uIHNob3VsZCBiZSB0ZW1wb3JhcnkuCi1FWEVDVVRF IGdldF9wYXJ0aXRpb25faW5mbygne3R9Jyk7Ci0gIG9pZCAgIHwgcmVscGVyc2lzdGVuY2UgfCBy ZWxraW5kIHwgaW5oZGV0YWNocGVuZGluZyB8ICAgICAgICBwZ19nZXRfZXhwciAgICAgICAgIAot LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB0cF8wXzIgfCB0ICAgICAgICAgICAgICB8IHIg ICAgICAgfCBmICAgICAgICAgICAgICAgIHwgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMikKLSgx IHJvdykKLQotRFJPUCBUQUJMRSB0OwotLS0KIC0tIENoZWNrIHRoZSBwYXJ0aXRpb24gaW5kZXgg bmFtZSBpZiB0aGUgcGFydGl0aW9uIG5hbWUgaXMgdGhlIHNhbWUgYXMgb25lCiAtLSBvZiB0aGUg bWVyZ2VkIHBhcnRpdGlvbnMuCiAtLQpAQCAtNzAzLDggKzY4MSwzNyBAQCBOb3QtbnVsbCBjb25z dHJhaW50czoKIAogRFJPUCBUQUJMRSB0OwogLS0KKy0tIFRyeSB0byBNRVJHRSBwYXJ0aXRpb25z IG9mIHRlbXBvcmFyeSB0YWJsZS4KKy0tCitCRUdJTjsKK1NIT1cgc2VhcmNoX3BhdGg7CisgICAg ICAgICAgIHNlYXJjaF9wYXRoICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIHBhcnRpdGlvbnNfbWVyZ2Vfc2NoZW1hLCBwdWJsaWMKKygxIHJvdykKKworQ1JF QVRFIFRFTVAgVEFCTEUgdCAoaSBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaSkgT04gQ09NTUlU IERST1A7CitDUkVBVEUgVEVNUCBUQUJMRSB0cF8wXzEgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVF UyBGUk9NICgwKSBUTyAoMSk7CitDUkVBVEUgVEVNUCBUQUJMRSB0cF8xXzIgUEFSVElUSU9OIE9G IHQgRk9SIFZBTFVFUyBGUk9NICgxKSBUTyAoMik7CitDUkVBVEUgVEVNUCBUQUJMRSB0cF8yXzMg UEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgyKSBUTyAoMyk7CitDUkVBVEUgVEVNUCBU QUJMRSB0cF8zXzQgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgzKSBUTyAoNCk7CitB TFRFUiBUQUJMRSB0IE1FUkdFIFBBUlRJVElPTlMgKHRwXzBfMSwgdHBfMV8yKSBJTlRPIHBnX3Rl bXAudHBfMF8yOworQUxURVIgVEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8wXzIsIHRwXzJf MykgSU5UTyBwZ190ZW1wLnRwXzBfMzsKKy0tIFBhcnRpdGlvbiBzaG91bGQgYmUgdGVtcG9yYXJ5 LgorRVhFQ1VURSBnZXRfcGFydGl0aW9uX2luZm8oJ3t0fScpOworICBvaWQgICB8IHJlbHBlcnNp c3RlbmNlIHwgcmVsa2luZCB8IGluaGRldGFjaHBlbmRpbmcgfCAgICAgICAgcGdfZ2V0X2V4cHIg ICAgICAgICAKKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdHBfMF8zIHwgdCAgICAgICAg ICAgICAgfCByICAgICAgIHwgZiAgICAgICAgICAgICAgICB8IEZPUiBWQUxVRVMgRlJPTSAoMCkg VE8gKDMpCisgdHBfM180IHwgdCAgICAgICAgICAgICAgfCByICAgICAgIHwgZiAgICAgICAgICAg ICAgICB8IEZPUiBWQUxVRVMgRlJPTSAoMykgVE8gKDQpCisoMiByb3dzKQorCitBTFRFUiBUQUJM RSB0IE1FUkdFIFBBUlRJVElPTlMgKHRwXzBfMywgdHBfM180KSBJTlRPIHRwXzBfNDsgLS1lcnJv cgorRVJST1I6ICBjYW5ub3QgY3JlYXRlIGEgcGVybWFuZW50IHJlbGF0aW9uIGFzIHBhcnRpdGlv biBvZiB0ZW1wb3JhcnkgcmVsYXRpb24gInQiCitST0xMQkFDSzsKKy0tCiAtLSBUcnkgbWl4aW5n IHBlcm1hbmVudCBhbmQgdGVtcG9yYXJ5IHBhcnRpdGlvbnMuCiAtLQorQkVHSU47CiBTRVQgc2Vh cmNoX3BhdGggPSBwYXJ0aXRpb25zX21lcmdlX3NjaGVtYSwgcGdfdGVtcCwgcHVibGljOwogQ1JF QVRFIFRBQkxFIHQgKGkgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGkpOwogQ1JFQVRFIFRBQkxF IHRwXzBfMSBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxKTsKQEAgLTcy MiwxNyArNzI5LDE5IEBAIEVYRUNVVEUgZ2V0X3BhcnRpdGlvbl9pbmZvKCd7dH0nKTsKICB0cF8x XzIgfCBwICAgICAgICAgICAgICB8IHIgICAgICAgfCBmICAgICAgICAgICAgICAgIHwgRk9SIFZB TFVFUyBGUk9NICgxKSBUTyAoMikKICgyIHJvd3MpCiAKK1NBVkVQT0lOVCBzOwogU0VUIHNlYXJj aF9wYXRoID0gcGdfdGVtcCwgcGFydGl0aW9uc19tZXJnZV9zY2hlbWEsIHB1YmxpYzsKIC0tIENh bid0IG1lcmdlIHBlcnNpc3RlbnQgcGFydGl0aW9ucyBpbnRvIGEgdGVtcG9yYXJ5IHBhcnRpdGlv bgogQUxURVIgVEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8wXzEsIHRwXzFfMikgSU5UTyB0 cF8wXzI7CiBFUlJPUjogIGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgcmVsYXRpb24gYXMgcGFy dGl0aW9uIG9mIHBlcm1hbmVudCByZWxhdGlvbiAidCIKK1JPTExCQUNLIFRPIFNBVkVQT0lOVCBz OwogU0VUIHNlYXJjaF9wYXRoID0gcGFydGl0aW9uc19tZXJnZV9zY2hlbWEsIHB1YmxpYzsKIC0t IENhbid0IG1lcmdlIHBlcnNpc3RlbnQgcGFydGl0aW9ucyBpbnRvIGEgdGVtcG9yYXJ5IHBhcnRp dGlvbgogQUxURVIgVEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8wXzEsIHRwXzFfMikgSU5U TyBwZ190ZW1wLnRwXzBfMjsKIEVSUk9SOiAgY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSByZWxh dGlvbiBhcyBwYXJ0aXRpb24gb2YgcGVybWFuZW50IHJlbGF0aW9uICJ0IgotRFJPUCBUQUJMRSB0 OwotU0VUIHNlYXJjaF9wYXRoID0gcGdfdGVtcCwgcGFydGl0aW9uc19tZXJnZV9zY2hlbWEsIHB1 YmxpYzsKK1JPTExCQUNLOwogQkVHSU47CitTRVQgc2VhcmNoX3BhdGggPSBwZ190ZW1wLCBwYXJ0 aXRpb25zX21lcmdlX3NjaGVtYSwgcHVibGljOwogQ1JFQVRFIFRBQkxFIHQgKGkgaW50KSBQQVJU SVRJT04gQlkgUkFOR0UgKGkpOwogQ1JFQVRFIFRBQkxFIHRwXzBfMSBQQVJUSVRJT04gT0YgdCBG T1IgVkFMVUVTIEZST00gKDApIFRPICgxKTsKIENSRUFURSBUQUJMRSB0cF8xXzIgUEFSVElUSU9O IE9GIHQgRk9SIFZBTFVFUyBGUk9NICgxKSBUTyAoMik7CkBAIC03NDksMTEgKzc1OCwxMiBAQCBF WEVDVVRFIGdldF9wYXJ0aXRpb25faW5mbygne3R9Jyk7CiAgdHBfMV8yIHwgdCAgICAgICAgICAg ICAgfCByICAgICAgIHwgZiAgICAgICAgICAgICAgICB8IEZPUiBWQUxVRVMgRlJPTSAoMSkgVE8g KDIpCiAoMiByb3dzKQogCi1ERUFMTE9DQVRFIGdldF9wYXJ0aXRpb25faW5mbzsKIFNFVCBzZWFy Y2hfcGF0aCA9IHBhcnRpdGlvbnNfbWVyZ2Vfc2NoZW1hLCBwZ190ZW1wLCBwdWJsaWM7CiAtLSBD YW4ndCBtZXJnZSB0ZW1wb3JhcnkgcGFydGl0aW9ucyBpbnRvIGEgcGVyc2lzdGVudCBwYXJ0aXRp b24KIEFMVEVSIFRBQkxFIHQgTUVSR0UgUEFSVElUSU9OUyAodHBfMF8xLCB0cF8xXzIpIElOVE8g dHBfMF8yOworRVJST1I6ICBjYW5ub3QgY3JlYXRlIGEgcGVybWFuZW50IHJlbGF0aW9uIGFzIHBh cnRpdGlvbiBvZiB0ZW1wb3JhcnkgcmVsYXRpb24gInQiCiBST0xMQkFDSzsKK0RFQUxMT0NBVEUg Z2V0X3BhcnRpdGlvbl9pbmZvOwogLS0gQ2hlY2sgdGhlIG5ldyBwYXJ0aXRpb24gaW5oZXJpdHMg cGFyZW50J3MgdGFibGVzcGFjZQogU0VUIHNlYXJjaF9wYXRoID0gcGFydGl0aW9uc19tZXJnZV9z Y2hlbWEsIHB1YmxpYzsKIENSRUFURSBUQUJMRSB0IChpIGludCBQUklNQVJZIEtFWSBVU0lORyBJ TkRFWCBUQUJMRVNQQUNFIHJlZ3Jlc3NfdGJsc3BhY2UpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9wYXJ0aXRpb25fbWVyZ2Uuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFy dGl0aW9uX21lcmdlLnNxbAppbmRleCBiYjUzODZmZTM4MS4uMDgxMmQzMzE4NmMgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9tZXJnZS5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX21lcmdlLnNxbApAQCAtNDQ5LDIxICs0NDksNiBAQCBE Uk9QIFRBQkxFIHQzOwogRFJPUCBUQUJMRSB0MjsKIERST1AgVEFCTEUgdDE7CiAKLS0tCi0tLSBU cnkgdG8gTUVSR0UgcGFydGl0aW9ucyBvZiB0ZW1wb3JhcnkgdGFibGUuCi0tLQotQ1JFQVRFIFRF TVAgVEFCTEUgdCAoaSBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaSk7Ci1DUkVBVEUgVEVNUCBU QUJMRSB0cF8wXzEgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMSk7Ci1D UkVBVEUgVEVNUCBUQUJMRSB0cF8xXzIgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgx KSBUTyAoMik7Ci0KLUVYRUNVVEUgZ2V0X3BhcnRpdGlvbl9pbmZvKCd7dH0nKTsKLQotQUxURVIg VEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8wXzEsIHRwXzFfMikgSU5UTyB0cF8wXzI7Ci0K LS0tIFBhcnRpdGlvbiBzaG91bGQgYmUgdGVtcG9yYXJ5LgotRVhFQ1VURSBnZXRfcGFydGl0aW9u X2luZm8oJ3t0fScpOwotCi1EUk9QIFRBQkxFIHQ7CiAKIC0tCiAtLSBDaGVjayB0aGUgcGFydGl0 aW9uIGluZGV4IG5hbWUgaWYgdGhlIHBhcnRpdGlvbiBuYW1lIGlzIHRoZSBzYW1lIGFzIG9uZQpA QCAtNDgzLDQ4ICs0NjgsNjYgQEAgQUxURVIgVEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8x XzIsIHRwXzBfMSkgSU5UTyB0cF8xXzI7CiAKIERST1AgVEFCTEUgdDsKIAorLS0KKy0tIFRyeSB0 byBNRVJHRSBwYXJ0aXRpb25zIG9mIHRlbXBvcmFyeSB0YWJsZS4KKy0tCitCRUdJTjsKK1NIT1cg c2VhcmNoX3BhdGg7CitDUkVBVEUgVEVNUCBUQUJMRSB0IChpIGludCkgUEFSVElUSU9OIEJZIFJB TkdFIChpKSBPTiBDT01NSVQgRFJPUDsKK0NSRUFURSBURU1QIFRBQkxFIHRwXzBfMSBQQVJUSVRJ T04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxKTsKK0NSRUFURSBURU1QIFRBQkxFIHRw XzFfMiBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDEpIFRPICgyKTsKK0NSRUFURSBU RU1QIFRBQkxFIHRwXzJfMyBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDIpIFRPICgz KTsKK0NSRUFURSBURU1QIFRBQkxFIHRwXzNfNCBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZS T00gKDMpIFRPICg0KTsKKworQUxURVIgVEFCTEUgdCBNRVJHRSBQQVJUSVRJT05TICh0cF8wXzEs IHRwXzFfMikgSU5UTyBwZ190ZW1wLnRwXzBfMjsKK0FMVEVSIFRBQkxFIHQgTUVSR0UgUEFSVElU SU9OUyAodHBfMF8yLCB0cF8yXzMpIElOVE8gcGdfdGVtcC50cF8wXzM7CisKKy0tIFBhcnRpdGlv biBzaG91bGQgYmUgdGVtcG9yYXJ5LgorRVhFQ1VURSBnZXRfcGFydGl0aW9uX2luZm8oJ3t0fScp OworCitBTFRFUiBUQUJMRSB0IE1FUkdFIFBBUlRJVElPTlMgKHRwXzBfMywgdHBfM180KSBJTlRP IHRwXzBfNDsgLS1lcnJvcgorUk9MTEJBQ0s7CisKIC0tCiAtLSBUcnkgbWl4aW5nIHBlcm1hbmVu dCBhbmQgdGVtcG9yYXJ5IHBhcnRpdGlvbnMuCiAtLQorQkVHSU47CiBTRVQgc2VhcmNoX3BhdGgg PSBwYXJ0aXRpb25zX21lcmdlX3NjaGVtYSwgcGdfdGVtcCwgcHVibGljOwogQ1JFQVRFIFRBQkxF IHQgKGkgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGkpOwogQ1JFQVRFIFRBQkxFIHRwXzBfMSBQ QVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxKTsKIENSRUFURSBUQUJMRSB0 cF8xXzIgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgxKSBUTyAoMik7CiAKIFNFTEVD VCBjLm9pZDo6cGdfY2F0YWxvZy5yZWdjbGFzcywgYy5yZWxwZXJzaXN0ZW5jZSBGUk9NIHBnX2Nh dGFsb2cucGdfY2xhc3MgYyBXSEVSRSBjLm9pZCA9ICd0Jzo6cmVnY2xhc3M7Ci0KIEVYRUNVVEUg Z2V0X3BhcnRpdGlvbl9pbmZvKCd7dH0nKTsKK1NBVkVQT0lOVCBzOwogCiBTRVQgc2VhcmNoX3Bh dGggPSBwZ190ZW1wLCBwYXJ0aXRpb25zX21lcmdlX3NjaGVtYSwgcHVibGljOwotCiAtLSBDYW4n dCBtZXJnZSBwZXJzaXN0ZW50IHBhcnRpdGlvbnMgaW50byBhIHRlbXBvcmFyeSBwYXJ0aXRpb24K IEFMVEVSIFRBQkxFIHQgTUVSR0UgUEFSVElUSU9OUyAodHBfMF8xLCB0cF8xXzIpIElOVE8gdHBf MF8yOwogCitST0xMQkFDSyBUTyBTQVZFUE9JTlQgczsKIFNFVCBzZWFyY2hfcGF0aCA9IHBhcnRp dGlvbnNfbWVyZ2Vfc2NoZW1hLCBwdWJsaWM7Ci0KIC0tIENhbid0IG1lcmdlIHBlcnNpc3RlbnQg cGFydGl0aW9ucyBpbnRvIGEgdGVtcG9yYXJ5IHBhcnRpdGlvbgogQUxURVIgVEFCTEUgdCBNRVJH RSBQQVJUSVRJT05TICh0cF8wXzEsIHRwXzFfMikgSU5UTyBwZ190ZW1wLnRwXzBfMjsKLURST1Ag VEFCTEUgdDsKLQotU0VUIHNlYXJjaF9wYXRoID0gcGdfdGVtcCwgcGFydGl0aW9uc19tZXJnZV9z Y2hlbWEsIHB1YmxpYzsKK1JPTExCQUNLOwogCiBCRUdJTjsKK1NFVCBzZWFyY2hfcGF0aCA9IHBn X3RlbXAsIHBhcnRpdGlvbnNfbWVyZ2Vfc2NoZW1hLCBwdWJsaWM7CiBDUkVBVEUgVEFCTEUgdCAo aSBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaSk7CiBDUkVBVEUgVEFCTEUgdHBfMF8xIFBBUlRJ VElPTiBPRiB0IEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEpOwogQ1JFQVRFIFRBQkxFIHRwXzFf MiBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDEpIFRPICgyKTsKIAogU0VMRUNUIGMu b2lkOjpwZ19jYXRhbG9nLnJlZ2NsYXNzLCBjLnJlbHBlcnNpc3RlbmNlIEZST00gcGdfY2F0YWxv Zy5wZ19jbGFzcyBjIFdIRVJFIGMub2lkID0gJ3QnOjpyZWdjbGFzczsKLQogRVhFQ1VURSBnZXRf cGFydGl0aW9uX2luZm8oJ3t0fScpOwogCi1ERUFMTE9DQVRFIGdldF9wYXJ0aXRpb25faW5mbzsK LQogU0VUIHNlYXJjaF9wYXRoID0gcGFydGl0aW9uc19tZXJnZV9zY2hlbWEsIHBnX3RlbXAsIHB1 YmxpYzsKIAogLS0gQ2FuJ3QgbWVyZ2UgdGVtcG9yYXJ5IHBhcnRpdGlvbnMgaW50byBhIHBlcnNp c3RlbnQgcGFydGl0aW9uCiBBTFRFUiBUQUJMRSB0IE1FUkdFIFBBUlRJVElPTlMgKHRwXzBfMSwg dHBfMV8yKSBJTlRPIHRwXzBfMjsKIFJPTExCQUNLOwogCitERUFMTE9DQVRFIGdldF9wYXJ0aXRp b25faW5mbzsKKwogLS0gQ2hlY2sgdGhlIG5ldyBwYXJ0aXRpb24gaW5oZXJpdHMgcGFyZW50J3Mg dGFibGVzcGFjZQogU0VUIHNlYXJjaF9wYXRoID0gcGFydGl0aW9uc19tZXJnZV9zY2hlbWEsIHB1 YmxpYzsKIENSRUFURSBUQUJMRSB0IChpIGludCBQUklNQVJZIEtFWSBVU0lORyBJTkRFWCBUQUJM RVNQQUNFIHJlZ3Jlc3NfdGJsc3BhY2UpCi0tIAoyLjM0LjEKCg== --000000000000bec2f3063cda70e9--