Move fixes for >8 indexed fields.
authorBruce Momjian
Mon, 10 Jan 2000 05:20:26 +0000 (05:20 +0000)
committerBruce Momjian
Mon, 10 Jan 2000 05:20:26 +0000 (05:20 +0000)
src/backend/parser/analyze.c
src/backend/utils/adt/int.c
src/bin/psql/describe.c
src/include/config.h.in
src/include/postgres.h

index afcbcce3ed919fd5f8c9e61e24d78925997edc49..2ac263fb2679bc2eb5c3604703f5f869751c46a5 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: analyze.c,v 1.127 2000/01/06 20:46:49 wieck Exp $
+ * $Id: analyze.c,v 1.128 2000/01/10 05:20:21 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -674,7 +674,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
 
                        fkconstraint = (FkConstraint *)constraint;
                        fkconstraint->fk_attrs = lappend(NIL, id);
-                       
+
                        fkconstraints = lappend(fkconstraints, constraint);
                        continue;
                    }
@@ -960,7 +960,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
             */
            if (fkconstraint->fk_attrs != NIL && fkconstraint->pk_attrs == NIL)
                transformFkeyGetPrimaryKey(fkconstraint);
-           
+
            /*
             * Build a CREATE CONSTRAINT TRIGGER statement for the CHECK
             * action.
@@ -1016,7 +1016,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
            extras_after = lappend(extras_after, (Node *)fk_trigger);
 
            /*
-            * Build a CREATE CONSTRAINT TRIGGER statement for the 
+            * Build a CREATE CONSTRAINT TRIGGER statement for the
             * ON DELETE action fired on the PK table !!!
             *
             */
@@ -1084,7 +1084,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
            extras_after = lappend(extras_after, (Node *)fk_trigger);
 
            /*
-            * Build a CREATE CONSTRAINT TRIGGER statement for the 
+            * Build a CREATE CONSTRAINT TRIGGER statement for the
             * ON UPDATE action fired on the PK table !!!
             *
             */
@@ -1679,7 +1679,7 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
     * using the attribute names of the PK relation descriptor
     * ----------
     */
-   for (i = 0; i < 8 && indexStruct->indkey[i] != 0; i++)
+   for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++)
    {
        pkattno = indexStruct->indkey[i];
        pkattr = (Ident *)makeNode(Ident);
index 3d37054d7ccf470d4f5daba8b3448bd414acc8e4..041ac3d2ec8f8b54450fdc98ca0ac3c2f4cb0253 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.27 1999/07/17 20:17:56 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.28 2000/01/10 05:20:23 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -76,29 +76,26 @@ int2out(int16 sh)
  *             Fills any nonexistent digits with NULLs.
  */
 int16 *
-int28in(char *shs)
+int28in(char *intString)
 {
    int16      *result;
-   int         nums;
+   int         slot;
 
-   if (shs == NULL)
+   if (intString == NULL)
        return NULL;
 
-   result = (int16 *) palloc(sizeof(int16[8]));
-   if ((nums = sscanf(shs, "%hd%hd%hd%hd%hd%hd%hd%hd",
-                      &result[0],
-                      &result[1],
-                      &result[2],
-                      &result[3],
-                      &result[4],
-                      &result[5],
-                      &result[6],
-                      &result[7])) != 8)
+   result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));
+
+   for (slot=0; *intString && slot < INDEX_MAX_KEYS; slot++)
    {
-       do
-           result[nums++] = 0;
-       while (nums < 8);
+       if (sscanf(intString, "%hd", &result[slot]) != 1)
+           break;
+       while (*intString && *intString != ' ')
+           intString++;
    }
+   while (slot < INDEX_MAX_KEYS)
+       result[slot++] = 0;
+
    return result;
 }
 
@@ -120,10 +117,10 @@ int28out(int16 *shs)
        result[1] = '\0';
        return result;
    }
