From 8e9cc8b7def3614f0f643f0811bc56b99d9ffe3d Mon Sep 17 00:00:00 2001 From: Greg Sabino Mullane Date: Sun, 22 Mar 2026 11:06:01 -0400 Subject: [PATCH] Add comment header for generated SQL inside psql --- src/bin/psql/describe.c | 265 ++++++++++++++++++++++++++-------------- 1 file changed, 176 insertions(+), 89 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index eafb33143d9..f09cd49850c 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -84,7 +84,8 @@ describeAggregates(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching aggregates")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " p.proname AS \"%s\",\n" " pg_catalog.format_type(p.prorettype, NULL) AS \"%s\",\n" @@ -165,7 +166,8 @@ describeAccessMethods(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching access methods")); + appendPQExpBuffer(&buf, "SELECT amname AS \"%s\",\n" " CASE amtype" " WHEN " CppAsString2(AMTYPE_INDEX) " THEN '%s'" @@ -228,7 +230,8 @@ describeTablespaces(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching tablespaces")); + appendPQExpBuffer(&buf, "SELECT spcname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n" " pg_catalog.pg_tablespace_location(oid) AS \"%s\"", @@ -338,7 +341,8 @@ describeFunctions(const char *functypes, const char *func_pattern, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching functions")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " p.proname as \"%s\",\n", gettext_noop("Schema"), @@ -645,7 +649,8 @@ describeTypes(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching types")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " pg_catalog.format_type(t.oid, NULL) AS \"%s\",\n", gettext_noop("Schema"), @@ -819,7 +824,8 @@ describeOperators(const char *oper_pattern, * to pre-v14 servers. */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching operators")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " o.oprname AS \"%s\",\n" " CASE WHEN o.oprkind='l' THEN NULL ELSE pg_catalog.format_type(o.oprleft, NULL) END AS \"%s\",\n" @@ -952,7 +958,8 @@ listAllDbs(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching databases")); + appendPQExpBuffer(&buf, "SELECT\n" " d.datname as \"%s\",\n" " pg_catalog.pg_get_userbyid(d.datdba) as \"%s\",\n" @@ -1060,7 +1067,8 @@ permissionsList(const char *pattern, bool showSystem) /* * we ignore indexes and toast tables since they have no meaningful rights */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching access privileges")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " c.relname as \"%s\",\n" " CASE c.relkind" @@ -1224,7 +1232,8 @@ listDefaultACLs(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching default ACLs")); + appendPQExpBuffer(&buf, "SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS \"%s\",\n" " n.nspname AS \"%s\",\n" " CASE d.defaclobjtype " @@ -1305,6 +1314,7 @@ objectDescription(const char *pattern, bool showSystem) initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching object comments")); appendPQExpBuffer(&buf, "SELECT DISTINCT tt.nspname AS \"%s\", tt.name AS \"%s\", tt.object AS \"%s\", d.description AS \"%s\"\n" "FROM (\n", @@ -1497,7 +1507,8 @@ describeTableDetails(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching relations to describe")); + appendPQExpBuffer(&buf, "SELECT c.oid,\n" " n.nspname,\n" " c.relname\n" @@ -1633,9 +1644,10 @@ describeOneTableDetails(const char *schemaname, initPQExpBuffer(&tmpbuf); /* Get general table info */ + printfPQExpBuffer(&buf, "/* %s */\n", _("Get general relation information")); if (pset.sversion >= 120000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, " "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, " "false AS relhasoids, c.relispartition, %s, c.reltablespace, " @@ -1653,7 +1665,7 @@ describeOneTableDetails(const char *schemaname, } else if (pset.sversion >= 100000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, " "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, " "c.relhasoids, c.relispartition, %s, c.reltablespace, " @@ -1670,7 +1682,7 @@ describeOneTableDetails(const char *schemaname, } else if (pset.sversion >= 90500) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, " "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, " "c.relhasoids, false as relispartition, %s, c.reltablespace, " @@ -1687,7 +1699,7 @@ describeOneTableDetails(const char *schemaname, } else if (pset.sversion >= 90400) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, " "c.relhastriggers, false, false, c.relhasoids, " "false as relispartition, %s, c.reltablespace, " @@ -1704,7 +1716,7 @@ describeOneTableDetails(const char *schemaname, } else { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, " "c.relhastriggers, false, false, c.relhasoids, " "false as relispartition, %s, c.reltablespace, " @@ -1765,9 +1777,10 @@ describeOneTableDetails(const char *schemaname, printQueryOpt myopt = pset.popt; char *footers[3] = {NULL, NULL, NULL}; + printfPQExpBuffer(&buf, "/* %s */\n", _("Get sequence information")); if (pset.sversion >= 100000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n" " seqstart AS \"%s\",\n" " seqmin AS \"%s\",\n" @@ -1791,7 +1804,7 @@ describeOneTableDetails(const char *schemaname, } else { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT 'bigint' AS \"%s\",\n" " start_value AS \"%s\",\n" " min_value AS \"%s\",\n" @@ -1818,7 +1831,8 @@ describeOneTableDetails(const char *schemaname, goto error_return; /* Get the column that owns this sequence */ - printfPQExpBuffer(&buf, "SELECT pg_catalog.quote_ident(nspname) || '.' ||" + printfPQExpBuffer(&buf, "/* %s */\n", _("Get the column that owns this sequence")); + appendPQExpBuffer(&buf, "SELECT pg_catalog.quote_ident(nspname) || '.' ||" "\n pg_catalog.quote_ident(relname) || '.' ||" "\n pg_catalog.quote_ident(attname)," "\n d.deptype" @@ -1862,7 +1876,8 @@ describeOneTableDetails(const char *schemaname, /* Print any publications */ if (pset.sversion >= 190000) { - printfPQExpBuffer(&buf, "SELECT pubname FROM pg_catalog.pg_publication p" + printfPQExpBuffer(&buf, "/* %s */\n", _("Get publications containing this sequence")); + appendPQExpBuffer(&buf, "SELECT pubname FROM pg_catalog.pg_publication p" "\nWHERE p.puballsequences" "\n AND pg_catalog.pg_relation_is_publishable('%s')" "\nORDER BY 1", @@ -1921,7 +1936,8 @@ describeOneTableDetails(const char *schemaname, printQueryOpt myopt = pset.popt; char *footers[3] = {NULL, NULL, NULL}; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get property graph information")); + appendPQExpBuffer(&buf, "SELECT e.pgealias AS \"%s\"," "\n pg_catalog.quote_ident(n.nspname) || '.' ||" "\n pg_catalog.quote_ident(c.relname) AS \"%s\"," @@ -2003,7 +2019,8 @@ describeOneTableDetails(const char *schemaname, * duplicative test logic below. */ cols = 0; - printfPQExpBuffer(&buf, "SELECT a.attname"); + printfPQExpBuffer(&buf, "/* %s */\n", _("Get columns for this relation")); + appendPQExpBuffer(&buf, "SELECT a.attname"); attname_col = cols++; appendPQExpBufferStr(&buf, ",\n pg_catalog.format_type(a.atttypid, a.atttypmod)"); atttype_col = cols++; @@ -2305,7 +2322,8 @@ describeOneTableDetails(const char *schemaname, /* Footer information for a partition child table */ PGresult *result; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get partition information for this table")); + appendPQExpBuffer(&buf, "SELECT inhparent::pg_catalog.regclass,\n" " pg_catalog.pg_get_expr(c.relpartbound, c.oid),\n "); @@ -2382,7 +2400,8 @@ describeOneTableDetails(const char *schemaname, /* For a TOAST table, print name of owning table */ PGresult *result; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get the table which owns this TOAST table")); + appendPQExpBuffer(&buf, "SELECT n.nspname, c.relname\n" "FROM pg_catalog.pg_class c" " JOIN pg_catalog.pg_namespace n" @@ -2410,7 +2429,8 @@ describeOneTableDetails(const char *schemaname, /* Footer information about an index */ PGresult *result; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get index details")); + appendPQExpBuffer(&buf, "SELECT i.indisunique, i.indisprimary, i.indisclustered, " "i.indisvalid,\n" " (NOT i.indimmediate) AND " @@ -2531,7 +2551,8 @@ describeOneTableDetails(const char *schemaname, /* print indexes */ if (tableinfo.hasindex) { - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get indexes for this table")); + appendPQExpBuffer(&buf, "SELECT c2.relname, i.indisprimary, i.indisunique, " "i.indisclustered, i.indisvalid, " "pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),\n " @@ -2635,7 +2656,9 @@ describeOneTableDetails(const char *schemaname, /* print table (and column) check constraints */ if (tableinfo.checks) { - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get check constraints")); + appendPQExpBuffer(&buf, "SELECT r.conname, " "pg_catalog.pg_get_constraintdef(r.oid, true)\n" "FROM pg_catalog.pg_constraint r\n" @@ -2666,6 +2689,7 @@ describeOneTableDetails(const char *schemaname, } /* Print foreign-key constraints */ + printfPQExpBuffer(&buf, "/* %s */\n", _("Get foreign key constraints")); if (pset.sversion >= 120000 && (tableinfo.ispartition || tableinfo.relkind == RELKIND_PARTITIONED_TABLE)) { @@ -2673,7 +2697,7 @@ describeOneTableDetails(const char *schemaname, * Put the constraints defined in this table first, followed by * the constraints defined in ancestor partitioned tables. */ - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT conrelid = '%s'::pg_catalog.regclass AS sametable,\n" " conname,\n" " pg_catalog.pg_get_constraintdef(oid, true) AS condef,\n" @@ -2686,7 +2710,7 @@ describeOneTableDetails(const char *schemaname, } else { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT true as sametable, conname,\n" " pg_catalog.pg_get_constraintdef(r.oid, true) as condef,\n" " conrelid::pg_catalog.regclass AS ontable\n" @@ -2736,9 +2760,10 @@ describeOneTableDetails(const char *schemaname, PQclear(result); /* print incoming foreign-key references */ + printfPQExpBuffer(&buf, "/* %s */\n", _("Get foreign keys referencing this table")); if (pset.sversion >= 120000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n" " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n" " FROM pg_catalog.pg_constraint c\n" @@ -2750,7 +2775,7 @@ describeOneTableDetails(const char *schemaname, } else { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n" " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n" " FROM pg_catalog.pg_constraint\n" @@ -2787,7 +2812,8 @@ describeOneTableDetails(const char *schemaname, /* print any row-level policies */ if (pset.sversion >= 90500) { - printfPQExpBuffer(&buf, "SELECT pol.polname,"); + printfPQExpBuffer(&buf, "/* %s */\n", _("Get row-level policies for this table")); + appendPQExpBuffer(&buf, "SELECT pol.polname,"); if (pset.sversion >= 100000) appendPQExpBufferStr(&buf, " pol.polpermissive,\n"); @@ -2867,9 +2893,10 @@ describeOneTableDetails(const char *schemaname, } /* print any extended statistics */ + printfPQExpBuffer(&buf, "/* %s */\n", _("Get extended statistics for this table")); if (pset.sversion >= 140000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT oid, " "stxrelid::pg_catalog.regclass, " "stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS nsp, " @@ -2967,7 +2994,7 @@ describeOneTableDetails(const char *schemaname, } else if (pset.sversion >= 100000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT oid, " "stxrelid::pg_catalog.regclass, " "stxnamespace::pg_catalog.regnamespace AS nsp, " @@ -3046,7 +3073,8 @@ describeOneTableDetails(const char *schemaname, /* print rules */ if (tableinfo.hasrules && tableinfo.relkind != RELKIND_MATVIEW) { - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get rules for this table")); + appendPQExpBuffer(&buf, "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true)), " "ev_enabled\n" "FROM pg_catalog.pg_rewrite r\n" @@ -3129,9 +3157,10 @@ describeOneTableDetails(const char *schemaname, /* print any publications */ if (pset.sversion >= 100000) { + printfPQExpBuffer(&buf, "/* %s */\n", _("Get publications that use this table")); if (pset.sversion >= 150000) { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT pubname\n" " , NULL\n" " , NULL\n" @@ -3191,7 +3220,7 @@ describeOneTableDetails(const char *schemaname, } else { - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT pubname\n" " , NULL\n" " , NULL\n" @@ -3241,7 +3270,8 @@ describeOneTableDetails(const char *schemaname, /* Print publications where the table is in the EXCEPT clause */ if (pset.sversion >= 190000) { - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get publications that exclude this table")); + appendPQExpBuffer(&buf, "SELECT pubname\n" "FROM pg_catalog.pg_publication p\n" "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" @@ -3273,7 +3303,8 @@ describeOneTableDetails(const char *schemaname, */ if (verbose) { - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get not null constraints for this table")); + appendPQExpBuffer(&buf, "SELECT c.conname, a.attname, c.connoinherit,\n" " c.conislocal, c.coninhcount <> 0,\n" " c.convalidated\n" @@ -3346,7 +3377,8 @@ describeOneTableDetails(const char *schemaname, /* print rules */ if (tableinfo.hasrules) { - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get rules for this view")); + appendPQExpBuffer(&buf, "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true))\n" "FROM pg_catalog.pg_rewrite r\n" "WHERE r.ev_class = '%s' AND r.rulename != '_RETURN' ORDER BY 1;", @@ -3383,7 +3415,8 @@ describeOneTableDetails(const char *schemaname, PGresult *result; int tuples; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get triggers for this table")); + appendPQExpBuffer(&buf, "SELECT t.tgname, " "pg_catalog.pg_get_triggerdef(t.oid, true), " "t.tgenabled, t.tgisinternal,\n"); @@ -3566,7 +3599,8 @@ describeOneTableDetails(const char *schemaname, char *ftoptions; /* Footer information about foreign table */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get foreign server")); + appendPQExpBuffer(&buf, "SELECT s.srvname,\n" " pg_catalog.array_to_string(ARRAY(\n" " SELECT pg_catalog.quote_ident(option_name)" @@ -3601,7 +3635,8 @@ describeOneTableDetails(const char *schemaname, } /* print tables inherited from (exclude partitioned parents) */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get parent tables")); + appendPQExpBuffer(&buf, "SELECT c.oid::pg_catalog.regclass\n" "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n" "WHERE c.oid = i.inhparent AND i.inhrelid = '%s'\n" @@ -3638,8 +3673,9 @@ describeOneTableDetails(const char *schemaname, } /* print child tables (with additional info if partitions) */ + printfPQExpBuffer(&buf, "/* %s */\n", _("Get child tables")); if (pset.sversion >= 140000) - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.oid::pg_catalog.regclass, c.relkind," " inhdetachpending," " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n" @@ -3649,7 +3685,7 @@ describeOneTableDetails(const char *schemaname, " c.oid::pg_catalog.regclass::pg_catalog.text;", oid); else if (pset.sversion >= 100000) - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.oid::pg_catalog.regclass, c.relkind," " false AS inhdetachpending," " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n" @@ -3659,7 +3695,7 @@ describeOneTableDetails(const char *schemaname, " c.oid::pg_catalog.regclass::pg_catalog.text;", oid); else - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT c.oid::pg_catalog.regclass, c.relkind," " false AS inhdetachpending, NULL\n" "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n" @@ -3894,7 +3930,8 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching roles")); + appendPQExpBuffer(&buf, "SELECT r.rolname, r.rolsuper, r.rolinherit,\n" " r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,\n" " r.rolconnlimit, r.rolvaliduntil"); @@ -4033,7 +4070,8 @@ listDbRoleSettings(const char *pattern, const char *pattern2) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, "SELECT rolname AS \"%s\", datname AS \"%s\",\n" + printfPQExpBuffer(&buf, "/* %s */\n", _("Get per-database and per-role settings")); + appendPQExpBuffer(&buf, "SELECT rolname AS \"%s\", datname AS \"%s\",\n" "pg_catalog.array_to_string(setconfig, E'\\n') AS \"%s\"\n" "FROM pg_catalog.pg_db_role_setting s\n" "LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase\n" @@ -4100,7 +4138,8 @@ describeRoleGrants(const char *pattern, bool showSystem) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching role grants")); + appendPQExpBuffer(&buf, "SELECT m.rolname AS \"%s\", r.rolname AS \"%s\",\n" " pg_catalog.concat_ws(', ',\n", gettext_noop("Role name"), @@ -4199,7 +4238,8 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching relations")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " c.relname as \"%s\",\n" " CASE c.relkind" @@ -4482,7 +4522,8 @@ listPartitionedTables(const char *reltypes, const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching partitioned tables")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " c.relname as \"%s\",\n" " pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"", @@ -4657,7 +4698,8 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching languages")); + appendPQExpBuffer(&buf, "SELECT l.lanname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(l.lanowner) as \"%s\",\n" " l.lanpltrusted AS \"%s\"", @@ -4733,7 +4775,8 @@ listDomains(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching domains")); + appendPQExpBuffer(&buf, "SELECT n.nspname as \"%s\",\n" " t.typname as \"%s\",\n" " pg_catalog.format_type(t.typbasetype, t.typtypmod) as \"%s\",\n" @@ -4818,7 +4861,8 @@ listConversions(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching conversions")); + appendPQExpBuffer(&buf, "SELECT n.nspname AS \"%s\",\n" " c.conname AS \"%s\",\n" " pg_catalog.pg_encoding_to_char(c.conforencoding) AS \"%s\",\n" @@ -4896,7 +4940,9 @@ describeConfigurationParameters(const char *pattern, bool verbose, printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching configuration parameters")); + appendPQExpBuffer(&buf, "SELECT s.name AS \"%s\", " "pg_catalog.current_setting(s.name) AS \"%s\"", gettext_noop("Parameter"), @@ -4976,7 +5022,8 @@ listEventTriggers(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching event triggers")); + appendPQExpBuffer(&buf, "SELECT evtname as \"%s\", " "evtevent as \"%s\", " "pg_catalog.pg_get_userbyid(e.evtowner) as \"%s\",\n" @@ -5053,7 +5100,9 @@ listExtendedStats(const char *pattern, bool verbose) } initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching extended statistics")); + appendPQExpBuffer(&buf, "SELECT \n" "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS \"%s\", \n" "es.stxname AS \"%s\", \n", @@ -5146,7 +5195,8 @@ listCasts(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching casts")); + appendPQExpBuffer(&buf, "SELECT pg_catalog.format_type(castsource, NULL) AS \"%s\",\n" " pg_catalog.format_type(casttarget, NULL) AS \"%s\",\n", gettext_noop("Source type"), @@ -5270,7 +5320,8 @@ listCollations(const char *pattern, bool verbose, bool showSystem) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching collations")); + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname AS \"%s\",\n" " c.collname AS \"%s\",\n", @@ -5393,7 +5444,9 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) char **footers = NULL; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching schemas")); + appendPQExpBuffer(&buf, "SELECT n.nspname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(n.nspowner) AS \"%s\"", gettext_noop("Name"), @@ -5436,7 +5489,8 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) PGresult *result; int i; - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get publications that use this schema")); + appendPQExpBuffer(&buf, "SELECT pubname \n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" @@ -5516,7 +5570,8 @@ listTSParsers(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search parsers")); + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname as \"%s\",\n" " p.prsname as \"%s\",\n" @@ -5565,7 +5620,8 @@ listTSParsersVerbose(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search parsers")); + appendPQExpBuffer(&buf, "SELECT p.oid,\n" " n.nspname,\n" " p.prsname\n" @@ -5642,7 +5698,8 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get text search parser details")); + appendPQExpBuffer(&buf, "SELECT '%s' AS \"%s\",\n" " p.prsstart::pg_catalog.regproc AS \"%s\",\n" " pg_catalog.obj_description(p.prsstart, 'pg_proc') as \"%s\"\n" @@ -5710,7 +5767,8 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get text search parser tokens")); + appendPQExpBuffer(&buf, "SELECT t.alias as \"%s\",\n" " t.description as \"%s\"\n" "FROM pg_catalog.ts_token_type( '%s'::pg_catalog.oid ) as t\n" @@ -5760,7 +5818,8 @@ listTSDictionaries(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search dictionaries")); + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname as \"%s\",\n" " d.dictname as \"%s\",\n", @@ -5825,8 +5884,9 @@ listTSTemplates(const char *pattern, bool verbose) initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search templates")); if (verbose) - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname AS \"%s\",\n" " t.tmplname AS \"%s\",\n" @@ -5839,7 +5899,7 @@ listTSTemplates(const char *pattern, bool verbose) gettext_noop("Lexize"), gettext_noop("Description")); else - printfPQExpBuffer(&buf, + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname AS \"%s\",\n" " t.tmplname AS \"%s\",\n" @@ -5893,7 +5953,8 @@ listTSConfigs(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search configurations")); + appendPQExpBuffer(&buf, "SELECT\n" " n.nspname as \"%s\",\n" " c.cfgname as \"%s\",\n" @@ -5939,7 +6000,8 @@ listTSConfigsVerbose(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching text search configurations")); + appendPQExpBuffer(&buf, "SELECT c.oid, c.cfgname,\n" " n.nspname,\n" " p.prsname,\n" @@ -6025,7 +6087,8 @@ describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get text search configuration details")); + appendPQExpBuffer(&buf, "SELECT\n" " ( SELECT t.alias FROM\n" " pg_catalog.ts_token_type(c.cfgparser) AS t\n" @@ -6093,7 +6156,9 @@ listForeignDataWrappers(const char *pattern, bool verbose) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching foreign-data wrappers")); + appendPQExpBuffer(&buf, "SELECT fdw.fdwname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(fdw.fdwowner) AS \"%s\",\n" " fdw.fdwhandler::pg_catalog.regproc AS \"%s\",\n" @@ -6164,7 +6229,9 @@ listForeignServers(const char *pattern, bool verbose) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching foreign servers")); + appendPQExpBuffer(&buf, "SELECT s.srvname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(s.srvowner) AS \"%s\",\n" " f.fdwname AS \"%s\"", @@ -6240,7 +6307,9 @@ listUserMappings(const char *pattern, bool verbose) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching user mappings")); + appendPQExpBuffer(&buf, "SELECT um.srvname AS \"%s\",\n" " um.usename AS \"%s\"", gettext_noop("Server"), @@ -6295,7 +6364,9 @@ listForeignTables(const char *pattern, bool verbose) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching foreign tables")); + appendPQExpBuffer(&buf, "SELECT n.nspname AS \"%s\",\n" " c.relname AS \"%s\",\n" " s.srvname AS \"%s\"", @@ -6367,7 +6438,9 @@ listExtensions(const char *pattern) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching extensions")); + appendPQExpBuffer(&buf, "SELECT e.extname AS \"%s\", " "e.extversion AS \"%s\", ae.default_version AS \"%s\"," "n.nspname AS \"%s\", d.description AS \"%s\"\n" @@ -6421,7 +6494,9 @@ listExtensionContents(const char *pattern) int i; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching installed extensions")); + appendPQExpBuffer(&buf, "SELECT e.extname, e.oid\n" "FROM pg_catalog.pg_extension e\n"); @@ -6489,7 +6564,9 @@ listOneExtensionContents(const char *extname, const char *oid) printQueryOpt myopt = pset.popt; initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + + printfPQExpBuffer(&buf, "/* %s */\n", _("Get installed extension details")); + appendPQExpBuffer(&buf, "SELECT pg_catalog.pg_describe_object(classid, objid, 0) AS \"%s\"\n" "FROM pg_catalog.pg_depend\n" "WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND refobjid = '%s' AND deptype = 'e'\n" @@ -6597,7 +6674,8 @@ listPublications(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching publications")); + appendPQExpBuffer(&buf, "SELECT pubname AS \"%s\",\n" " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" " puballtables AS \"%s\"", @@ -6748,7 +6826,8 @@ describePublications(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get details about matching publications")); + appendPQExpBuffer(&buf, "SELECT oid, pubname,\n" " pg_catalog.pg_get_userbyid(pubowner) AS owner,\n" " puballtables"); @@ -6884,8 +6963,8 @@ describePublications(const char *pattern) if (!puballtables) { /* Get the tables for the specified publication */ - printfPQExpBuffer(&buf, - "SELECT n.nspname, c.relname"); + printfPQExpBuffer(&buf, "/* %s */\n", _("Get tables used by this publication")); + appendPQExpBuffer(&buf, "SELECT n.nspname, c.relname"); if (pset.sversion >= 150000) { appendPQExpBufferStr(&buf, @@ -6921,7 +7000,8 @@ describePublications(const char *pattern) if (pset.sversion >= 150000) { /* Get the schemas for the specified publication */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get schemas used by this publication")); + appendPQExpBuffer(&buf, "SELECT n.nspname\n" "FROM pg_catalog.pg_namespace n\n" " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" @@ -6937,7 +7017,8 @@ describePublications(const char *pattern) if (pset.sversion >= 190000) { /* Get tables in the EXCEPT clause for this publication */ - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get tables excluded by this publication")); + appendPQExpBuffer(&buf, "SELECT n.nspname || '.' || c.relname\n" "FROM pg_catalog.pg_class c\n" " JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n" @@ -6997,7 +7078,8 @@ describeSubscriptions(const char *pattern, bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching subscriptions")); + appendPQExpBuffer(&buf, "SELECT subname AS \"%s\"\n" ", pg_catalog.pg_get_userbyid(subowner) AS \"%s\"\n" ", subenabled AS \"%s\"\n" @@ -7166,7 +7248,8 @@ listOperatorClasses(const char *access_method_pattern, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching operator classes")); + appendPQExpBuffer(&buf, "SELECT\n" " am.amname AS \"%s\",\n" " pg_catalog.format_type(c.opcintype, NULL) AS \"%s\",\n" @@ -7267,7 +7350,8 @@ listOperatorFamilies(const char *access_method_pattern, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching operator families")); + appendPQExpBuffer(&buf, "SELECT\n" " am.amname AS \"%s\",\n" " CASE\n" @@ -7357,7 +7441,8 @@ listOpFamilyOperators(const char *access_method_pattern, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get operators of matching operator families")); + appendPQExpBuffer(&buf, "SELECT\n" " am.amname AS \"%s\",\n" " CASE\n" @@ -7463,7 +7548,8 @@ listOpFamilyFunctions(const char *access_method_pattern, initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get matching support functions of operator families")); + appendPQExpBuffer(&buf, "SELECT\n" " am.amname AS \"%s\",\n" " CASE\n" @@ -7549,7 +7635,8 @@ listLargeObjects(bool verbose) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, + printfPQExpBuffer(&buf, "/* %s */\n", _("Get large objects")); + appendPQExpBuffer(&buf, "SELECT oid as \"%s\",\n" " pg_catalog.pg_get_userbyid(lomowner) as \"%s\",\n ", gettext_noop("ID"), -- 2.47.3