From 1ebbfc150a6bf3baa7ab256018b85385c3514737 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 17 Aug 2001 13:59:29 +0000 Subject: [PATCH] Attached is the patch requested by Tom Lane (see below). It includes two changes in the JDBC driver: 1) When connected to a backend >= 7.2: use obj_description() and col_description() instead of direct access to pg_description. 2) In DatabaseMetaData.getTables()/getColumns()/getProcedures(): when there is no comment on the object, return null in the REMARKS column of the ResultSet, instead of the default string "no remarks". Change 2 first appeared as a side-effect of change 1, but it is actually more compliant with the JDBC spec: "String object containing an explanatory comment on the table/column/procedure, which may be null". The default string "no remarks" was strictly speaking incorrect, as it could not be distinguished from a real user comment "no remarks". So I removed the default string completely. Change 2 might break existing code that doesn't follow the JDBC spec and isn't prepared to handle a null in the REMARKS column of getTables()/getColumns()/getProcedures. Patch tested with jdbc2 against both a 7.1 and a CVS tip backend. I did not have a jdbc1 environment to build and test with, but since the touched code is identical in jdbc1 and jdbc2 I don't foresee any problems. Regards, Ren? Pijlman --- .../postgresql/jdbc1/DatabaseMetaData.java | 52 ++++++++++++------- .../postgresql/jdbc2/DatabaseMetaData.java | 51 +++++++++++------- 2 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java index 89d195e25d..d510f65bdd 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java @@ -43,10 +43,6 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData static final int iInt4Oid = 23; // OID for int4 static final int VARHDRSZ = 4; // length for int4 - // This is a default value for remarks - private static final byte defaultRemarks[]="no remarks".getBytes(); - - public DatabaseMetaData(Connection conn) { this.connection = conn; @@ -1517,8 +1513,6 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData java.sql.ResultSet r; // ResultSet for the SQL query that we need to do Vector v = new Vector(); // The new ResultSet tuple stuff - byte remarks[] = defaultRemarks; - f[0] = new Field(connection, "PROCEDURE_CAT", iVarcharOid, 32); f[1] = new Field(connection, "PROCEDURE_SCHEM", iVarcharOid, 32); f[2] = new Field(connection, "PROCEDURE_NAME", iVarcharOid, 32); @@ -1540,7 +1534,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData tuple[1] = null; // Schema name tuple[2] = r.getBytes(1); // Procedure name tuple[3] = tuple[4] = tuple[5] = null; // Reserved - tuple[6] = remarks; // Remarks + tuple[6] = null; // Remarks if (r.getBoolean(2)) tuple[7] = Integer.toString(java.sql.DatabaseMetaData.procedureReturnsResult).getBytes(); @@ -1684,6 +1678,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData // Now form the query StringBuffer sql = new StringBuffer("select relname,oid,relkind from pg_class where ("); + boolean notFirst=false; for(int i=0;i - r = connection.ExecSQL("select a.oid,c.relname,a.attname,a.atttypid,a.attnum,a.attnotnull,a.attlen,a.atttypmod,d.adsrc from pg_class c,pg_attribute a,pg_attrdef d where a.attrelid=c.oid and c.relname like '"+tableNamePattern.toLowerCase()+"' and a.attname like '"+columnNamePattern.toLowerCase()+"' and a.attnum>0 and c.oid=d.adrelid and d.adnum=a.attnum order by c.relname,a.attnum"); - - byte remarks[]; + String query = + "select " + + (connection.haveMinimumServerVersion("7.2") ? "a.attrelid" : "a.oid") + + ",c.relname,a.attname,a.atttypid," + + "a.attnum,a.attnotnull,a.attlen,a.atttypmod,d.adsrc from pg_class c," + + "pg_attribute a,pg_attrdef d where a.attrelid=c.oid and " + + "c.relname like '"+tableNamePattern.toLowerCase()+"' and " + + "a.attname like '"+columnNamePattern.toLowerCase()+"' and " + + "a.attnum>0 and c.oid=d.adrelid and d.adnum=a.attnum " + + "order by c.relname,a.attnum"; + + r = connection.ExecSQL(query); while(r.next()) { byte[][] tuple = new byte[18][0]; // Fetch the description for the table (if any) - java.sql.ResultSet dr = connection.ExecSQL("select description from pg_description where objoid="+r.getInt(1)); + String getDescriptionStatement = + connection.haveMinimumServerVersion("7.2") ? + "select col_description(" + r.getInt(1) + "," + r.getInt(5) + ")" : + "select description from pg_description where objoid=" + r.getInt(1); + + java.sql.ResultSet dr = connection.ExecSQL(getDescriptionStatement); + if(((org.postgresql.ResultSet)dr).getTupleCount()==1) { dr.next(); tuple[11] = dr.getBytes(1); } else - tuple[11] = defaultRemarks; - + tuple[11] = null; dr.close(); tuple[0] = "".getBytes(); // Catalog name @@ -1985,7 +1998,6 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData r.close(); return new ResultSet(connection, f, v, "OK", 1); } - /** * Get a description of the access rights for a table's columns. * diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java index 85ff9ea5ec..f186d01406 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java @@ -43,10 +43,6 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData static final int iInt4Oid = 23; // OID for int4 static final int VARHDRSZ = 4; // length for int4 - // This is a default value for remarks - private static final byte defaultRemarks[]="no remarks".getBytes(); - - public DatabaseMetaData(Connection conn) { this.connection = conn; @@ -1517,8 +1513,6 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData java.sql.ResultSet r; // ResultSet for the SQL query that we need to do Vector v = new Vector(); // The new ResultSet tuple stuff - byte remarks[] = defaultRemarks; - f[0] = new Field(connection, "PROCEDURE_CAT", iVarcharOid, 32); f[1] = new Field(connection, "PROCEDURE_SCHEM", iVarcharOid, 32); f[2] = new Field(connection, "PROCEDURE_NAME", iVarcharOid, 32); @@ -1540,7 +1534,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData tuple[1] = null; // Schema name tuple[2] = r.getBytes(1); // Procedure name tuple[3] = tuple[4] = tuple[5] = null; // Reserved - tuple[6] = remarks; // Remarks + tuple[6] = null; if (r.getBoolean(2)) tuple[7] = Integer.toString(java.sql.DatabaseMetaData.procedureReturnsResult).getBytes(); @@ -1684,6 +1678,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData // Now form the query StringBuffer sql = new StringBuffer("select relname,oid,relkind from pg_class where ("); + boolean notFirst=false; for(int i=0;i - r = connection.ExecSQL("select a.oid,c.relname,a.attname,a.atttypid,a.attnum,a.attnotnull,a.attlen,a.atttypmod,d.adsrc from pg_class c,pg_attribute a,pg_attrdef d where a.attrelid=c.oid and c.relname like '"+tableNamePattern.toLowerCase()+"' and a.attname like '"+columnNamePattern.toLowerCase()+"' and a.attnum>0 and c.oid=d.adrelid and d.adnum=a.attnum order by c.relname,a.attnum"); - - byte remarks[]; + String query = + "select " + + (connection.haveMinimumServerVersion("7.2") ? "a.attrelid" : "a.oid") + + ",c.relname,a.attname,a.atttypid," + + "a.attnum,a.attnotnull,a.attlen,a.atttypmod,d.adsrc from pg_class c," + + "pg_attribute a,pg_attrdef d where a.attrelid=c.oid and " + + "c.relname like '"+tableNamePattern.toLowerCase()+"' and " + + "a.attname like '"+columnNamePattern.toLowerCase()+"' and " + + "a.attnum>0 and c.oid=d.adrelid and d.adnum=a.attnum " + + "order by c.relname,a.attnum"; + + r = connection.ExecSQL(query); while(r.next()) { byte[][] tuple = new byte[18][0]; // Fetch the description for the table (if any) - java.sql.ResultSet dr = connection.ExecSQL("select description from pg_description where objoid="+r.getInt(1)); + String getDescriptionStatement = + connection.haveMinimumServerVersion("7.2") ? + "select col_description(" + r.getInt(1) + "," + r.getInt(5) + ")" : + "select description from pg_description where objoid=" + r.getInt(1); + + java.sql.ResultSet dr = connection.ExecSQL(getDescriptionStatement); + if(((org.postgresql.ResultSet)dr).getTupleCount()==1) { dr.next(); tuple[11] = dr.getBytes(1); } else - tuple[11] = defaultRemarks; - + tuple[11] = null; dr.close(); tuple[0] = "".getBytes(); // Catalog name -- 2.40.0