Applied two patches from Kris Jurka.

- First fixes a problem with a recent patch allowing setNull on updateable
    resultsets
  - Second removed toLower() calls on database object names.  Leave it to
    the caller to correctly pass lower, upper or mixed case.  The driver
    already has methods that the caller can use to determine that postgres
    stores identifiers in lowercase. (unless the identifier was quoted when
    created).

 Modified Files:
 	jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
 	jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
This commit is contained in:
Barry Lind 2002-11-04 06:42:33 +00:00
parent bfccacf3f8
commit fdf6b4ff93
2 changed files with 62 additions and 60 deletions

View File

@ -314,10 +314,6 @@ public abstract class AbstractJdbc1DatabaseMetaData
* 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
*/
@ -1725,10 +1721,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
" 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())+"' ";
sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
}
if (procedureNamePattern != null) {
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
}
sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME ";
} else if (connection.haveMinimumServerVersion("7.1")) {
@ -1737,14 +1733,14 @@ public abstract class AbstractJdbc1DatabaseMetaData
" 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 += " 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.toLowerCase())+"' ";
sql += " WHERE p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
}
sql += " ORDER BY PROCEDURE_NAME ";
}
@ -1822,10 +1818,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
" 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())+"' ";
sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
}
if (procedureNamePattern != null) {
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
}
sql += " ORDER BY n.nspname, p.proname ";
} else {
@ -1833,7 +1829,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
" FROM pg_proc p,pg_type t "+
" WHERE p.prorettype=t.oid ";
if (procedureNamePattern != null) {
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern.toLowerCase())+"' ";
sql += " AND p.proname LIKE '"+escapeQuotes(procedureNamePattern)+"' ";
}
sql += " ORDER BY p.proname ";
}
@ -1997,10 +1993,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
" 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())+"' ";
select += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
}
if (tableNamePattern != null) {
select += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
select += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
}
orderby = " ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ";
} else {
@ -2290,7 +2286,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
" 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())+"' ";
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,10 +2304,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
}
if (tableNamePattern != null && !"".equals(tableNamePattern)) {
sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
}
if (columnNamePattern != null && !"".equals(columnNamePattern)) {
sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern.toLowerCase())+"' ";
sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern)+"' ";
}
sql += " ORDER BY nspname,relname,attname ";
@ -2410,8 +2406,6 @@ public abstract class AbstractJdbc1DatabaseMetaData
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());
@ -2432,7 +2426,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
" AND c.relkind = 'r' "+
" AND a.attnum > 0 AND NOT a.attisdropped ";
if (schema != null && !"".equals(schema)) {
sql += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
sql += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
}
} else {
sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl,a.attname "+
@ -2443,9 +2437,9 @@ public abstract class AbstractJdbc1DatabaseMetaData
" AND c.relkind = 'r' ";
}
sql += " AND c.relname = '"+escapeQuotes(table.toLowerCase())+"' ";
sql += " AND c.relname = '"+escapeQuotes(table)+"' ";
if (columnNamePattern != null && !"".equals(columnNamePattern)) {
sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern.toLowerCase())+"' ";
sql += " AND a.attname LIKE '"+escapeQuotes(columnNamePattern)+"' ";
}
sql += " ORDER BY attname ";
@ -2538,7 +2532,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
" AND u.usesysid = c.relowner "+
" AND c.relkind = 'r' ";
if (schemaPattern != null && !"".equals(schemaPattern)) {
sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern.toLowerCase())+"' ";
sql += " AND n.nspname LIKE '"+escapeQuotes(schemaPattern)+"' ";
}
} else {
sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl "+
@ -2548,7 +2542,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
}
if (tableNamePattern != null && !"".equals(tableNamePattern)) {
sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern.toLowerCase())+"' ";
sql += " AND c.relname LIKE '"+escapeQuotes(tableNamePattern)+"' ";
}
sql += " ORDER BY nspname, relname ";
@ -2752,7 +2746,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_attribute a, pg_catalog.pg_index i ";
where = " AND ct.relnamespace = n.oid ";
if (schema != null && !"".equals(schema)) {
where += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
}
} else {
from = " FROM pg_class ct, pg_class ci, pg_attribute a, pg_index i ";
@ -2761,7 +2755,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
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())+"' "+
" AND ct.relname = '"+escapeQuotes(table)+"' "+
where+
" ORDER BY a.attnum ";
@ -2882,7 +2876,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_attribute a, pg_catalog.pg_index i ";
where = " AND ct.relnamespace = n.oid ";
if (schema != null && !"".equals(schema)) {
where += " AND n.nspname = '"+escapeQuotes(schema.toLowerCase())+"' ";
where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
}
} else {
select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
@ -2896,7 +2890,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
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())+"' "+
" AND ct.relname = '"+escapeQuotes(table)+"' "+
where+
" ORDER BY table_name, pk_name, key_seq";
return connection.createStatement().executeQuery(sql);
@ -3008,10 +3002,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
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 ";
if (primarySchema != null && !"".equals(primarySchema)) {
where += " AND n.nspname = '"+escapeQuotes(primarySchema.toLowerCase())+"' ";
where += " AND n.nspname = '"+escapeQuotes(primarySchema)+"' ";
}
if (foreignSchema != null && !"".equals(foreignSchema)) {
where += " AND n2.nspname = '"+escapeQuotes(foreignSchema.toLowerCase())+"' ";
where += " AND n2.nspname = '"+escapeQuotes(foreignSchema)+"' ";
}
} else {
select = "SELECT DISTINCT NULL::text as pnspname, NULL::text as fnspname, ";
@ -3052,10 +3046,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
+ where;
if (primaryTable != null) {
sql += "AND c.relname='" + escapeQuotes(primaryTable.toLowerCase()) + "' ";
sql += "AND c.relname='" + escapeQuotes(primaryTable) + "' ";
}
if (foreignTable != null) {
sql += "AND c2.relname='" + escapeQuotes(foreignTable.toLowerCase()) + "' ";
sql += "AND c2.relname='" + escapeQuotes(foreignTable) + "' ";
}
sql += "ORDER BY ";
@ -3548,7 +3542,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_index i, 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())+"' ";
where += " AND n.nspname = '"+escapeQuotes(schema)+"' ";
}
} else {
select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
@ -3573,7 +3567,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
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())+"' ";
" AND ct.relname = '"+escapeQuotes(tableName)+"' ";
if (unique) {
sql += " AND i.indisunique ";

View File

@ -15,7 +15,7 @@ import org.postgresql.util.PGbytea;
import org.postgresql.util.PSQLException;
/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.9 2002/10/17 19:17:08 barry Exp $
/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.10 2002/11/04 06:42:33 barry Exp $
* This class defines methods of the jdbc2 specification. This class extends
* org.postgresql.jdbc1.AbstractJdbc1ResultSet which provides the jdbc1
* methods. The real Statement class (for jdbc2) is org.postgresql.jdbc2.Jdbc2ResultSet
@ -1406,34 +1406,42 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
String columnName = (String) columns.nextElement();
int columnIndex = _findColumn( columnName ) - 1;
switch ( connection.getSQLType( fields[columnIndex].getPGType() ) )
{
case Types.DECIMAL:
case Types.BIGINT:
case Types.DOUBLE:
case Types.BIT:
case Types.VARCHAR:
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
case Types.SMALLINT:
case Types.FLOAT:
case Types.INTEGER:
case Types.CHAR:
case Types.NUMERIC:
case Types.REAL:
case Types.TINYINT:
rowBuffer[columnIndex] = connection.getEncoding().encode(String.valueOf( updateValues.get( columnName ) ));
case Types.NULL:
continue;
default:
rowBuffer[columnIndex] = (byte[]) updateValues.get( columnName );
Object valueObject = updateValues.get(columnName);
if (valueObject instanceof NullObject) {
rowBuffer[columnIndex] = null;
}
else
{
switch ( connection.getSQLType( fields[columnIndex].getPGType() ) )
{
case Types.DECIMAL:
case Types.BIGINT:
case Types.DOUBLE:
case Types.BIT:
case Types.VARCHAR:
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
case Types.SMALLINT:
case Types.FLOAT:
case Types.INTEGER:
case Types.CHAR:
case Types.NUMERIC:
case Types.REAL:
case Types.TINYINT:
rowBuffer[columnIndex] = connection.getEncoding().encode(String.valueOf( valueObject));
case Types.NULL:
continue;
default:
rowBuffer[columnIndex] = (byte[]) valueObject;
}
}
}
}