-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
 
  
Attached is my "backslash consistency" patch which basically makes all
the backslash commands behave as \dt does: \d* shows non-system objects,
and \d*S shows system objects. See the archives for more discussion on
this. I wrote this patch some time ago, and have been meaning to work on
enhancing the tab-completion stuff more. However, I'm going to leave it
as it is for now[1], and I've updated my patch to the recent cvs. This
was done hastily, so it definitely needs a looking over.
  
[1] I'd like to eventually fix psql so that \di [tab] only lists schemas
that actually contain possible indexes (or indexes), rather than the
current behavior which is to just list all schemas.
 
- --
Greg Sabino Mullane [EMAIL PROTECTED]
PGP Key: 0x14964AC8 200505261242
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
 
-----BEGIN PGP SIGNATURE-----
 
iD8DBQFClfyjvJuQZxSWSsgRAv4aAJ48KPwfzYGpU80KcjS9/obMqKMK0wCgx+M0
hCAJLpFXpj72anOnb+2E0yg=
=ezLT
-----END PGP SIGNATURE-----

Index: command.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.143
diff -c -r1.143 command.c
*** command.c	29 Apr 2005 13:42:20 -0000	1.143
--- command.c	26 May 2005 20:09:37 -0000
***************
*** 298,310 ****
  	else if (cmd[0] == 'd')
  	{
  		char	   *pattern;
! 		bool		show_verbose;
  
  		/* We don't do SQLID reduction on the pattern yet */
  		pattern = psql_scan_slash_option(scan_state,
  										 OT_NORMAL, NULL, true);
  
  		show_verbose = strchr(cmd, '+') ? true : false;
  
  		switch (cmd[1])
  		{
--- 298,311 ----
  	else if (cmd[0] == 'd')
  	{
  		char	   *pattern;
! 		bool		show_verbose, show_system;
  
  		/* We don't do SQLID reduction on the pattern yet */
  		pattern = psql_scan_slash_option(scan_state,
  										 OT_NORMAL, NULL, true);
  
  		show_verbose = strchr(cmd, '+') ? true : false;
+ 		show_system = strchr(cmd, 'S') ? true: false;
  
  		switch (cmd[1])
  		{
***************
*** 314,341 ****
  					success = describeTableDetails(pattern, show_verbose);
  				else
  					/* standard listing of interesting things */
! 					success = listTables("tvs", NULL, show_verbose);
  				break;
  			case 'a':
! 				success = describeAggregates(pattern, show_verbose);
  				break;
  			case 'b':
  				success = describeTablespaces(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 'g':
  				success = describeGroups(pattern);
--- 315,342 ----
  					success = describeTableDetails(pattern, show_verbose);
  				else
  					/* standard listing of interesting things */
! 					success = listTables("tvs", NULL, show_verbose, show_system);
  				break;
  			case 'a':
! 				success = describeAggregates(pattern, show_verbose, show_system);
  				break;
  			case 'b':
  				success = describeTablespaces(pattern, show_verbose);
  				break;
  			case 'c':
! 				success = listConversions(pattern, show_system);
  				break;
  			case 'C':
  				success = listCasts(pattern);
  				break;
  			case 'd':
! 				success = objectDescription(pattern, show_system);
  				break;
  			case 'D':
! 				success = listDomains(pattern, show_system);
  				break;
  			case 'f':
! 				success = describeFunctions(pattern, show_verbose, show_system);
  				break;
  			case 'g':
  				success = describeGroups(pattern);
***************
*** 347,366 ****
  				success = listSchemas(pattern, show_verbose);
  				break;
  			case 'o':
! 				success = describeOperators(pattern);
  				break;
  			case 'p':
  				success = permissionsList(pattern);
  				break;
  			case 'T':
! 				success = describeTypes(pattern, show_verbose);
  				break;
  			case 't':
  			case 'v':
  			case 'i':
  			case 's':
  			case 'S':
! 				success = listTables(&cmd[1], pattern, show_verbose);
  				break;
  			case 'u':
  				success = describeUsers(pattern);
--- 348,367 ----
  				success = listSchemas(pattern, show_verbose);
  				break;
  			case 'o':
! 				success = describeOperators(pattern, show_system);
  				break;
  			case 'p':
  				success = permissionsList(pattern);
  				break;
  			case 'T':
! 				success = describeTypes(pattern, show_verbose, show_system);
  				break;
  			case 't':
  			case 'v':
  			case 'i':
  			case 's':
  			case 'S':
! 				success = listTables(&cmd[1], pattern, show_verbose, show_system);
  				break;
  			case 'u':
  				success = describeUsers(pattern);
Index: describe.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/describe.c,v
retrieving revision 1.115
diff -c -r1.115 describe.c
*** describe.c	6 Apr 2005 05:23:32 -0000	1.115
--- describe.c	26 May 2005 20:09:37 -0000
***************
*** 53,59 ****
   * Takes an optional regexp to select particular aggregates
   */
  bool
! describeAggregates(const char *pattern, bool verbose)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 53,59 ----
   * Takes an optional regexp to select particular aggregates
   */
  bool
! describeAggregates(const char *pattern, bool verbose, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 80,85 ****
--- 80,88 ----
  					  _("Schema"), _("Name"), _("(all types)"),
  					  _("Data type"), _("Description"));
  
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "p.proname", NULL,
  					   "pg_catalog.pg_function_is_visible(p.oid)");
***************
*** 158,164 ****
   * Takes an optional regexp to select particular functions
   */
  bool
! describeFunctions(const char *pattern, bool verbose)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 161,167 ----
   * Takes an optional regexp to select particular functions
   */
  bool
! describeFunctions(const char *pattern, bool verbose, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 205,210 ****
--- 208,216 ----
  					  "      OR   p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)\n"
  					  "      AND NOT p.proisagg\n");
  
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "p.proname", NULL,
  					   "pg_catalog.pg_function_is_visible(p.oid)");
***************
*** 232,238 ****
   * describe types
   */
  bool
! describeTypes(const char *pattern, bool verbose)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 238,244 ----
   * describe types
   */
  bool
! describeTypes(const char *pattern, bool verbose, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 271,276 ****
--- 277,285 ----
  					  "WHERE c.oid = t.typrelid)) ");
  	appendPQExpBuffer(&buf, "AND t.typname !~ '^_'\n");
  
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	/* Match name pattern against either internal or external name */
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "t.typname",
***************
*** 298,304 ****
  /* \do
   */
  bool
! describeOperators(const char *pattern)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 307,313 ----
  /* \do
   */
  bool
! describeOperators(const char *pattern, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 320,326 ****
  					  _("Left arg type"), _("Right arg type"),
  					  _("Result type"), _("Description"));
  
! 	processNamePattern(&buf, pattern, false, true,
  					   "n.nspname", "o.oprname", NULL,
  					   "pg_catalog.pg_operator_is_visible(o.oid)");
  
--- 329,338 ----
  					  _("Left arg type"), _("Right arg type"),
  					  _("Result type"), _("Description"));
  
! 	if (!showSystem)
! 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
! 
! 	processNamePattern(&buf, pattern, !showSystem, true,
  					   "n.nspname", "o.oprname", NULL,
  					   "pg_catalog.pg_operator_is_visible(o.oid)");
  
***************
*** 454,460 ****
   * lists of things, there are other \d? commands.
   */
  bool
! objectDescription(const char *pattern)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 466,472 ----
   * lists of things, there are other \d? commands.
   */
  bool
! objectDescription(const char *pattern, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 477,482 ****
--- 489,498 ----
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
  					  "  WHERE p.proisagg\n",
  					  _("aggregate"));
+ 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "p.proname", NULL,
  					   "pg_catalog.pg_function_is_visible(p.oid)");
***************
*** 496,501 ****
--- 512,521 ----
  					  "      OR   p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)\n"
  					  "      AND NOT p.proisagg\n",
  					  _("function"));
