mirror of
https://github.com/postgres/postgres.git
synced 2025-07-12 21:01:52 +03:00
Add auto-size to screen to \d? commands. Use UNION to show all
\d? results in one query. Add \d? field search feature. Rename MB to MULTIBYTE.
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.147 1998/07/09 03:28:53 scrappy Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.148 1998/07/18 18:34:14 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -129,7 +129,7 @@ static int
|
||||
tableList(PsqlSettings *pset, bool deep_tablelist,
|
||||
char info_type, bool system_tables);
|
||||
static int tableDesc(PsqlSettings *pset, char *table, FILE *fout);
|
||||
static int objectDescription(PsqlSettings *pset, char *object, FILE *fout);
|
||||
static int objectDescription(PsqlSettings *pset, char *object);
|
||||
static int rightsList(PsqlSettings *pset);
|
||||
static void prompt_for_password(char *username, char *password);
|
||||
static char *
|
||||
@ -144,9 +144,7 @@ static void
|
||||
SendQuery(bool *success_p, PsqlSettings *pset, const char *query,
|
||||
const bool copy_in, const bool copy_out, FILE *copystream);
|
||||
static int
|
||||
HandleSlashCmds(PsqlSettings *pset,
|
||||
char *line,
|
||||
char *query);
|
||||
HandleSlashCmds(PsqlSettings *pset, char *line, char *query);
|
||||
static int MainLoop(PsqlSettings *pset, char *query, FILE *source);
|
||||
static FILE *setFout(PsqlSettings *pset, char *fname);
|
||||
|
||||
@ -626,8 +624,7 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
|
||||
char *pagerenv;
|
||||
|
||||
#ifdef TIOCGWINSZ
|
||||
if (fout == NULL &&
|
||||
pset->notty == 0 &&
|
||||
if (pset->notty == 0 &&
|
||||
(ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 ||
|
||||
screen_size.ws_col == 0 ||
|
||||
screen_size.ws_row == 0))
|
||||
@ -653,7 +650,7 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
for (i = 0; table[i]; i += PQmblen(table+i))
|
||||
#else
|
||||
for (i = 0; table[i]; i++)
|
||||
@ -790,29 +787,13 @@ tableDesc(PsqlSettings *pset, char *table, FILE *fout)
|
||||
*
|
||||
*/
|
||||
int
|
||||
objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
objectDescription(PsqlSettings *pset, char *object)
|
||||
{
|
||||
char descbuf[512];
|
||||
int nDescriptions;
|
||||
int i;
|
||||
PGresult *res;
|
||||
int usePipe = 0;
|
||||
char *pagerenv;
|
||||
|
||||
#ifdef TIOCGWINSZ
|
||||
if (fout == NULL &&
|
||||
pset->notty == 0 &&
|
||||
(ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 ||
|
||||
screen_size.ws_col == 0 ||
|
||||
screen_size.ws_row == 0))
|
||||
{
|
||||
#endif
|
||||
screen_size.ws_row = 24;
|
||||
screen_size.ws_col = 80;
|
||||
#ifdef TIOCGWINSZ
|
||||
}
|
||||
#endif
|
||||
|
||||
int i;
|
||||
bool success;
|
||||
|
||||
/* Build the query */
|
||||
|
||||
while (isspace(*object))
|
||||
@ -830,7 +811,7 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
for (i = 0; object[i]; i += PQmblen(object+i))
|
||||
#else
|
||||
for (i = 0; object[i]; i++)
|
||||
@ -866,7 +847,7 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
{
|
||||
strcat(descbuf, "SELECT DISTINCT description ");
|
||||
strcat(descbuf, "FROM pg_class, pg_description ");
|
||||
strcat(descbuf, "WHERE pg_class.relname = '");
|
||||
strcat(descbuf, "WHERE pg_class.relname ~ '^");
|
||||
strcat(descbuf, object);
|
||||
strcat(descbuf, "'");
|
||||
strcat(descbuf, " and pg_class.oid = pg_description.objoid ");
|
||||
@ -878,7 +859,7 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT DISTINCT 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, "' and ");
|
||||
strcat(descbuf, " pg_type.oid = pg_description.objoid ");
|
||||
@ -890,7 +871,7 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT DISTINCT description ");
|
||||
strcat(descbuf, "FROM pg_proc, pg_description ");
|
||||
strcat(descbuf, "WHERE pg_proc.proname = '");
|
||||
strcat(descbuf, "WHERE pg_proc.proname ~ '^");
|
||||
strcat(descbuf, object);
|
||||
strcat(descbuf, "'");
|
||||
strcat(descbuf, " and pg_proc.oid = pg_description.objoid ");
|
||||
@ -902,7 +883,7 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT DISTINCT description ");
|
||||
strcat(descbuf, "FROM pg_operator, pg_description ");
|
||||
strcat(descbuf, "WHERE pg_operator.oprname = '");
|
||||
strcat(descbuf, "WHERE pg_operator.oprname ~ '^");
|
||||
strcat(descbuf, object);
|
||||
strcat(descbuf, "'");
|
||||
/* operator descriptions are attached to the proc */
|
||||
@ -915,59 +896,31 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT DISTINCT description ");
|
||||
strcat(descbuf, "FROM pg_aggregate, pg_description ");
|
||||
strcat(descbuf, "WHERE pg_aggregate.aggname = '");
|
||||
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;
|
||||
else if (PQntuples(res) <= 0)
|
||||
{
|
||||
PQclear(res);
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT 'no description' as description ");
|
||||
if (!(res = PSQLexec(pset, descbuf)))
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
nDescriptions = PQntuples(res);
|
||||
if (nDescriptions > 0)
|
||||
{
|
||||
if (fout == NULL)
|
||||
{
|
||||
if (pset->notty == 0 &&
|
||||
(pagerenv = getenv("PAGER")) &&
|
||||
pagerenv[0] != '\0' &&
|
||||
screen_size.ws_row <= nDescriptions + 1 &&
|
||||
(fout = popen(pagerenv, "w")))
|
||||
{
|
||||
usePipe = 1;
|
||||
pqsignal(SIGPIPE, SIG_IGN);
|
||||
}
|
||||
else
|
||||
fout = stdout;
|
||||
}
|
||||
|
||||
/*
|
||||
* * Display the information
|
||||
*/
|
||||
PQclear(res);
|
||||
|
||||
fprintf(fout, "\nObject = %s\n", object);
|
||||
SendQuery(&success, pset, descbuf, false, false, NULL);
|
||||
|
||||
/* next, print out the instances */
|
||||
for (i = 0; i < PQntuples(res); i++)
|
||||
fprintf(fout, "%s\n", PQgetvalue(res, i, 0));
|
||||
|
||||
PQclear(res);
|
||||
if (usePipe)
|
||||
{
|
||||
pclose(fout);
|
||||
pqsignal(SIGPIPE, SIG_DFL);
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Couldn't find comments for object %s!\n", object);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef char *(*READ_ROUTINE) (char *prompt, FILE *source);
|
||||
@ -1752,6 +1705,7 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
case 'a': /* toggles to align fields on output */
|
||||
toggle(pset, &pset->opt.align, "field alignment");
|
||||
break;
|
||||
|
||||
case 'C': /* define new caption */
|
||||
if (pset->opt.caption)
|
||||
{
|
||||
@ -1764,6 +1718,7 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
exit(CMD_TERMINATE);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
{
|
||||
if (strncmp(cmd, "copy ", strlen("copy ")) == 0 ||
|
||||
@ -1815,32 +1770,83 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'd': /* \d describe database information */
|
||||
/*
|
||||
* if the optarg2 name is surrounded by double-quotes, then don't
|
||||
* convert case
|
||||
*/
|
||||
if (optarg2)
|
||||
{
|
||||
if (*optarg2 == '"')
|
||||
{
|
||||
optarg2++;
|
||||
if (*(optarg2 + strlen(optarg2) - 1) == '"')
|
||||
*(optarg2 + strlen(optarg2) - 1) = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
#ifdef MULTIBYTE
|
||||
for (i = 0; optarg2[i]; i += PQmblen(optarg2+i))
|
||||
#else
|
||||
for (i = 0; optarg2[i]; i++)
|
||||
#endif
|
||||
if (isupper(optarg2[i]))
|
||||
optarg2[i] = tolower(optarg2[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TIOCGWINSZ
|
||||
if (pset->notty == 0 &&
|
||||
(ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 ||
|
||||
screen_size.ws_col == 0 ||
|
||||
screen_size.ws_row == 0))
|
||||
{
|
||||
#endif
|
||||
screen_size.ws_row = 24;
|
||||
screen_size.ws_col = 80;
|
||||
#ifdef TIOCGWINSZ
|
||||
}
|
||||
#endif
|
||||
if (strncmp(cmd, "da", 2) == 0)
|
||||
{
|
||||
char descbuf[4096];
|
||||
|
||||
/* 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);
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT a.aggname AS aggname, \
|
||||
'all types' as all_types, \
|
||||
obj_description(a.oid) as description \
|
||||
FROM pg_aggregate a \
|
||||
WHERE a.aggbasetype = 0 \
|
||||
ORDER BY aggname;",
|
||||
false, false, 0);
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT a.aggname AS aggname, ");
|
||||
strcat(descbuf, " t.typname AS type, ");
|
||||
strcat(descbuf, " obj_description(a.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_aggregate a, pg_type t ");
|
||||
strcat(descbuf, "WHERE a.aggbasetype = t.oid ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND a.aggname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "UNION ");
|
||||
strcat(descbuf, "SELECT a.aggname AS aggname, ");
|
||||
strcat(descbuf, " 'all types' as type, ");
|
||||
strcat(descbuf, " obj_description(a.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_aggregate a ");
|
||||
strcat(descbuf, "WHERE a.aggbasetype = 0 ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND a.aggname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "ORDER BY aggname, type;");
|
||||
SendQuery(&success, pset, descbuf, false, false, NULL);
|
||||
}
|
||||
else if (strncmp(cmd, "dd", 2) == 0)
|
||||
/* descriptions */
|
||||
objectDescription(pset, optarg + 1, NULL);
|
||||
objectDescription(pset, optarg + 1);
|
||||
else if (strncmp(cmd, "df", 2) == 0)
|
||||
{
|
||||
char descbuf[4096];
|
||||
/* functions/procedures */
|
||||
|
||||
/*
|
||||
@ -1848,75 +1854,101 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
* some arguments, but have no types defined for those
|
||||
* arguments
|
||||
*/
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT t.typname as return_type, \
|
||||
p.proname as function, \
|
||||
substr(oid8types(p.proargtypes),1,20) as arguments, \
|
||||
substr(obj_description(p.oid),1,28) as description \
|
||||
FROM pg_proc p, pg_type t \
|
||||
WHERE p.prorettype = t.oid and \
|
||||
(pronargs = 0 or oid8types(p.proargtypes) != '') and \
|
||||
t.typname != 'bool' \
|
||||
ORDER BY return_type, function;",
|
||||
false, false, 0);
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT t.typname as rtns, \
|
||||
p.proname as function, \
|
||||
oid8types(p.proargtypes) as arguments, \
|
||||
substr(obj_description(p.oid),1,34) as description \
|
||||
FROM pg_proc p, pg_type t \
|
||||
WHERE p.prorettype = t.oid and \
|
||||
(pronargs = 0 or oid8types(p.proargtypes) != '') and \
|
||||
t.typname = 'bool' \
|
||||
ORDER BY rtns, function;",
|
||||
false, false, 0);
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT t.typname as result, ");
|
||||
strcat(descbuf, " p.proname as function, ");
|
||||
if (screen_size.ws_col <= 80)
|
||||
strcat(descbuf, " substr(oid8types(p.proargtypes),1,14) as arguments, ");
|
||||
else
|
||||
strcat(descbuf, " oid8types(p.proargtypes) as arguments, ");
|
||||
if (screen_size.ws_col <= 80)
|
||||
strcat(descbuf, " substr(obj_description(p.oid),1,34) as description ");
|
||||
else
|
||||
strcat(descbuf, " obj_description(p.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_proc p, pg_type t ");
|
||||
strcat(descbuf, "WHERE p.prorettype = t.oid and ");
|
||||
strcat(descbuf, "(pronargs = 0 or oid8types(p.proargtypes) != '') ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND p.proname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "ORDER BY result, function, arguments;");
|
||||
SendQuery(&success, pset, descbuf, false, false, NULL);
|
||||
}
|
||||
else if (strncmp(cmd, "di", 2) == 0)
|
||||
/* only indices */
|
||||
tableList(pset, false, 'i', false);
|
||||
else if (strncmp(cmd, "do", 2) == 0)
|
||||
{
|
||||
char descbuf[4096];
|
||||
/* operators */
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT o.oprname AS op, \
|
||||
t0.typname AS result, \
|
||||
t1.typname AS left_type, \
|
||||
t2.typname AS right_type, \
|
||||
substr(obj_description(p.oid),1,42) 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 op, result, left_type, right_type;",
|
||||
false, false, 0);
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT o.oprname AS left_unary, \
|
||||
t0.typname AS return_type, \
|
||||
t1.typname AS operand, \
|
||||
obj_description(p.oid) as description \
|
||||
FROM pg_operator o, pg_proc p, pg_type t0, pg_type t1 \
|
||||
WHERE RegprocToOid(o.oprcode) = p.oid AND \
|
||||
o.oprresult = t0.oid AND \
|
||||
o.oprkind = 'l' AND \
|
||||
o.oprright = t1.oid \
|
||||
ORDER BY left_unary, return_type, operand;",
|
||||
false, false, 0);
|
||||
SendQuery(&success, pset, "\
|
||||
SELECT o.oprname AS right_unary, \
|
||||
t0.typname AS return_type, \
|
||||
t1.typname AS operand, \
|
||||
obj_description(p.oid) as description \
|
||||
FROM pg_operator o, pg_proc p, pg_type t0, pg_type t1 \
|
||||
WHERE RegprocToOid(o.oprcode) = p.oid AND \
|
||||
o.oprresult = t0.oid AND \
|
||||
o.oprkind = 'r' AND \
|
||||
o.oprleft = t1.oid \
|
||||
ORDER BY right_unary, return_type, operand;",
|
||||
false, false, 0);
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT o.oprname AS op, ");
|
||||
strcat(descbuf, " t1.typname AS left_arg, ");
|
||||
strcat(descbuf, " t2.typname AS right_arg, ");
|
||||
strcat(descbuf, " t0.typname AS result, ");
|
||||
if (screen_size.ws_col <= 80)
|
||||
strcat(descbuf, " substr(obj_description(p.oid),1,41) as description ");
|
||||
else
|
||||
strcat(descbuf, " obj_description(p.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_proc p, pg_type t0, ");
|
||||
strcat(descbuf, " pg_type t1, pg_type t2, ");
|
||||
strcat(descbuf, " pg_operator o ");
|
||||
strcat(descbuf, "WHERE p.prorettype = t0.oid AND ");
|
||||
strcat(descbuf, " RegprocToOid(o.oprcode) = p.oid AND ");
|
||||
strcat(descbuf, " p.pronargs = 2 AND ");
|
||||
strcat(descbuf, " o.oprleft = t1.oid AND ");
|
||||
strcat(descbuf, " o.oprright = t2.oid ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND o.oprname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "UNION ");
|
||||
strcat(descbuf, "SELECT o.oprname as op, ");
|
||||
strcat(descbuf, " ''::name AS left_arg, ");
|
||||
strcat(descbuf, " t1.typname AS right_arg, ");
|
||||
strcat(descbuf, " t0.typname AS result, ");
|
||||
if (screen_size.ws_col <= 80)
|
||||
strcat(descbuf, " substr(obj_description(p.oid),1,41) as description ");
|
||||
else
|
||||
strcat(descbuf, " obj_description(p.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_operator o, pg_proc p, pg_type t0, pg_type t1 ");
|
||||
strcat(descbuf, "WHERE RegprocToOid(o.oprcode) = p.oid AND ");
|
||||
strcat(descbuf, " o.oprresult = t0.oid AND ");
|
||||
strcat(descbuf, " o.oprkind = 'l' AND ");
|
||||
strcat(descbuf, " o.oprright = t1.oid ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND o.oprname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "UNION ");
|
||||
strcat(descbuf, "SELECT o.oprname as op, ");
|
||||
strcat(descbuf, " t1.typname AS left_arg, ");
|
||||
strcat(descbuf, " ''::name AS right_arg, ");
|
||||
strcat(descbuf, " t0.typname AS result, ");
|
||||
if (screen_size.ws_col <= 80)
|
||||
strcat(descbuf, " substr(obj_description(p.oid),1,41) as description ");
|
||||
else
|
||||
strcat(descbuf, " obj_description(p.oid) as description ");
|
||||
strcat(descbuf, "FROM pg_operator o, pg_proc p, pg_type t0, pg_type t1 ");
|
||||
strcat(descbuf, "WHERE RegprocToOid(o.oprcode) = p.oid AND ");
|
||||
strcat(descbuf, " o.oprresult = t0.oid AND ");
|
||||
strcat(descbuf, " o.oprkind = 'r' AND ");
|
||||
strcat(descbuf, " o.oprleft = t1.oid ");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND o.oprname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
strcat(descbuf, "ORDER BY op, left_arg, right_arg, result;");
|
||||
SendQuery(&success, pset, descbuf, false, false, NULL);
|
||||
}
|
||||
else if (strncmp(cmd, "ds", 2) == 0)
|
||||
/* only sequences */
|
||||
@ -1928,15 +1960,25 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
/* only tables */
|
||||
tableList(pset, false, 't', false);
|
||||
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);
|
||||
{
|
||||
char descbuf[4096];
|
||||
|
||||
/* types */
|
||||
descbuf[0] = '\0';
|
||||
strcat(descbuf, "SELECT typname AS type, ");
|
||||
strcat(descbuf, " obj_description(oid) as description ");
|
||||
strcat(descbuf, "FROM pg_type ");
|
||||
strcat(descbuf, "WHERE typrelid = 0 AND ");
|
||||
strcat(descbuf, " typname !~ '^_.*' ");
|
||||
strcat(descbuf, "ORDER BY type;");
|
||||
if (optarg2)
|
||||
{
|
||||
strcat(descbuf, "AND typname ~ '^");
|
||||
strcat(descbuf, optarg2);
|
||||
strcat(descbuf, "' ");
|
||||
}
|
||||
SendQuery(&success, pset, descbuf, false, false, NULL);
|
||||
}
|
||||
else if (!optarg)
|
||||
/* show tables, sequences and indices */
|
||||
tableList(pset, false, 'b', false);
|
||||
@ -1950,13 +1992,14 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
tableDesc(pset, optarg, NULL);
|
||||
else
|
||||
slashUsage(pset);
|
||||
|
||||
break;
|
||||
|
||||
case 'e': /* edit */
|
||||
{
|
||||
do_edit(optarg, query, &status);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'E':
|
||||
{
|
||||
FILE *fd;
|
||||
@ -1999,6 +2042,7 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
fclose(fd);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'f':
|
||||
{
|
||||
char *fs = DEFAULT_FIELD_SEP;
|
||||
@ -2036,11 +2080,13 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
}
|
||||
status = CMD_SEND;
|
||||
break;
|
||||
|
||||
case 'h': /* help */
|
||||
{
|
||||
do_help(pset, optarg);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'i': /* \i is include file */
|
||||
{
|
||||
FILE *fd;
|
||||
@ -2059,16 +2105,20 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
fclose(fd);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'l': /* \l is list database */
|
||||
listAllDbs(pset);
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
if (toggle(pset, &pset->opt.html3, "HTML3.0 tabular output"))
|
||||
pset->opt.standard = 0;
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
setFout(pset, optarg);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
if (query)
|
||||
{
|
||||
@ -2076,14 +2126,17 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
fputc('\n', stdout);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'q': /* \q is quit */
|
||||
status = CMD_TERMINATE;
|
||||
break;
|
||||
|
||||
case 'r': /* reset(clear) the buffer */
|
||||
query[0] = '\0';
|
||||
if (!pset->quiet)
|
||||
printf("buffer reset(cleared)\n");
|
||||
break;
|
||||
|
||||
case 's': /* \s is save history to a file */
|
||||
if (!optarg)
|
||||
optarg = "/dev/tty";
|
||||
@ -2092,6 +2145,7 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
fprintf(stderr, "cannot write history to %s\n", optarg);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'm': /* monitor like type-setting */
|
||||
if (toggle(pset, &pset->opt.standard, "standard SQL separaters and padding"))
|
||||
{
|
||||
@ -2112,12 +2166,15 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
printf("field separator changed to '%s'\n", pset->opt.fieldSep);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'z': /* list table rights (grant/revoke) */
|
||||
rightsList(pset);
|
||||
break;
|
||||
|
||||
case 't': /* toggle headers */
|
||||
toggle(pset, &pset->opt.header, "output headings and row count");
|
||||
break;
|
||||
|
||||
case 'T': /* define html <table ...> option */
|
||||
if (pset->opt.tableOpt)
|
||||
free(pset->opt.tableOpt);
|
||||
@ -2129,20 +2186,23 @@ HandleSlashCmds(PsqlSettings *pset,
|
||||
exit(CMD_TERMINATE);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
toggle(pset, &pset->opt.expanded, "expanded table representation");
|
||||
break;
|
||||
|
||||
case '!':
|
||||
do_shell(optarg);
|
||||
break;
|
||||
default:
|
||||
|
||||
case '?': /* \? is help */
|
||||
slashUsage(pset);
|
||||
break;
|
||||
}
|
||||
free(cmd);
|
||||
return status;
|
||||
} /* HandleSlashCmds() */
|
||||
}
|
||||
|
||||
/* MainLoop()
|
||||
* Main processing loop for reading lines of input
|
||||
@ -2311,7 +2371,7 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
|
||||
if (pset->singleLineMode)
|
||||
{
|
||||
SendQuery(&success, pset, line, false, false, 0);
|
||||
SendQuery(&success, pset, line, false, false, NULL);
|
||||
successResult &= success;
|
||||
querySent = true;
|
||||
}
|
||||
@ -2319,12 +2379,12 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
int mblen = 1;
|
||||
#endif
|
||||
|
||||
was_bslash = false;
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
for (i = 0; i < len; mblen=PQmblen(line+i), i+=mblen)
|
||||
#else
|
||||
for (i = 0; i < len; i++)
|
||||
@ -2362,7 +2422,7 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
|
||||
if (was_bslash)
|
||||
was_bslash = false;
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
else if (i > 0 && line[i - mblen] == '\\')
|
||||
#else
|
||||
else if (i > 0 && line[i - 1] == '\\')
|
||||
@ -2375,14 +2435,14 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
else if (xcomment != NULL) /* inside an extended
|
||||
* comment? */
|
||||
{
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
if (line[i] == '*' && line[i + mblen] == '/')
|
||||
#else
|
||||
if (line[i] == '*' && line[i + 1] == '/')
|
||||
#endif
|
||||
{
|
||||
xcomment = NULL;
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
i += mblen;
|
||||
#else
|
||||
i++;
|
||||
@ -2390,21 +2450,21 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
}
|
||||
}
|
||||
/* possible backslash command? */
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
else if (line[i] == '/' && line[i + mblen] == '*')
|
||||
#else
|
||||
else if (line[i] == '/' && line[i + 1] == '*')
|
||||
#endif
|
||||
{
|
||||
xcomment = line + i;
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
i += mblen;
|
||||
#else
|
||||
i++;
|
||||
#endif
|
||||
}
|
||||
/* single-line comment? truncate line */
|
||||
#ifdef MB
|
||||
#ifdef MULTIBYTE
|
||||
else if ((line[i] == '-' && line[i + mblen] == '-') ||
|
||||
(line[i] == '/' && line[i + mblen] == '/'))
|
||||
#else
|
||||
@ -2436,7 +2496,7 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
else
|
||||
strcpy(query, query_start);
|
||||
}
|
||||
SendQuery(&success, pset, query, false, false, 0);
|
||||
SendQuery(&success, pset, query, false, false, NULL);
|
||||
successResult &= success;
|
||||
line[i + 1] = hold_char;
|
||||
query_start = line + i + 1;
|
||||
@ -2509,7 +2569,7 @@ MainLoop(PsqlSettings *pset, char *query, FILE *source)
|
||||
/* had a backslash-g? force the query to be sent */
|
||||
if (slashCmdStatus == CMD_SEND)
|
||||
{
|
||||
SendQuery(&success, pset, query, false, false, 0);
|
||||
SendQuery(&success, pset, query, false, false, NULL);
|
||||
successResult &= success;
|
||||
xcomment = NULL;
|
||||
in_quote = false;
|
||||
@ -2745,7 +2805,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
bool success;/* The query succeeded at the backend */
|
||||
|
||||
SendQuery(&success, &settings, singleQuery, false, false, 0);
|
||||
SendQuery(&success, &settings, singleQuery, false, false, NULL);
|
||||
successResult = success;
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user