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 1uPcPa-00Bk2G-TR for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Jun 2025 07:31:47 +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 1uPcPX-00A79m-QF for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Jun 2025 07:31:44 +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 1uPcPX-00A79e-8g for pgsql-hackers@lists.postgresql.org; Thu, 12 Jun 2025 07:31:44 +0000 Received: from mail-vs1-xe2d.google.com ([2607:f8b0:4864:20::e2d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uPcPW-001Z5s-0R for pgsql-hackers@lists.postgresql.org; Thu, 12 Jun 2025 07:31:43 +0000 Received: by mail-vs1-xe2d.google.com with SMTP id ada2fe7eead31-4e7b345f1e3so380937137.2 for ; Thu, 12 Jun 2025 00:31:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749713501; x=1750318301; 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=lEU0jNAORKYwNyqwk62W35+cuZ/hGeBSPHrXXoSMB2M=; b=XnosgA5PXrkXwg/fwM8FfS/uKnO04hKZiwyRz5Y3fdzHYSYShPi3QncaQmUwRgvxRC tIbbu/LcqcS+qC7pWXbkAHRRewoiovAukOFgGhulfjdZCjHdSSy6IjbUjeDw7nT+CUp4 IRvRKlS7v8BJbEA3a109ezL+mkv8L9eEMhw0ZGCd6HTtcw64viwAyj6yxpB4gpsCsf3v QUGvp1I/s4JY41w5aBWVVQGeAwJvsr1QdcUEtkJsq/5pirHNG0Up72BfVtUGIVpvt3Un AnBlhnbwLxY/8fj2OPL+RDeZ0zInmUd25OUcqrAp9LPy+OxYl/gCFPzJj7EKUJT+pEzQ UHvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749713501; x=1750318301; 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=lEU0jNAORKYwNyqwk62W35+cuZ/hGeBSPHrXXoSMB2M=; b=v/hr9zvqfqbwAIpBwAgJ2XKNPPUKlK8HRHNxzqfgdO/9QChX/t2cqUszJoa9TZkaTp uk/NgJ7Usp/Gjzf9qx8DxYL9FVOxNZZZVcR7HDoxfJXhmqVl97J5LlsWlWpb1Hu3uThE wol6Y2gm+eBvHWU1gehQpgW5Eq4Ek0XEIsuN71PBdLpJ0cAt++S61u9k23lIh8Q/DjXa x+9hRHmgMSrGDG6aLaSyNAa24jnchPlHdLH7D1Q7BHCyfHZbjlhoreTZv1VHTe/eEoSf bPrpYEaRLO+l3W/wfWA8cbHRQugTol/QQWxiLT4gvIdyAJJ3Gvds09MFDycT4QuG2yrw 70Dw== X-Forwarded-Encrypted: i=1; AJvYcCWaaGDlsfGb8LyWVEGGw2vCWjF6vMtC0mL/zyWMhGvefSgb5BTGux3uL4f70wsQyGY2Ko+D6ZyjOwC/9rPf@lists.postgresql.org X-Gm-Message-State: AOJu0Yw4rPIX0bC5r7bilAGj7S22liYtZCR6Sh43bBXaNLakClozblsD aK2piwQJvnPfEk4um0PcZwkOPSRsw9HiuESdsMnwbCmq78cnFwm2Ec4TGQssWhYxQorxaQNKgK3 Nx+N94V3uZEl19dzU7vH4Ce30S5K0acE= X-Gm-Gg: ASbGncuAvabum49XcCfZpHwUXNmTFO6c9JkcMOU6D+tHO2Vp0W+cnH5+ebqqhi6TkBw fQ8gHsxEnNqLBU9qtl0N0p7vGcjd4BfyFL1oJasRiyu6JWvTq989xpsnmfS8ZeNbNkyRtbYSDqK z4uxwW5igubqf0U2ZRHqzLkRHWR5GbrhjO5WulPzSytw== X-Google-Smtp-Source: AGHT+IFfW0gsLpB5K3+27cKZalCcbUagFI/ene6AyBrdJx7ZKfbqSgdgVlufCMBinMejV4RJHsoLHJhBNvd9MXNAtDE= X-Received: by 2002:a05:6102:5091:b0:4e7:866c:5cd2 with SMTP id ada2fe7eead31-4e7ce7fda4dmr1733781137.2.1749713501121; Thu, 12 Jun 2025 00:31:41 -0700 (PDT) MIME-Version: 1.0 References: <171085360143.2046436.7217841141682511557.pgcf@coridan.postgresql.org> <4e2764f7-f6be-478f-8d7f-f921dbd10f5f@postgrespro.ru> <7fdaf3e8-4c05-4739-bee6-98acc068d1c7@postgrespro.ru> <4433b492-9e97-4334-96d9-ddaaa5083099@postgrespro.ru> <67ecf5fb-e63d-4284-be75-d0479eef81aa@postgrespro.ru> <884bcf9e-d6e3-4b0c-8dcb-7f2110070ac9@postgrespro.ru> <26fe1a14-89aa-415d-a1b1-176526e54d3b@postgrespro.ru> In-Reply-To: From: jian he Date: Thu, 12 Jun 2025 15:31:04 +0800 X-Gm-Features: AX0GCFus6Rti5iVxwO5veYR2zhTpfV-56MToKkvTWtZHrRCUaIMMgHlM3jbocW4 Message-ID: Subject: Re: Add SPLIT PARTITION/MERGE PARTITIONS commands To: Dmitry Koval Cc: Junwang Zhao , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000b1a64506375aebe0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b1a64506375aebe0 Content-Type: text/plain; charset="UTF-8" hi. +/* + * check_two_partitions_bounds_range + * + * (function for BY RANGE partitioning) + * + * This is a helper function for check_partitions_for_split() and + * calculate_partition_bound_for_merge(). check_partitions_for_split does not exist in v43-0001. + /* + * Rename the existing partition with a temporary name, leaving it + * free for the new partition. We don't need to care about this + * in the future because we're going to eventually drop the + * existing partition anyway. + */ + RenameRelationInternal(RelationGetRelid(sameNamePartition), + tmpRelName, false, false); the third argument, is_internal should set to true? + /* Cycle for CHECK constraints. */ + for (ccnum = 0; ccnum < constr->num_check; ccnum++) + { + char *ccname = constr->check[ccnum].ccname; + char *ccbin = constr->check[ccnum].ccbin; + bool ccenforced = constr->check[ccnum].ccenforced; + bool ccnoinherit = constr->check[ccnum].ccnoinherit; a partitioned table can not have NO INHERIT check constraint, you may see StoreRelCheck. we can add an Assert: Assert(!ccnoinherit); + /* Reproduce not-null constraints. */ + if (constr->has_not_null) + { + List *nnconstraints; + + nnconstraints = RelationGetNotNullConstraints(RelationGetRelid(modelRel), + false, true); as mentioned in above, partitioned table cannot have NO INHERIT constraint, maybe we should set RelationGetNotNullConstraints last argument to false /* * calculate_partition_bound_for_merge * * Calculates the bound of merged partition "spec" by using the bounds of * partitions to be merged. * * parent: partitioned table * partNames: names of partitions to be merged * partOids: Oids of partitions to be merged * spec (out): bounds specification of the merged partition * pstate: pointer to ParseState struct for determine error position */ void calculate_partition_bound_for_merge(Relation parent, List *partNames, List *partOids, PartitionBoundSpec *spec, ParseState *pstate) if we are within calculate_partition_bound_for_merge, then we at least hold AccessShareLock for all the partOids (see transformPartitionCmdForMerge) partNames is a list of RangeVar one to one corresponding to partOids, then we really do not need partNames at all for error messages handling, we can just use get_rel_name. so we don't need to pass partNames to calculate_partition_bound_for_merge The attached patch is a rewrite for calculate_partition_bound_for_merge and callees. please let me know whether this improves code readability in RelationBuildPartitionDesc we have the following code pattern: foreach(cell, inhoids) { Oid inhrelid = lfirst_oid(cell); HeapTuple tuple; PartitionBoundSpec *boundspec = NULL; /* Try fetching the tuple from the catcache, for speed. */ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(inhrelid)); if (HeapTupleIsValid(tuple)) { datum = SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound, &isnull); if (!isnull) boundspec = stringToNode(TextDatumGetCString(datum)); ReleaseSysCache(tuple); } if (boundspec == NULL) { pg_class = table_open(RelationRelationId, AccessShareLock); ScanKeyInit(&key[0], Anum_pg_class_oid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(inhrelid)); scan = systable_beginscan(pg_class, ClassOidIndexId, true, NULL, 1, key); .... } I wonder if we should do the same in get_partition_bound_spec? you may also see comments in RelationBuildPartitionDesc, partdesc.c line 203. --000000000000b1a64506375aebe0 Content-Type: application/octet-stream; name="v43-0001-refactor-calculate_partition_bound_for_merge.no-cfbot" Content-Disposition: attachment; filename="v43-0001-refactor-calculate_partition_bound_for_merge.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mbt24ne20 RnJvbSA5OGVmZDQwM2ZmYjRmNWY5NDk1Nzk4NTU1Mjk5NDI0NjNhZmNiODQ1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFRodSwgMTIgSnVuIDIwMjUgMTU6Mjg6MDUgKzA4MDAKU3ViamVjdDogW1BBVENIIHY0 MyAxLzFdIHJlZmFjdG9yIGNhbGN1bGF0ZV9wYXJ0aXRpb25fYm91bmRfZm9yX21lcmdlCgotLS0K IHNyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jICAgICAgfCAgMyArLQogc3JjL2JhY2tl bmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQuYyAgICB8ICA1ICsrLQogc3JjL2JhY2tlbmQvcGFydGl0 aW9uaW5nL3BhcnRib3VuZHMuYyB8IDUzICsrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLQogc3Jj L2luY2x1ZGUvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuaCB8ICAxIC0KIDQgZmlsZXMgY2hhbmdl ZCwgMjcgaW5zZXJ0aW9ucygrKSwgMzUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNt ZHMuYwppbmRleCA5MmJlZDRhMmRkNy4uMjEzYmY0ZjA1MTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxl Y21kcy5jCkBAIC0yMjIxNiw2ICsyMjIxNiw3IEBAIGNyZWF0ZVRhYmxlQ29uc3RyYWludHMoUmVs YXRpb24gbW9kZWxSZWwsIFJlbGF0aW9uIG5ld1JlbCkKIAkJYm9vbAkJZm91bmRfd2hvbGVfcm93 OwogCQlDb29rZWRDb25zdHJhaW50ICpjb29rZWQ7CiAKKwkJQXNzZXJ0KCFjY25vaW5oZXJpdCk7 CiAJCWNjYmluX25vZGUgPSBtYXBfdmFyaWFibGVfYXR0bm9zKHN0cmluZ1RvTm9kZShjY2Jpbiks CiAJCQkJCQkJCQkJIDEsIDAsCiAJCQkJCQkJCQkJIGF0dG1hcCwKQEAgLTIyMjYxLDcgKzIyMjYy LDcgQEAgY3JlYXRlVGFibGVDb25zdHJhaW50cyhSZWxhdGlvbiBtb2RlbFJlbCwgUmVsYXRpb24g bmV3UmVsKQogCQlMaXN0CSAgICpubmNvbnN0cmFpbnRzOwogCiAJCW5uY29uc3RyYWludHMgPSBS ZWxhdGlvbkdldE5vdE51bGxDb25zdHJhaW50cyhSZWxhdGlvbkdldFJlbGlkKG1vZGVsUmVsKSwK LQkJCQkJCQkJCQkJCQkgIGZhbHNlLCB0cnVlKTsKKwkJCQkJCQkJCQkJCQkgIGZhbHNlLCBmYWxz ZSk7CiAKIAkJQXNzZXJ0KGxpc3RfbGVuZ3RoKG5uY29uc3RyYWludHMpID4gMCk7CiAKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV91dGlsY21kLmMgYi9zcmMvYmFja2VuZC9w YXJzZXIvcGFyc2VfdXRpbGNtZC5jCmluZGV4IDc4MTVlOGQyNDU1Li5lODA0MGExZmI1OCAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQuYworKysgYi9zcmMvYmFj a2VuZC9wYXJzZXIvcGFyc2VfdXRpbGNtZC5jCkBAIC0zNjE0LDggKzM2MTQsOSBAQCB0cmFuc2Zv cm1QYXJ0aXRpb25DbWRGb3JNZXJnZShDcmVhdGVTdG10Q29udGV4dCAqY3h0LCBQYXJ0aXRpb25D bWQgKnBhcnRjbWQpCiAJcGFydGNtZC0+Ym91bmQtPmxvY2F0aW9uID0gLTE7CiAJcGFydGNtZC0+ Ym91bmQtPmlzX2RlZmF1bHQgPSBpc0RlZmF1bHRQYXJ0OwogCWlmICghaXNEZWZhdWx0UGFydCkK LQkJY2FsY3VsYXRlX3BhcnRpdGlvbl9ib3VuZF9mb3JfbWVyZ2UocGFyZW50LCBwYXJ0Y21kLT5w YXJ0bGlzdCwKLQkJCQkJCQkJCQkJcGFydE9pZHMsIHBhcnRjbWQtPmJvdW5kLAorCQljYWxjdWxh dGVfcGFydGl0aW9uX2JvdW5kX2Zvcl9tZXJnZShwYXJlbnQsCisJCQkJCQkJCQkJCXBhcnRPaWRz LAorCQkJCQkJCQkJCQlwYXJ0Y21kLT5ib3VuZCwKIAkJCQkJCQkJCQkJY3h0LT5wc3RhdGUpOwog fQogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJ0aXRpb25pbmcvcGFydGJvdW5kcy5jIGIv c3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYwppbmRleCBjYjcxOWYxZmY1Ny4u MjY5ODJmMTNhODkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9wYXJ0Ym91 bmRzLmMKKysrIGIvc3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYwpAQCAtNDk5 NCwxOCArNDk5NCwxOCBAQCBzYXRpc2ZpZXNfaGFzaF9wYXJ0aXRpb24oUEdfRlVOQ1RJT05fQVJH UykKICAqIERFRkFVTFQgcGFydGl0aW9uLgogICoKICAqIHBhcmVudDoJCQlwYXJ0aXRpb25lZCB0 YWJsZQotICogZmlyc3RfbmFtZToJCW5hbWUgb2YgZmlyc3QgcGFydGl0aW9uCisgKiBmaXJzdF9u YW1lOgkJT2lkIG9mIGZpcnN0IHBhcnRpdGlvbgogICogZmlyc3RfYm91bmQ6CQlib3VuZCBvZiBm aXJzdCBwYXJ0aXRpb24KLSAqIHNlY29uZF9uYW1lOgkJbmFtZSBvZiBzZWNvbmQgcGFydGl0aW9u CisgKiBzZWNvbmRfbmFtZToJCU9pZCBvZiBzZWNvbmQgcGFydGl0aW9uCiAgKiBzZWNvbmRfYm91 bmQ6CWJvdW5kIG9mIHNlY29uZCBwYXJ0aXRpb24KICAqIGRlZmF1bHRQYXJ0OgkJdHJ1ZSBpZiBv bmUgb2Ygc3BsaXQgcGFydGl0aW9ucyBpcyBERUZBVUxUCiAgKiBwc3RhdGU6CQkJcG9pbnRlciB0 byBQYXJzZVN0YXRlIHN0cnVjdCBmb3IgZGV0ZXJtaW5pbmcgZXJyb3IgcG9zaXRpb24KICAqLwog c3RhdGljIHZvaWQKIGNoZWNrX3R3b19wYXJ0aXRpb25zX2JvdW5kc19yYW5nZShSZWxhdGlvbiBw YXJlbnQsCi0JCQkJCQkJCSAgUmFuZ2VWYXIgKmZpcnN0X25hbWUsCisJCQkJCQkJCSAgT2lkIGZp cnN0X25hbWUsCiAJCQkJCQkJCSAgUGFydGl0aW9uQm91bmRTcGVjICpmaXJzdF9ib3VuZCwKLQkJ CQkJCQkJICBSYW5nZVZhciAqc2Vjb25kX25hbWUsCisJCQkJCQkJCSAgT2lkIHNlY29uZF9uYW1l LAogCQkJCQkJCQkgIFBhcnRpdGlvbkJvdW5kU3BlYyAqc2Vjb25kX2JvdW5kLAogCQkJCQkJCQkg IGJvb2wgZGVmYXVsdFBhcnQsCiAJCQkJCQkJCSAgUGFyc2VTdGF0ZSAqcHN0YXRlKQpAQCAtNTAz NCwyMCArNTAzNCwyMCBAQCBjaGVja190d29fcGFydGl0aW9uc19ib3VuZHNfcmFuZ2UoUmVsYXRp b24gcGFyZW50LAogCQlQYXJ0aXRpb25SYW5nZURhdHVtICpkYXR1bSA9IGxpbml0aWFsKHNlY29u ZF9ib3VuZC0+bG93ZXJkYXR1bXMpOwogCiAJCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycmNvZGUo RVJSQ09ERV9JTlZBTElEX09CSkVDVF9ERUZJTklUSU9OKSwKLQkJCQkgZXJybXNnKCJsb3dlciBi b3VuZCBvZiBwYXJ0aXRpb24gXCIlc1wiIGNvbmZsaWN0cyB3aXRoIHVwcGVyIGJvdW5kIG9mIHBy ZXZpb3VzIHBhcnRpdGlvbiBcIiVzXCIiLAotCQkJCQkJc2Vjb25kX25hbWUtPnJlbG5hbWUsIGZp cnN0X25hbWUtPnJlbG5hbWUpLAotCQkJCSBwYXJzZXJfZXJycG9zaXRpb24ocHN0YXRlLCBkYXR1 bS0+bG9jYXRpb24pKSk7CisJCQkJZXJyY29kZShFUlJDT0RFX0lOVkFMSURfT0JKRUNUX0RFRklO SVRJT04pLAorCQkJCWVycm1zZygibG93ZXIgYm91bmQgb2YgcGFydGl0aW9uIFwiJXNcIiBjb25m bGljdHMgd2l0aCB1cHBlciBib3VuZCBvZiBwcmV2aW91cyBwYXJ0aXRpb24gXCIlc1wiIiwKKwkJ CQkJCWdldF9yZWxfbmFtZShzZWNvbmRfbmFtZSksIGdldF9yZWxfbmFtZShmaXJzdF9uYW1lKSks CisJCQkJcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgZGF0dW0tPmxvY2F0aW9uKSk7CiAJfQog fQogCiAvKgogICogZ2V0X3BhcnRpdGlvbl9ib3VuZF9zcGVjCiAgKgotICogUmV0dXJucyBkZXNj cmlwdGlvbiBvZiBwYXJ0aXRpb24gd2l0aCBPaWQgInBhcnRPaWQiIGFuZCBuYW1lICJuYW1lIi4K KyAqIFJldHVybnMgdGhlIFBhcnRpdGlvbkJvdW5kU3BlYyBmb3IgdGhlIHBhcnRpdGlvbiB3aXRo IHRoZSBnaXZlbiBPSUQgcGFydE9pZAogICovCiBzdGF0aWMgUGFydGl0aW9uQm91bmRTcGVjICoK LWdldF9wYXJ0aXRpb25fYm91bmRfc3BlYyhPaWQgcGFydE9pZCwgUmFuZ2VWYXIgKm5hbWUpCitn ZXRfcGFydGl0aW9uX2JvdW5kX3NwZWMoT2lkIHBhcnRPaWQpCiB7CiAJSGVhcFR1cGxlCXR1cGxl OwogCURhdHVtCQlkYXR1bTsKQEAgLTUwNTcsMjEgKzUwNTcsMjAgQEAgZ2V0X3BhcnRpdGlvbl9i b3VuZF9zcGVjKE9pZCBwYXJ0T2lkLCBSYW5nZVZhciAqbmFtZSkKIAkvKiBUcnkgZmV0Y2hpbmcg dGhlIHR1cGxlIGZyb20gdGhlIGNhdGNhY2hlLCBmb3Igc3BlZWQuICovCiAJdHVwbGUgPSBTZWFy Y2hTeXNDYWNoZTEoUkVMT0lELCBwYXJ0T2lkKTsKIAlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVw bGUpKQotCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gXCIl c1wiIiwKLQkJCSBuYW1lLT5yZWxuYW1lKTsKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBm YWlsZWQgZm9yIHJlbGF0aW9uICV1IiwgcGFydE9pZCk7CiAKIAlkYXR1bSA9IFN5c0NhY2hlR2V0 QXR0cihSRUxPSUQsIHR1cGxlLAogCQkJCQkJCUFudW1fcGdfY2xhc3NfcmVscGFydGJvdW5kLAog CQkJCQkJCSZpc251bGwpOwogCWlmIChpc251bGwpCi0JCWVsb2coRVJST1IsICJwYXJ0aXRpb24g Ym91bmQgZm9yIHJlbGF0aW9uIFwiJXNcIiBpcyBudWxsIiwKLQkJCSBuYW1lLT5yZWxuYW1lKTsK KwkJZWxvZyhFUlJPUiwgInBhcnRpdGlvbiBib3VuZCBmb3IgcmVsYXRpb24gJXUgaXMgbnVsbCIs CisJCQkgcGFydE9pZCk7CiAKIAlib3VuZHNwZWMgPSBzdHJpbmdUb05vZGUoVGV4dERhdHVtR2V0 Q1N0cmluZyhkYXR1bSkpOwogCiAJaWYgKCFJc0EoYm91bmRzcGVjLCBQYXJ0aXRpb25Cb3VuZFNw ZWMpKQotCQllbG9nKEVSUk9SLCAiZXhwZWN0ZWQgUGFydGl0aW9uQm91bmRTcGVjIGZvciByZWxh dGlvbiBcIiVzXCIiLAotCQkJIG5hbWUtPnJlbG5hbWUpOworCQllbG9nKEVSUk9SLCAiZXhwZWN0 ZWQgUGFydGl0aW9uQm91bmRTcGVjIGZvciByZWxhdGlvbiAldSIsCisJCQkgcGFydE9pZCk7CiAK IAlSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwogCXJldHVybiBib3VuZHNwZWM7CkBAIC01MDg0LDE0 ICs1MDgzLDEyIEBAIGdldF9wYXJ0aXRpb25fYm91bmRfc3BlYyhPaWQgcGFydE9pZCwgUmFuZ2VW YXIgKm5hbWUpCiAgKiBwYXJ0aXRpb25zIHRvIGJlIG1lcmdlZC4KICAqCiAgKiBwYXJlbnQ6CQkJ cGFydGl0aW9uZWQgdGFibGUKLSAqIHBhcnROYW1lczoJCW5hbWVzIG9mIHBhcnRpdGlvbnMgdG8g YmUgbWVyZ2VkCiAgKiBwYXJ0T2lkczoJCU9pZHMgb2YgcGFydGl0aW9ucyB0byBiZSBtZXJnZWQK ICAqIHNwZWMgKG91dCk6CQlib3VuZHMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbWVyZ2VkIHBhcnRp dGlvbgogICogcHN0YXRlOgkJCXBvaW50ZXIgdG8gUGFyc2VTdGF0ZSBzdHJ1Y3QgZm9yIGRldGVy bWluZSBlcnJvciBwb3NpdGlvbgogICovCiB2b2lkCiBjYWxjdWxhdGVfcGFydGl0aW9uX2JvdW5k X2Zvcl9tZXJnZShSZWxhdGlvbiBwYXJlbnQsCi0JCQkJCQkJCQlMaXN0ICpwYXJ0TmFtZXMsCiAJ CQkJCQkJCQlMaXN0ICpwYXJ0T2lkcywKIAkJCQkJCQkJCVBhcnRpdGlvbkJvdW5kU3BlYyAqc3Bl YywKIAkJCQkJCQkJCVBhcnNlU3RhdGUgKnBzdGF0ZSkKQEAgLTUxMTcsMTAgKzUxMTQsMTAgQEAg Y2FsY3VsYXRlX3BhcnRpdGlvbl9ib3VuZF9mb3JfbWVyZ2UoUmVsYXRpb24gcGFyZW50LAogCQkJ CSAqIENyZWF0ZSBhcnJheSBvZiBsb3dlciBib3VuZHMgYW5kIGxpc3Qgb2YKIAkJCQkgKiBQYXJ0 aXRpb25Cb3VuZFNwZWMuCiAJCQkJICovCi0JCQkJZm9yIChpID0gMDsgaSA8IG5wYXJ0czsgaSsr KQorCQkJCWZvcmVhY2hfb2lkKHBhcnRvaWQsIHBhcnRPaWRzKQogCQkJCXsKLQkJCQkJYm91bmQg PSBnZXRfcGFydGl0aW9uX2JvdW5kX3NwZWMobGlzdF9udGhfb2lkKHBhcnRPaWRzLCBpKSwKLQkJ CQkJCQkJCQkJCQkgKFJhbmdlVmFyICopIGxpc3RfbnRoKHBhcnROYW1lcywgaSkpOworCQkJCQli b3VuZCA9IGdldF9wYXJ0aXRpb25fYm91bmRfc3BlYyhwYXJ0b2lkKTsKKwkJCQkJaSA9IGZvcmVh Y2hfY3VycmVudF9pbmRleChwYXJ0b2lkKTsKIAogCQkJCQlsb3dlcl9ib3VuZHNbaV0gPSBtYWtl X29uZV9wYXJ0aXRpb25fcmJvdW5kKGtleSwgaSwgYm91bmQtPmxvd2VyZGF0dW1zLCB0cnVlKTsK IAkJCQkJYm91bmRzID0gbGFwcGVuZChib3VuZHMsIGJvdW5kKTsKQEAgLTUxMzcsOSArNTEzNCw5 IEBAIGNhbGN1bGF0ZV9wYXJ0aXRpb25fYm91bmRfZm9yX21lcmdlKFJlbGF0aW9uIHBhcmVudCwK IAkJCQkJaW50CQkJcHJldl9pbmRleCA9IGxvd2VyX2JvdW5kc1tpIC0gMV0tPmluZGV4OwogCiAJ CQkJCWNoZWNrX3R3b19wYXJ0aXRpb25zX2JvdW5kc19yYW5nZShwYXJlbnQsCi0JCQkJCQkJCQkJ CQkJICAoUmFuZ2VWYXIgKikgbGlzdF9udGgocGFydE5hbWVzLCBwcmV2X2luZGV4KSwKKwkJCQkJ CQkJCQkJCQkgIGxpc3RfbnRoX29pZChwYXJ0T2lkcywgcHJldl9pbmRleCksCiAJCQkJCQkJCQkJ CQkJICAoUGFydGl0aW9uQm91bmRTcGVjICopIGxpc3RfbnRoKGJvdW5kcywgcHJldl9pbmRleCks Ci0JCQkJCQkJCQkJCQkJICAoUmFuZ2VWYXIgKikgbGlzdF9udGgocGFydE5hbWVzLCBpbmRleCks CisJCQkJCQkJCQkJCQkJICBsaXN0X250aF9vaWQocGFydE9pZHMsIGluZGV4KSwKIAkJCQkJCQkJ CQkJCQkgIChQYXJ0aXRpb25Cb3VuZFNwZWMgKikgbGlzdF9udGgoYm91bmRzLCBpbmRleCksCiAJ CQkJCQkJCQkJCQkJICBmYWxzZSwgcHN0YXRlKTsKIAkJCQl9CkBAIC01MTY1LDE2ICs1MTYyLDEw IEBAIGNhbGN1bGF0ZV9wYXJ0aXRpb25fYm91bmRfZm9yX21lcmdlKFJlbGF0aW9uIHBhcmVudCwK IAogCQljYXNlIFBBUlRJVElPTl9TVFJBVEVHWV9MSVNUOgogCQkJewotCQkJCUxpc3RDZWxsICAg Kmxpc3RwdHIsCi0JCQkJCQkgICAqbGlzdHB0cjI7Ci0KIAkJCQkvKiBDb25zb2xpZGF0ZSBib3Vu ZHMgZm9yIGFsbCBwYXJ0aXRpb25zIGluIHRoZSBsaXN0LiAqLwotCQkJCWZvcmJvdGgobGlzdHB0 ciwgcGFydE9pZHMsIGxpc3RwdHIyLCBwYXJ0TmFtZXMpCisJCQkJZm9yZWFjaF9vaWQocGFydG9p ZCwgcGFydE9pZHMpCiAJCQkJewotCQkJCQlSYW5nZVZhciAgICpuYW1lID0gKFJhbmdlVmFyICop IGxmaXJzdChsaXN0cHRyMik7Ci0JCQkJCU9pZAkJCWN1ck9pZCA9IGxmaXJzdF9vaWQobGlzdHB0 cik7Ci0KLQkJCQkJYm91bmQgPSBnZXRfcGFydGl0aW9uX2JvdW5kX3NwZWMoY3VyT2lkLCBuYW1l KTsKKwkJCQkJYm91bmQgPSBnZXRfcGFydGl0aW9uX2JvdW5kX3NwZWMocGFydG9pZCk7CiAJCQkJ CXNwZWMtPmxpc3RkYXR1bXMgPSBsaXN0X2NvbmNhdChzcGVjLT5saXN0ZGF0dW1zLCBib3VuZC0+ bGlzdGRhdHVtcyk7CiAJCQkJfQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv cGFydGl0aW9uaW5nL3BhcnRib3VuZHMuaCBiL3NyYy9pbmNsdWRlL3BhcnRpdGlvbmluZy9wYXJ0 Ym91bmRzLmgKaW5kZXggNjkwZDI1OTYxOTAuLmE0MzJjMmQyN2ZmIDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9wYXJ0aXRpb25pbmcvcGFydGJvdW5kcy5oCisrKyBiL3NyYy9pbmNsdWRlL3BhcnRp dGlvbmluZy9wYXJ0Ym91bmRzLmgKQEAgLTE0NCw3ICsxNDQsNiBAQCBleHRlcm4gaW50CXBhcnRp dGlvbl9oYXNoX2JzZWFyY2goUGFydGl0aW9uQm91bmRJbmZvIGJvdW5kaW5mbywKIAkJCQkJCQkJ ICAgaW50IG1vZHVsdXMsIGludCByZW1haW5kZXIpOwogCiBleHRlcm4gdm9pZCBjYWxjdWxhdGVf cGFydGl0aW9uX2JvdW5kX2Zvcl9tZXJnZShSZWxhdGlvbiBwYXJlbnQsCi0JCQkJCQkJCQkJCQlM aXN0ICpwYXJ0TmFtZXMsCiAJCQkJCQkJCQkJCQlMaXN0ICpwYXJ0T2lkcywKIAkJCQkJCQkJCQkJ CVBhcnRpdGlvbkJvdW5kU3BlYyAqc3BlYywKIAkJCQkJCQkJCQkJCVBhcnNlU3RhdGUgKnBzdGF0 ZSk7Ci0tIAoyLjM0LjEKCg== --000000000000b1a64506375aebe0--