Re: DatabaseMetaData.getTables() problem - Mailing list pgsql-jdbc

From Kris Jurka
Subject Re: DatabaseMetaData.getTables() problem
Date
Msg-id 3DC4510E.266D9F3D@ejurka.com
Whole thread Raw
In response to Re: DatabaseMetaData.getTables() problem  (Kris Jurka <books@ejurka.com>)
List pgsql-jdbc
I have given this some further thought and believe that we should not do
any case folding in the driver for DatabaseMetaData calls.  We cannot
guess what the caller's intention is regarding case handling, so instead
the driver provides the necessary methods to let the user know what the
database does with regard to case.  The following methods allow the
caller to do their own case folding if necessary:

storesLowerCaseIdentifiers
storesLowerCaseQuotedIdentifiers
storesMixedCaseIdentifiers
storesMixedCaseQuotedIdentifiers
storesUpperCaseIdentifiers
storesUpperCaseQuotedIdentifiers
supportsMixedCaseIdentifiers
supportsMixedCaseQuotedIdentifiers

The attached patch removes the existing case folding in the driver.


Barry Lind wrote:
>
> Kris,
>
> I can't think of anything better.  So yes please submit a patch for this.
>
> thanks,
> --Barry
>
> Kris Jurka wrote:
> > This has not been fixed.  Currently the driver is doing something along
> > the lines of
> >
> > " WHERE c.relname LIKE " + tableNamePattern.toLowerCase();
> >
> > This masks the problem of a user supplying an uppercase version of a
> > tablename that was case folded to lower, but does not work when they
> > really want an uppercase table name.
> >
> > I believe that adding a LOWER() to c.relname is the best temporary
> > solution until we figure out a better way to handle case sensitivity.
> >
> > Barry, If you believe this is the way to go I will work up a patch for
> > this an similar places in the driver.
> >
> > Kris Jurka
> >
> >
> > On Tue, 29 Oct 2002, Barry Lind wrote:
> >
> >
> >>Wolfgang,
> >>
> >>Can you try this test using the 7.3beta3 build of the driver from
> >>jdbc.postgresql.org?  I think this should be fixed in the latest build.
> >>
> >>thanks,
> >>--Barry
> >>
> >>
> >>w.winter wrote:
> >>
> >>>Hi,
> >>>
> >>>on testing our auto-configuration persistence framework ACP against
> >>>PostgreSQL we found the following problem:
> >>>
> >>>There is a table A625431658_Person1, created as quoted mixed case
> >>>identifier.
> >>>
> >>>I do:
> >>>databaseMetaData.getTables(null, null, "%", new String[] {"TABLE"})
> >>>--> A625431658_Person1 is in the ResultSet. OK.
> >>>
> >>>I do:
> >>>databaseMetaData.getTables(null, null, "A625431658_Person1", new String[]
> >>>{"TABLE"})
> >>>--> A625431658_Person1 is NOT in the ResultSet.
> >>>
> >>>I do:
> >>>databaseMetaData.getTables(null, null, "%erson1", new String[] {"TABLE"})
> >>>--> A625431658_Person1 is in the ResultSet. OK.
> >>>
> >>>Seems there is a problem with mixed case ?
> >>>
> >>>
> >>>Wolfgang
> >>>
> >>>___________________
> >>>Dr. Wolfgang Winter
> >>>LogiTags Systems
> >>>www.logitags.com? src/interfaces/jdbc/org/postgresql/Driver.java
Index: src/interfaces/jdbc/org/postgresql//jdbc1/AbstractJdbc1DatabaseMetaData.java
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java,v
retrieving revision 1.9
diff -c -r1.9 AbstractJdbc1DatabaseMetaData.java
*** src/interfaces/jdbc/org/postgresql//jdbc1/AbstractJdbc1DatabaseMetaData.java    2002/10/25 02:54:37    1.9
--- src/interfaces/jdbc/org/postgresql//jdbc1/AbstractJdbc1DatabaseMetaData.java    2002/11/02 22:26:58
***************
*** 314,323 ****
       * as case sensitive and as a result store them in mixed case?
       * A JDBC-Compliant driver will always return false.
       *
-      * <p>Predicament - what do they mean by "SQL identifiers" - if it
-      * means the names of the tables and columns, then the answers
-      * given below are correct - otherwise I don't know.
-      *
       * @return true if so
       * @exception SQLException if a database access error occurs
       */
