Commit b0b5e20c authored by Alexander Korotkov's avatar Alexander Korotkov

Show opclass and opfamily related information in psql

This commit provides psql commands for listing operator classes, operator
families and its contents in psql.  New commands will be useful for exploring
capabilities of both builtin opclasses/opfamilies as well as
opclasses/opfamilies defined in extensions.

Discussion: https://postgr.es/m/1529675324.14193.5.camel%40postgrespro.ru
Author: Sergey Cherkashin, Nikita Glukhov, Alexander Korotkov
Reviewed-by: Michael Paquier, Alvaro Herrera, Arthur Zakirov
Reviewed-by: Kyotaro Horiguchi, Andres Freund
parent 691e8b2e
......@@ -1231,6 +1231,97 @@ testdb=>
</listitem>
</varlistentry>
<varlistentry>
<term>
<literal>\dAc[+]
[<link linkend="app-psql-patterns"><replaceable class="parameter">access-method-pattern</replaceable></link>
[<link linkend="app-psql-patterns"><replaceable class="parameter">input-type-pattern</replaceable></link>]]
</literal>
</term>
<listitem>
<para>
Lists operator classes
(see <xref linkend="catalog-pg-opclass"/>).
If <replaceable class="parameter">access-method-patttern</replaceable>
is specified, only operator classes associated with access methods whose
names match 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.
If <literal>+</literal> is appended to the command name, each operator
class is listed with its associated operator family and owner.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<literal>\dAf[+]
[<link linkend="app-psql-patterns"><replaceable class="parameter">access-method-pattern</replaceable></link>
[<link linkend="app-psql-patterns"><replaceable class="parameter">input-type-pattern</replaceable></link>]]
</literal>
</term>
<listitem>
<para>
Lists operator families
(see <xref linkend="catalog-pg-opfamily"/>).
If <replaceable class="parameter">access-method-patttern</replaceable>
is specified, only operator families associated with access methods whose
names match 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.
If <literal>+</literal> is appended to the command name, each operator
family is listed with its owner.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<literal>\dAo[+]
[<link linkend="app-psql-patterns"><replaceable class="parameter">access-method-pattern</replaceable></link>
[<link linkend="app-psql-patterns"><replaceable class="parameter">operator-family-pattern</replaceable></link>]]
</literal>
</term>
<listitem>
<para>
Lists operators associated with operator families
(<xref linkend="catalog-pg-amop"/>).
If <replaceable class="parameter">access-method-patttern</replaceable>
is specified, only members of operator families associated with access
methods whose names match pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only memeber of operator families whose names match the
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.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<literal>\dAp[+]
[<link linkend="app-psql-patterns"><replaceable class="parameter">access-method-pattern</replaceable></link>
[<link linkend="app-psql-patterns"><replaceable class="parameter">operator-family-pattern</replaceable></link>]]
</literal>
</term>
<listitem>
<para>
Lists procedures associated with operator families
(<xref linkend="catalog-pg-amproc"/>).
If <replaceable class="parameter">access-method-patttern</replaceable>
is specified, only members of operator families associated with access
methods whose names match pattern are listed.
If <replaceable class="parameter">input-type-pattern</replaceable>
is specified, only memeber of operator families whose names match the
pattern are listed.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>\db[+] [ <link linkend="app-psql-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
......
......@@ -721,7 +721,38 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd)
success = listTables("tvmsE", NULL, show_verbose, show_system);
break;
case 'A':
success = describeAccessMethods(pattern, show_verbose);
{
char *pattern2 = NULL;
if (pattern && cmd[2] != '\0' && cmd[2] != '+')
pattern2 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true);
switch (cmd[2])
{
case '\0':
case '+':
success = describeAccessMethods(pattern, show_verbose);
break;
case 'c':
success = listOperatorClasses(pattern, pattern2, show_verbose);
break;
case 'f':
success = listOperatorFamilies(pattern, pattern2, show_verbose);
break;
case 'o':
success = listOpFamilyOperators(pattern, pattern2, show_verbose);
break;
case 'p':
success = listOpFamilyProcedures(pattern, pattern2);
break;
default:
status = PSQL_CMD_UNKNOWN;
break;
}
if (pattern2)
free(pattern2);
}
break;
case 'a':
success = describeAggregates(pattern, show_verbose, show_system);
......
This diff is collapsed.
......@@ -114,4 +114,23 @@ bool describePublications(const char *pattern);
/* \dRs */
bool describeSubscriptions(const char *pattern, bool verbose);
/* \dAc */
extern bool listOperatorClasses(const char *access_method_pattern,
const char *opclass_pattern,
bool verbose);
/* \dAf */
extern bool listOperatorFamilies(const char *access_method_pattern,
const char *opclass_pattern,
bool verbose);
/* \dAo */
extern bool listOpFamilyOperators(const char *accessMethod_pattern,
const char *family_pattern, bool verbose);
/* \dAp */
extern bool listOpFamilyProcedures(const char *access_method_pattern,
const char *family_pattern);
#endif /* DESCRIBE_H */
......@@ -227,6 +227,10 @@ slashUsage(unsigned short int pager)
fprintf(output, _(" \\d[S+] NAME describe table, view, sequence, or index\n"));
fprintf(output, _(" \\da[S] [PATTERN] list aggregates\n"));
fprintf(output, _(" \\dA[+] [PATTERN] list access methods\n"));
fprintf(output, _(" \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"));
fprintf(output, _(" \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"));
fprintf(output, _(" \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"));
fprintf(output, _(" \\dAp [AMPTRN [OPFPTRN]] list procedures of operator families\n"));
fprintf(output, _(" \\db[+] [PATTERN] list tablespaces\n"));
fprintf(output, _(" \\dc[S+] [PATTERN] list conversions\n"));
fprintf(output, _(" \\dC[+] [PATTERN] list casts\n"));
......
......@@ -510,6 +510,13 @@ static const SchemaQuery Query_for_list_of_partitioned_relations = {
.result = "pg_catalog.quote_ident(c.relname)",
};
static const SchemaQuery Query_for_list_of_operator_families = {
.catname = "pg_catalog.pg_opfamily c",
.viscondition = "pg_catalog.pg_opfamily_is_visible(c.oid)",
.namespace = "c.opfnamespace",
.result = "pg_catalog.quote_ident(c.opfname)",
};
/* Relations supporting INSERT, UPDATE or DELETE */
static const SchemaQuery Query_for_list_of_updatables = {
.catname = "pg_catalog.pg_class c",
......@@ -1462,7 +1469,8 @@ psql_completion(const char *text, int start, int end)
"\\a",
"\\connect", "\\conninfo", "\\C", "\\cd", "\\copy",
"\\copyright", "\\crosstabview",
"\\d", "\\da", "\\dA", "\\db", "\\dc", "\\dC", "\\dd", "\\ddp", "\\dD",
"\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp",
"\\db", "\\dc", "\\dC", "\\dd", "\\ddp", "\\dD",
"\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df",
"\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL",
"\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt",
......@@ -3698,6 +3706,12 @@ psql_completion(const char *text, int start, int end)
}
else if (TailMatchesCS("\\da*"))
COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL);
else if (TailMatchesCS("\\dAc*", MatchAny) ||
TailMatchesCS("\\dAf*", MatchAny))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
else if (TailMatchesCS("\\dAo*", MatchAny) ||
TailMatchesCS("\\dAp*", MatchAny))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families, NULL);
else if (TailMatchesCS("\\dA*"))
COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
else if (TailMatchesCS("\\db*"))
......
......@@ -4809,3 +4809,165 @@ Owning table: "pg_catalog.pg_statistic"
Indexes:
"pg_toast_2619_index" PRIMARY KEY, btree (chunk_id, chunk_seq)
-- check printing info about access methods
\dA
List of access methods
Name | Type
--------+-------
brin | Index
btree | Index
gin | Index
gist | Index
hash | Index
heap | Table
heap2 | Table
spgist | Index
(8 rows)
\dA *
List of access methods
Name | Type
--------+-------
brin | Index
btree | Index
gin | Index
gist | Index
hash | Index
heap | Table
heap2 | Table
spgist | Index
(8 rows)
\dA h*
List of access methods
Name | Type
-------+-------
hash | Index
heap | Table
heap2 | Table
(3 rows)
\dA foo
List of access methods
Name | Type
------+------
(0 rows)
\dA foo bar
List of access methods
Name | Type
------+------
(0 rows)
\dA: extra argument "bar" ignored
\dA+
List of access methods
Name | Type | Handler | Description
--------+-------+----------------------+----------------------------------------
brin | Index | brinhandler | block range index (BRIN) access method
btree | Index | bthandler | b-tree index access method
gin | Index | ginhandler | GIN index access method
gist | Index | gisthandler | GiST index access method
hash | Index | hashhandler | hash index access method
heap | Table | heap_tableam_handler | heap table access method
heap2 | Table | heap_tableam_handler |
spgist | Index | spghandler | SP-GiST index access method
(8 rows)
\dA+ *
List of access methods
Name | Type | Handler | Description
--------+-------+----------------------+----------------------------------------
brin | Index | brinhandler | block range index (BRIN) access method
btree | Index | bthandler | b-tree index access method
gin | Index | ginhandler | GIN index access method
gist | Index | gisthandler | GiST index access method
hash | Index | hashhandler | hash index access method
heap | Table | heap_tableam_handler | heap table access method
heap2 | Table | heap_tableam_handler |
spgist | Index | spghandler | SP-GiST index access method
(8 rows)
\dA+ h*
List of access methods
Name | Type | Handler | Description
-------+-------+----------------------+--------------------------
hash | Index | hashhandler | hash index access method
heap | Table | heap_tableam_handler | heap table access method
heap2 | Table | heap_tableam_handler |
(3 rows)
\dA+ foo
List of access methods
Name | Type | Handler | Description
------+------+---------+-------------
(0 rows)
\dAc brin pg*.oid*
List of operator classes
AM | Input type | Storage type | Operator class | Default?
------+------------+--------------+----------------+----------
brin | oid | | oid_minmax_ops | yes
(1 row)
\dAf spgist
List of operator families
AM | Operator family | Applicable types
--------+-----------------+------------------
spgist | box_ops | box
spgist | kd_point_ops | point
spgist | network_ops | inet
spgist | poly_ops | polygon
spgist | quad_point_ops | point
spgist | range_ops | anyrange
spgist | text_ops | text
(7 rows)
\dAf btree int4
List of operator families
AM | Operator family | Applicable types
-------+-----------------+---------------------------
btree | integer_ops | smallint, integer, bigint
(1 row)
\dAo brin uuid_minmax_ops
List of operators of operator families
AM | Opfamily Name | Operator
------+-----------------+-----------------
brin | uuid_minmax_ops | < (uuid, uuid)
brin | uuid_minmax_ops | <= (uuid, uuid)
brin | uuid_minmax_ops | = (uuid, uuid)
brin | uuid_minmax_ops | >= (uuid, uuid)
brin | uuid_minmax_ops | > (uuid, uuid)
(5 rows)
\dAo * pg_catalog.jsonb_path_ops
List of operators of operator families
AM | Opfamily Name | Operator
-----+----------------+----------------------
gin | jsonb_path_ops | @> (jsonb, jsonb)
gin | jsonb_path_ops | @? (jsonb, jsonpath)
gin | jsonb_path_ops | @@ (jsonb, jsonpath)
(3 rows)
\dAp brin uuid_minmax_ops
List of procedures of operator families
AM | Operator family | Left arg type | Right arg type | Number | Proc name
------+-----------------+---------------+----------------+--------+------------------------
brin | uuid_minmax_ops | uuid | uuid | 1 | brin_minmax_opcinfo
brin | uuid_minmax_ops | uuid | uuid | 2 | brin_minmax_add_value
brin | uuid_minmax_ops | uuid | uuid | 3 | brin_minmax_consistent
brin | uuid_minmax_ops | uuid | uuid | 4 | brin_minmax_union
(4 rows)
\dAp * pg_catalog.uuid_ops
List of procedures of operator families
AM | Operator family | Left arg type | Right arg type | Number | Proc name
-------+-----------------+---------------+----------------+--------+--------------------
btree | uuid_ops | uuid | uuid | 1 | uuid_cmp
btree | uuid_ops | uuid | uuid | 2 | uuid_sortsupport
btree | uuid_ops | uuid | uuid | 4 | btequalimage
hash | uuid_ops | uuid | uuid | 1 | uuid_hash
hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended
(5 rows)
......@@ -1182,3 +1182,21 @@ drop role regress_partitioning_role;
-- \d on toast table (use pg_statistic's toast table, which has a known name)
\d pg_toast.pg_toast_2619
-- check printing info about access methods
\dA
\dA *
\dA h*
\dA foo
\dA foo bar
\dA+
\dA+ *
\dA+ h*
\dA+ foo
\dAc brin pg*.oid*
\dAf spgist
\dAf btree int4
\dAo brin uuid_minmax_ops
\dAo * pg_catalog.jsonb_path_ops
\dAp brin uuid_minmax_ops
\dAp * pg_catalog.uuid_ops
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment