diff options
author | Peter Mount <peter@retep.org.uk> | 1999-09-15 20:40:02 +0000 |
---|---|---|
committer | Peter Mount <peter@retep.org.uk> | 1999-09-15 20:40:02 +0000 |
commit | cd68ecfef628022de360b1839fcad0f13239b2cd (patch) | |
tree | 38446d2851c6c00a26f57549a04006f8eaa6830b /src/interfaces/jdbc/postgresql/jdbc1 | |
parent | 4d4378b70fa07eff26475170897c03c1f56a2fe1 (diff) | |
download | postgresql-cd68ecfef628022de360b1839fcad0f13239b2cd.tar.gz |
Some late patches from Jens Glaser (jens@jens.de). These upgrade the protocol
to version 2, and fixes ResultSetMetaData.getColumnDisplaySize().
Diffstat (limited to 'src/interfaces/jdbc/postgresql/jdbc1')
-rw-r--r-- | src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java | 4 | ||||
-rw-r--r-- | src/interfaces/jdbc/postgresql/jdbc1/ResultSetMetaData.java | 45 |
2 files changed, 34 insertions, 15 deletions
diff --git a/src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java index 1ee24a8e29..e28f5a6132 100644 --- a/src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java +++ b/src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java @@ -309,7 +309,7 @@ public class ResultSet extends postgresql.ResultSet implements java.sql.ResultSe /** * Get the value of a column in the current row as a - * java.lang.BigDecimal object + * java.math.BigDecimal object * * @param columnIndex the first column is 1, the second is 2... * @param scale the number of digits to the right of the decimal @@ -709,7 +709,7 @@ public class ResultSet extends postgresql.ResultSet implements java.sql.ResultSe case Types.BIGINT: return new Long(getLong(columnIndex)); case Types.NUMERIC: - return getBigDecimal(columnIndex, 0); + return getBigDecimal(columnIndex, ((field.mod-4) & 0xffff)); case Types.REAL: return new Float(getFloat(columnIndex)); case Types.DOUBLE: diff --git a/src/interfaces/jdbc/postgresql/jdbc1/ResultSetMetaData.java b/src/interfaces/jdbc/postgresql/jdbc1/ResultSetMetaData.java index 0502dcdc56..a5859e3dd8 100644 --- a/src/interfaces/jdbc/postgresql/jdbc1/ResultSetMetaData.java +++ b/src/interfaces/jdbc/postgresql/jdbc1/ResultSetMetaData.java @@ -188,19 +188,38 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData */ public int getColumnDisplaySize(int column) throws SQLException { - int max = getColumnLabel(column).length(); - int i; - - for (i = 0 ; i < rows.size(); ++i) - { - byte[][] x = (byte[][])(rows.elementAt(i)); - if(x[column-1]!=null) { - int xl = x[column - 1].length; - if (xl > max) - max = xl; - } - } - return max; + Field f = getField(column); + String type_name = f.getTypeName(); + int sql_type = f.getSQLType(); + int typmod = f.mod; + + // I looked at other JDBC implementations and couldn't find a consistent + // interpretation of the "display size" for numeric values, so this is our's + // FIXME: currently, only types with a SQL92 or SQL3 pendant are implemented - jens@jens.de + + // fixed length data types + if (type_name.equals( "int2" )) return 6; // -32768 to +32768 (5 digits and a sign) + if (type_name.equals( "int4" ) + || type_name.equals( "oid" )) return 11; // -2147483648 to +2147483647 + if (type_name.equals( "int8" )) return 20; // -9223372036854775808 to +9223372036854775807 + if (type_name.equals( "money" )) return 12; // MONEY = DECIMAL(9,2) + if (type_name.equals( "float4" )) return 11; // i checked it out ans wasn't able to produce more than 11 digits + if (type_name.equals( "float8" )) return 20; // dito, 20 + if (type_name.equals( "char" )) return 1; + if (type_name.equals( "bool" )) return 1; + if (type_name.equals( "date" )) return 14; // "01/01/4713 BC" - "31/12/32767 AD" + if (type_name.equals( "time" )) return 8; // 00:00:00-23:59:59 + if (type_name.equals( "timestamp" )) return 22; // hhmmm ... the output looks like this: 1999-08-03 22:22:08+02 + + // variable length fields + typmod -= 4; + if (type_name.equals( "bpchar" ) + || type_name.equals( "varchar" )) return typmod; // VARHDRSZ=sizeof(int32)=4 + if (type_name.equals( "numeric" )) return ( (typmod >>16) & 0xffff ) + + 1 + ( typmod & 0xffff ); // DECIMAL(p,s) = (p digits).(s digits) + + // if we don't know better + return f.length; } /** |