--- 314,319 ----
***************
*** 1725,1734 ****
                  " LEFT JOIN pg_catalog.pg_namespace pn ON (c.relnamespace=pn.oid AND pn.nspname='pg_catalog') "+
                  " WHERE p.pronamespace=n.oid ";
                  if (schemaPattern != null && !"".equals(schemaPattern)) {
!                     sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
                  }
                  if (procedureNamePattern != null) {
!                     sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME ";
          } else if (connection.haveMinimumServerVersion("7.1")) {
--- 1721,1730 ----
                  " LEFT JOIN pg_catalog.pg_namespace pn ON (c.relnamespace=pn.oid AND pn.nspname='pg_catalog') "+
                  " WHERE p.pronamespace=n.oid ";
                  if (schemaPattern != null && !"".equals(schemaPattern)) {
!                     sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
                  }
                  if (procedureNamePattern != null) {
!                     sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME ";
          } else if (connection.haveMinimumServerVersion("7.1")) {
***************
*** 1737,1750 ****
                  " LEFT JOIN pg_description d ON (p.oid=d.objoid) "+
                  " LEFT JOIN pg_class c ON (d.classoid=c.oid AND c.relname='pg_proc') ";
                  if (procedureNamePattern != null) {
!                     sql += " WHERE p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_NAME ";
          } else {
              sql = "SELECT NULL AS PROCEDURE_CAT, NULL AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, NULL, NULL,
NULL,NULL AS REMARKS, "+java.sql.DatabaseMetaData.procedureReturnsResult+" AS PROCEDURE_TYPE "+ 
                  " FROM pg_proc p ";
                  if (procedureNamePattern != null) {
!                     sql += " WHERE p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_NAME ";
          }
--- 1733,1746 ----
                  " LEFT JOIN pg_description d ON (p.oid=d.objoid) "+
                  " LEFT JOIN pg_class c ON (d.classoid=c.oid AND c.relname='pg_proc') ";
                  if (procedureNamePattern != null) {
!                     sql += " WHERE p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_NAME ";
          } else {
              sql = "SELECT NULL AS PROCEDURE_CAT, NULL AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, NULL, NULL,
NULL,NULL AS REMARKS, "+java.sql.DatabaseMetaData.procedureReturnsResult+" AS PROCEDURE_TYPE "+ 
                  " FROM pg_proc p ";
                  if (procedureNamePattern != null) {
!                     sql += " WHERE p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
                  }
                  sql += " ORDER BY PROCEDURE_NAME ";
          }
***************
*** 1822,1831 ****
                  " FROM pg_catalog.pg_proc p,pg_catalog.pg_namespace n, pg_catalog.pg_type t "+
                  " WHERE p.pronamespace=n.oid AND p.prorettype=t.oid ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
              }
              if (procedureNamePattern != null) {
!                 sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
              }
              sql += " ORDER BY n.nspname, p.proname ";
          } else {
--- 1818,1827 ----
                  " FROM pg_catalog.pg_proc p,pg_catalog.pg_namespace n, pg_catalog.pg_type t "+
                  " WHERE p.pronamespace=n.oid AND p.prorettype=t.oid ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
              }
              if (procedureNamePattern != null) {
!                 sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
              }
              sql += " ORDER BY n.nspname, p.proname ";
          } else {
***************
*** 1833,1839 ****
                  " FROM pg_proc p,pg_type t "+
                  " WHERE p.prorettype=t.oid ";
              if (procedureNamePattern != null) {
!                 sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
              }
              sql += " ORDER BY p.proname ";
          }
--- 1829,1835 ----
                  " FROM pg_proc p,pg_type t "+
                  " WHERE p.prorettype=t.oid ";
              if (procedureNamePattern != null) {
!                 sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
              }
              sql += " ORDER BY p.proname ";
          }
***************
*** 1997,2006 ****
              " LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND dn.nspname='pg_catalog') "+
              " WHERE c.relnamespace = n.oid ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 select += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
              }
              if (tableNamePattern != null) {
!                 select += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
              }
              orderby = " ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ";
          } else {
--- 1993,2002 ----
              " LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND dn.nspname='pg_catalog') "+
              " WHERE c.relnamespace = n.oid ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 select += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
              }
              if (tableNamePattern != null) {
!                 select += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
              }
              orderby = " ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ";
          } else {
***************
*** 2290,2296 ****
                  " LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') "+
                  " WHERE a.attnum > 0 AND NOT a.attisdropped ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
              }
          } else if (connection.haveMinimumServerVersion("7.1")) {
              sql = "SELECT NULL::text AS
nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,a.attnum,def.adsrc,dsc.description"+ 
--- 2286,2292 ----
                  " LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') "+
                  " WHERE a.attnum > 0 AND NOT a.attisdropped ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
              }
          } else if (connection.haveMinimumServerVersion("7.1")) {
              sql = "SELECT NULL::text AS
nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,a.attnum,def.adsrc,dsc.description"+ 
***************
*** 2308,2317 ****
          }

          if (tableNamePattern != null && !"".equals(tableNamePattern)) {
!             sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
          }
          if (columnNamePattern != null && !"".equals(columnNamePattern)) {
!             sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern.toLowerCase())+"' ";
          }
          sql += " ORDER BY nspname,relname,attname ";

