[BUGS] JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit. - Mailing list pgsql-jdbc

From Saneesh Apte
Subject [BUGS] JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit.
Date
Msg-id 4C295503.5020506@calccit.org
Whole thread Raw
Responses Re: [BUGS] JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit.  (Oliver Jowett <oliver@opencloud.com>)
List pgsql-jdbc
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:

------------------------------------------------------------------

public class NewClass {
     public static void main(String[] args) {
         try {

             Class.forName("org.postgresql.Driver");
             java.sql.Connection conn = java.sql.DriverManager.getConnection(
                 "jdbc:postgresql://localhost:5432/dev", "dev", "devmm" );
             java.util.Enumeration<java.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.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[]");

    } catch( Exception e ) { ; }
    } // main
} // class

------------------------------------------------------------------


    Prints the following for me:


------------------------------------------------------------------

sun.jdbc.odbc.JdbcOdbcDriver@de6f34: 2.1
org.postgresql.Driver@47b480: 8.4
PostgreSQL 8.4.2 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2
20071124 (Red Hat 4.1.2-42), 64-bit
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;
         at NewClass.main(NewClass.java:90)
[Ljava.lang.Integer; cannot be cast to [Ljava.lang.Short;

------------------------------------------------------------------









    Thanks for any help,


--
Saneesh Apte
510-642-5478
http://www.calccit.org
California Center for Innovative Transportation
University of California, Berkeley, MC3830
2105 Bancroft Way, Suite 300
Berkeley, CA 94720-3830
Phone: 510-642-4522
Fax: 510-642-0910

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

pgsql-jdbc by date:

Previous
From: Andrés Maneiro
Date:
Subject: Re: Source code for postgress 7.4?
Next
From: Kris Jurka
Date:
Subject: Re: Source code for postgress 7.4?