aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-03-11 04:36:43 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2010-03-11 04:36:43 +0000
commite6555b436e44fc43f14b3d8c1f782fbd3924485d (patch)
treed25247408f1af6952d2ee97ba38cbe1ad710839a /src
parent4df5c6c7195cf9382d249d6371d2c8e02d46a7ae (diff)
downloadpostgresql-e6555b436e44fc43f14b3d8c1f782fbd3924485d.tar.gz
postgresql-e6555b436e44fc43f14b3d8c1f782fbd3924485d.zip
Simplify a couple of pg_dump and psql \d queries about index constraints
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.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dump.c16
-rw-r--r--src/bin/psql/describe.c50
2 files changed, 30 insertions, 36 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 18dd71e364f..52ba1c9d704 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -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);
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index a6fa883c47b..d1610e21393 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -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)