--- 2304,2313 ----
          }

          if (tableNamePattern != null && !"".equals(tableNamePattern)) {
!             sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
          }
          if (columnNamePattern != null && !"".equals(columnNamePattern)) {
!             sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern)+"' ";
          }
          sql += " ORDER BY nspname,relname,attname ";

***************
*** 2410,2417 ****

          if (columnNamePattern == null)
              columnNamePattern = "%";
-         else
-             columnNamePattern = columnNamePattern.toLowerCase();

          f[0] = new Field(connection, "TABLE_CAT", iVarcharOid, getMaxNameLength());
          f[1] = new Field(connection, "TABLE_SCHEM", iVarcharOid, getMaxNameLength());
--- 2406,2411 ----
***************
*** 2432,2438 ****
                  " AND c.relkind = 'r' "+
                  " AND a.attnum > 0 AND NOT a.attisdropped ";
              if (schema != null && !"".equals(schema)) {
!                 sql += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
              }
          } else {
              sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl,a.attname "+
--- 2426,2432 ----
                  " AND c.relkind = 'r' "+
                  " AND a.attnum > 0 AND NOT a.attisdropped ";
              if (schema != null && !"".equals(schema)) {
!                 sql += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
              }
          } else {
              sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl,a.attname "+
***************
*** 2443,2451 ****
                  " AND c.relkind = 'r' ";
          }

!         sql += " AND c.relname = '"+escapeQuotes(table.toLowerCase())+"' ";
          if (columnNamePattern != null && !"".equals(columnNamePattern)) {
!             sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern.toLowerCase())+"' ";
          }
          sql += " ORDER BY attname ";

--- 2437,2445 ----
                  " AND c.relkind = 'r' ";
          }

!         sql += " AND c.relname = '"+escapeQuotes(table)+"' ";
          if (columnNamePattern != null && !"".equals(columnNamePattern)) {
!             sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern)+"' ";
          }
          sql += " ORDER BY attname ";

***************
*** 2538,2544 ****
                  " AND u.usesysid = c.relowner "+
                  " AND c.relkind = 'r' ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
              }
          } else {
              sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl "+
--- 2532,2538 ----
                  " AND u.usesysid = c.relowner "+
                  " AND c.relkind = 'r' ";
              if (schemaPattern != null && !"".equals(schemaPattern)) {
!                 sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
              }
          } else {
              sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl "+
***************
*** 2548,2554 ****
          }

          if (tableNamePattern != null && !"".equals(tableNamePattern)) {
!             sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
          }
          sql += " ORDER BY nspname, relname ";

--- 2542,2548 ----
          }

          if (tableNamePattern != null && !"".equals(tableNamePattern)) {
!             sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
          }
          sql += " ORDER BY nspname, relname ";