+ 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "p.proname", NULL,
  					   "pg_catalog.pg_function_is_visible(p.oid)");
***************
*** 510,516 ****
  					  "  FROM pg_catalog.pg_operator o\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
  					  _("operator"));
! 	processNamePattern(&buf, pattern, false, false,
  					   "n.nspname", "o.oprname", NULL,
  					   "pg_catalog.pg_operator_is_visible(o.oid)");
  
--- 530,540 ----
  					  "  FROM pg_catalog.pg_operator o\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
  					  _("operator"));
! 
! 	if (!showSystem)
! 		appendPQExpBuffer(&buf, "      WHERE n.nspname !~ 'pg_catalog'\n");
! 
! 	processNamePattern(&buf, pattern, !showSystem, false,
  					   "n.nspname", "o.oprname", NULL,
  					   "pg_catalog.pg_operator_is_visible(o.oid)");
  
***************
*** 524,530 ****
  					  "  FROM pg_catalog.pg_type t\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n",
  					  _("data type"));
! 	processNamePattern(&buf, pattern, false, false,
  				"n.nspname", "pg_catalog.format_type(t.oid, NULL)", NULL,
  					   "pg_catalog.pg_type_is_visible(t.oid)");
  
--- 548,558 ----
  					  "  FROM pg_catalog.pg_type t\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n",
  					  _("data type"));
! 
! 	if (!showSystem)
! 		appendPQExpBuffer(&buf, "      WHERE n.nspname !~ 'pg_catalog'\n");
! 
! 	processNamePattern(&buf, pattern, !showSystem, false,
  				"n.nspname", "pg_catalog.format_type(t.oid, NULL)", NULL,
  					   "pg_catalog.pg_type_is_visible(t.oid)");
  
***************
*** 541,546 ****
--- 569,578 ----
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
  					  "  WHERE c.relkind IN ('r', 'v', 'i', 'S')\n",
  					  _("table"), _("view"), _("index"), _("sequence"));
