Add tablespace location display for psql \d.
authorBruce Momjian
Mon, 12 Jul 2004 20:41:13 +0000 (20:41 +0000)
committerBruce Momjian
Mon, 12 Jul 2004 20:41:13 +0000 (20:41 +0000)
Gavin Sherry

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/common.h
src/bin/psql/describe.c
src/bin/psql/large_obj.c

index 17ce7a2f39179fbf35746386fd1dc433e0f61dd7..44b4a91f68fb5d4bf5388e1072f322ea8a424c4f 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -784,7 +784,7 @@ testdb=>
         
         For each relation (table, view, index, or sequence) matching the
         pattern, show all
-        columns, their types, and any special
+        columns, their types, the tablespace (if not the default) and any special
         attributes such as NOT NULL or defaults, if
         any. Associated indexes, constraints, rules, and triggers are
         also shown, as is the view definition if the relation is a view.
index 35d67828015810de1dfaf0e2d89f652bebc21fec..64988142c89e9183aaa34d4363ca7e5ad8dc51a5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/common.h,v 1.37 2004/07/11 13:29:15 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/common.h,v 1.38 2004/07/12 20:41:13 momjian Exp $
  */
 #ifndef COMMON_H
 #define COMMON_H
@@ -20,6 +20,9 @@
 #define psql_assert(p)
 #endif
 
+#define atooid(x)  ((Oid) strtoul((x), NULL, 10))
+
+
 /*
  * Safer versions of some standard C library functions. If an
  * out-of-memory condition occurs, these functions will bail out
index 0f75d97d23da15698d051d1e87a20ad9cce4ee54..29217896368cc7a717f8df0a423d1667f532716d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.99 2004/06/18 06:14:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.100 2004/07/12 20:41:13 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -39,6 +39,9 @@ static void processNamePattern(PQExpBuffer buf, const char *pattern,
                   const char *schemavar, const char *namevar,
                   const char *altnamevar, const char *visibilityrule);
 
+static void add_tablespace_footer(char relkind, Oid tablespace, 
+       char **footers, int *count, PQExpBufferData buf);
+
 /*----------------
  * Handlers for various slash commands displaying some sort of list
  * of things in the database.
@@ -682,6 +685,7 @@ describeOneTableDetails(const char *schemaname,
        bool        hasindex;
        bool        hasrules;
        bool        hasoids;
+       Oid         tablespace;
    }           tableinfo;
    bool        show_modifiers = false;
    bool        retval;
@@ -694,7 +698,8 @@ describeOneTableDetails(const char *schemaname,
 
    /* Get general table info */
    printfPQExpBuffer(&buf,
-    "SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules, relhasoids\n"
+    "SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules, \n" 
+                   "relhasoids, reltablespace \n"
                      "FROM pg_catalog.pg_class WHERE oid = '%s'",
                      oid);
    res = PSQLexec(buf.data, false);
@@ -717,6 +722,7 @@ describeOneTableDetails(const char *schemaname,
    tableinfo.hasindex = strcmp(PQgetvalue(res, 0, 0), "t") == 0;
    tableinfo.hasrules = strcmp(PQgetvalue(res, 0, 4), "t") == 0;
    tableinfo.hasoids = strcmp(PQgetvalue(res, 0, 5), "t") == 0;
+   tableinfo.tablespace = atooid(PQgetvalue(res, 0, 6));
    PQclear(res);
 
    headers[0] = _("Column");
@@ -897,6 +903,7 @@ describeOneTableDetails(const char *schemaname,
            char       *indamname = PQgetvalue(result, 0, 3);
            char       *indtable = PQgetvalue(result, 0, 4);
            char       *indpred = PQgetvalue(result, 0, 5);
+           int         count_footers = 0;
 
            if (strcmp(indisprimary, "t") == 0)
                printfPQExpBuffer(&tmpbuf, _("PRIMARY KEY, "));
@@ -916,9 +923,12 @@ describeOneTableDetails(const char *schemaname,
            if (strcmp(indisclustered, "t") == 0)
                appendPQExpBuffer(&tmpbuf, _(", CLUSTER"));
 
-           footers = pg_malloc_zero(2 * sizeof(*footers));
-           footers[0] = pg_strdup(tmpbuf.data);
-           footers[1] = NULL;
+           footers = pg_malloc_zero(4 * sizeof(*footers));
+           footers[count_footers++] = pg_strdup(tmpbuf.data);
+           add_tablespace_footer(tableinfo.relkind, tableinfo.tablespace,
+               footers, &count_footers, tmpbuf);
+           footers[count_footers] = NULL;
+
        }
 
        PQclear(result);
@@ -1103,7 +1113,7 @@ describeOneTableDetails(const char *schemaname,
        else
            inherits_count = PQntuples(result6);
 
-       footers = pg_malloc_zero((index_count + check_count + rule_count + trigger_count + foreignkey_count + inherits_count + 6)
+       footers = pg_malloc_zero((index_count + check_count + rule_count + trigger_count + foreignkey_count + inherits_count + 7 + 1)
                                 * sizeof(*footers));
 
        /* print indexes */
@@ -1236,6 +1246,8 @@ describeOneTableDetails(const char *schemaname,
            footers[count_footers++] = pg_strdup(buf.data);
        }
 
+       add_tablespace_footer(tableinfo.relkind, tableinfo.tablespace,
+           footers, &count_footers, buf);
        /* end of list marker */
        footers[count_footers] = NULL;
 
@@ -1287,6 +1299,40 @@ error_return:
 }
 
 
+static void
+add_tablespace_footer(char relkind, Oid tablespace, char **footers, 
+       int *count, PQExpBufferData buf)
+{
+   /* relkinds for which we support tablespaces */
+   if(relkind == 'r' || relkind == 'i')
+   {
+       /*
+        * We ignore the database default tablespace so that users not
+        * using tablespaces don't need to know about them.
+        */
+       if(tablespace != 0)
+       {
+           PGresult   *result1 = NULL;
+           printfPQExpBuffer(&buf, "SELECT spcname FROM pg_tablespace \n"
+               "WHERE oid = '%u';", tablespace);
+           result1 = PSQLexec(buf.data, false);
+           if (!result1)
+               return;
+           /* Should always be the case, but.... */
+           if(PQntuples(result1) > 0)
+           {
+               printfPQExpBuffer(&buf, _("Tablespace:"));
+               footers[(*count)++] = pg_strdup(buf.data);
+               printfPQExpBuffer(&buf, _("    \"%s\""),
+                                     PQgetvalue(result1, 0, 0));
+   
+               footers[(*count)++] = pg_strdup(buf.data);
+           }
+           PQclear(result1);
+       }
+   }
+}
+
 /*
  * \du
  *
index 18ad2f11482d1e68266d96e7e3faecc49a41e24e..78021eca798d8a24cd1b5303558820e716bc31eb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.31 2003/11/29 19:52:06 pgsql Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.32 2004/07/12 20:41:13 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "large_obj.h"
@@ -16,9 +16,6 @@
 #include "print.h"
 
 
-#define atooid(x)  ((Oid) strtoul((x), NULL, 10))
-
-
 /*
  * Prepare to do a large-object operation. We *must* be inside a transaction
  * block for all these operations, so start one if needed.