diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 77da336696a20ca682f9777e6099f72339f660bf..677b4773b43d11abb8bc99fcc6b8fb3fcc5f4015 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.83 2003/01/07 18:46:52 momjian Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.84 2003/01/07 20:56:06 tgl Exp $ PostgreSQL documentation --> @@ -798,6 +798,30 @@ testdb=> </listitem> </varlistentry> + + <varlistentry> + <term><literal>\dc</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term> + <listitem> + <para> + Lists all available conversions between character-set encodings. + If <replaceable class="parameter">pattern</replaceable> + is specified, only conversions whose name matches the pattern are + listed. + </para> + </listitem> + </varlistentry> + + + <varlistentry> + <term><literal>\dC</literal></term> + <listitem> + <para> + Lists all available type casts. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><literal>\dd</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term> <listitem> @@ -847,29 +871,6 @@ testdb=> </varlistentry> - <varlistentry> - <term><literal>\dc</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term> - <listitem> - <para> - Lists all available conversions (between encodings). If <replaceable - class="parameter">pattern</replaceable> - is specified, only matching conversions are shown. - </para> - </listitem> - </varlistentry> - - - <varlistentry> - <term><literal>\dC</literal></term> - <listitem> - <para> - Lists all available type casts. Casts can be explicit, explicit and assignment - or implicit, and are used to change a variable from one type to another. - </para> - </listitem> - </varlistentry> - - <varlistentry> <term><literal>\df [ <replaceable class="parameter">pattern</replaceable> ]</literal></term> @@ -929,6 +930,19 @@ testdb=> </varlistentry> + <varlistentry> + <term><literal>\dn</literal> [ <replaceable class="parameter">pattern</replaceable> ]</term> + + <listitem> + <para> + Lists all available schemas (namespaces). If <replaceable + class="parameter">pattern</replaceable> (a regular expression) + is specified, only schemas whose name matches the pattern are listed. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><literal>\do [ <replaceable class="parameter">pattern</replaceable> ]</literal></term> <listitem> @@ -1054,8 +1068,9 @@ Tue Oct 26 21:40:57 CEST 1999 </para> <note> <para> - This command does not see changes made by <command>SET - CLIENT_ENCODING</>. + This command will not notice changes made directly by <command>SET + CLIENT_ENCODING</>. If you use <literal>\encoding</literal>, + be sure to use it to set as well as examine the encoding. </para> </note> </listitem> diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index fa0d20af307da781da711944fb9e5b6675a02888..0c571ca2a4028ef7dd7a53bcd6e47f1da1709864 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.42 2002/12/12 21:02:19 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.43 2003/01/07 20:56:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -145,6 +145,7 @@ Datum pg_operator_is_visible(PG_FUNCTION_ARGS); Datum pg_opclass_is_visible(PG_FUNCTION_ARGS); Datum pg_conversion_is_visible(PG_FUNCTION_ARGS); + /* * RangeVarGetRelid * Given a RangeVar describing an existing relation, @@ -1084,7 +1085,7 @@ ConversionIsVisible(Oid conid) ObjectIdGetDatum(conid), 0, 0, 0); if (!HeapTupleIsValid(contup)) - elog(ERROR, "Cache lookup failed for converions %u", conid); + elog(ERROR, "Cache lookup failed for conversion %u", conid); conform = (Form_pg_conversion) GETSTRUCT(contup); recomputeNamespacePath(); @@ -1104,7 +1105,7 @@ ConversionIsVisible(Oid conid) * If it is in the path, it might still not be visible; it could * be hidden by another conversion of the same name earlier in the * path. So we must do a slow check to see if this conversion would - * be found by ConvnameGetConid. + * be found by ConversionGetConid. */ char *conname = NameStr(conform->conname); diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 06d31598566207bd8883216979a8e30c61ec7fb5..419e44a63265418fd1be57a5d776775744709de6 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -3,7 +3,7 @@ * * Copyright 2000-2002 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.86 2002/12/12 21:02:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.87 2003/01/07 20:56:06 tgl Exp $ */ #include "postgres_fe.h" #include "command.h" @@ -350,15 +350,27 @@ exec_command(const char *cmd, case 'a': success = describeAggregates(pattern, show_verbose); break; + case 'c': + success = listConversions(pattern); + break; + case 'C': + success = listCasts(pattern); + break; case 'd': success = objectDescription(pattern); break; + case 'D': + success = listDomains(pattern); + break; case 'f': success = describeFunctions(pattern, show_verbose); break; case 'l': success = do_lo_list(); break; + case 'n': + success = listSchemas(pattern); + break; case 'o': success = describeOperators(pattern); break; @@ -378,16 +390,7 @@ exec_command(const char *cmd, case 'u': success = describeUsers(pattern); break; - case 'D': - success = listDomains(pattern); - break; - case 'c': - success = listConversions(pattern); - break; - case 'C': - success = listCasts(pattern); - break; - + default: status = CMD_UNKNOWN; } diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index d4f7e1ededd2f065b42059451faeb91ddcba176c..0614b63da8dbe3c74dd5fa8ce1f3e23bc40d9e4e 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -3,7 +3,7 @@ * * Copyright 2000-2002 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.73 2002/12/21 01:07:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.74 2003/01/07 20:56:06 tgl Exp $ */ #include "postgres_fe.h" #include "describe.h" @@ -1426,15 +1426,16 @@ listConversions(const char *pattern) " pg_catalog.pg_encoding_to_char(c.conforencoding) AS \"%s\",\n" " pg_catalog.pg_encoding_to_char(c.contoencoding) AS \"%s\",\n" " CASE WHEN c.condefault THEN '%s'\n" - " ELSE NULL END AS \"%s\"\n" + " ELSE '%s' END AS \"%s\"\n" "FROM pg_catalog.pg_conversion c, pg_catalog.pg_namespace n\n" "WHERE n.oid = c.connamespace\n", _("Schema"), _("Name"), _("Source"), - _("Dest"), - _("default"), - _("Modifier")); + _("Destination"), + _("yes"), + _("no"), + _("Default?")); processNamePattern(&buf, pattern, true, false, "n.nspname", "c.conname", NULL, @@ -1471,9 +1472,9 @@ listCasts(const char *pattern) initPQExpBuffer(&buf); /* NEED LEFT JOIN FOR BINARY CASTS */ printfPQExpBuffer(&buf, - "SELECT t1.typname AS \"%s\",\n" - " t2.typname AS \"%s\",\n" - " CASE WHEN p.proname IS NULL THEN '%s'\n" + "SELECT pg_catalog.format_type(castsource, NULL) AS \"%s\",\n" + " pg_catalog.format_type(casttarget, NULL) AS \"%s\",\n" + " CASE WHEN castfunc = 0 THEN '%s'\n" " ELSE p.proname\n" " END as \"%s\",\n" " CASE WHEN c.castcontext = 'e' THEN '%s'\n" @@ -1481,16 +1482,16 @@ listCasts(const char *pattern) " ELSE '%s'\n" " END as \"%s\"\n" "FROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p\n" - " ON c.castfunc=p.oid, pg_catalog.pg_type t1, pg_catalog.pg_type t2\n" - "WHERE c.castsource=t1.oid AND c.casttarget=t2.oid ORDER BY 1, 2", + " ON c.castfunc = p.oid\n" + "ORDER BY 1, 2", _("Source"), _("Target"), _("BINARY"), _("Function"), - _("explicit"), - _("assignment explicit"), - _("implicit"), - _("Context")); + _("no"), + _("in assignment"), + _("yes"), + _("Implicit?")); res = PSQLexec(buf.data, false); termPQExpBuffer(&buf); @@ -1506,6 +1507,48 @@ listCasts(const char *pattern) return true; } +/* + * \dn + * + * Describes schemas (namespaces) + */ +bool +listSchemas(const char *pattern) +{ + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, + "SELECT n.nspname AS \"%s\",\n" + " u.usename AS \"%s\"\n" + "FROM pg_catalog.pg_namespace n LEFT JOIN pg_catalog.pg_user u\n" + " ON n.nspowner=u.usesysid\n", + _("Name"), + _("Owner")); + + processNamePattern(&buf, pattern, false, false, + NULL, "n.nspname", NULL, + NULL); + + appendPQExpBuffer(&buf, "ORDER BY 1;"); + + res = PSQLexec(buf.data, false); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of schemas"); + + printQuery(res, &myopt, pset.queryFout); + + PQclear(res); + return true; +} + + /* * processNamePattern * diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 6461b41d303c311628728d7d6de96fae025c8b7c..40a94b0efd21de1d01ff711d7e8dcf41667bf68a 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -3,7 +3,7 @@ * * Copyright 2000-2002 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.19 2002/12/12 21:02:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.20 2003/01/07 20:56:07 tgl Exp $ */ #ifndef DESCRIBE_H #define DESCRIBE_H @@ -49,5 +49,8 @@ bool listConversions(const char *pattern); /* \dC */ bool listCasts(const char *pattern); +/* \dn */ +bool listSchemas(const char *pattern); + #endif /* DESCRIBE_H */ diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index e921f1da4b8e61ae4aee1c540ecdb0dcb7e0a6e9..2dcf798d9dd6b8c68680bed4b78aa594ed62c1b7 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.68 2002/12/13 22:17:57 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.69 2003/01/07 20:56:07 tgl Exp $ */ #include "postgres_fe.h" #include "common.h" @@ -211,6 +211,7 @@ slashUsage(unsigned short int pager) fprintf(output, _(" \\dd [PATTERN] show comment for object\n")); fprintf(output, _(" \\dD [PATTERN] list domains\n")); fprintf(output, _(" \\df [PATTERN] list functions (add \"+\" for more detail)\n")); + fprintf(output, _(" \\dn [PATTERN] list schemas\n")); fprintf(output, _(" \\do [NAME] list operators\n")); fprintf(output, _(" \\dl list large objects, same as \\lo_list\n")); fprintf(output, _(" \\dp [PATTERN] list table access privileges\n")); diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index 27e3e75168f861c5aaafd9aabc7c7b598e6bf712..8bcd48767083edf20eb8a1903ca1456513a83d26 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: namespace.h,v 1.23 2002/12/12 21:02:25 momjian Exp $ + * $Id: namespace.h,v 1.24 2003/01/07 20:56:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -65,8 +65,9 @@ extern bool OperatorIsVisible(Oid oprid); extern OpclassCandidateList OpclassGetCandidates(Oid amid); extern Oid OpclassnameGetOpcid(Oid amid, const char *opcname); extern bool OpclassIsVisible(Oid opcid); -extern bool ConversionIsVisible(Oid opcid); + extern Oid ConversionGetConid(const char *conname); +extern bool ConversionIsVisible(Oid conid); extern void DeconstructQualifiedName(List *names, char **nspname_p,