+ 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "c.relname", NULL,
  					   "pg_catalog.pg_table_is_visible(c.oid)");
***************
*** 557,562 ****
--- 589,598 ----
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
  					  "  WHERE r.rulename != '_RETURN'\n",
  					  _("rule"));
+ 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	/* XXX not sure what to do about visibility rule here? */
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "r.rulename", NULL,
***************
*** 573,580 ****
  			   "       JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
  					  _("trigger"));
  	/* XXX not sure what to do about visibility rule here? */
! 	processNamePattern(&buf, pattern, false, false,
  					   "n.nspname", "t.tgname", NULL,
  					   "pg_catalog.pg_table_is_visible(c.oid)");
  
--- 609,620 ----
  			   "       JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
  					  "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
  					  _("trigger"));
+ 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      WHERE n.nspname !~ 'pg_catalog'\n");
+ 
  	/* XXX not sure what to do about visibility rule here? */
! 	processNamePattern(&buf, pattern, !showSystem, false,
  					   "n.nspname", "t.tgname", NULL,
  					   "pg_catalog.pg_table_is_visible(c.oid)");
  
***************
*** 1452,1464 ****
   * (any order of the above is fine)
   */
  bool
! listTables(const char *tabtypes, const char *pattern, bool verbose)
  {
  	bool		showTables = strchr(tabtypes, 't') != NULL;
  	bool		showIndexes = strchr(tabtypes, 'i') != NULL;
  	bool		showViews = strchr(tabtypes, 'v') != NULL;
  	bool		showSeq = strchr(tabtypes, 's') != NULL;
- 	bool		showSystem = strchr(tabtypes, 'S') != NULL;
  
  	PQExpBufferData buf;
  	PGresult   *res;
--- 1492,1503 ----
   * (any order of the above is fine)
   */
  bool
! listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem)
  {
  	bool		showTables = strchr(tabtypes, 't') != NULL;
  	bool		showIndexes = strchr(tabtypes, 'i') != NULL;
  	bool		showViews = strchr(tabtypes, 'v') != NULL;
  	bool		showSeq = strchr(tabtypes, 's') != NULL;
  
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 1563,1569 ****
   * Describes domains.
   */
  bool
! listDomains(const char *pattern)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 1602,1608 ----
   * Describes domains.
   */
  bool
! listDomains(const char *pattern, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 1591,1596 ****
--- 1630,1638 ----
  					  _("Modifier"),
  					  _("Check"));
  
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	processNamePattern(&buf, pattern, true, false,
  					   "n.nspname", "t.typname", NULL,
  					   "pg_catalog.pg_type_is_visible(t.oid)");
***************
*** 1617,1623 ****
   * Describes conversions.
   */
  bool
! listConversions(const char *pattern)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
--- 1659,1665 ----
   * Describes conversions.
   */
  bool
! listConversions(const char *pattern, bool showSystem)
  {
  	PQExpBufferData buf;
  	PGresult   *res;
***************
*** 1646,1651 ****
--- 1688,1696 ----
  					   "n.nspname", "c.conname", NULL,
  					   "pg_catalog.pg_conversion_is_visible(c.oid)");
  
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname !~ 'pg_catalog'\n");
+ 
  	appendPQExpBuffer(&buf, "ORDER BY 1, 2;");
  
  	res = PSQLexec(buf.data, false);
Index: describe.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/describe.h,v
retrieving revision 1.28
diff -c -r1.28 describe.h
*** describe.h	1 Jan 2005 05:43:08 -0000	1.28
--- describe.h	26 May 2005 20:09:38 -0000
***************
*** 11,29 ****
  #include "settings.h"
  
  /* \da */
! bool		describeAggregates(const char *pattern, bool verbose);
  
  /* \db */
  bool		describeTablespaces(const char *pattern, bool verbose);
  
  /* \df */
! bool		describeFunctions(const char *pattern, bool verbose);
  
  /* \dT */
! bool		describeTypes(const char *pattern, bool verbose);
  
  /* \do */
! bool		describeOperators(const char *pattern);
  
  /* \du */
  bool		describeUsers(const char *pattern);
--- 11,29 ----
  #include "settings.h"
  
  /* \da */
! bool		describeAggregates(const char *pattern, bool verbose, bool showSystem);
  
  /* \db */
  bool		describeTablespaces(const char *pattern, bool verbose);
  
  /* \df */
! bool		describeFunctions(const char *pattern, bool verbose, bool showSystem);
  
  /* \dT */
! bool		describeTypes(const char *pattern, bool verbose, bool showSystem);
  
  /* \do */
! bool		describeOperators(const char *pattern, bool showSystem);
  
  /* \du */
  bool		describeUsers(const char *pattern);
***************
*** 35,41 ****
  bool		permissionsList(const char *pattern);
  
  /* \dd */
! bool		objectDescription(const char *pattern);
  
  /* \d foo */
  bool		describeTableDetails(const char *pattern, bool verbose);
--- 35,41 ----
  bool		permissionsList(const char *pattern);
  
  /* \dd */
! bool		objectDescription(const char *pattern, bool showSystem);
  
  /* \d foo */
  bool		describeTableDetails(const char *pattern, bool verbose);
***************
*** 44,56 ****
  bool		listAllDbs(bool verbose);
  
  /* \dt, \di, \ds, \dS, etc. */
! bool		listTables(const char *tabtypes, const char *pattern, bool verbose);
  
  /* \dD */
! bool		listDomains(const char *pattern);
  
  /* \dc */
! bool		listConversions(const char *pattern);
  
  /* \dC */
  bool		listCasts(const char *pattern);
--- 44,56 ----
  bool		listAllDbs(bool verbose);
  
  /* \dt, \di, \ds, \dS, etc. */
! bool		listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem);
  
  /* \dD */
