Patch from Kris Jurka to improve the performance of getImportedKeys(). The
authorBarry Lind <barry@xythos.com>
Tue, 14 Jan 2003 05:07:56 +0000 (05:07 +0000)
committerBarry Lind <barry@xythos.com>
Tue, 14 Jan 2003 05:07:56 +0000 (05:07 +0000)
fix uses explicit joins to avoid using the genetic query optimizer for
consistent results.

 Modified Files:
  Tag: REL7_3_STABLE
  jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java

src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java

index 90635e0a6b8aca79a6aa23f83a1ce40d97982dbe..1027d3f28a204af725371fabc1419adff0283a6e 100644 (file)
@@ -2896,62 +2896,6 @@ public abstract class AbstractJdbc1DatabaseMetaData
        return connection.createStatement().executeQuery(sql);
    }
 
-   /*
-    SELECT
-           c.relname as primary,
-           c2.relname as foreign,
-           t.tgconstrname,
-           ic.relname as fkeyname,
-           af.attnum as fkeyseq,
-           ipc.relname as pkeyname,
-           ap.attnum as pkeyseq,
-           t.tgdeferrable,
-           t.tginitdeferred,
-           t.tgnargs,t.tgargs,
-           p1.proname as updaterule,
-           p2.proname as deleterule
-   FROM
-           pg_trigger t,
-           pg_trigger t1,
-           pg_class c,
-           pg_class c2,
-           pg_class ic,
-           pg_class ipc,
-           pg_proc p1,
-           pg_proc p2,
-           pg_index if,
-           pg_index ip,
-           pg_attribute af,
-           pg_attribute ap
-   WHERE
-           (t.tgrelid=c.oid
-           AND t.tgisconstraint
-           AND t.tgconstrrelid=c2.oid
-           AND t.tgfoid=p1.oid
-           and p1.proname like '%%upd')
-
-           and
-           (t1.tgrelid=c.oid
-           and t1.tgisconstraint
-           and t1.tgconstrrelid=c2.oid
-           AND t1.tgfoid=p2.oid
-           and p2.proname like '%%del')
-
-           AND c2.relname='users'
-
-           AND
-           (if.indrelid=c.oid
-           AND if.indexrelid=ic.oid
-           and ic.oid=af.attrelid
-           AND if.indisprimary)
-
-           and
-           (ip.indrelid=c2.oid
-           and ip.indexrelid=ipc.oid
-           and ipc.oid=ap.attrelid
-           and ip.indisprimary)
-
-   */
    /**
     *
     * @param catalog
@@ -2998,55 +2942,68 @@ public abstract class AbstractJdbc1DatabaseMetaData
         */
 
        if (connection.haveMinimumServerVersion("7.3")) {
-           select = "SELECT DISTINCT n.nspname as pnspname,n2.nspname as fnspname, ";
-           from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_namespace n2, pg_catalog.pg_trigger t, pg_catalog.pg_trigger t1, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_class ic, pg_catalog.pg_proc p1, pg_catalog.pg_proc p2, pg_catalog.pg_index i, pg_catalog.pg_attribute a ";
-           where = " AND c.relnamespace = n.oid AND c2.relnamespace=n2.oid ";
+           select = "SELECT n1.nspname as pnspname,n2.nspname as fnspname, ";
+           from = " FROM pg_catalog.pg_namespace n1 "+
+               " JOIN pg_catalog.pg_class c1 ON (c1.relnamespace = n1.oid) "+
+               " JOIN pg_catalog.pg_index i ON (c1.oid=i.indrelid) "+
+               " JOIN pg_catalog.pg_class ic ON (i.indexrelid=ic.oid) "+
+               " JOIN pg_catalog.pg_attribute a ON (ic.oid=a.attrelid), "+
+               " pg_catalog.pg_namespace n2 "+
+               " JOIN pg_catalog.pg_class c2 ON (c2.relnamespace=n2.oid), "+
+               " pg_catalog.pg_trigger t1 "+
+               " JOIN pg_catalog.pg_proc p1 ON (t1.tgfoid=p1.oid), "+
+               " pg_catalog.pg_trigger t2 "+
+               " JOIN pg_catalog.pg_proc p2 ON (t2.tgfoid=p2.oid) ";
            if (primarySchema != null && !"".equals(primarySchema)) {
-               where += " AND n.nspname = '"+escapeQuotes(primarySchema)+"' ";
+               where += " AND n1.nspname = '"+escapeQuotes(primarySchema)+"' ";
            }
            if (foreignSchema != null && !"".equals(foreignSchema)) {
                where += " AND n2.nspname = '"+escapeQuotes(foreignSchema)+"' ";
            }
        } else {
-           select = "SELECT DISTINCT NULL::text as pnspname, NULL::text as fnspname, ";
-           from = " FROM pg_trigger t, pg_trigger t1, pg_class c, pg_class c2, pg_class ic, pg_proc p1, pg_proc p2, pg_index i, pg_attribute a ";
+           select = "SELECT NULL::text as pnspname, NULL::text as fnspname, ";
+           from = " FROM pg_class c1 "+
+               " JOIN pg_index i ON (c1.oid=i.indrelid) "+
+               " JOIN pg_class ic ON (i.indexrelid=ic.oid) "+
+               " JOIN pg_attribute a ON (ic.oid=a.attrelid), "+
+               " pg_class c2, "+
+               " pg_trigger t1 "+
+               " JOIN pg_proc p1 ON (t1.tgfoid=p1.oid), "+
+               " pg_trigger t2 "+
+               " JOIN pg_proc p2 ON (t2.tgfoid=p2.oid) ";
        }
 
        String sql = select
