sgilbertson / sqlite4java

Automatically exported from code.google.com/p/sqlite4java
0 stars 0 forks source link

SQLiteStatement.columnValue returns a Long when an Integer is expected #15

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
When you use columnValue method to retrieve an Integer, you obtain a Long. Here 
is a small test case:

SQLiteStatement st = cnx.prepare("select 1;");
st.step();
Assert.assertEquals(Integer.class, st.columnValue(0).getClass());

The problem comes from SQLiteStatement.java, line 1044:

return value == ((long) ((int) value)) ? Integer.valueOf((int) value) : 
Long.valueOf(value);

This instruction works fine unless you mix Integer, Byte, Short, Long, Float or 
Double value as the result of the inline condition. For example, the following 
inline condition:

<cond> ? new Integer(1) : new String()

has a type of Object: the common base class of Integer and String. But the 
following condition:

<cond> ? new Integer(1) : new Long(1)

has a type of Long. This is because a promotion occurs on Integer and it 
becomes a Long.

you must use standard condition like:

if (value == (int)value) {
  return Integer.valueOf(value);
}
return Long.valueOf(value);

It works fine for me.

Original issue reported on code.google.com by olivier....@free.fr on 19 Aug 2010 at 12:18

GoogleCodeExporter commented 9 years ago
Thx!

Original comment by ser...@gmail.com on 19 Aug 2010 at 12:25

GoogleCodeExporter commented 9 years ago
fixed in revision 193

Original comment by ser...@gmail.com on 21 Aug 2010 at 10:55

GoogleCodeExporter commented 9 years ago

Original comment by ser...@gmail.com on 23 Aug 2010 at 8:10