Re: [JDBC] JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit.

Поиск
Список
Период
Сортировка
От dmp
Тема Re: [JDBC] JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit.
Дата
Msg-id 4C2A437E.80103@ttc-cmc.net
обсуждение исходный текст
Ответ на JDBC: 2 bugs: Getting a smallint array actually gets an integer array and return type of a boolean array is bit.  (Saneesh Apte <san@calccit.org>)
Список pgsql-bugs
> 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.JdbcOdbcDriver@fc9944: 2.1
org.postgresql.Driver@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.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.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

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Marcel Asio
Дата:
Сообщение: Re: Function works in 8.4 but not in 9.0 beta2 "ERROR: structure of query does not match function result type"
Следующее
От: "Baegle"
Дата:
Сообщение: BUG #5530: Default cost of crypt causes poor decisions