mirror of
https://github.com/postgres/postgres.git
synced 2025-07-09 22:41:56 +03:00
Add new psql \da, \do, and \dT options.
This commit is contained in:
@ -26,7 +26,7 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
# IDENTIFICATION
|
# IDENTIFICATION
|
||||||
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.25 1997/11/13 03:22:34 momjian Exp $
|
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.26 1997/11/14 21:37:35 momjian Exp $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -346,11 +346,12 @@ fi
|
|||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
echo "vacuuming template1"
|
|
||||||
echo "vacuum" | postgres -F -Q -D$PGDATA template1 2>&1 > /dev/null |\
|
|
||||||
grep -v "^DEBUG:"
|
|
||||||
|
|
||||||
echo "loading pg_description"
|
echo "loading pg_description"
|
||||||
echo "copy pg_description from '$TEMPLATE_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
|
echo "copy pg_description from '$TEMPLATE_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
|
||||||
echo "copy pg_description from '$GLOBAL_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
|
echo "copy pg_description from '$GLOBAL_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
|
||||||
|
|
||||||
|
echo "vacuuming template1"
|
||||||
|
echo "vacuum" | postgres -F -Q -D$PGDATA template1 2>&1 > /dev/null |\
|
||||||
|
grep -v "^DEBUG:"
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.104 1997/11/14 05:57:35 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.105 1997/11/14 21:37:41 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -135,14 +135,6 @@ HandleSlashCmds(PsqlSettings *pset,
|
|||||||
char *line,
|
char *line,
|
||||||
char *query);
|
char *query);
|
||||||
static int MainLoop(PsqlSettings *pset, char *query, FILE *source);
|
static int MainLoop(PsqlSettings *pset, char *query, FILE *source);
|
||||||
|
|
||||||
/* probably should move this into libpq */
|
|
||||||
void
|
|
||||||
PQprint(FILE *fp,
|
|
||||||
PGresult *res,
|
|
||||||
PQprintOpt *po
|
|
||||||
);
|
|
||||||
|
|
||||||
static FILE *setFout(PsqlSettings *pset, char *fname);
|
static FILE *setFout(PsqlSettings *pset, char *fname);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -224,11 +216,14 @@ slashUsage(PsqlSettings *pset)
|
|||||||
fprintf(fout, " \\C [<captn>] -- set html3 caption (currently '%s')\n", pset->opt.caption ? pset->opt.caption : "");
|
fprintf(fout, " \\C [<captn>] -- set html3 caption (currently '%s')\n", pset->opt.caption ? pset->opt.caption : "");
|
||||||
fprintf(fout, " \\connect <dbname|-> <user> -- connect to new database (currently '%s')\n", PQdb(pset->db));
|
fprintf(fout, " \\connect <dbname|-> <user> -- connect to new database (currently '%s')\n", PQdb(pset->db));
|
||||||
fprintf(fout, " \\copy table {from | to} <fname>\n");
|
fprintf(fout, " \\copy table {from | to} <fname>\n");
|
||||||
fprintf(fout, " \\d [<table>] -- list tables and indices in database or columns in <table>, * for all\n");
|
fprintf(fout, " \\d [<table>] -- list tables and indices, columns in <table>, or * for all\n");
|
||||||
|
fprintf(fout, " \\da -- list aggregates\n");
|
||||||
fprintf(fout, " \\dd [<object>]- list comment for table, field, type, function, or operator.\n");
|
fprintf(fout, " \\dd [<object>]- list comment for table, field, type, function, or operator.\n");
|
||||||
fprintf(fout, " \\di -- list only indices in database\n");
|
fprintf(fout, " \\di -- list only indices\n");
|
||||||
fprintf(fout, " \\ds -- list only sequences in database\n");
|
fprintf(fout, " \\do -- list operators\n");
|
||||||
fprintf(fout, " \\dt -- list only tables in database\n");
|
fprintf(fout, " \\ds -- list only sequences\n");
|
||||||
|
fprintf(fout, " \\dt -- list only tables\n");
|
||||||
|
fprintf(fout, " \\dT -- list types\n");
|
||||||
fprintf(fout, " \\e [<fname>] -- edit the current query buffer or <fname>\n");
|
fprintf(fout, " \\e [<fname>] -- edit the current query buffer or <fname>\n");
|
||||||
fprintf(fout, " \\E [<fname>] -- edit the current query buffer or <fname>, and execute\n");
|
fprintf(fout, " \\E [<fname>] -- edit the current query buffer or <fname>, and execute\n");
|
||||||
fprintf(fout, " \\f [<sep>] -- change field separater (currently '%s')\n", pset->opt.fieldSep);
|
fprintf(fout, " \\f [<sep>] -- change field separater (currently '%s')\n", pset->opt.fieldSep);
|
||||||
@ -751,20 +746,19 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
|||||||
strcat(descbuf, "FROM pg_type, pg_description ");
|
strcat(descbuf, "FROM pg_type, pg_description ");
|
||||||
strcat(descbuf, "WHERE pg_type.typname = '");
|
strcat(descbuf, "WHERE pg_type.typname = '");
|
||||||
strcat(descbuf, object);
|
strcat(descbuf, object);
|
||||||
strcat(descbuf, "'" );
|
strcat(descbuf, "' and ");
|
||||||
strcat(descbuf, " and pg_type.oid = pg_description.objoid " );
|
strcat(descbuf, " pg_type.oid = pg_description.objoid " );
|
||||||
if (!(res = PSQLexec(pset, descbuf)))
|
if (!(res = PSQLexec(pset, descbuf)))
|
||||||
return -1;
|
return -1;
|
||||||
else if (PQntuples(res) <= 0)
|
|
||||||
{
|
{
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
descbuf[0] = '\0';
|
descbuf[0] = '\0';
|
||||||
strcat(descbuf, "SELECT DISTINCT description ");
|
strcat(descbuf, "SELECT DISTINCT description ");
|
||||||
strcat(descbuf, "FROM pg_type, pg_description ");
|
strcat(descbuf, "FROM pg_proc, pg_description ");
|
||||||
strcat(descbuf, "WHERE pg_type.typname = '");
|
strcat(descbuf, "WHERE pg_proc.proname = '");
|
||||||
strcat(descbuf, object);
|
strcat(descbuf, object);
|
||||||
strcat(descbuf, "'" );
|
strcat(descbuf, "'" );
|
||||||
strcat(descbuf, " and pg_type.oid = pg_description.objoid " );
|
strcat(descbuf, " and pg_proc.oid = pg_description.objoid " );
|
||||||
if (!(res = PSQLexec(pset, descbuf)))
|
if (!(res = PSQLexec(pset, descbuf)))
|
||||||
return -1;
|
return -1;
|
||||||
else if (PQntuples(res) <= 0)
|
else if (PQntuples(res) <= 0)
|
||||||
@ -772,11 +766,11 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
|||||||
PQclear(res);
|
PQclear(res);
|
||||||
descbuf[0] = '\0';
|
descbuf[0] = '\0';
|
||||||
strcat(descbuf, "SELECT DISTINCT description ");
|
strcat(descbuf, "SELECT DISTINCT description ");
|
||||||
strcat(descbuf, "FROM pg_proc, pg_description ");
|
strcat(descbuf, "FROM pg_operator, pg_description ");
|
||||||
strcat(descbuf, "WHERE pg_proc.proname = '");
|
strcat(descbuf, "WHERE pg_operator.oprname = '");
|
||||||
strcat(descbuf, object);
|
strcat(descbuf, object);
|
||||||
strcat(descbuf, "'" );
|
strcat(descbuf, "'" );
|
||||||
strcat(descbuf, " and pg_proc.oid = pg_description.objoid " );
|
strcat(descbuf, " and pg_operator.oid = pg_description.objoid " );
|
||||||
if (!(res = PSQLexec(pset, descbuf)))
|
if (!(res = PSQLexec(pset, descbuf)))
|
||||||
return -1;
|
return -1;
|
||||||
else if (PQntuples(res) <= 0)
|
else if (PQntuples(res) <= 0)
|
||||||
@ -784,26 +778,13 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
|||||||
PQclear(res);
|
PQclear(res);
|
||||||
descbuf[0] = '\0';
|
descbuf[0] = '\0';
|
||||||
strcat(descbuf, "SELECT DISTINCT description ");
|
strcat(descbuf, "SELECT DISTINCT description ");
|
||||||
strcat(descbuf, "FROM pg_operator, pg_description ");
|
strcat(descbuf, "FROM pg_aggregate, pg_description ");
|
||||||
strcat(descbuf, "WHERE pg_operator.oprname = '");
|
strcat(descbuf, "WHERE pg_aggregate.aggname = '");
|
||||||
strcat(descbuf, object);
|
strcat(descbuf, object);
|
||||||
strcat(descbuf, "'" );
|
strcat(descbuf, "'" );
|
||||||
strcat(descbuf, " and pg_operator.oid = pg_description.objoid " );
|
strcat(descbuf, " and pg_aggregate.oid = pg_description.objoid " );
|
||||||
if (!(res = PSQLexec(pset, descbuf)))
|
if (!(res = PSQLexec(pset, descbuf)))
|
||||||
return -1;
|
return -1;
|
||||||
else if (PQntuples(res) <= 0)
|
|
||||||
{
|
|
||||||
PQclear(res);
|
|
||||||
descbuf[0] = '\0';
|
|
||||||
strcat(descbuf, "SELECT DISTINCT description ");
|
|
||||||
strcat(descbuf, "FROM pg_aggregate, pg_description ");
|
|
||||||
strcat(descbuf, "WHERE pg_aggregate.aggname = '");
|
|
||||||
strcat(descbuf, object);
|
|
||||||
strcat(descbuf, "'" );
|
|
||||||
strcat(descbuf, " and pg_aggregate.oid = pg_description.objoid " );
|
|
||||||
if (!(res = PSQLexec(pset, descbuf)))
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1584,7 +1565,7 @@ HandleSlashCmds(PsqlSettings *pset,
|
|||||||
{
|
{
|
||||||
int status = CMD_SKIP_LINE;
|
int status = CMD_SKIP_LINE;
|
||||||
char *optarg;
|
char *optarg;
|
||||||
|
bool success;
|
||||||
/*
|
/*
|
||||||
* Pointer inside the <cmd> string to the argument of the slash
|
* Pointer inside the <cmd> string to the argument of the slash
|
||||||
* command, assuming it is a one-character slash command. If it's not
|
* command, assuming it is a one-character slash command. If it's not
|
||||||
@ -1696,20 +1677,82 @@ HandleSlashCmds(PsqlSettings *pset,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'd': /* \d describe tables or columns in a
|
case 'd': /* \d describe database information */
|
||||||
* table */
|
if (strncmp(cmd, "da", 2) == 0)
|
||||||
if (strncmp(cmd, "dd", 2) == 0)
|
/* aggregates */
|
||||||
|
SendQuery(&success, pset,"\
|
||||||
|
SELECT a.aggname AS aggname, \
|
||||||
|
t.typname AS typname, \
|
||||||
|
obj_description(a.oid) as description \
|
||||||
|
FROM pg_aggregate a, pg_type t \
|
||||||
|
WHERE a.aggbasetype = t.oid \
|
||||||
|
ORDER BY aggname, typname;",
|
||||||
|
false, false, 0);
|
||||||
|
else if (strncmp(cmd, "dd", 2) == 0)
|
||||||
/* descriptions */
|
/* descriptions */
|
||||||
objectDescription(pset, optarg+1, NULL);
|
objectDescription(pset, optarg+1, NULL);
|
||||||
else if (strncmp(cmd, "di", 2) == 0)
|
else if (strncmp(cmd, "di", 2) == 0)
|
||||||
/* only indices */
|
/* only indices */
|
||||||
tableList(pset, false, 'i');
|
tableList(pset, false, 'i');
|
||||||
|
else if (strncmp(cmd, "do", 2) == 0)
|
||||||
|
{
|
||||||
|
/* operators */
|
||||||
|
SendQuery(&success, pset,"\
|
||||||
|
SELECT t0.typname AS result, \
|
||||||
|
t1.typname AS left_type, \
|
||||||
|
t2.typname AS right_type, \
|
||||||
|
o.oprname AS operatr, \
|
||||||
|
p.proname AS func_name, \
|
||||||
|
obj_description(o.oid) as description \
|
||||||
|
FROM pg_proc p, pg_type t0, \
|
||||||
|
pg_type t1, pg_type t2, \
|
||||||
|
pg_operator o \
|
||||||
|
WHERE p.prorettype = t0.oid AND \
|
||||||
|
RegprocToOid(o.oprcode) = p.oid AND \
|
||||||
|
p.pronargs = 2 AND \
|
||||||
|
o.oprleft = t1.oid AND \
|
||||||
|
o.oprright = t2.oid \
|
||||||
|
ORDER BY result, left_type, right_type, operatr;",
|
||||||
|
false, false, 0);
|
||||||
|
SendQuery(&success, pset,"\
|
||||||
|
SELECT o.oprname AS left_unary, \
|
||||||
|
t.typname AS operand, \
|
||||||
|
r.typname AS return_type, \
|
||||||
|
obj_description(o.oid) as description \
|
||||||
|
FROM pg_operator o, pg_type t, pg_type r \
|
||||||
|
WHERE o.oprkind = 'l' AND \
|
||||||
|
o.oprright = t.oid AND \
|
||||||
|
o.oprresult = r.oid \
|
||||||
|
ORDER BY operand;",
|
||||||
|
false, false, 0);
|
||||||
|
SendQuery(&success, pset,"\
|
||||||
|
SELECT o.oprname AS right_unary, \
|
||||||
|
t.typname AS operand, \
|
||||||
|
r.typname AS return_type, \
|
||||||
|
obj_description(o.oid) as description \
|
||||||
|
FROM pg_operator o, pg_type t, pg_type r \
|
||||||
|
WHERE o.oprkind = 'r' AND \
|
||||||
|
o.oprleft = t.oid AND \
|
||||||
|
o.oprresult = r.oid \
|
||||||
|
ORDER BY operand;",
|
||||||
|
false, false, 0);
|
||||||
|
}
|
||||||
else if (strncmp(cmd, "ds", 2) == 0)
|
else if (strncmp(cmd, "ds", 2) == 0)
|
||||||
/* only sequences */
|
/* only sequences */
|
||||||
tableList(pset, false, 'S');
|
tableList(pset, false, 'S');
|
||||||
else if (strncmp(cmd, "dt", 2) == 0)
|
else if (strncmp(cmd, "dt", 2) == 0)
|
||||||
/* only tables */
|
/* only tables */
|
||||||
tableList(pset, false, 't');
|
tableList(pset, false, 't');
|
||||||
|
else if (strncmp(cmd, "dT", 2) == 0)
|
||||||
|
/* types */
|
||||||
|
SendQuery(&success, pset,"\
|
||||||
|
SELECT typname AS type, \
|
||||||
|
obj_description(oid) as description \
|
||||||
|
FROM pg_type \
|
||||||
|
WHERE typrelid = 0 AND \
|
||||||
|
typname !~ '^_.*' \
|
||||||
|
ORDER BY type;",
|
||||||
|
false, false, 0);
|
||||||
else if (!optarg)
|
else if (!optarg)
|
||||||
/* show tables, sequences and indices */
|
/* show tables, sequences and indices */
|
||||||
tableList(pset, false, 'b');
|
tableList(pset, false, 'b');
|
||||||
@ -1718,9 +1761,12 @@ HandleSlashCmds(PsqlSettings *pset,
|
|||||||
if (tableList(pset, false, 'b') == 0)
|
if (tableList(pset, false, 'b') == 0)
|
||||||
tableList(pset, true, 'b');
|
tableList(pset, true, 'b');
|
||||||
}
|
}
|
||||||
else
|
else if (strncmp(cmd, "d ", 2) == 0)
|
||||||
/* describe the specified table */
|
/* describe the specified table */
|
||||||
tableDesc(pset, optarg, NULL);
|
tableDesc(pset, optarg, NULL);
|
||||||
|
else
|
||||||
|
slashUsage(pset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'e': /* edit */
|
case 'e': /* edit */
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: pg_proc.h,v 1.34 1997/11/13 03:23:07 momjian Exp $
|
* $Id: pg_proc.h,v 1.35 1997/11/14 21:37:54 momjian Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The script catalog/genbki.sh reads this file and generates .bki
|
* The script catalog/genbki.sh reads this file and generates .bki
|
||||||
@ -1649,6 +1649,8 @@ DATA(insert OID = 1346 ( int2 PGUID 14 f t f 1 f 21 "25" 100 0 0 100 "sele
|
|||||||
DESCR("");
|
DESCR("");
|
||||||
DATA(insert OID = 1347 ( int4 PGUID 14 f t f 1 f 23 "25" 100 0 0 100 "select text_int4($1)" - ));
|
DATA(insert OID = 1347 ( int4 PGUID 14 f t f 1 f 23 "25" 100 0 0 100 "select text_int4($1)" - ));
|
||||||
DESCR("");
|
DESCR("");
|
||||||
|
DATA(insert OID = 1348 ( obj_description PGUID 14 f t f 1 f 25 "26" 100 0 0 100 "select description from pg_description where objoid = $1" - ));
|
||||||
|
DESCR("");
|
||||||
|
|
||||||
DATA(insert OID = 1350 ( datetime PGUID 14 f t f 1 f 1184 "1184" 100 0 0 100 "select $1" - ));
|
DATA(insert OID = 1350 ( datetime PGUID 14 f t f 1 f 1184 "1184" 100 0 0 100 "select $1" - ));
|
||||||
DESCR("");
|
DESCR("");
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" This is -*-nroff-*-
|
.\" This is -*-nroff-*-
|
||||||
.\" XXX standard disclaimer belongs here....
|
.\" XXX standard disclaimer belongs here....
|
||||||
.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.14 1997/11/13 03:36:42 momjian Exp $
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.15 1997/11/14 21:38:16 momjian Exp $
|
||||||
.TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
|
.TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
|
||||||
.SH NAME
|
.SH NAME
|
||||||
psql \(em run the interactive query front-end
|
psql \(em run the interactive query front-end
|
||||||
@ -292,14 +292,20 @@ is specified, list the columns in
|
|||||||
If table name is
|
If table name is
|
||||||
.IR *,
|
.IR *,
|
||||||
list all tables and column information for each tables.
|
list all tables and column information for each tables.
|
||||||
|
.IP "\eda"
|
||||||
|
List aggregates.
|
||||||
.IP "\edd object"
|
.IP "\edd object"
|
||||||
List the description of the table, table.column, type, operator, or aggregate.
|
List the description of the table, table.column, type, operator, or aggregate.
|
||||||
.IP "\edi"
|
.IP "\edi"
|
||||||
List only indexes.
|
List only indexes.
|
||||||
.IP "\edt"
|
.IP "\edo"
|
||||||
List only tables.
|
List operators.
|
||||||
.IP "\eds"
|
.IP "\eds"
|
||||||
List only sequences.
|
List only sequences.
|
||||||
|
.IP "\edt"
|
||||||
|
List only tables.
|
||||||
|
.IP "\edT"
|
||||||
|
List types.
|
||||||
.IP "\ee [\fIfilename\fR]"
|
.IP "\ee [\fIfilename\fR]"
|
||||||
Edit the current query buffer or \fIfile\fR.
|
Edit the current query buffer or \fIfile\fR.
|
||||||
.IP "\eE [\fIfilename\fR]"
|
.IP "\eE [\fIfilename\fR]"
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 658 KiB After Width: | Height: | Size: 7.2 KiB |
Reference in New Issue
Block a user