! bool		listDomains(const char *pattern, bool showSystem);
  
  /* \dc */
! bool		listConversions(const char *pattern, bool showSystem);
  
  /* \dC */
  bool		listCasts(const char *pattern);
Index: help.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/help.c,v
retrieving revision 1.101
diff -c -r1.101 help.c
*** help.c	22 Feb 2005 04:40:55 -0000	1.101
--- help.c	26 May 2005 20:09:38 -0000
***************
*** 208,231 ****
  	fprintf(output, "\n");
  
  	fprintf(output, _("Informational\n"));
! 	fprintf(output, _("  \\d [NAME]      describe table, index, sequence, or view\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, _("  \\db [PATTERN]  list tablespaces (add \"+\" for more detail)\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"));
  	fprintf(output, _("  \\dg [PATTERN]  list groups\n"));
- 	fprintf(output, _("  \\dn [PATTERN]  list schemas (add \"+\" for more detail)\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, view, and sequence access privileges\n"));
- 	fprintf(output, _("  \\dT [PATTERN]  list data types (add \"+\" for more detail)\n"));
  	fprintf(output, _("  \\du [PATTERN]  list users\n"));
- 	fprintf(output, _("  \\l             list all databases (add \"+\" for more detail)\n"));
  	fprintf(output, _("  \\z [PATTERN]   list table, view, and sequence access privileges (same as \\dp)\n"));
  	fprintf(output, "\n");
  
--- 208,235 ----
  	fprintf(output, "\n");
  
  	fprintf(output, _("Informational\n"));
! 	fprintf(output, _("  Modifiers: S = show system objects  + = Additional detail\n"));
! 	fprintf(output, _("  \\l[+]             list all databases\n"));
! 	fprintf(output, _("  \\d[S]             list tables, views, and sequences\n"));
! 	fprintf(output, _("  \\d[S] NAME        describe table, view, sequence, or index\n"));
! 	fprintf(output, _("  \\dt[S+] [PATTERN] list tables\n"));
! 	fprintf(output, _("  \\dv[S+] [PATTERN] list views\n"));
! 	fprintf(output, _("  \\ds[S+] [PATTERN] list sequences\n"));
! 	fprintf(output, _("  \\di[S+] [PATTERN] list indexes\n"));
! 	fprintf(output, _("  \\df[S+] [PATTERN] list functions\n"));
! 	fprintf(output, _("  \\dT[S+] [PATTERN] list data types\n"));
! 	fprintf(output, _("  \\dd[S] [PATTERN]  list comments on objects\n"));
! 	fprintf(output, _("  \\dD[S] [PATTERN]  list domains\n"));
! 	fprintf(output, _("  \\do[S] [PATTERN]  list operators\n"));
! 	fprintf(output, _("  \\da[S] [PATTERN]  list aggregate functions\n"));
! 	fprintf(output, _("  \\dc[S] [PATTERN]  list conversions\n"));
! 	fprintf(output, _("  \\db[+] [PATTERN]  list tablespaces\n"));
! 	fprintf(output, _("  \\dn[+] [PATTERN]  list schemas\n"));
  	fprintf(output, _("  \\dC            list casts\n"));
  	fprintf(output, _("  \\dg [PATTERN]  list groups\n"));
  	fprintf(output, _("  \\dl            list large objects, same as \\lo_list\n"));
  	fprintf(output, _("  \\dp [PATTERN]  list table, view, and sequence access privileges\n"));
  	fprintf(output, _("  \\du [PATTERN]  list users\n"));
  	fprintf(output, _("  \\z [PATTERN]   list table, view, and sequence access privileges (same as \\dp)\n"));
  	fprintf(output, "\n");
  
Index: tab-complete.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/tab-complete.c,v
retrieving revision 1.130
diff -c -r1.130 tab-complete.c
*** tab-complete.c	25 May 2005 22:12:05 -0000	1.130
--- tab-complete.c	26 May 2005 20:09:38 -0000
***************
*** 160,166 ****
  	/* catname */
  	"pg_catalog.pg_proc p",
  	/* selcondition */
! 	"p.proisagg",
  	/* viscondition */
  	"pg_catalog.pg_function_is_visible(p.oid)",
  	/* namespace */
--- 160,166 ----
  	/* catname */
  	"pg_catalog.pg_proc p",
  	/* selcondition */
! 	"p.proisagg AND p.pronamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
  	/* viscondition */
  	"pg_catalog.pg_function_is_visible(p.oid)",
  	/* namespace */
***************
*** 171,183 ****
  	NULL
  };
  
  static const SchemaQuery Query_for_list_of_datatypes = {
  	/* catname */
  	"pg_catalog.pg_type t",
  	/* selcondition --- ignore table rowtypes and array types */
  	"(t.typrelid = 0 "
  	" OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
! 	"AND t.typname !~ '^_'",
  	/* viscondition */
  	"pg_catalog.pg_type_is_visible(t.oid)",
  	/* namespace */
--- 171,235 ----
  	NULL
  };
  
