[libpostgresql-jdbc-java] 07/09: Patch from Kris Jurka to improve the performance of getImportedKeys(). The fix uses explicit joins to avoid using the genetic query optimizer for consistent results.
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:19:00 UTC 2017
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to tag REL7_3_2
in repository libpostgresql-jdbc-java.
commit 7e04436e20c065947ce8db6101797782147cd8ef
Author: Barry Lind <barry at xythos.com>
Date: Tue Jan 14 05:07:56 2003 +0000
Patch from Kris Jurka to improve the performance of getImportedKeys(). The
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
---
.../jdbc1/AbstractJdbc1DatabaseMetaData.java | 127 ++++++++-------------
1 file changed, 45 insertions(+), 82 deletions(-)
diff --git a/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java b/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
index 90635e0..1027d3f 100644
--- a/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
+++ b/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
@@ -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";
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git
More information about the pkg-java-commits
mailing list