Hi,
I think I found two bugs (and I hope I am not wasting everyone's
time).
One is minor: the base type of a boolean[] is java.sql.Types.BIT
instead or java.sql.Types.BOOLEAN. At the very least shouldn't these
be aliases for the same type?
And secondly the returned type from a smallint[] is an Integer[]
instead of a Short[].
So running this code:
The running of the supplied code also gives the same results with
PostgreSQL 8.3.3
results:
sun.jdbc.odbc.jdbcodbcdri...@fc9944: 2.1
org.postgresql.dri...@8b819f: 8.4
PostgreSQL 8.3.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.6
Integer[]
1 2
int4: 4 4
END Integer[]
Boolean[]
false true
bool: 16 -7 -7
END Boolean[]
Short[]
java.lang.ClassCastException: [Ljava.lang.Integer; cannot be cast to
[Ljava.lang.Short;
The 8.4 JDBC Driver though does gives a consistent result as past
versions via the
tableMetaData.getColumnClassName() tableMetaData.getColumnTypeName()
for the base types, integer, smallint, and boolean.
System.out.println(i + + colNameString + +
columnClass + + columnType + +
columnSize);
3 int_type java.lang.Integer int4 11
2 smallint_type java.lang.Integer int2 6
21 boolean_type java.lang.Boolean bool 1
1 ia java.sql.Array _int4 11
2 sa java.sql.Array _int2 6
3 ba java.sql.Array _bool 1
Attached slight modification to NewClass to correctly compile and drop
table if run
more than once.
danap.
public class NewClass2
{
public static void main(String[] args)
{
try
{
Class.forName(org.postgresql.Driver);
java.sql.Connection conn = java.sql.DriverManager.getConnection(
jdbc:postgresql://192.168.157.32:5432/dev, dev, devmm);
java.util.Enumerationjava.sql.Driver drivers =
java.sql.DriverManager.getDrivers();
while (drivers.hasMoreElements())
{
java.sql.Driver d = drivers.nextElement();
System.out.println(d.toString() + : + d.getMajorVersion() + .
+ d.getMinorVersion());
}
java.sql.PreparedStatement ps_ver = conn.prepareStatement(SELECT
version());
java.sql.ResultSet rs = ps_ver.executeQuery();
while (rs.next())
System.out.println(rs.getString(1));
java.sql.Statement dbStatement = conn.createStatement();
dbStatement.executeUpdate(DROP TABLE IF EXISTS public.aab);
java.sql.PreparedStatement ps_create = conn.prepareStatement(CREATE
TABLE public.aab (
+ ia integer[], + sa smallint[],
+ ba boolean[] ));
ps_create.executeUpdate();
java.sql.PreparedStatement ps_insert = conn
.prepareStatement(INSERT INTO public.aab (ia,sa,ba) VALUES
(?,?,?));
ps_insert.setArray(1, conn.createArrayOf(int4, new Integer[] {1,
2}));
ps_insert.setArray(2, conn.createArrayOf(int2, new Short[] {100,
200}));
ps_insert.setArray(3, conn.createArrayOf(bool, new Boolean[] {false,
true}));
ps_insert.executeUpdate();
java.sql.PreparedStatement ps_select = conn.prepareStatement(SELECT
ia,sa,ba FROM public.aab);
rs = ps_select.executeQuery();
java.sql.Array jdbcArr;
while (rs.next())
{
System.out.println(Integer[]);
jdbcArr = rs.getArray(ia);
Integer[] javaIntArr = (Integer[]) jdbcArr.getArray();
System.out.println(javaIntArr[0] + + javaIntArr[1]);
System.out.println(String.format(%s: %d %d,
jdbcArr.getBaseTypeName(), java.sql.Types.INTEGER,
jdbcArr.getBaseType()));
System.out.println(END Integer[]);
System.out.println(Boolean[]);
jdbcArr = rs.getArray(ba);
Boolean[] javaBooArr = (Boolean[]) jdbcArr.getArray();
System.out.println(javaBooArr[0] + + javaBooArr[1]);
System.out.println(String.format(%s: %d %d %d,
jdbcArr.getBaseTypeName(),
java.sql.Types.BOOLEAN, jdbcArr.getBaseType(),
java.sql.Types.BIT));
System.out.println(END Boolean[]);
System.out.println(Short[]);
jdbcArr = rs.getArray(sa);
Short[] javaShoArr = (Short[]) jdbcArr.getArray();
System.out.println(javaShoArr[0] + + javaShoArr[1]);
System.out.println(String.format(%s: %d %d,
jdbcArr.getBaseTypeName(), java.sql.Types.SMALLINT,
jdbcArr.getBaseType()));
System.out.println(END Short[]);
}
rs.close();
dbStatement.close();
conn.close();
}
catch (Exception e)
{
System.out.println(e.toString());
}
} // main
} // class
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your