+ static const SchemaQuery Query_for_list_of_comments = {
+ 	/* catname */
+ "(SELECT c.name, c.namesp FROM ( SELECT * FROM ("
+ " SELECT oid, relname as name, relnamespace as namesp FROM pg_catalog.pg_class c"
+ "  WHERE pg_catalog.pg_table_is_visible(oid)"
+ " UNION ALL"
+ " SELECT oid, proname::pg_catalog.text as name, pronamespace AS namesp FROM pg_catalog.pg_proc"
+ "  WHERE pg_catalog.pg_function_is_visible(oid) AND (proisagg OR proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)"
+ " UNION ALL"
+ " SELECT oid, pg_catalog.format_type(oid, NULL) as name, typnamespace AS namesp FROM pg_catalog.pg_type"
+ "  WHERE pg_catalog.pg_type_is_visible(oid)"
+ " UNION ALL"
+ " SELECT oid, oprname::pg_catalog.text AS name, oprnamespace AS namesp FROM pg_catalog.pg_operator"
+ "   WHERE pg_catalog.pg_operator_is_visible(oid)"
+ " UNION ALL"
+ " SELECT r.oid, r.rulename::pg_catalog.text AS name, c.relnamespace AS namesp FROM pg_catalog.pg_rewrite r"
+ "   JOIN pg_catalog.pg_class c ON c.oid = r.ev_class"
+ "   WHERE r.rulename != '_RETURN' AND pg_catalog.pg_table_is_visible(c.oid)"
+ " UNION ALL"
+ " SELECT t.oid, t.tgname::pg_catalog.text AS name, c.relnamespace AS namesp FROM pg_catalog.pg_trigger t"
+ "  JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid"
+ "  WHERE pg_catalog.pg_table_is_visible(c.oid)"
+ ") b WHERE namesp <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"
+ ") c JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0)) AS  x",
+ 	/* selcondition */
+ 	NULL, // "x.namesp <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
+ 	/* viscondition */
+ 	"1=1", /* Always true, since we have to call *_is_visible functions separately above */
+ 	/* namespace */
+ 	"x.namesp",
+ 	/* result */
+ 	"pg_catalog.quote_ident(x.name)",
+ 	/* qualresult */
+ 	NULL
+ };
+ 
+ static const SchemaQuery Query_for_list_of_conversions = {
+ 	/* catname */
+ 	"pg_catalog.pg_conversion c",
+ 	/* selcondition */
+ 	"c.connamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
+ 	/* viscondition */
+ 	"pg_catalog.pg_conversion_is_visible(c.oid)",
+ 	/* namespace */
+ 	"c.connamespace",
+ 	/* result */
+ 	"pg_catalog.quote_ident(c.conname)",
+ 	/* qualresult */
+ 	NULL
+ };
+ 
  static const SchemaQuery Query_for_list_of_datatypes = {
  	/* catname */
  	"pg_catalog.pg_type t",
  	/* selcondition --- ignore table rowtypes and array types */
  	"(t.typrelid = 0 "
  	" OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
! 	"AND t.typname !~ '^_'"
! 	"AND t.typnamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
  	/* viscondition */
  	"pg_catalog.pg_type_is_visible(t.oid)",
  	/* namespace */
***************
*** 192,198 ****
  	/* catname */
  	"pg_catalog.pg_type t",
  	/* selcondition */
! 	"t.typtype = 'd'",
  	/* viscondition */
  	"pg_catalog.pg_type_is_visible(t.oid)",
  	/* namespace */
--- 244,250 ----
  	/* catname */
  	"pg_catalog.pg_type t",
  	/* selcondition */
! 	"t.typtype = 'd' AND t.typnamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
  	/* viscondition */
  	"pg_catalog.pg_type_is_visible(t.oid)",
  	/* namespace */
***************
*** 207,213 ****
  	/* catname */
  	"pg_catalog.pg_proc p",
  	/* selcondition */
! 	NULL,
  	/* viscondition */
  	"pg_catalog.pg_function_is_visible(p.oid)",
  	/* namespace */
--- 259,265 ----
  	/* catname */
  	"pg_catalog.pg_proc p",
  	/* selcondition */
! 	"p.pronamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
  	/* viscondition */
  	"pg_catalog.pg_function_is_visible(p.oid)",
  	/* namespace */
***************
*** 233,238 ****
--- 285,305 ----
  	NULL
  };
  