-           + "c.relname as prelname, "
+           + "c1.relname as prelname, "
            + "c2.relname as frelname, "
-           + "t.tgconstrname, "
+           + "t1.tgconstrname, "
            + "a.attnum as keyseq, "
            + "ic.relname as fkeyname, "
-           + "t.tgdeferrable, "
-           + "t.tginitdeferred, "
-           + "t.tgnargs,t.tgargs, "
+           + "t1.tgdeferrable, "
+           + "t1.tginitdeferred, "
+           + "t1.tgnargs,t1.tgargs, "
            + "p1.proname as updaterule, "
            + "p2.proname as deleterule "
            + from 
            + "WHERE "
            // isolate the update rule
-           + "(t.tgrelid=c.oid "
-           + "AND t.tgisconstraint "
-           + "AND t.tgconstrrelid=c2.oid "
-           + "AND t.tgfoid=p1.oid "
-           + "and p1.proname like 'RI\\\\_FKey\\\\_%\\\\_upd') "
+           + "(t1.tgrelid=c1.oid "
+           + "AND t1.tgisconstraint "
+           + "AND t1.tgconstrrelid=c2.oid "
+           + "AND p1.proname LIKE 'RI\\\\_FKey\\\\_%\\\\_upd') "
 
-           + "and "
+           + "AND "
            // isolate the delete rule
-           + "(t1.tgrelid=c.oid "
-           + "and t1.tgisconstraint "
-           + "and t1.tgconstrrelid=c2.oid "
-           + "AND t1.tgfoid=p2.oid "
-           + "and p2.proname like 'RI\\\\_FKey\\\\_%\\\\_del') "
-           + "AND i.indrelid=c.oid "
-           + "AND i.indexrelid=ic.oid "
-           + "AND ic.oid=a.attrelid "
+           + "(t2.tgrelid=c1.oid "
+           + "AND t2.tgisconstraint "
+           + "AND t2.tgconstrrelid=c2.oid "
+           + "AND p2.proname LIKE 'RI\\\\_FKey\\\\_%\\\\_del') "
+
            + "AND i.indisprimary "
            + where;
 
        if (primaryTable != null) {
-           sql += "AND c.relname='" + escapeQuotes(primaryTable) + "' ";
+           sql += "AND c1.relname='" + escapeQuotes(primaryTable) + "' ";
        }
        if (foreignTable != null) {
            sql += "AND c2.relname='" + escapeQuotes(foreignTable) + "' ";
@@ -3060,8 +3017,14 @@ public abstract class AbstractJdbc1DatabaseMetaData
        // since when getting crossreference, primaryTable will be defined
 
        if (primaryTable != null) {
+           if (connection.haveMinimumServerVersion("7.3")) {
+               sql += "fnspname,";
+           }
            sql += "frelname";
        } else {
+           if (connection.haveMinimumServerVersion("7.3")) {
+               sql += "pnspname,";
+           }
            sql += "prelname";
        }