OSDN Git Service

Simplify a couple of pg_dump and psql \d queries about index constraints
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 11 Mar 2010 04:36:43 +0000 (04:36 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 11 Mar 2010 04:36:43 +0000 (04:36 +0000)
by joining to pg_constraint.conindid, instead of the former technique of
joining indirectly through pg_depend.  This is much more straightforward
and probably faster as well.  I had originally desisted from changing these
queries when conindid was added because I was worried about losing
performance, but if we join on conrelid as well as conindid then the index
on conrelid can be used when pg_constraint is large.

src/bin/pg_dump/pg_dump.c
src/bin/psql/describe.c

index 18dd71e..52ba1c9 100644 (file)
@@ -25,7 +25,7 @@
  *     http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.577 2010/03/03 23:38:44 momjian Exp $
+ *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.578 2010/03/11 04:36:43 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3956,6 +3956,11 @@ getIndexes(TableInfo tblinfo[], int numTables)
                 * that is related by an internal dependency link to the index. If we
                 * find one, create a CONSTRAINT entry linked to the INDEX entry.  We
                 * assume an index won't have more than one internal dependency.
+                *
+                * As of 9.0 we don't need to look at pg_depend but can check for
+                * a match to pg_constraint.conindid.  The check on conrelid is
+                * redundant but useful because that column is indexed while conindid
+                * is not.
                 */
                resetPQExpBuffer(query);
                if (g_fout->remoteVersion >= 90000)
@@ -3975,13 +3980,10 @@ getIndexes(TableInfo tblinfo[], int numTables)
                                                        "array_to_string(t.reloptions, ', ') AS options "
                                                          "FROM pg_catalog.pg_index i "
                                          "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) "
-                                                         "LEFT JOIN pg_catalog.pg_depend d "
-                                                         "ON (d.classid = t.tableoid "
-                                                         "AND d.objid = t.oid "
-                                                         "AND d.deptype = 'i') "
                                                          "LEFT JOIN pg_catalog.pg_constraint c "
-                                                         "ON (d.refclassid = c.tableoid "
-                                                         "AND d.refobjid = c.oid) "
+                                                         "ON (i.indrelid = c.conrelid AND "
+                                                         "i.indexrelid = c.conindid AND "
+                                                         "c.contype IN ('p','u','x')) "
                                                          "WHERE i.indrelid = '%u'::pg_catalog.oid "
                                                          "ORDER BY indexname",
                                                          tbinfo->dobj.catId.oid);
index a6fa883..d1610e2 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Copyright (c) 2000-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.239 2010/03/01 20:55:45 heikki Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.240 2010/03/11 04:36:43 tgl Exp $
  */
 #include "postgres_fe.h"
 
@@ -1417,21 +1417,17 @@ describeOneTableDetails(const char *schemaname,
                if (pset.sversion >= 90000)
                        appendPQExpBuffer(&buf,
                                                          "  (NOT i.indimmediate) AND "
-                                                         "EXISTS (SELECT 1 FROM pg_catalog.pg_depend d, "
-                                                         "pg_catalog.pg_constraint con WHERE "
-                               "d.classid = 'pg_catalog.pg_class'::pg_catalog.regclass AND "
-                                                         "d.objid = i.indexrelid AND "
-                                                         "d.refclassid = 'pg_catalog.pg_constraint'::pg_catalog.regclass AND "
-                                                         "d.refobjid = con.oid AND d.deptype = 'i' AND "
-                                                         "con.condeferrable) AS condeferrable,\n"
+                                                         "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+                                                         "WHERE conrelid = i.indrelid AND "
+                                                         "conindid = i.indexrelid AND "
+                                                         "contype IN ('p','u','x') AND "
+                                                         "condeferrable) AS condeferrable,\n"
                                                          "  (NOT i.indimmediate) AND "
-                                                         "EXISTS (SELECT 1 FROM pg_catalog.pg_depend d, "
-                                                         "pg_catalog.pg_constraint con WHERE "
-                               "d.classid = 'pg_catalog.pg_class'::pg_catalog.regclass AND "
-                                                         "d.objid = i.indexrelid AND "
-                                                         "d.refclassid = 'pg_catalog.pg_constraint'::pg_catalog.regclass AND "
-                                                         "d.refobjid = con.oid AND d.deptype = 'i' AND "
-                                                         "con.condeferred) AS condeferred,\n");
+                                                         "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+                                                         "WHERE conrelid = i.indrelid AND "
+                                                         "conindid = i.indexrelid AND "
+                                                         "contype IN ('p','u','x') AND "
+                                                         "condeferred) AS condeferred,\n");
                else
                        appendPQExpBuffer(&buf,
                                                "  false AS condeferrable, false AS condeferred,\n");
@@ -1553,21 +1549,17 @@ describeOneTableDetails(const char *schemaname,
                        if (pset.sversion >= 90000)
                                appendPQExpBuffer(&buf,
                                                                  ",\n  (NOT i.indimmediate) AND "
-                                                        "EXISTS (SELECT 1 FROM pg_catalog.pg_depend d, "
-                                                                 "pg_catalog.pg_constraint con WHERE "
-                               "d.classid = 'pg_catalog.pg_class'::pg_catalog.regclass AND "
-                                                                 "d.objid = i.indexrelid AND "
-                                                                 "d.refclassid = 'pg_catalog.pg_constraint'::pg_catalog.regclass AND "
-                                                         "d.refobjid = con.oid AND d.deptype = 'i' AND "
-                                                                 "con.condeferrable) AS condeferrable"
+                                                                 "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+                                                                 "WHERE conrelid = i.indrelid AND "
+                                                                 "conindid = i.indexrelid AND "
+                                                                 "contype IN ('p','u','x') AND "
+                                                                 "condeferrable) AS condeferrable"
                                                                  ",\n  (NOT i.indimmediate) AND "
-                                                        "EXISTS (SELECT 1 FROM pg_catalog.pg_depend d, "
-                                                                 "pg_catalog.pg_constraint con WHERE "
-                               "d.classid = 'pg_catalog.pg_class'::pg_catalog.regclass AND "
-                                                                 "d.objid = i.indexrelid AND "
-                                                                 "d.refclassid = 'pg_catalog.pg_constraint'::pg_catalog.regclass AND "
-                                                         "d.refobjid = con.oid AND d.deptype = 'i' AND "
-                                                                 "con.condeferred) AS condeferred");
+                                                                 "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+                                                                 "WHERE conrelid = i.indrelid AND "
+                                                                 "conindid = i.indexrelid AND "
+                                                                 "contype IN ('p','u','x') AND "
+                                                                 "condeferred) AS condeferred");
                        else
                                appendPQExpBuffer(&buf, ", false AS condeferrable, false AS condeferred");
                        if (pset.sversion >= 80000)