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 1umihU-002Wgq-LQ for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Aug 2025 00:53:44 +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 1umihR-00B14B-1F for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Aug 2025 00:53:41 +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 1umihQ-00B143-JU for pgsql-hackers@lists.postgresql.org; Fri, 15 Aug 2025 00:53:40 +0000 Received: from mail-qt1-x834.google.com ([2607:f8b0:4864:20::834]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1umihO-000dSM-0U for pgsql-hackers@lists.postgresql.org; Fri, 15 Aug 2025 00:53:39 +0000 Received: by mail-qt1-x834.google.com with SMTP id d75a77b69052e-4b109bd8b09so20074231cf.2 for ; Thu, 14 Aug 2025 17:53:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755219217; x=1755824017; 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=KE4NncuFGwFwtyDnNcX7HwoVpG4BSmJxQmxudP3UcPU=; b=MqvcoakG2DFGKBZxpU0Mozyytaz51UH+JyxrI4MCnEXRTAEQHYLlJAqgnMg+8x4PZR PgREVfGIfnFCoSIoiY5ZbM3yXqcv0R+Qcw3Y3HGZ4i4eiWgex2gvgzKuLNOn+iYoO7CK Qb3Loa5D5qMksKA6hi96bOX0jyOg7mEj+EdMyYvbg0YE9tvnmCqCAcPDX9jkxQKWfPym 8S/77lQ7l/GxPeOzowU/WE3TYistHGIHqEvVZ5KmLPTzlw0YRvgd9gMiu7ZeN7SIZD6u xb3iB3JiyaG0miYdNGNb4ibjPK3PjDIzhhITewyU0uIDKym2QnS4AJo6DKlmg7Qfh+Pi 5IMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755219217; x=1755824017; 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=KE4NncuFGwFwtyDnNcX7HwoVpG4BSmJxQmxudP3UcPU=; b=EifX3neUZIpWw7AiVb4qqsd4yd7kExLNCVfA/tTnMIHFZmBxwuc/lWG8nMUxStHUkT E1KOJiP4WnTOg8ZIGzZ5FQnVaVfu5+t2Kx21CQM+tRh6NfDAK1WiK0sB1fL38leUz7EM hKUBSZcVBkmAoc1F5v11uiY2BisidIlYUtSMRQEPdWqUvGO00GXhrXHGnNmzoxr2QTMm 1UvN6/rthpkPRF8zvDK0OkXvXuKozVhOY20cvkEntHIikIVL7LhPA7vTOrA4Wj0sP7cb 8SMVNrvZ9tEPenmdhAbnD7DpvsQHbcSok7EGli+3WzndFByn0yfWTA+f+HCZO3uJY726 A97Q== X-Forwarded-Encrypted: i=1; AJvYcCVgh3Fl04hdSlQH4dhtQPR/6yhynKVB3IWqYd5XpAMKA8uoFpKuAssdh3zgU6lhp+ia1WPDxJRugxg4TRCp@lists.postgresql.org X-Gm-Message-State: AOJu0Yw8lonIy9IN0cyFx+VlupYEprclZLRGV3bVqzgHe8+fCnJPsVKd 8aybG3m6vTeKpoDdrQkkCk9FmohPcz17ZgqGjlzGckhEnxhZRa2lTJudKi1SidX9i4P5iSHLuT6 RksDdnv+mcXqBCMP+i5WRem9nDUShEO4= X-Gm-Gg: ASbGncsbkYSoqK7ye/pVZcZHdbImmIcnY3iJ++3KKAqkDEjMf7qnMna1xpHmbJJspov gi/OIL4dUUnwKuCs7C+wW32PR8k2E7G4/E11VN36UnSu4/OUGetcFBYu7HlaMFic9Mq7rdmnCUO 0gcFjd4NnXBLGjbI9phjsMnzCJ1qGypD1yEqeWvOXHXUNDqNATsCW1bZVd+gdTtzpRCzmWKhHhC pGMYylusJuqUnIs2+QvdI/M43ahvZV0ReLpaE0= X-Google-Smtp-Source: AGHT+IFmI5RyYBKqor58B/FwoNSouaaYg6JAB0r7pIQ1l2XpdSvkvKNYr2wiQROj+2VbEV/lcNK19fNMVcgaMRpFhcM= X-Received: by 2002:a05:622a:4a8f:b0:4b0:7ace:1ca2 with SMTP id d75a77b69052e-4b11e11aa3bmr2536741cf.16.1755219217289; Thu, 14 Aug 2025 17:53:37 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Smith Date: Fri, 15 Aug 2025 10:53:10 +1000 X-Gm-Features: Ac12FXyrQO-BojaG9CoCNdn3mhZv9HSm3EXabDniMs28OWiHCBl_Kx87IVInDB8 Message-ID: Subject: Re: Skipping schema changes in publication To: Shlok Kyal Cc: Amit Kapila , "Zhijie Hou (Fujitsu)" , vignesh C , YeXiu <1518981153@qq.com>, Ian Lawrence Barwick , Bharath Rupireddy , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000f333de063c5cd169" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f333de063c5cd169 Content-Type: text/plain; charset="UTF-8" Hi Shlok, Here are some review comments for v20-0003. ====== src/backend/commands/publicationcmds.c AlterPublicationTables: 1. bool isnull = true; - Datum whereClauseDatum; - Datum columnListDatum; + Datum datum; I know you did not write the code, but that "isnull = true" is redundant, and seems kind of misleading because it will always be re-assigned before it is used. ~~~ 2. /* Load the WHERE clause for this table. */ - whereClauseDatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, - Anum_pg_publication_rel_prqual, - &isnull); + datum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prqual, + &isnull); if (!isnull) - oldrelwhereclause = stringToNode(TextDatumGetCString(whereClauseDatum)); + oldrelwhereclause = stringToNode(TextDatumGetCString(datum)); /* Transform the int2vector column list to a bitmap. */ - columnListDatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, - Anum_pg_publication_rel_prattrs, - &isnull); + datum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prattrs, + &isnull); + + if (!isnull) + oldcolumns = pub_collist_to_bitmapset(NULL, datum, NULL); + + /* Load the prexcept flag for this table. */ + datum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prexcept, + &isnull); if (!isnull) - oldcolumns = pub_collist_to_bitmapset(NULL, columnListDatum, NULL); + oldexcept = DatumGetBool(datum); Use consistent spacing. Either do or don't (I prefer don't) put a blank line between the pairs of "datum =" and "if (!isnull)". Avoid having a mixture. ====== src/bin/psql/describe.c addFooterToPublicationOrTableDesc: 3. +/* + * If is_tbl_desc is true add footer to table description else add footer to + * publication description. + */ +static bool +addFooterToPublicationOrTableDesc(PQExpBuffer buf, const char *footermsg, + bool as_schema, printTableContent *const cont, + bool is_tbl_desc) 3a. Since you are changing this anyway, I think it would be better to keep those boolean params together (at the end). ~ 3b. It seems a bit mixed up calling this addFooterToPublicationOrTableDesc but having the variable 'is_tbl_desc', because it seems more natural to me to read left to right, so the logical order of everything here should be pub desc then table desc. In other words, use boolean 'is_pub_desc' instead of 'is_tbl_desc'. Also, I think that 'as_schema' thing is kind of a *subset* of the publication description, so it makes more sense for that to come last too. e.g. CURRENT addFooterToPublicationOrTableDesc(buf, footermsg, as_schema, cont, is_tbl_desc) SUGGESTION addFooterToPublicationOrTableDesc(buf, cont, footermsg, is_pub_desc, as_schema) ~ 3c While you are changing things, maybe also consider changing that 'as_schema' name because I did not understand what "as" means. Perhaps rename like 'pub_schemas', or 'only_show_schemas' or something better (???). ~~~ 4. + PGresult *res; + int count = 0; + int i = 0; + int col = is_tbl_desc ? 0 : 1; + + res = PSQLexec(buf->data); + if (!res) + return false; + else + count = PQntuples(res); + 4a. Assignment count = 0 is redundant. ~ 4b. Remove the 'i' declaration here. Declare it in the "for" loop later. ~ 4c. The "else" is not required. If 'res' was not good, you already returned. ~~~ 5. + if (as_schema) + printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0)); + else + { + if (is_tbl_desc) + printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, col)); + else + printfPQExpBuffer(buf, " \"%s.%s\"", PQgetvalue(res, i, 0), + PQgetvalue(res, i, col)); This function is basically either (a) a footer for a table description or (b) a footer for a publication description. And that all hinges on the boolean 'is_tbl_desc'. Therefore, it seems more natural for the main condition to be "if (is_tbl_desc)" here. This turned everything inside out. PSA: a top-up patch to show a way to do this. Perhaps my implementation is a bit verbose, but OTOH it seems easier to understand. Anyway, see what you think... ~~~ 6. + /*--------------------------------------------------- + * Publication/ table description columns: + * [0]: schema name (nspname) + * [col]: table name (relname) / publication name (pubname) + * [col + 1]: row filter expression (prqual), may be NULL + * [col + 2]: column list (comma-separated), may be NULL + * [col + 3]: except flag ("t" if EXCEPT, else "f") + *--------------------------------------------------- I've modified this comment slightly so I could understand it better. See if you agree. SUGGESTION /*--------------------------------------------------- * Description columns: * PUB TBL * [0] - : schema name (nspname) * [col] - : table name (relname) * - [col] : publication name (pubname) * [col+1] [col+1]: row filter expression (prqual), may be NULL * [col+2] [col+1]: column list (comma-separated), may be NULL * [col+3] [col+1]: except flag ("t" if EXCEPT, else "f") *--------------------------------------------------- */ ~~~ describeOneTableDetails: 7. + else if (pset.sversion >= 150000) + { + printfPQExpBuffer(&buf, + "SELECT pubname\n" + " , NULL\n" + " , NULL\n" + "FROM pg_catalog.pg_publication p\n" + " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" + " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" + "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" + "UNION\n" + "SELECT pubname\n" + " , pg_get_expr(pr.prqual, c.oid)\n" + " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n" + " (SELECT string_agg(attname, ', ')\n" + " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" + " pg_catalog.pg_attribute\n" + " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" + " ELSE NULL END) " + "FROM pg_catalog.pg_publication p\n" + " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" + " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" + "WHERE pr.prrelid = '%s'\n" + "UNION\n" + "SELECT pubname\n" + " , NULL\n" + " , NULL\n" + "FROM pg_catalog.pg_publication p\n" + "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" + "ORDER BY 1;", + oid, oid, oid, oid); AFAICT, that >= 150000 code seems to have added another UNION at the end that was not previously there. What's that about? How is that related to EXCEPT (column-list)? ====== Kind Regards, Peter Smith. Fujitsu Australia --000000000000f333de063c5cd169 Content-Type: application/octet-stream; name="PS_addFooterToPublicationOrTableDesc.diff" Content-Disposition: attachment; filename="PS_addFooterToPublicationOrTableDesc.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mec459sa0 ZGlmZiAtLWdpdCBhL3NyYy9iaW4vcHNxbC9kZXNjcmliZS5jIGIvc3JjL2Jpbi9wc3FsL2Rlc2Ny aWJlLmMKaW5kZXggNmI3Mjc0NS4uNDgyY2NhNiAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9wc3FsL2Rl c2NyaWJlLmMKKysrIGIvc3JjL2Jpbi9wc3FsL2Rlc2NyaWJlLmMKQEAgLTE1NjEsNDkgKzE1NjEs NjkgQEAgZGVzY3JpYmVUYWJsZURldGFpbHMoY29uc3QgY2hhciAqcGF0dGVybiwgYm9vbCB2ZXJi b3NlLCBib29sIHNob3dTeXN0ZW0pCiB9CiAKIC8qCi0gKiBJZiBpc190YmxfZGVzYyBpcyB0cnVl IGFkZCBmb290ZXIgdG8gdGFibGUgZGVzY3JpcHRpb24gZWxzZSBhZGQgZm9vdGVyIHRvCi0gKiBw dWJsaWNhdGlvbiBkZXNjcmlwdGlvbi4KKyAqIEFkZCBhIGZvb3RlciB0byBhIHB1YmxpY2F0aW9u IGRlc2NyaXB0aW9uIG9yIGEgdGFibGUgZGVzY3JpcHRpb24uCisgKgorICogJ2lzX3B1Yl9kZXNj JyAtIHRydWUgZm9yIGEgcHViIGRlc2M7IGZhbHNlIGZvciBhIHRhYmxlIGRlc2MKKyAqICdhc19z Y2hlbWEnIC0gdHJ1ZSBpZiB0aGUgcHViX2Rlc2Mgb25seSBzaG93cyBzY2hlbWFzLCBvdGhlcndp c2UgZmFsc2UKICAqLwogc3RhdGljIGJvb2wKLWFkZEZvb3RlclRvUHVibGljYXRpb25PclRhYmxl RGVzYyhQUUV4cEJ1ZmZlciBidWYsIGNvbnN0IGNoYXIgKmZvb3Rlcm1zZywKLQkJCQkJCQkJICBi b29sIGFzX3NjaGVtYSwgcHJpbnRUYWJsZUNvbnRlbnQgKmNvbnN0IGNvbnQsCi0JCQkJCQkJCSAg Ym9vbCBpc190YmxfZGVzYykKK2FkZEZvb3RlclRvUHVibGljYXRpb25PclRhYmxlRGVzYyhQUUV4 cEJ1ZmZlciBidWYsCisJCQkJCQkJCSAgcHJpbnRUYWJsZUNvbnRlbnQgKmNvbnN0IGNvbnQsCisJ CQkJCQkJCSAgY29uc3QgY2hhciAqZm9vdGVybXNnLAorCQkJCQkJCQkgIGJvb2wgaXNfcHViX2Rl c2MsIGJvb2wgYXNfc2NoZW1hKQogewogCVBHcmVzdWx0ICAgKnJlczsKLQlpbnQJCQljb3VudCA9 IDA7Ci0JaW50CQkJaSA9IDA7Ci0JaW50CQkJY29sID0gaXNfdGJsX2Rlc2MgPyAwIDogMTsKKwlp bnQJCQljb3VudDsKKwlpbnQJCQljb2wgPSBpc19wdWJfZGVzYyA/IDEgOiAwOwogCiAJcmVzID0g UFNRTGV4ZWMoYnVmLT5kYXRhKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIGZhbHNlOwotCWVsc2UK LQkJY291bnQgPSBQUW50dXBsZXMocmVzKTsKIAorCWNvdW50ID0gUFFudHVwbGVzKHJlcyk7CiAJ aWYgKGNvdW50ID4gMCkKIAkJcHJpbnRUYWJsZUFkZEZvb3Rlcihjb250LCBmb290ZXJtc2cpOwog Ci0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K LQkgKiBQdWJsaWNhdGlvbi8gdGFibGUgZGVzY3JpcHRpb24gY29sdW1uczoKLQkgKiBbMF06IHNj aGVtYSBuYW1lIChuc3BuYW1lKQotCSAqIFtjb2xdOiB0YWJsZSBuYW1lIChyZWxuYW1lKSAvIHB1 YmxpY2F0aW9uIG5hbWUgKHB1Ym5hbWUpCi0JICogW2NvbCArIDFdOiByb3cgZmlsdGVyIGV4cHJl c3Npb24gKHBycXVhbCksIG1heSBiZSBOVUxMCi0JICogW2NvbCArIDJdOiBjb2x1bW4gbGlzdCAo Y29tbWEtc2VwYXJhdGVkKSwgbWF5IGJlIE5VTEwKLQkgKiBbY29sICsgM106IGV4Y2VwdCBmbGFn ICgidCIgaWYgRVhDRVBULCBlbHNlICJmIikKLQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBEZXNjcmlwdGlvbiBjb2x1 bW5zOgorCSAqCisJICogUFVCICAgICAgVEJMCisJICogWzBdICAgICAgLSAgICAgIDogc2NoZW1h IG5hbWUgKG5zcG5hbWUpCisJICogW2NvbF0gICAgLSAgICAgIDogdGFibGUgbmFtZSAocmVsbmFt ZSkKKwkgKiAtICAgICAgICBbY29sXSAgOiBwdWJsaWNhdGlvbiBuYW1lIChwdWJuYW1lKQorCSAq IFtjb2wrMV0gIFtjb2wrMV06IHJvdyBmaWx0ZXIgZXhwcmVzc2lvbiAocHJxdWFsKSwgbWF5IGJl IE5VTEwKKwkgKiBbY29sKzJdICBbY29sKzFdOiBjb2x1bW4gbGlzdCAoY29tbWEtc2VwYXJhdGVk KSwgbWF5IGJlIE5VTEwKKwkgKiBbY29sKzNdICBbY29sKzFdOiBleGNlcHQgZmxhZyAoInQiIGlm IEVYQ0VQVCwgZWxzZSAiZiIpCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3Vu dDsgaSsrKQorCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAl7Ci0JCWlmIChhc19z Y2hlbWEpCi0JCQlwcmludGZQUUV4cEJ1ZmZlcihidWYsICIgICAgXCIlc1wiIiwgUFFnZXR2YWx1 ZShyZXMsIGksIDApKTsKLQkJZWxzZQorCQlwcmludGZQUUV4cEJ1ZmZlcihidWYsICIgICAgIik7 IC8qIGluZGVudCAqLworCisJCS8qIEZvb3RlcnMgZW50cmllcyBmb3IgYSBwdWJsaWNhdGlvbiBk ZXNjcmlwdGlvbiBvciBhIHRhYmxlIGRlc2NyaXB0aW9uICovCisJCWlmIChpc19wdWJfZGVzYykK IAkJewotCQkJaWYgKGlzX3RibF9kZXNjKQotCQkJCXByaW50ZlBRRXhwQnVmZmVyKGJ1ZiwgIiAg ICBcIiVzXCIiLCBQUWdldHZhbHVlKHJlcywgaSwgY29sKSk7CisJCQlpZiAoYXNfc2NoZW1hKQor CQkJeworCQkJCS8qIFNjaGVtYXMgb2YgdGhlIHB1YmxpY2F0aW9uLi4uICovCisJCQkJYXBwZW5k UFFFeHBCdWZmZXIoYnVmLCAiXCIlc1wiIiwgUFFnZXR2YWx1ZShyZXMsIGksIDApKTsKKwkJCX0K IAkJCWVsc2UKLQkJCQlwcmludGZQUUV4cEJ1ZmZlcihidWYsICIgICAgXCIlcy4lc1wiIiwgUFFn ZXR2YWx1ZShyZXMsIGksIDApLAorCQkJeworCQkJCS8qIFRhYmxlcyBvZiB0aGUgcHVibGljYXRp b24uLi4gKi8KKwkJCQlhcHBlbmRQUUV4cEJ1ZmZlcihidWYsICJcIiVzLiVzXCIiLCBQUWdldHZh bHVlKHJlcywgaSwgMCksCiAJCQkJCQkJCSAgUFFnZXR2YWx1ZShyZXMsIGksIGNvbCkpOworCQkJ fQorCQl9CisJCWVsc2UKKwkJeworCQkJLyogUHVibGljYXRpb25zIG9mIHRoZSB0YWJsZS4uLiAq LworCQkJYXBwZW5kUFFFeHBCdWZmZXIoYnVmLCAiXCIlc1wiIiwgUFFnZXR2YWx1ZShyZXMsIGks IGNvbCkpOworCQl9CiAKKwkJLyogQ29tbW9uIGZvb3RlciBvdXRwdXQgZm9yIGNvbHVtbiBsaXN0 IGFuZC9vciByb3cgZmlsdGVyICovCisJCWlmICghYXNfc2NoZW1hKQorCQl7CiAJCQlpZiAoIVBR Z2V0aXNudWxsKHJlcywgaSwgY29sICsgMikpCiAJCQl7CiAJCQkJaWYgKHN0cmNtcChQUWdldHZh bHVlKHJlcywgaSwgY29sICsgMyksICJ0IikgPT0gMCkKQEAgLTMxOTIsNyArMzIxMiw3IEBAIGRl c2NyaWJlT25lVGFibGVEZXRhaWxzKGNvbnN0IGNoYXIgKnNjaGVtYW5hbWUsCiAJCQkJCQkJCSAg b2lkLCBvaWQpOwogCQkJfQogCi0JCQlpZiAoIWFkZEZvb3RlclRvUHVibGljYXRpb25PclRhYmxl RGVzYygmYnVmLCBfKCJQdWJsaWNhdGlvbnM6IiksIGZhbHNlLCAmY29udCwgdHJ1ZSkpCisJCQlp ZiAoIWFkZEZvb3RlclRvUHVibGljYXRpb25PclRhYmxlRGVzYygmYnVmLCAmY29udCwgXygiUHVi bGljYXRpb25zOiIpLCBmYWxzZSwgZmFsc2UpKQogCQkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQl9 CiAKQEAgLTY3NTUsNyArNjc3NSw3IEBAIGRlc2NyaWJlUHVibGljYXRpb25zKGNvbnN0IGNoYXIg KnBhdHRlcm4pCiAJCQkJCQkJICAiICBBTkQgcHIucHJwdWJpZCA9ICclcydcbiIsIHB1YmlkKTsK IAogCQkJYXBwZW5kUFFFeHBCdWZmZXIoJmJ1ZiwgIk9SREVSIEJZIDEsMiIpOwotCQkJaWYgKCFh ZGRGb290ZXJUb1B1YmxpY2F0aW9uT3JUYWJsZURlc2MoJmJ1ZiwgXygiVGFibGVzOiIpLCBmYWxz ZSwgJmNvbnQsIGZhbHNlKSkKKwkJCWlmICghYWRkRm9vdGVyVG9QdWJsaWNhdGlvbk9yVGFibGVE ZXNjKCZidWYsICZjb250LCBfKCJUYWJsZXM6IiksIHRydWUsIGZhbHNlKSkKIAkJCQlnb3RvIGVy cm9yX3JldHVybjsKIAogCQkJaWYgKHBzZXQuc3ZlcnNpb24gPj0gMTUwMDAwKQpAQCAtNjc2Nyw4 ICs2Nzg3LDggQEAgZGVzY3JpYmVQdWJsaWNhdGlvbnMoY29uc3QgY2hhciAqcGF0dGVybikKIAkJ CQkJCQkJICAiICAgICBKT0lOIHBnX2NhdGFsb2cucGdfcHVibGljYXRpb25fbmFtZXNwYWNlIHBu IE9OIG4ub2lkID0gcG4ucG5uc3BpZFxuIgogCQkJCQkJCQkgICJXSEVSRSBwbi5wbnB1YmlkID0g JyVzJ1xuIgogCQkJCQkJCQkgICJPUkRFUiBCWSAxIiwgcHViaWQpOwotCQkJCWlmICghYWRkRm9v dGVyVG9QdWJsaWNhdGlvbk9yVGFibGVEZXNjKCZidWYsIF8oIlRhYmxlcyBmcm9tIHNjaGVtYXM6 IiksCi0JCQkJCQkJCQkJCQkJICAgdHJ1ZSwgJmNvbnQsIGZhbHNlKSkKKwkJCQlpZiAoIWFkZEZv b3RlclRvUHVibGljYXRpb25PclRhYmxlRGVzYygmYnVmLCAmY29udCwKKwkJCQkJCQkJCQkJCQkg ICBfKCJUYWJsZXMgZnJvbSBzY2hlbWFzOiIpLCB0cnVlLCB0cnVlKSkKIAkJCQkJZ290byBlcnJv cl9yZXR1cm47CiAJCQl9CiAJCX0KQEAgLTY3ODQsOCArNjgwNCw4IEBAIGRlc2NyaWJlUHVibGlj YXRpb25zKGNvbnN0IGNoYXIgKnBhdHRlcm4pCiAJCQkJCQkJCSAgIldIRVJFIHByLnBycHViaWQg PSAnJXMnXG4iCiAJCQkJCQkJCSAgIiAgQU5EIHByLnByZXhjZXB0XG4iCiAJCQkJCQkJCSAgIk9S REVSIEJZIDEiLCBwdWJpZCk7Ci0JCQkJaWYgKCFhZGRGb290ZXJUb1B1YmxpY2F0aW9uT3JUYWJs ZURlc2MoJmJ1ZiwgXygiRXhjZXB0IHRhYmxlczoiKSwKLQkJCQkJCQkJCQkJCQkgICB0cnVlLCAm Y29udCwgZmFsc2UpKQorCQkJCWlmICghYWRkRm9vdGVyVG9QdWJsaWNhdGlvbk9yVGFibGVEZXNj KCZidWYsICZjb250LAorCQkJCQkJCQkJCQkJCSAgIF8oIkV4Y2VwdCB0YWJsZXM6IiksIHRydWUs IHRydWUpKQogCQkJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJCX0KIAkJfQo= --000000000000f333de063c5cd169--