Fix minor issues in psql's new \dAc and related commands.

The type-name pattern in \dAc and \dAf was matched only to the actual
pg_type.typname string, which is fairly user-unfriendly in cases where
that is not what's shown to the user by format_type (compare "_int4"
and "integer[]").  Make this code match what \dT does, i.e. match the
pattern against either typname or format_type() output.  Also fix its
broken handling of schema-name restrictions.  (IOW, make these
processSQLNamePattern calls match \dT's.)  While here, adjust
whitespace to make the query a little prettier in -E output, too.

Also improve some inaccuracies and shaky grammar in the related
documentation.

Noted while working on a patch for intarray's opclasses; I wondered
why I couldn't get a match to "integer*" for the input type name.
This commit is contained in:
Tom Lane 2020-08-02 17:00:26 -04:00
parent 6ee3b5fb99
commit 533020d050
3 changed files with 48 additions and 27 deletions

View File

@ -1410,6 +1410,15 @@ SELECT am.amname AS index_method,
ORDER BY index_method, opfamily_name, opfamily_operator;
</programlisting>
</para>
<tip>
<para>
<xref linkend="app-psql"/> has
commands <command>\dAc</command>, <command>\dAf</command>,
and <command>\dAo</command>, which provide slightly more sophisticated
versions of these queries.
</para>
</tip>
</sect1>

View File

@ -1245,13 +1245,13 @@ testdb=&gt;
<listitem>
<para>
Lists operator classes
(see <xref linkend="catalog-pg-opclass"/>).
(see <xref linkend="xindex-opclass"/>).
If <replaceable class="parameter">access-method-pattern</replaceable>
is specified, only operator classes associated with access methods whose
names match the pattern are listed.
names match that pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only operator classes associated with input types whose
names match the pattern are listed.
names match that pattern are listed.
If <literal>+</literal> is appended to the command name, each operator
class is listed with its associated operator family and owner.
</para>
@ -1268,13 +1268,13 @@ testdb=&gt;
<listitem>
<para>
Lists operator families
(see <xref linkend="catalog-pg-opfamily"/>).
(see <xref linkend="xindex-opfamily"/>).
If <replaceable class="parameter">access-method-pattern</replaceable>
is specified, only operator families associated with access methods whose
names match the pattern are listed.
names match that pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only operator families associated with input types whose
names match the pattern are listed.
names match that pattern are listed.
If <literal>+</literal> is appended to the command name, each operator
family is listed with its owner.
</para>
@ -1292,15 +1292,15 @@ testdb=&gt;
<listitem>
<para>
Lists operators associated with operator families
(<xref linkend="catalog-pg-amop"/>).
(see <xref linkend="xindex-strategies"/>).
If <replaceable class="parameter">access-method-pattern</replaceable>
is specified, only members of operator families associated with access
methods whose names match the pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only members of operator families whose names match the
methods whose names match that pattern are listed.
If <replaceable class="parameter">operator-family-pattern</replaceable>
is specified, only members of operator families whose names match that
pattern are listed.
If <literal>+</literal> is appended to the command name, each operator
is listed with its strategy number, purpose and sort operator family.
is listed with its sort operator family (if it is an ordering operator).
</para>
</listitem>
</varlistentry>
@ -1314,14 +1314,16 @@ testdb=&gt;
</term>
<listitem>
<para>
Lists functions associated with operator families
(<xref linkend="catalog-pg-amproc"/>).
Lists support functions associated with operator families
(see <xref linkend="xindex-support"/>).
If <replaceable class="parameter">access-method-pattern</replaceable>
is specified, only members of operator families associated with access
methods whose names match the pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only members of operator families whose names match the
pattern are listed.
is specified, only functions of operator families associated with
access methods whose names match that pattern are listed.
If <replaceable class="parameter">operator-family-pattern</replaceable>
is specified, only functions of operator families whose names match
that pattern are listed.
If <literal>+</literal> is appended to the command name, functions are
displayed verbosely, with their actual parameter lists.
</para>
</listitem>
</varlistentry>

View File

@ -6056,7 +6056,7 @@ printACLColumn(PQExpBuffer buf, const char *colname)
* \dAc
* Lists operator classes
*
* Takes an optional regexps to filter by index access method and type.
* Takes optional regexps to filter by index access method and input data type.
*/
bool
listOperatorClasses(const char *access_method_pattern,
@ -6110,6 +6110,7 @@ listOperatorClasses(const char *access_method_pattern,
" LEFT JOIN pg_catalog.pg_am am on am.oid = c.opcmethod\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n"
" LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n"
" LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"
);
if (verbose)
appendPQExpBuffer(&buf,
@ -6120,8 +6121,13 @@ listOperatorClasses(const char *access_method_pattern,
have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern,
false, false, NULL, "am.amname", NULL, NULL);
if (type_pattern)
{
/* Match type name pattern against either internal or external name */
processSQLNamePattern(pset.db, &buf, type_pattern, have_where, false,
NULL, "t.typname", NULL, NULL);
"tn.nspname", "t.typname",
"pg_catalog.format_type(t.oid, NULL)",
"pg_catalog.pg_type_is_visible(t.oid)");
}
appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
res = PSQLexec(buf.data);
@ -6145,7 +6151,7 @@ listOperatorClasses(const char *access_method_pattern,
* \dAf
* Lists operator families
*
* Takes an optional regexps to filter by index access method and type.
* Takes optional regexps to filter by index access method and input data type.
*/
bool
listOperatorFamilies(const char *access_method_pattern,
@ -6190,15 +6196,19 @@ listOperatorFamilies(const char *access_method_pattern,
if (type_pattern)
{
appendPQExpBuffer(&buf,
"\n %s EXISTS (\n"
" %s EXISTS (\n"
" SELECT 1\n"
" FROM pg_catalog.pg_type t\n"
" JOIN pg_catalog.pg_opclass oc ON oc.opcintype = t.oid\n"
" WHERE oc.opcfamily = f.oid",
" LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"
" WHERE oc.opcfamily = f.oid\n",
have_where ? "AND" : "WHERE");
/* Match type name pattern against either internal or external name */
processSQLNamePattern(pset.db, &buf, type_pattern, true, false,
NULL, "t.typname", NULL, NULL);
appendPQExpBuffer(&buf, ")");
"tn.nspname", "t.typname",
"pg_catalog.format_type(t.oid, NULL)",
"pg_catalog.pg_type_is_visible(t.oid)");
appendPQExpBuffer(&buf, " )\n");
}
appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
@ -6223,7 +6233,7 @@ listOperatorFamilies(const char *access_method_pattern,
* \dAo
* Lists operators of operator families
*
* Takes an optional regexps to filter by index access method and operator
* Takes optional regexps to filter by index access method and operator
* family.
*/
bool
@ -6310,7 +6320,7 @@ listOpFamilyOperators(const char *access_method_pattern,
* \dAp
* Lists support functions of operator families
*
* Takes an optional regexps to filter by index access method and operator
* Takes optional regexps to filter by index access method and operator
* family.
*/
bool