? 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) */