***************
*** 2752,2758 ****
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_attributea, pg_catalog.pg_index i "; 
              where = " AND ct.relnamespace = n.oid ";
              if (schema != null && !"".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
              }
          } else {
              from = " FROM pg_class ct, pg_class ci, pg_attribute a, pg_index i ";
--- 2746,2752 ----
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_attributea, pg_catalog.pg_index i "; 
              where = " AND ct.relnamespace = n.oid ";
              if (schema != null && !"".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
              }
          } else {
              from = " FROM pg_class ct, pg_class ci, pg_attribute a, pg_index i ";
***************
*** 2761,2767 ****
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "+
              " AND a.attrelid=ci.oid AND i.indisprimary "+
!             " AND ct.relname = '"+escapeQuotes(table.toLowerCase())+"' "+
              where+
              " ORDER BY a.attnum ";

--- 2755,2761 ----
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "+
              " AND a.attrelid=ci.oid AND i.indisprimary "+
!             " AND ct.relname = '"+escapeQuotes(table)+"' "+
              where+
              " ORDER BY a.attnum ";

***************
*** 2882,2888 ****
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_attributea, pg_catalog.pg_index i "; 
              where = " AND ct.relnamespace = n.oid ";
              if (schema != null && !"".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
              }
          } else {
              select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
--- 2876,2882 ----
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_attributea, pg_catalog.pg_index i "; 
              where = " AND ct.relnamespace = n.oid ";
              if (schema != null && !"".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
              }
          } else {
              select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
***************
*** 2896,2902 ****
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "+
              " AND a.attrelid=ci.oid AND i.indisprimary "+
!             " AND ct.relname = '"+escapeQuotes(table.toLowerCase())+"' "+
              where+
              " ORDER BY table_name, pk_name, key_seq";
          return connection.createStatement().executeQuery(sql);
--- 2890,2896 ----
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "+
              " AND a.attrelid=ci.oid AND i.indisprimary "+
!             " AND ct.relname = '"+escapeQuotes(table)+"' "+
              where+
              " ORDER BY table_name, pk_name, key_seq";
          return connection.createStatement().executeQuery(sql);
***************
*** 3008,3017 ****
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_namespace n2, pg_catalog.pg_trigger t,
pg_catalog.pg_triggert1, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_class ic, pg_catalog.pg_proc p1,
pg_catalog.pg_procp2, pg_catalog.pg_index i, pg_catalog.pg_attribute a "; 
              where = " AND c.relnamespace = n.oid AND c2.relnamespace=n2.oid ";
              if (primarySchema != null && !"".equals(primarySchema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(primarySchema.toLowerCase())+"' ";
              }
              if (foreignSchema != null && !"".equals(foreignSchema)) {
!                 where += " AND n2.nspname = '"+escapeQuotes(foreignSchema.toLowerCase())+"' ";
              }
          } else {
              select = "SELECT DISTINCT NULL::text as pnspname, NULL::text as fnspname, ";
--- 3002,3011 ----
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_namespace n2, pg_catalog.pg_trigger t,
pg_catalog.pg_triggert1, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_class ic, pg_catalog.pg_proc p1,
pg_catalog.pg_procp2, pg_catalog.pg_index i, pg_catalog.pg_attribute a "; 
              where = " AND c.relnamespace = n.oid AND c2.relnamespace=n2.oid ";
              if (primarySchema != null && !"".equals(primarySchema)) {
!                 where += " AND n.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, ";
***************
*** 3052,3061 ****
              + where;

          if (primaryTable != null) {
!             sql += "AND c.relname='" + escapeQuotes(primaryTable.toLowerCase()) + "' ";
          }
          if (foreignTable != null) {
!             sql += "AND c2.relname='" + escapeQuotes(foreignTable.toLowerCase()) + "' ";
          }

          sql += "ORDER BY ";
--- 3046,3055 ----
              + where;

          if (primaryTable != null) {
!             sql += "AND c.relname='" + escapeQuotes(primaryTable) + "' ";
          }
          if (foreignTable != null) {
!             sql += "AND c2.relname='" + escapeQuotes(foreignTable) + "' ";
          }

          sql += "ORDER BY ";
***************
*** 3548,3554 ****
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_indexi, pg_catalog.pg_attribute a, pg_catalog.pg_am am "; 
              where = " AND n.oid = ct.relnamespace ";
              if (schema != null && ! "".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
              }
          } else {
              select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
--- 3542,3548 ----
              from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci,
pg_catalog.pg_indexi, pg_catalog.pg_attribute a, pg_catalog.pg_am am "; 
              where = " AND n.oid = ct.relnamespace ";
              if (schema != null && ! "".equals(schema)) {
!                 where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
              }
          } else {
              select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
***************
*** 3573,3579 ****
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid AND a.attrelid=ci.oid AND ci.relam=am.oid "+
              where+
!             " AND ct.relname = '"+escapeQuotes(tableName.toLowerCase())+"' ";

          if (unique) {
              sql += " AND i.indisunique ";
--- 3567,3573 ----
              from+
              " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid AND a.attrelid=ci.oid AND ci.relam=am.oid "+
              where+
!             " AND ct.relname = '"+escapeQuotes(tableName)+"' ";

          if (unique) {
              sql += " AND i.indisunique ";

pgsql-jdbc by date:

Previous
From: "Nick Fankhauser"
Date:
Subject: Re: Java.lang.ClassNotFoundException:postgresql.Driver
Next
From: Antonie C Malan
Date:
Subject: Question arising from a post