? GNUmakefile ? config.log ? config.status ? configure.lineno ? ftipatch.txt ? guc.diff ? patch.txt ? psql-patch.txt ? psql-patch2.txt ? contrib/fulltextindex2 ? contrib/tsearch.tgz ? contrib/cube/cube.diff ? contrib/spi/.deps ? contrib/tsearch/.deps ? contrib/tsearch/libtsearch.so.0 ? contrib/tsearch/parser.c ? contrib/tsearch/results ? contrib/tsearch/tsearch.sql ? src/Makefile.global ? src/backend/postgres ? src/backend/access/common/.deps ? src/backend/access/gist/.deps ? src/backend/access/hash/.deps ? src/backend/access/heap/.deps ? src/backend/access/index/.deps ? src/backend/access/nbtree/.deps ? src/backend/access/rtree/.deps ? src/backend/access/transam/.deps ? src/backend/bootstrap/.deps ? src/backend/catalog/.deps ? src/backend/catalog/postgres.bki ? src/backend/catalog/postgres.description ? src/backend/commands/.deps ? src/backend/executor/.deps ? src/backend/lib/.deps ? src/backend/libpq/.deps ? src/backend/main/.deps ? src/backend/nodes/.deps ? src/backend/optimizer/geqo/.deps ? src/backend/optimizer/path/.deps ? src/backend/optimizer/plan/.deps ? src/backend/optimizer/prep/.deps ? src/backend/optimizer/util/.deps ? src/backend/parser/.deps ? src/backend/port/.deps ? src/backend/postmaster/.deps ? src/backend/regex/.deps ? src/backend/rewrite/.deps ? src/backend/storage/buffer/.deps ? src/backend/storage/file/.deps ? src/backend/storage/freespace/.deps ? src/backend/storage/ipc/.deps ? src/backend/storage/large_object/.deps ? src/backend/storage/lmgr/.deps ? src/backend/storage/page/.deps ? src/backend/storage/smgr/.deps ? src/backend/tcop/.deps ? src/backend/utils/.deps ? src/backend/utils/adt/.deps ? src/backend/utils/cache/.deps ? src/backend/utils/error/.deps ? src/backend/utils/fmgr/.deps ? src/backend/utils/hash/.deps ? src/backend/utils/init/.deps ? src/backend/utils/mb/.deps ? src/backend/utils/mb/conversion_procs/conversion_create.sql ? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps ? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps ? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps ? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps ? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0 ? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps ? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps ? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0 ? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps ? src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0 ? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps ? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/libutf8_and_tcvn.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win1250/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win1250/libutf8_and_win1250.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win1256/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win1256/libutf8_and_win1256.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win874/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win874/libutf8_and_win874.so.0 ? src/backend/utils/misc/.deps ? src/backend/utils/mmgr/.deps ? src/backend/utils/sort/.deps ? src/backend/utils/time/.deps ? src/bin/initdb/initdb ? src/bin/initlocation/initlocation ? src/bin/ipcclean/ipcclean ? src/bin/pg_config/pg_config ? src/bin/pg_controldata/.deps ? src/bin/pg_controldata/pg_controldata ? src/bin/pg_ctl/pg_ctl ? src/bin/pg_dump/.deps ? src/bin/pg_dump/pg_dump ? src/bin/pg_dump/pg_dumpall ? src/bin/pg_dump/pg_restore ? src/bin/pg_encoding/.deps ? src/bin/pg_encoding/pg_encoding ? src/bin/pg_id/.deps ? src/bin/pg_id/pg_id ? src/bin/pg_resetxlog/.deps ? src/bin/pg_resetxlog/pg_resetxlog ? src/bin/psql/.deps ? src/bin/psql/psql ? src/bin/scripts/createlang ? src/include/pg_config.h ? src/include/stamp-h ? src/interfaces/ecpg/lib/.deps ? src/interfaces/ecpg/lib/libecpg.so.3 ? src/interfaces/ecpg/preproc/.deps ? src/interfaces/ecpg/preproc/ecpg ? src/interfaces/libpgeasy/.deps ? src/interfaces/libpgeasy/libpgeasy.so.2 ? src/interfaces/libpq/.deps ? src/interfaces/libpq/libpq.so.2 ? src/pl/plpgsql/src/.deps ? src/pl/plpgsql/src/libplpgsql.so.1 ? src/test/regress/.deps ? src/test/regress/log ? src/test/regress/pg_regress ? src/test/regress/regression.diffs ? src/test/regress/regression.out ? src/test/regress/results ? src/test/regress/tmp_check ? src/test/regress/expected/constraints.out ? src/test/regress/expected/copy.out ? src/test/regress/expected/create_function_1.out ? src/test/regress/expected/create_function_2.out ? src/test/regress/expected/misc.out ? src/test/regress/sql/constraints.sql ? src/test/regress/sql/copy.sql ? src/test/regress/sql/create_function_1.sql ? src/test/regress/sql/create_function_2.sql ? src/test/regress/sql/misc.sql Index: doc/src/sgml/ref/psql-ref.sgml =================================================================== RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/psql-ref.sgml,v retrieving revision 1.80 diff -c -r1.80 psql-ref.sgml *** doc/src/sgml/ref/psql-ref.sgml 2002/11/08 19:12:21 1.80 --- doc/src/sgml/ref/psql-ref.sgml 2002/12/11 03:47:34 *************** *** 790,795 **** --- 790,807 ---- + \dn [ pattern ] + + + + Lists all available schemas (namespaces). If pattern (a regular expression) + is specified, only matching schemas are shown. + + + + + \da [ pattern ] *************** *** 846,851 **** --- 858,886 ---- Lists all available domains (derived types). If pattern is specified, only matching domains are shown. + + + + + + + \dc [ pattern ] + + + Lists all available conversions (between encodings). If pattern + is specified, only matching conversions are shown. + + + + + + + \dC + + + 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. Index: src/backend/catalog/namespace.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/catalog/namespace.c,v retrieving revision 1.41 diff -c -r1.41 namespace.c *** src/backend/catalog/namespace.c 2002/12/04 05:18:31 1.41 --- src/backend/catalog/namespace.c 2002/12/11 03:47:37 *************** *** 143,150 **** Datum pg_function_is_visible(PG_FUNCTION_ARGS); Datum pg_operator_is_visible(PG_FUNCTION_ARGS); Datum pg_opclass_is_visible(PG_FUNCTION_ARGS); - /* * RangeVarGetRelid * Given a RangeVar describing an existing relation, --- 143,150 ---- Datum pg_function_is_visible(PG_FUNCTION_ARGS); 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, *************** *** 1036,1041 **** --- 1036,1122 ---- } /* + * ConversionGetConid + * Try to resolve an unqualified conversion name. + * Returns OID if conversion found in search path, else InvalidOid. + * + * This is essentially the same as RelnameGetRelid. + */ + Oid + ConversionGetConid(const char *conname) + { + Oid conid; + List *lptr; + + recomputeNamespacePath(); + + foreach(lptr, namespaceSearchPath) + { + Oid namespaceId = (Oid) lfirsti(lptr); + + conid = GetSysCacheOid(CONNAMENSP, + PointerGetDatum(conname), + ObjectIdGetDatum(namespaceId), + 0, 0); + if (OidIsValid(conid)) + return conid; + } + + /* Not found in path */ + return InvalidOid; + } + + /* + * ConversionIsVisible + * Determine whether a conversion (identified by OID) is visible in the + * current search path. Visible means "would be found by searching + * for the unqualified conversion name". + */ + bool + ConversionIsVisible(Oid conid) + { + HeapTuple contup; + Form_pg_conversion conform; + Oid connamespace; + bool visible; + + contup = SearchSysCache(CONOID, + ObjectIdGetDatum(conid), + 0, 0, 0); + if (!HeapTupleIsValid(contup)) + elog(ERROR, "Cache lookup failed for converions %u", conid); + conform = (Form_pg_conversion) GETSTRUCT(contup); + + recomputeNamespacePath(); + + /* + * Quick check: if it ain't in the path at all, it ain't visible. + * Items in the system namespace are surely in the path and so we + * needn't even do intMember() for them. + */ + connamespace = conform->connamespace; + if (connamespace != PG_CATALOG_NAMESPACE && + !intMember(connamespace, namespaceSearchPath)) + visible = false; + else + { + /* + * 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. + */ + char *conname = NameStr(conform->conname); + + visible = (ConversionGetConid(conname) == conid); + } + + ReleaseSysCache(contup); + + return visible; + } + + /* * DeconstructQualifiedName * Given a possibly-qualified name expressed as a list of String nodes, * extract the schema name and object name. *************** *** 1853,1856 **** --- 1934,1945 ---- Oid oid = PG_GETARG_OID(0); PG_RETURN_BOOL(OpclassIsVisible(oid)); + } + + Datum + pg_conversion_is_visible(PG_FUNCTION_ARGS) + { + Oid oid = PG_GETARG_OID(0); + + PG_RETURN_BOOL(ConversionIsVisible(oid)); } Index: src/bin/psql/command.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/command.c,v retrieving revision 1.85 diff -c -r1.85 command.c *** src/bin/psql/command.c 2002/11/08 19:12:21 1.85 --- src/bin/psql/command.c 2002/12/11 03:47:40 *************** *** 381,387 **** case 'D': success = listDomains(pattern); break; ! default: status = CMD_UNKNOWN; } --- 381,396 ---- case 'D': success = listDomains(pattern); break; ! case 'c': ! success = listConversions(pattern); ! break; ! case 'C': ! success = listCasts(); ! break; ! case 'n': ! success = listSchemas(pattern); ! break; ! default: status = CMD_UNKNOWN; } Index: src/bin/psql/describe.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/describe.c,v retrieving revision 1.71 diff -c -r1.71 describe.c *** src/bin/psql/describe.c 2002/10/19 20:50:44 1.71 --- src/bin/psql/describe.c 2002/12/11 03:47:42 *************** *** 1390,1395 **** --- 1390,1535 ---- } /* + * \dc + * + * Describes conversions. + */ + bool + listConversions(const char *pattern) + { + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + + printfPQExpBuffer(&buf, + "SELECT n.nspname AS \"%s\",\n" + " c.conname AS \"%s\",\n" + " 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" + "FROM pg_catalog.pg_conversion c, pg_catalog.pg_namespace n\n" + "WHERE n.oid = c.connamespace\n", + _("Schema"), + _("Name"), + _("Source"), + _("Dest"), + _("default"), + _("Modifier")); + + processNamePattern(&buf, pattern, true, false, + "n.nspname", "c.conname", NULL, + "pg_catalog.pg_conversion_is_visible(c.oid)"); + + appendPQExpBuffer(&buf, "ORDER BY 1, 2;"); + + res = PSQLexec(buf.data, false); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of conversions"); + + printQuery(res, &myopt, pset.queryFout); + + PQclear(res); + return true; + } + + /* + * \dC + * + * Describes casts. + */ + bool + listCasts() + { + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, + "SELECT t1.typname AS \"%s\",\n" + " t2.typname AS \"%s\",\n" + " CASE WHEN p.proname IS NULL THEN '%s'\n" + " ELSE p.proname\n" + " END as \"%s\",\n" + " CASE WHEN c.castcontext = 'e' THEN '%s'\n" + " WHEN c.castcontext = 'a' THEN '%s'\n" + " 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", + _("Source"), + _("Target"), + _("BINARY"), + _("Function"), + _("explicit"), + _("assignment explicit"), + _("implicit"), + _("Context")); + + res = PSQLexec(buf.data, false); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of casts"); + + printQuery(res, &myopt, pset.queryFout); + + PQclear(res); + 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 * * Scan a wildcard-pattern option and generate appropriate WHERE clauses Index: src/bin/psql/describe.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/describe.h,v retrieving revision 1.18 diff -c -r1.18 describe.h *** src/bin/psql/describe.h 2002/08/27 18:28:29 1.18 --- src/bin/psql/describe.h 2002/12/11 03:47:42 *************** *** 43,46 **** --- 43,56 ---- /* \dD */ bool listDomains(const char *pattern); + /* \dc */ + bool listConversions(const char *pattern); + + /* \dC */ + bool listCasts(); + + /* \dn */ + bool listSchemas(const char *pattern); + + #endif /* DESCRIBE_H */ Index: src/bin/psql/help.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/help.c,v retrieving revision 1.61 diff -c -r1.61 help.c *** src/bin/psql/help.c 2002/11/08 19:12:21 1.61 --- src/bin/psql/help.c 2002/12/11 03:47:43 *************** *** 180,188 **** --- 180,191 ---- fprintf(output, _(" \\copy ... perform SQL COPY with data stream to the client host\n")); fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n")); fprintf(output, _(" \\d [NAME] describe table, index, sequence, or view\n")); + fprintf(output, _(" \\dn [PATTERN] list schemas\n")); fprintf(output, _(" \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n" " list tables/indexes/sequences/views/system tables\n")); fprintf(output, _(" \\da [PATTERN] list aggregate functions\n")); + fprintf(output, _(" \\dc [PATTERN] list conversions\n")); + fprintf(output, _(" \\dC list casts\n")); 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")); Index: src/include/catalog/namespace.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/catalog/namespace.h,v retrieving revision 1.22 diff -c -r1.22 namespace.h *** src/include/catalog/namespace.h 2002/11/02 18:41:22 1.22 --- src/include/catalog/namespace.h 2002/12/11 03:47:43 *************** *** 65,70 **** --- 65,72 ---- 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 void DeconstructQualifiedName(List *names, char **nspname_p, Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/catalog/pg_proc.h,v retrieving revision 1.279 diff -c -r1.279 pg_proc.h *** src/include/catalog/pg_proc.h 2002/12/06 05:20:26 1.279 --- src/include/catalog/pg_proc.h 2002/12/11 03:47:47 *************** *** 2930,2935 **** --- 2930,2937 ---- DESCR("is operator visible in search path?"); DATA(insert OID = 2083 ( pg_opclass_is_visible PGNSP PGUID 12 f f t f s 1 16 "26" pg_opclass_is_visible - _null_ )); DESCR("is opclass visible in search path?"); + DATA(insert OID = 2093 ( pg_conversion_is_visible PGNSP PGUID 12 f f t f s 1 16 "26" pg_conversion_is_visible - _null_ )); + DESCR("is conversion visible in search path?"); /* Aggregates (moved here from pg_aggregate for 7.3) */