From cbf4c9671ed01c769c6d6abb29fe082437373c33 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 26 Feb 2000 18:31:25 +0000 Subject: [PATCH] psql's \d command wasn't doing the right things with 'char' (type 18) fields, nor with bpchar and varchar fields that have typmod -1. The latter effectively have an unspecified length, so I made them display as char() and varchar() rather than falsely equating them to char(1) and varchar(1). --- src/bin/psql/describe.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 0282906064..631a04b336 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.17 2000/02/16 13:15:26 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.18 2000/02/26 18:31:25 tgl Exp $ */ #include "postgres.h" #include "describe.h" @@ -631,9 +631,7 @@ describeTableDetails(const char *name, bool desc) attype++; } /* (convert some internal type names to SQL'ish) */ - if (strcmp(attype, "bpchar")==0) - typename = "char"; - else if (strcmp(attype, "int2")==0) + if (strcmp(attype, "int2")==0) typename = "smallint"; else if (strcmp(attype, "int4")==0) typename = "integer"; @@ -646,13 +644,26 @@ describeTableDetails(const char *name, bool desc) /* more might need to be added when date/time types are sorted out */ cells[i * cols + 1] = xmalloc(NAMEDATALEN + 16); - if (strcmp(typename, "char") == 0) - sprintf(cells[i * cols + 1], "char(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 1); + if (strcmp(typename, "bpchar") == 0) + { + if (attypmod != -1) + sprintf(cells[i * cols + 1], "char(%d)", attypmod - VARHDRSZ); + else + sprintf(cells[i * cols + 1], "char()"); + } else if (strcmp(typename, "varchar") == 0) - sprintf(cells[i * cols + 1], "varchar(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 1); + { + if (attypmod != -1) + sprintf(cells[i * cols + 1], "varchar(%d)", attypmod - VARHDRSZ); + else + sprintf(cells[i * cols + 1], "varchar()"); + } else if (strcmp(typename, "numeric") == 0) - sprintf(cells[i * cols + 1], "numeric(%d,%d)", ((attypmod - VARHDRSZ) >> 16) & 0xffff, + { + sprintf(cells[i * cols + 1], "numeric(%d,%d)", + ((attypmod - VARHDRSZ) >> 16) & 0xffff, (attypmod - VARHDRSZ) & 0xffff); + } else strcpy(cells[i * cols + 1], typename);