-   rp = result = (char *) palloc(8 * 7);       /* assumes sign, 5 digits,
-                                                * ' ' */
+   rp = result = (char *) palloc(INDEX_MAX_KEYS * 7);
+                           /* assumes sign, 5 digits, ' ' */
    sp = shs;
-   for (num = 8; num != 0; num--)
+   for (num = INDEX_MAX_KEYS; num != 0; num--)
    {
        itoa(*sp++, rp);
        while (*++rp != '\0')
index 56e425d2656b6c6a854c395f3236a4ab19d03af1..1b6314fdc55e31b4dddda49dbff9300ffa4a8047 100644 (file)
@@ -47,15 +47,15 @@ describeAggregates(const char *name, PsqlSettings *pset, bool verbose, bool desc
    strcpy(buf,
           "SELECT a.aggname AS \"Name\", t.typname AS \"Type\"");
     if (verbose)
-        strcat(buf, " ,u.usename as \"Owner\"");
+   strcat(buf, " ,u.usename as \"Owner\"");
    if (desc)
        strcat(buf, ",\n       obj_description(a.oid) as \"Description\"");
    strcat(buf, !verbose ?
           ("\nFROM pg_aggregate a, pg_type t\n"
-            "WHERE a.aggbasetype = t.oid\n") :
+       "WHERE a.aggbasetype = t.oid\n") :
           ("\nFROM pg_aggregate a, pg_type t, pg_user u\n"
-            "WHERE a.aggbasetype = t.oid AND a.aggowner = u.usesysid\n")
-        );
+       "WHERE a.aggbasetype = t.oid AND a.aggowner = u.usesysid\n")
+   );
 
    if (name)
    {
@@ -68,16 +68,16 @@ describeAggregates(const char *name, PsqlSettings *pset, bool verbose, bool desc
           "UNION\n"
           "SELECT a.aggname AS \"Name\", '(all types)' as \"Type\"");
     if (verbose)
-        strcat(buf, " ,u.usename as \"Owner\"");
+   strcat(buf, " ,u.usename as \"Owner\"");
    if (desc)
        strcat(buf,
               ",\n       obj_description(a.oid) as \"Description\"");
    strcat(buf, !verbose ?
           ("\nFROM pg_aggregate a\n"
-            "WHERE a.aggbasetype = 0\n") :
+       "WHERE a.aggbasetype = 0\n") :
           ("\nFROM pg_aggregate a, pg_user u\n"
-            "WHERE a.aggbasetype = 0 AND a.aggowner = u.usesysid\n")
-        );
+       "WHERE a.aggbasetype = 0 AND a.aggowner = u.usesysid\n")
+   );
    if (name)
    {
        strcat(buf, "  AND a.aggname ~* '");
@@ -117,22 +117,22 @@ describeFunctions(const char *name, PsqlSettings *pset, bool verbose, bool desc)
     * arguments, but have no types defined for those arguments
     */
    strcpy(buf,
-           "SELECT t.typname as \"Result\", p.proname as \"Function\",\n"
+      "SELECT t.typname as \"Result\", p.proname as \"Function\",\n"
           "       oid8types(p.proargtypes) as \"Arguments\"");
     if (verbose)
-        strcat(buf, ",\n       u.usename as \"Owner\", l.lanname as \"Language\", p.prosrc as \"Source\"");
+   strcat(buf, ",\n       u.usename as \"Owner\", l.lanname as \"Language\", p.prosrc as \"Source\"");
    if (desc)
        strcat(buf, ",\n       obj_description(p.oid) as \"Description\"");
 
     if (!verbose)
-        strcat(buf,
-               "\nFROM pg_proc p, pg_type t\n"
-               "WHERE p.prorettype = t.oid and (pronargs = 0 or oid8types(p.proargtypes) != '')\n");
+   strcat(buf,
+          "\nFROM pg_proc p, pg_type t\n"
+          "WHERE p.prorettype = t.oid and (pronargs = 0 or oid8types(p.proargtypes) != '')\n");
     else
-        strcat(buf,
-               "\nFROM pg_proc p, pg_type t, pg_language l, pg_user u\n"
-               "WHERE p.prorettype = t.oid AND p.prolang = l.oid AND p.proowner = u.usesysid\n"
-               "  AND (pronargs = 0 or oid8types(p.proargtypes) != '')\n");
+   strcat(buf,
+          "\nFROM pg_proc p, pg_type t, pg_language l, pg_user u\n"
+          "WHERE p.prorettype = t.oid AND p.prolang = l.oid AND p.proowner = u.usesysid\n"
+          "  AND (pronargs = 0 or oid8types(p.proargtypes) != '')\n");
 
    if (name)
    {
@@ -171,10 +171,10 @@ describeTypes(const char *name, PsqlSettings *pset, bool verbose, bool desc)
 
    strcpy(buf, "SELECT t.typname AS \"Type\"");
     if (verbose)
-        strcat(buf,
-               ",\n       (CASE WHEN t.typlen=-1 THEN 'var'::text ELSE t.typlen::text END) as \"Length\""
-               ",\n       u.usename as \"Owner\""
-            );
+   strcat(buf,
+          ",\n       (CASE WHEN t.typlen=-1 THEN 'var'::text ELSE t.typlen::text END) as \"Length\""
+          ",\n       u.usename as \"Owner\""
+       );
     /*
     *  Let's always show descriptions for this.  There is room.
     *  bjm 1999/12/31
@@ -185,11 +185,11 @@ describeTypes(const char *name, PsqlSettings *pset, bool verbose, bool desc)
      * do not include user relations (typrelid!=0)
      */
    strcat(buf, !verbose ?
-           ("\nFROM pg_type t\n"
-            "WHERE t.typrelid = 0 AND t.typname !~ '^_.*'\n") :
-           ("\nFROM pg_type t, pg_user u\n"
-            "WHERE t.typrelid = 0 AND t.typname !~ '^_.*' AND t.typowner = u.usesysid\n")
-        );
+      ("\nFROM pg_type t\n"
+       "WHERE t.typrelid = 0 AND t.typname !~ '^_.*'\n") :
+      ("\nFROM pg_type t, pg_user u\n"
+       "WHERE t.typrelid = 0 AND t.typname !~ '^_.*' AND t.typowner = u.usesysid\n")
+   );
 
    if (name)
    {
@@ -230,14 +230,14 @@ describeOperators(const char *name, PsqlSettings *pset, bool verbose, bool desc)
     /* FIXME: Use outer joins here when ready */
 
    strcpy(buf,
-           "SELECT o.oprname AS \"Op\",\n"
+      "SELECT o.oprname AS \"Op\",\n"
           "       t1.typname AS \"Left arg\",\n"
           "       t2.typname AS \"Right arg\",\n"
           "       t0.typname AS \"Result\"");
    if (desc)
        strcat(buf, ",\n       obj_description(p.oid) as \"Description\"");
    strcat(buf,
-           "\nFROM   pg_proc p, pg_type t0,\n"
+      "\nFROM   pg_proc p, pg_type t0,\n"
           "       pg_type t1, pg_type t2,\n"
           "       pg_operator o\n"
           "WHERE  p.prorettype = t0.oid AND\n"
@@ -319,7 +319,7 @@ listAllDbs(PsqlSettings *pset, bool desc)
    printQueryOpt myopt = pset->popt;
 
    strcpy(buf,
-           "SELECT pg_database.datname as \"Database\",\n"
+      "SELECT pg_database.datname as \"Database\",\n"
           "       pg_user.usename as \"Owner\"");
 #ifdef MULTIBYTE
    strcat(buf,
@@ -541,7 +541,7 @@ xmalloc(size_t size)
 bool
 describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 {
-   char        buf[512 + 8 * NAMEDATALEN];
+   char        buf[512 + INDEX_MAX_KEYS * NAMEDATALEN];
    PGresult   *res = NULL;
    printTableOpt myopt = pset->popt.topt;
    int         i;
@@ -557,20 +557,20 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 
     /* truncate table name */
     if (strlen(name) > NAMEDATALEN) {
-        char *my_name = xmalloc(NAMEDATALEN+1);
-        strncpy(my_name, name, NAMEDATALEN);
-        my_name[NAMEDATALEN] = '\0';
-        name = my_name;
+   char *my_name = xmalloc(NAMEDATALEN+1);
+   strncpy(my_name, name, NAMEDATALEN);
+   my_name[NAMEDATALEN] = '\0';
+   name = my_name;
     }
 
    /* Get general table info */
     sprintf(buf,
-            "SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules\n"
-            "FROM pg_class WHERE relname='%s'",
-            name);
+       "SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules\n"
+       "FROM pg_class WHERE relname='%s'",
+       name);
     res = PSQLexec(pset, buf);
     if (!res)
-        return false;
+   return false;
 
    /* Did we get anything? */
    if (PQntuples(res) == 0)
@@ -596,13 +596,13 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 
     if (tableinfo.relkind == 'r' || tableinfo.relkind == 's')
     {
-        cols++;
-        headers[cols-1] = "Extra";
+   cols++;
+   headers[cols-1] = "Extra";
     }
 
    if (desc)
    {
-        cols++;
+   cols++;
        headers[cols-1] = "Description";
    }
 
@@ -625,19 +625,19 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 
    /* Check if table is a view */
     if (tableinfo.hasrules) {
-        PGresult *result;
-        sprintf(buf, "SELECT definition FROM pg_views WHERE viewname = '%s'", name);
-        result = PSQLexec(pset, buf);
-        if (!result)
-        {
-            PQclear(res);
-            PQclear(result);
-            return false;
-        }
-
-        if (PQntuples(result) > 0)
-            view_def = xstrdup(PQgetvalue(result, 0, 0));
-        PQclear(result);
+   PGresult *result;
+   sprintf(buf, "SELECT definition FROM pg_views WHERE viewname = '%s'", name);
+   result = PSQLexec(pset, buf);
+   if (!result)
+   {
+       PQclear(res);
+       PQclear(result);
+       return false;
+   }
+
+   if (PQntuples(result) > 0)
+       view_def = xstrdup(PQgetvalue(result, 0, 0));
+   PQclear(result);
     }
 
 
@@ -652,9 +652,9 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 
        /* Name */
        cells[i * cols + 0] = (char *)PQgetvalue(res, i, 0);    /* don't free this afterwards */
-       
+
        /* Type */
-        /* (convert some internal type names to "readable") */
+   /* (convert some internal type names to "readable") */
        cells[i * cols + 1] = xmalloc(NAMEDATALEN + 16);
        if (strcmp(attype, "bpchar") == 0)
            sprintf(cells[i * cols + 1], "char(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 0);
@@ -671,38 +671,38 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
 
        /* Extra: not null and default */
        /* (I'm cutting off the 'default' string at 128) */
-        if (tableinfo.relkind == 'r' || tableinfo.relkind == 's')
-        {
-            cells[i * cols + 2] = xmalloc(128 + 128);
-            cells[i * cols + 2][0] = '\0';
-            if (strcmp(PQgetvalue(res, i, 4), "t") == 0)
-                strcat(cells[i * cols + 2], "not null");
-
-            /* handle "default" here */
-            if (strcmp(PQgetvalue(res, i, 5), "t") == 0)
-            {
-                PGresult *result;
-
-                sprintf(buf, "SELECT substring(d.adsrc for 128) FROM pg_attrdef d, pg_class c\n"
-                        "WHERE c.relname = '%s' AND c.oid = d.adrelid AND d.adnum = %s",
-                        name, PQgetvalue(res, i, 6));
-
-                result = PSQLexec(pset, buf);
-                if (!result)
-                    error = true;
-                else
-                {
-                    if (cells[i * cols + 2][0])
-                        strcat(cells[i * cols + 2], " ");
-                    strcat(cells[i * cols + 2], "default ");
-                    strcat(cells[i * cols + 2], PQgetvalue(result, 0, 0));
-                    PQclear(result);
-                }
-            }
-        }
-
-        if (error)
-            break;
+   if (tableinfo.relkind == 'r' || tableinfo.relkind == 's')
+   {
+       cells[i * cols + 2] = xmalloc(128 + 128);
+       cells[i * cols + 2][0] = '\0';
+       if (strcmp(PQgetvalue(res, i, 4), "t") == 0)
+       strcat(cells[i * cols + 2], "not null");
+
+       /* handle "default" here */
+       if (strcmp(PQgetvalue(res, i, 5), "t") == 0)
+       {
+       PGresult *result;
+
+       sprintf(buf, "SELECT substring(d.adsrc for 128) FROM pg_attrdef d, pg_class c\n"
+           "WHERE c.relname = '%s' AND c.oid = d.adrelid AND d.adnum = %s",
+           name, PQgetvalue(res, i, 6));
+
+       result = PSQLexec(pset, buf);
+       if (!result)
+           error = true;
+       else
+       {
+           if (cells[i * cols + 2][0])
+           strcat(cells[i * cols + 2], " ");
+           strcat(cells[i * cols + 2], "default ");
+           strcat(cells[i * cols + 2], PQgetvalue(result, 0, 0));
+           PQclear(result);
+       }
+       }
+   }
+
+   if (error)
+       break;
 
        /* Description */
        if (desc)
@@ -713,50 +713,50 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
    title = xmalloc(20 + strlen(name));
     switch (tableinfo.relkind) {
     case 'r':
-        if (view_def)
-            sprintf(title, "View \"%s\"", name);
-        else
-            sprintf(title, "Table \"%s\"", name);
-        break;
+   if (view_def)
+       sprintf(title, "View \"%s\"", name);
+   else
+       sprintf(title, "Table \"%s\"", name);
+   break;
     case 'S':
-        sprintf(title, "Sequence \"%s\"", name);
-        break;
+   sprintf(title, "Sequence \"%s\"", name);
+   break;
     case 'i':
-        sprintf(title, "Index \"%s\"", name);
-        break;
+   sprintf(title, "Index \"%s\"", name);
+   break;
     case 's':
-        sprintf(title, "System table \"%s\"", name);
-        break;
+   sprintf(title, "System table \"%s\"", name);
+   break;
     default:
-        sprintf(title, "?%c?", tableinfo.relkind);
+   sprintf(title, "?%c?", tableinfo.relkind);
     }
 
    /* Make footers */
     /* Information about the index */
     if (tableinfo.relkind == 'i')
     {
-        PGresult * result;
-
-        sprintf(buf, "SELECT i.indisunique, i.indisprimary, a.amname\n"
-                "FROM pg_index i, pg_class c, pg_am a\n"
-                "WHERE i.indexrelid = c.oid AND c.relname = '%s' AND c.relam = a.oid",
-                name);
-
-        result = PSQLexec(pset, buf);
-        if (!result)
-            error = true;
-        else
-        {
-            footers = xmalloc(2 * sizeof(*footers));
-            footers[0] = xmalloc(NAMEDATALEN + 32);
-            sprintf(footers[0], "%s%s",
-                    strcmp(PQgetvalue(result, 0, 0), "t")==0 ? "unique " : "",
-                    PQgetvalue(result, 0, 2)
-                );
-            if (strcmp(PQgetvalue(result, 0, 1), "t")==0)
-                strcat(footers[0], " (primary key)");
-            footers[1] = NULL;
-        }
+   PGresult * result;
+
+   sprintf(buf, "SELECT i.indisunique, i.indisprimary, a.amname\n"
+       "FROM pg_index i, pg_class c, pg_am a\n"
+       "WHERE i.indexrelid = c.oid AND c.relname = '%s' AND c.relam = a.oid",
+       name);
+
+   result = PSQLexec(pset, buf);
+   if (!result)
+       error = true;
+   else
+   {
+       footers = xmalloc(2 * sizeof(*footers));
+       footers[0] = xmalloc(NAMEDATALEN + 32);
+       sprintf(footers[0], "%s%s",
+           strcmp(PQgetvalue(result, 0, 0), "t")==0 ? "unique " : "",
+           PQgetvalue(result, 0, 2)
+       );
+       if (strcmp(PQgetvalue(result, 0, 1), "t")==0)
+       strcat(footers[0], " (primary key)");
+       footers[1] = NULL;
+   }
     }
     /* Information about the view */
    else if (tableinfo.relkind == 'r' && view_def)
@@ -770,132 +770,132 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
     /* Information about the table */
    else if (tableinfo.relkind == 'r')
    {
-        PGresult *result1=NULL, *result2=NULL, *result3=NULL, *result4=NULL;
-        int index_count=0, constr_count=0, rule_count=0, trigger_count=0;
-        int count_footers=0;
+   PGresult *result1=NULL, *result2=NULL, *result3=NULL, *result4=NULL;
+   int index_count=0, constr_count=0, rule_count=0, trigger_count=0;
+   int count_footers=0;
 
        /* count indices */
-        if (!error && tableinfo.hasindex)
-        {
-            sprintf(buf, "SELECT c2.relname\n"
-                    "FROM pg_class c, pg_class c2, pg_index i\n"
-                    "WHERE c.relname = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
-                    "ORDER BY c2.relname",
-                    name);
-            result1 = PSQLexec(pset, buf);
-            if (!result1)
-                error = true;
-            else
-                index_count = PQntuples(result1);
-        }
-            
-        /* count table (and column) constraints */
-        if (!error && tableinfo.checks)
-        {
-            sprintf(buf, "SELECT rcsrc\n"
-                    "FROM pg_relcheck r, pg_class c\n"
-                    "WHERE c.relname='%s' AND c.oid = r.rcrelid",
-                    name);
-            result2 = PSQLexec(pset, buf);
-            if (!result2)
-                error = true;
-            else
-                constr_count = PQntuples(result2);
-        }
-
-        /* count rules */
-        if (!error && tableinfo.hasrules)
-        {
-            sprintf(buf,
-                    "SELECT r.rulename\n"
-                    "FROM pg_rewrite r, pg_class c\n"
-                    "WHERE c.relname='%s' AND c.oid = r.ev_class",
-                    name);
-            result3 = PSQLexec(pset, buf);
-            if (!result3)
-                error = true;
-            else
-                rule_count = PQntuples(result3);
-        }
-
-        /* count triggers */
-        if (!error && tableinfo.hasrules)
-        {
-            sprintf(buf,
-                    "SELECT t.tgname\n"
-                    "FROM pg_trigger t, pg_class c\n"
-                    "WHERE c.relname='%s' AND c.oid = t.tgrelid",
-                    name);
-            result4 = PSQLexec(pset, buf);
-            if (!result4)
-                error = true;
-            else
-                trigger_count = PQntuples(result4);
-        }
-
-        footers = xmalloc((index_count + constr_count + rule_count + trigger_count + 1) * sizeof(*footers));
-
-        /* print indices */
-        for (i = 0; i < index_count; i++)
-        {
-            sprintf(buf, "%s %s",
-                    index_count==1 ? "Index:" : (i==0 ? "Indices:" : "        "),
-                    PQgetvalue(result1, i, 0)
-                    );
-            if (i < index_count-1)
-                strcat(buf, ",");
-
-            footers[count_footers++] = xstrdup(buf);
+   if (!error && tableinfo.hasindex)
+   {
+       sprintf(buf, "SELECT c2.relname\n"
+           "FROM pg_class c, pg_class c2, pg_index i\n"
+           "WHERE c.relname = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
+           "ORDER BY c2.relname",
+           name);
+       result1 = PSQLexec(pset, buf);
+       if (!result1)
+       error = true;
+       else
+       index_count = PQntuples(result1);
+   }
+
+   /* count table (and column) constraints */
+   if (!error && tableinfo.checks)
+   {
+       sprintf(buf, "SELECT rcsrc\n"
+           "FROM pg_relcheck r, pg_class c\n"
+           "WHERE c.relname='%s' AND c.oid = r.rcrelid",
+           name);
+       result2 = PSQLexec(pset, buf);
+       if (!result2)
+       error = true;
+       else
+       constr_count = PQntuples(result2);
+   }
+
+   /* count rules */
+   if (!error && tableinfo.hasrules)
+   {
+       sprintf(buf,
+           "SELECT r.rulename\n"
+           "FROM pg_rewrite r, pg_class c\n"
+           "WHERE c.relname='%s' AND c.oid = r.ev_class",
+           name);
+       result3 = PSQLexec(pset, buf);
+       if (!result3)
+       error = true;
+       else
+       rule_count = PQntuples(result3);
+   }
+
+   /* count triggers */
+   if (!error && tableinfo.hasrules)
+   {
+       sprintf(buf,
+           "SELECT t.tgname\n"
+           "FROM pg_trigger t, pg_class c\n"
+           "WHERE c.relname='%s' AND c.oid = t.tgrelid",
+           name);
+       result4 = PSQLexec(pset, buf);
+       if (!result4)
+       error = true;
+       else
+       trigger_count = PQntuples(result4);
+   }
+
+   footers = xmalloc((index_count + constr_count + rule_count + trigger_count + 1) * sizeof(*footers));
+
+   /* print indices */
+   for (i = 0; i < index_count; i++)
+   {
+       sprintf(buf, "%s %s",
+           index_count==1 ? "Index:" : (i==0 ? "Indices:" : "        "),
+           PQgetvalue(result1, i, 0)
+           );
+       if (i < index_count-1)
+       strcat(buf, ",");
+
+       footers[count_footers++] = xstrdup(buf);
        }
 
-        /* print contraints */
-        for (i = 0; i < constr_count; i++)
-        {
-            sprintf(buf, "%s %s",
-                    constr_count==1 ? "Constraint:" : (i==0 ? "Constraints:" : "            "),
-                    PQgetvalue(result2, i, 0)
-                    );
-            footers[count_footers++] = xstrdup(buf);
+   /* print contraints */
+   for (i = 0; i < constr_count; i++)
+   {
+       sprintf(buf, "%s %s",
+           constr_count==1 ? "Constraint:" : (i==0 ? "Constraints:" : "            "),
+           PQgetvalue(result2, i, 0)
+           );
+       footers[count_footers++] = xstrdup(buf);
        }
 
-        /* print rules */
-        for (i = 0; i < rule_count; i++)
-        {
-            sprintf(buf, "%s %s",
-                    rule_count==1 ? "Rule:" : (i==0 ? "Rules:" : "      "),
-                    PQgetvalue(result3, i, 0)
-                    );
-            if (i < rule_count-1)
-                strcat(buf, ",");
-
-            footers[count_footers++] = xstrdup(buf);
+   /* print rules */
+   for (i = 0; i < rule_count; i++)
+   {
+       sprintf(buf, "%s %s",
+           rule_count==1 ? "Rule:" : (i==0 ? "Rules:" : "      "),
+           PQgetvalue(result3, i, 0)
+           );
+       if (i < rule_count-1)
+       strcat(buf, ",");
+
+       footers[count_footers++] = xstrdup(buf);
        }
 
-        /* print triggers */
-        for (i = 0; i < trigger_count; i++)
-        {
-            sprintf(buf, "%s %s",
-                    trigger_count==1 ? "Trigger:" : (i==0 ? "Triggers:" : "         "),
-                    PQgetvalue(result4, i, 0)
-                    );
-            if (i < trigger_count-1)
-                strcat(buf, ",");
-
-            footers[count_footers++] = xstrdup(buf);
+   /* print triggers */
+   for (i = 0; i < trigger_count; i++)
+   {
+       sprintf(buf, "%s %s",
+           trigger_count==1 ? "Trigger:" : (i==0 ? "Triggers:" : "         "),
+           PQgetvalue(result4, i, 0)
+           );
+       if (i < trigger_count-1)
+       strcat(buf, ",");
+
+       footers[count_footers++] = xstrdup(buf);
        }
 
-        /* end of list marker */
-        footers[count_footers] = NULL;
+   /* end of list marker */
+   footers[count_footers] = NULL;
 
-        PQclear(result1);
-        PQclear(result2);
-        PQclear(result3);
-        PQclear(result4);
+   PQclear(result1);
+   PQclear(result2);
+   PQclear(result3);
+   PQclear(result4);
    }
 
     if (!error) {
-        myopt.tuples_only = false;
-        printTable(title, headers, (const char**)cells, (const char**)footers, "llll", &myopt, pset->queryFout);
+   myopt.tuples_only = false;
+   printTable(title, headers, (const char**)cells, (const char**)footers, "llll", &myopt, pset->queryFout);
     }
 
    /* clean up */
@@ -904,8 +904,8 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
    for (i = 0; i < PQntuples(res); i++)
    {
        free(cells[i * cols + 1]);
-        if (tableinfo.relkind == 'r' || tableinfo.relkind == 's')
-            free(cells[i * cols + 2]);
+   if (tableinfo.relkind == 'r' || tableinfo.relkind == 's')
+       free(cells[i * cols + 2]);
    }
    free(cells);
 
@@ -994,10 +994,10 @@ listTables(const char *infotype, const char *name, PsqlSettings *pset, bool desc
            strcat(buf, "\nUNION\n\n");
 
        strcat(buf,
-               "SELECT c.relname as \"Name\",\n"
+          "SELECT c.relname as \"Name\",\n"
               "  (CASE WHEN relkind = 'S' THEN 'sequence'::text ELSE 'index'::text END) as \"Type\",\n"
-               "  u.usename as \"Owner\""
-            );
+          "  u.usename as \"Owner\""
+       );
        if (desc)
            strcat(buf, ", obj_description(c.oid) as \"Description\"");
        strcat(buf, "\nFROM pg_class c, pg_user u\n"
index 00713b0b702a1d9557136413efb6fc764a91d97c..c5a55a5fb368cc830f7770d1114bb72f5964d2b1 100644 (file)
  */
 #define INDEXSCAN_PATCH 
 
+/*
+ * Maximum number of columns in an index.
+ */
+#define INDEX_MAX_KEYS     8
+
 /*
  * Enables debugging print statements in the date/time support routines.
  * Particularly useful for porting to a new platform/OS combination.
index 6d9c2bfd81ee915e36896261013e7ef55dee65ae..4c51ceea4227283939c61106784887723007b25e 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1995, Regents of the University of California
  *
- * $Id: postgres.h,v 1.32 2000/01/10 04:36:36 momjian Exp $
+ * $Id: postgres.h,v 1.33 2000/01/10 05:20:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -101,8 +101,6 @@ struct varlena
 typedef struct varlena bytea;
 typedef struct varlena text;
 
-#define INDEX_MAX_KEYS 8       /* maximum number of keys in an index
-                                * definition */
 typedef int2 int28[INDEX_MAX_KEYS];
 typedef Oid oid8[INDEX_MAX_KEYS];