+ static const SchemaQuery Query_for_list_of_operators = {
+ 	/* catname */
+ 	"pg_catalog.pg_operator o",
+ 	/* selcondition */
+ 	"p.oprnamespace <> (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')",
+ 	/* viscondition */
+ 	"1=1",
+ 	/* namespace */
+ 	"o.oprnamespace",
+ 	/* result */
+ 	"pg_catalog.quote_ident(o.oprname)",
+ 	/* qualresult */
+ 	NULL
+ };
+ 
  static const SchemaQuery Query_for_list_of_sequences = {
  	/* catname */
  	"pg_catalog.pg_class c",
***************
*** 332,359 ****
  "   AND pg_catalog.quote_ident(relname)='%s' "\
  "   AND pg_catalog.pg_table_is_visible(c.oid)"
  
  #define Query_for_list_of_databases \
  "SELECT pg_catalog.quote_ident(datname) FROM pg_catalog.pg_database "\
  " WHERE substring(pg_catalog.quote_ident(datname),1,%d)='%s'"
  
! #define Query_for_list_of_tablespaces \
! "SELECT pg_catalog.quote_ident(spcname) FROM pg_catalog.pg_tablespace "\
! " WHERE substring(pg_catalog.quote_ident(spcname),1,%d)='%s'"
  
  #define Query_for_list_of_encodings \
  " SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
  "   FROM pg_catalog.pg_conversion "\
  "  WHERE substring(pg_catalog.pg_encoding_to_char(conforencoding),1,%d)=UPPER('%s')"
  
  #define Query_for_list_of_languages \
  "SELECT pg_catalog.quote_ident(lanname) "\
  "  FROM pg_language "\
  " WHERE lanname != 'internal' "\
  "   AND substring(pg_catalog.quote_ident(lanname),1,%d)='%s' "
  
! #define Query_for_list_of_schemas \
! "SELECT pg_catalog.quote_ident(nspname) FROM pg_catalog.pg_namespace "\
! " WHERE substring(pg_catalog.quote_ident(nspname),1,%d)='%s'"
  
  #define Query_for_list_of_system_relations \
  "SELECT pg_catalog.quote_ident(relname) "\
--- 399,479 ----
  "   AND pg_catalog.quote_ident(relname)='%s' "\
  "   AND pg_catalog.pg_table_is_visible(c.oid)"
  
+ #define Query_for_list_of_system_aggregates \
+ "SELECT pg_catalog.quote_ident(proname) FROM pg_catalog.pg_proc "\
+ " WHERE proisagg AND pg_catalog.pg_function_is_visible(oid)"\
+ " AND p.pronamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
+ " AND substring(pg_catalog.quote_ident(proname),1,%d)='%s'"
+ 
+ #define Query_for_list_of_system_comments \
+ "SELECT pg_catalog.quote_ident(name) FROM "\
+ "(SELECT c.name, c.namesp FROM ( SELECT * FROM ("\
+ " SELECT oid, relname as name, relnamespace as namesp FROM pg_catalog.pg_class c"\
+ "  WHERE pg_catalog.pg_table_is_visible(oid)"\
+ " UNION ALL"\
+ " SELECT oid, proname::pg_catalog.text as name, pronamespace AS namesp FROM pg_catalog.pg_proc"\
+ "  WHERE pg_catalog.pg_function_is_visible(oid) AND (proisagg OR proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)"\
+ " UNION ALL"\
+ " SELECT oid, pg_catalog.format_type(oid, NULL) as name, typnamespace AS namesp FROM pg_catalog.pg_type"\
+ "  WHERE pg_catalog.pg_type_is_visible(oid)"\
+ " UNION ALL"\
+ " SELECT oid, oprname::pg_catalog.text AS name, oprnamespace AS namesp FROM pg_catalog.pg_operator"\
+ "   WHERE pg_catalog.pg_operator_is_visible(oid)"\
+ " UNION ALL"\
+ " SELECT r.oid, r.rulename::pg_catalog.text AS name, c.relnamespace AS namesp FROM pg_catalog.pg_rewrite r"\
+ "   JOIN pg_catalog.pg_class c ON c.oid = r.ev_class"\
+ "   WHERE r.rulename != '_RETURN' AND pg_catalog.pg_table_is_visible(c.oid)"\
+ " UNION ALL"\
+ " SELECT t.oid, t.tgname::pg_catalog.text AS name, c.relnamespace AS namesp FROM pg_catalog.pg_trigger t"\
+ "  JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid"\
+ "  WHERE pg_catalog.pg_table_is_visible(c.oid)"\
+ ") b WHERE namesp = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
+ ") c JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0)) AS x",\
+ " WHERE substring(pg_catalog.quote_ident(cname),1,%d)='%s'"
+ 
+ #define Query_for_list_of_system_conversions \
+ "SELECT pg_catalog.quote_ident(conname) FROM pg_catalog.pg_conversion"\
+ " WHERE pg_catalog.pg_conversion_is_visible(oid)"\
+ " AND connamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
+ " AND substring(pg_catalog.quote_ident(conname),1,%d)='%s'"
+ 
  #define Query_for_list_of_databases \
  "SELECT pg_catalog.quote_ident(datname) FROM pg_catalog.pg_database "\
  " WHERE substring(pg_catalog.quote_ident(datname),1,%d)='%s'"
  
! #define Query_for_list_of_system_datatypes \
! "SELECT pg_catalog.quote_ident(t.typname) FROM pg_catalog.pg_type t"\
! " WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "\
! " AND t.typname !~ '^_'"\
! " AND t.typnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
! " AND substring(pg_catalog.quote_ident(typname),1,%d)='%s'"
! 
! #define Query_for_list_of_system_domains \
! "SELECT pg_catalog.quote_ident(typname) FROM pg_catalog.pg_type"\
! " WHERE pg_catalog.pg_domain_is_visible(oid)"\
! " AND typnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
! " AND substring(pg_catalog.quote_ident(typname),1,%d)='%s'"
  
  #define Query_for_list_of_encodings \
  " SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
  "   FROM pg_catalog.pg_conversion "\
  "  WHERE substring(pg_catalog.pg_encoding_to_char(conforencoding),1,%d)=UPPER('%s')"
  
+ #define Query_for_list_of_system_functions \
+ "SELECT pg_catalog.quote_ident(proname) FROM pg_catalog.pg_proc"\
+ " WHERE pg_catalog.pg_function_is_visible(oid)"\
+ " AND pronamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"\
+ " AND substring(pg_catalog.quote_ident(proname),1,%d)='%s'"
+ 
  #define Query_for_list_of_languages \
  "SELECT pg_catalog.quote_ident(lanname) "\
  "  FROM pg_language "\
  " WHERE lanname != 'internal' "\
  "   AND substring(pg_catalog.quote_ident(lanname),1,%d)='%s' "
  
! #define Query_for_list_of_largeobjects \
! "SELECT pg_catalog.obj_description(loid, 'pg_largeobject')"\
! " FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject)"
  
  #define Query_for_list_of_system_relations \
  "SELECT pg_catalog.quote_ident(relname) "\
***************
*** 363,368 ****
--- 483,496 ----
  "   AND c.relnamespace = n.oid "\
  "   AND n.nspname = 'pg_catalog'"
  
+ #define Query_for_list_of_schemas \
+ "SELECT pg_catalog.quote_ident(nspname) FROM pg_catalog.pg_namespace "\
+ " WHERE substring(pg_catalog.quote_ident(nspname),1,%d)='%s'"
+ 
+ #define Query_for_list_of_tablespaces \
+ "SELECT pg_catalog.quote_ident(spcname) FROM pg_catalog.pg_tablespace "\
+ " WHERE substring(pg_catalog.quote_ident(spcname),1,%d)='%s'"
+ 
  #define Query_for_list_of_users \
  " SELECT pg_catalog.quote_ident(usename) "\
  "   FROM pg_catalog.pg_user "\
***************
*** 418,424 ****
  	{"CAST", NULL, NULL},		/* Casts have complex structures for
  								 * names, so skip it */
  	/* CREATE CONSTRAINT TRIGGER is not supported here because it is designed to be used only by pg_dump. */
! 	{"CONVERSION", "SELECT pg_catalog.quote_ident(conname) FROM pg_catalog.pg_conversion WHERE substring(pg_catalog.quote_ident(conname),1,%d)='%s'"},
  	{"DATABASE", Query_for_list_of_databases},
  	{"DOMAIN", NULL, &Query_for_list_of_domains},
  	{"FUNCTION", NULL, &Query_for_list_of_functions},
--- 546,552 ----
  	{"CAST", NULL, NULL},		/* Casts have complex structures for
  								 * names, so skip it */
  	/* CREATE CONSTRAINT TRIGGER is not supported here because it is designed to be used only by pg_dump. */
! 	{"CONVERSION", NULL, &Query_for_list_of_conversions},
  	{"DATABASE", Query_for_list_of_databases},
  	{"DOMAIN", NULL, &Query_for_list_of_domains},
  	{"FUNCTION", NULL, &Query_for_list_of_functions},
***************
*** 617,625 ****
  
  	static const char *const backslash_commands[] = {
  		"\\a", "\\connect", "\\C", "\\cd", "\\copy", "\\copyright",
! 		"\\d", "\\da", "\\db", "\\dc", "\\dC", "\\dd", "\\dD", "\\df",
! 		"\\dg", "\\di", "\\dl", "\\dn", "\\do", "\\dp", "\\ds", "\\dS",
! 		"\\dt", "\\dT", "\\dv", "\\du",
  		"\\e", "\\echo", "\\encoding",
  		"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
  		"\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
--- 745,753 ----
  
  	static const char *const backslash_commands[] = {
  		"\\a", "\\connect", "\\C", "\\cd", "\\copy", "\\copyright",
! 		"\\d", "\\da", "\\daS", "\\db", "\\dc", "\\dcS", "\\dC", "\\dd", "\\ddS", "\\dD", "\\dDS",
! 		"\\df", "\\dfS", "\\dg", "\\di", "\\dl", "\\dn", "\\do", "\\doS", "\\dp", "\\ds", "\\dS",
! 		"\\dt", "\\dT", "\\dTS", "\\dv", "\\du",
  		"\\e", "\\echo", "\\encoding",
  		"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
  		"\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
***************
*** 1706,1728 ****
  
  
  /* Backslash commands */
- /* TODO:  \dc \dd \dl */
  	else if (strcmp(prev_wd, "\\connect") == 0 || strcmp(prev_wd, "\\c") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_databases);
  	else if (strcmp(prev_wd, "\\d") == 0 || strcmp(prev_wd, "\\d+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tisv, NULL);
  	else if (strcmp(prev_wd, "\\da") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL);
  	else if (strcmp(prev_wd, "\\db") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
  	else if (strcmp(prev_wd, "\\dD") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL);
  	else if (strcmp(prev_wd, "\\df") == 0 || strcmp(prev_wd, "\\df+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
  	else if (strcmp(prev_wd, "\\di") == 0 || strcmp(prev_wd, "\\di+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL);
  	else if (strcmp(prev_wd, "\\dn") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
  	else if (strcmp(prev_wd, "\\dp") == 0 || strcmp(prev_wd, "\\z") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsv, NULL);
  	else if (strcmp(prev_wd, "\\ds") == 0 || strcmp(prev_wd, "\\ds+") == 0)
--- 1834,1873 ----
  
  
  /* Backslash commands */
  	else if (strcmp(prev_wd, "\\connect") == 0 || strcmp(prev_wd, "\\c") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_databases);
  	else if (strcmp(prev_wd, "\\d") == 0 || strcmp(prev_wd, "\\d+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tisv, NULL);
  	else if (strcmp(prev_wd, "\\da") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL);
+ 	else if (strcmp(prev_wd, "\\daS") == 0)
+ 			COMPLETE_WITH_QUERY(Query_for_list_of_system_aggregates);
  	else if (strcmp(prev_wd, "\\db") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ 	else if (strcmp(prev_wd, "\\dc") == 0)
+ 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_conversions, NULL);
+ 	else if (strcmp(prev_wd, "\\dcS") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_system_conversions);
+ 	else if (strcmp(prev_wd, "\\dd") == 0)
+ 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_comments, NULL);
+ 	else if (strcmp(prev_wd, "\\ddS") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_system_comments);
  	else if (strcmp(prev_wd, "\\dD") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL);
+ 	else if (strcmp(prev_wd, "\\dDS") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_system_domains);
  	else if (strcmp(prev_wd, "\\df") == 0 || strcmp(prev_wd, "\\df+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
+ 	else if (strcmp(prev_wd, "\\dfS") == 0 || strcmp(prev_wd, "\\dfS+") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_system_functions);
  	else if (strcmp(prev_wd, "\\di") == 0 || strcmp(prev_wd, "\\di+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL);
+ 	else if (strcmp(prev_wd, "\\dl") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_largeobjects);
  	else if (strcmp(prev_wd, "\\dn") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ 	else if (strcmp(prev_wd, "\\do") == 0)
+ 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operators, NULL);
  	else if (strcmp(prev_wd, "\\dp") == 0 || strcmp(prev_wd, "\\z") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsv, NULL);
  	else if (strcmp(prev_wd, "\\ds") == 0 || strcmp(prev_wd, "\\ds+") == 0)
***************
*** 1733,1738 ****
--- 1878,1885 ----
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
  	else if (strcmp(prev_wd, "\\dT") == 0 || strcmp(prev_wd, "\\dT+") == 0)
  		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
+ 	else if (strcmp(prev_wd, "\\dTS") == 0 || strcmp(prev_wd, "\\dTS+") == 0)
+ 		COMPLETE_WITH_QUERY(Query_for_list_of_system_datatypes);
  	else if (strcmp(prev_wd, "\\du") == 0)
  		COMPLETE_WITH_QUERY(Query_for_list_of_users);
  	else if (strcmp(prev_wd, "\\dv") == 0 || strcmp(prev_wd, "\\dv+") == 0)
---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Reply via email to