Hi
2017-08-15 4:37 GMT+02:00 Peter Eisentraut <[email protected]
>:
> On 3/11/17 07:06, Pavel Stehule wrote:
> > I am sending a updated version with separated sort direction in special
> > variable
>
> This patch also needs a rebase.
>
I am sending rebased patch
Regards
Pavel
>
> --
> Peter Eisentraut http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c592edac60..9bc391cb39 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -3719,6 +3719,27 @@ bar
</varlistentry>
<varlistentry>
+ <term><varname>VERBOSE_SORT_COLUMNS</varname></term>
+ <listitem>
+ <para>
+ This variable can be set to the values <literal>schema_name</>,
+ <literal>name_schema</> or <literal>size</> to control the
+ order of content of decrible command.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>VERBOSE_SORT_DIRECTION</varname></term>
+ <listitem>
+ <para>
+ This variable can be set to the values <literal>asc</>,
+ or <literal>desc</> to control the order of content of decrible command.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>VERBOSITY</varname></term>
<listitem>
<para>
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index f6049cc9e5..1b2346d38b 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -200,6 +200,8 @@ describeAccessMethods(const char *pattern, bool verbose)
return true;
}
+#define SORT_DIRECTION_STR(v) ((v) == PSQL_SORT_ASC ? "ASC" : "DESC")
+
/*
* \db
* Takes an optional regexp to select particular tablespaces
@@ -268,7 +270,18 @@ describeTablespaces(const char *pattern, bool verbose)
NULL, "spcname", NULL,
NULL);
- appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ if (verbose && pset.sversion >= 90200)
+ {
+ if (pset.verbose_sort_columns == PSQL_SORT_SIZE)
+ appendPQExpBuffer(&buf,
+ "ORDER BY pg_catalog.pg_tablespace_size(oid) %s, 1;",
+ SORT_DIRECTION_STR(pset.verbose_sort_direction));
+ else
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+ }
+ else
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
res = PSQLexec(buf.data);
termPQExpBuffer(&buf);
@@ -830,7 +843,19 @@ listAllDbs(const char *pattern, bool verbose)
processSQLNamePattern(pset.db, &buf, pattern, false, false,
NULL, "d.datname", NULL, NULL);
- appendPQExpBufferStr(&buf, "ORDER BY 1;");
+ if (verbose && pset.sversion >= 80200)
+ {
+ if (pset.verbose_sort_columns == PSQL_SORT_SIZE)
+ appendPQExpBuffer(&buf,
+ "ORDER BY CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n"
+ " THEN pg_catalog.pg_database_size(d.datname) END %s, 1;\n",
+ SORT_DIRECTION_STR(pset.verbose_sort_direction));
+ else
+ appendPQExpBufferStr(&buf, "ORDER BY 1");
+ }
+ else
+ appendPQExpBufferStr(&buf, "ORDER BY 1");
+
res = PSQLexec(buf.data);
termPQExpBuffer(&buf);
if (!res)
@@ -3422,7 +3447,26 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
"n.nspname", "c.relname", NULL,
"pg_catalog.pg_table_is_visible(c.oid)");
- appendPQExpBufferStr(&buf, "ORDER BY 1,2;");
+ if (verbose && pset.sversion >= 80100)
+ {
+ if (pset.verbose_sort_columns == PSQL_SORT_SCHEMA_NAME)
+ appendPQExpBufferStr(&buf, "ORDER BY 1,2;");
+ else if (pset.verbose_sort_columns == PSQL_SORT_NAME_SCHEMA)
+ appendPQExpBufferStr(&buf, "ORDER BY 2,1;");
+ else
+ {
+ if (pset.sversion >= 90000)
+ appendPQExpBuffer(&buf,
+ "ORDER BY pg_catalog.pg_table_size(c.oid) %s, 1,2",
+ SORT_DIRECTION_STR(pset.verbose_sort_direction));
+ else
+ appendPQExpBuffer(&buf,
+ "ORDER BY pg_catalog.pg_relation_size(c.oid) %s, 1,2",
+ SORT_DIRECTION_STR(pset.verbose_sort_direction));
+ }
+ }
+ else
+ appendPQExpBufferStr(&buf, "ORDER BY 1,2;");
res = PSQLexec(buf.data);
termPQExpBuffer(&buf);
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index b3dbb5946e..abdc6555b6 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -336,7 +336,7 @@ helpVariables(unsigned short int pager)
* Windows builds currently print one more line than non-Windows builds.
* Using the larger number is fine.
*/
- output = PageOutput(88, pager ? &(pset.popt.topt) : NULL);
+ output = PageOutput(92, pager ? &(pset.popt.topt) : NULL);
fprintf(output, _("List of specially treated variables\n\n"));
@@ -373,6 +373,10 @@ helpVariables(unsigned short int pager)
fprintf(output, _(" SINGLESTEP single-step mode (same as -s option)\n"));
fprintf(output, _(" USER the currently connected database user\n"));
fprintf(output, _(" VERBOSITY controls verbosity of error reports [default, verbose, terse]\n"));
+ fprintf(output, _(" VERBOSE_SORT_COLUMNS\n"
+ " sort columns for verbose mode [schema_name, name_schema, size]\n"));
+ fprintf(output, _(" VERBOSE_SORT_DIRECTION\n"
+ " direction of sort of verbose mode [asc, desc]\n"));
fprintf(output, _("\nDisplay settings:\n"));
fprintf(output, _("Usage:\n"));
diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h
index b78f151acd..32249df15c 100644
--- a/src/bin/psql/settings.h
+++ b/src/bin/psql/settings.h
@@ -77,6 +77,19 @@ enum trivalue
TRI_YES
};
+typedef enum
+{
+ PSQL_SORT_SCHEMA_NAME,
+ PSQL_SORT_NAME_SCHEMA,
+ PSQL_SORT_SIZE,
+} PSQL_SORT_COLUMNS;
+
+typedef enum
+{
+ PSQL_SORT_ASC,
+ PSQL_SORT_DESC
+} PSQL_SORT_DIRECTION;
+
typedef struct _psqlSettings
{
PGconn *db; /* connection to backend */
@@ -138,6 +151,8 @@ typedef struct _psqlSettings
const char *prompt3;
PGVerbosity verbosity; /* current error verbosity level */
PGContextVisibility show_context; /* current context display level */
+ PSQL_SORT_COLUMNS verbose_sort_columns; /* sort columns for describe verbose command */
+ PSQL_SORT_DIRECTION verbose_sort_direction; /* sort direction for describe verbose command */
} PsqlSettings;
extern PsqlSettings pset;
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 7f767976a5..8e3fb1bd78 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -168,6 +168,9 @@ main(int argc, char *argv[])
SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
+ SetVariable(pset.vars, "VERBOSE_SORT_COLUMNS", "schema_name");
+ SetVariable(pset.vars, "VERBOSE_SORT_DIRECTION", "asc");
+
parse_psql_options(argc, argv, &options);
/*
@@ -1075,6 +1078,60 @@ verbosity_hook(const char *newval)
}
static char *
+verbose_sort_columns_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("schema_name");
+ return newval;
+}
+
+static bool
+verbose_sort_columns_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "schema_name") == 0)
+ pset.verbose_sort_columns = PSQL_SORT_SCHEMA_NAME;
+ else if (pg_strcasecmp(newval, "name_schema") == 0)
+ pset.verbose_sort_columns = PSQL_SORT_NAME_SCHEMA;
+ else if (pg_strcasecmp(newval, "size") == 0)
+ pset.verbose_sort_columns = PSQL_SORT_SIZE;
+ else
+ {
+ PsqlVarEnumError("VERBOSE_SORT_COLUMNS", newval,
+ "schema_name, name_schema, size");
+ return false;
+ }
+
+ return true;
+}
+
+static char *
+verbose_sort_direction_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("asc");
+ return newval;
+}
+
+static bool
+verbose_sort_direction_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "asc") == 0)
+ pset.verbose_sort_direction = PSQL_SORT_ASC;
+ else if (pg_strcasecmp(newval, "desc") == 0)
+ pset.verbose_sort_direction = PSQL_SORT_DESC;
+ else
+ {
+ PsqlVarEnumError("VERBOSE_SORT_DIRECTION", newval, "asc, desc");
+ return false;
+ }
+
+ return true;
+}
+
+
+static char *
show_context_substitute_hook(char *newval)
{
if (newval == NULL)
@@ -1163,6 +1220,12 @@ EstablishVariableSpace(void)
SetVariableHooks(pset.vars, "VERBOSITY",
verbosity_substitute_hook,
verbosity_hook);
+ SetVariableHooks(pset.vars, "VERBOSE_SORT_COLUMNS",
+ verbose_sort_columns_substitute_hook,
+ verbose_sort_columns_hook);
+ SetVariableHooks(pset.vars, "VERBOSE_SORT_DIRECTION",
+ verbose_sort_direction_substitute_hook,
+ verbose_sort_direction_hook);
SetVariableHooks(pset.vars, "SHOW_CONTEXT",
show_context_substitute_hook,
show_context_hook);
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 1583cfa998..963f537a24 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3564,6 +3564,10 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH_LIST_CS3("never", "errors", "always");
else if (TailMatchesCS1("VERBOSITY"))
COMPLETE_WITH_LIST_CS3("default", "verbose", "terse");
+ else if (TailMatchesCS1("VERBOSE_SORT_COLUMNS"))
+ COMPLETE_WITH_LIST_CS3("schema_name", "name_schema","size");
+ else if (TailMatchesCS1("VERBOSE_SORT_DIRECTION"))
+ COMPLETE_WITH_LIST_CS2("asc", "desc");
}
else if (TailMatchesCS1("\\sf*"))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers