Bug #11940 The PreparedStatement causes invalid transformation unsigned int type
| Submitted: | 14 Jul 2005 14:06 | Modified: | 15 Jul 2005 12:05 |
|---|---|---|---|
| Reporter: | Eugene Andrewhin | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / J | Severity: | S2 (Serious) |
| Version: | 3.1.10 | OS: | Windows (Windows XP) |
| Assigned to: | CPU Architecture: | Any |
[14 Jul 2005 19:30]
Aleksey Kishkin
testcase
Attachment: Bug11940.java (text/x-java), 1.30 KiB.
[14 Jul 2005 19:37]
Aleksey Kishkin
What version of mysql server did you use? Tested on linux (testcase attached) against mysql 5.0.10 and j/connector 3.1.10 - works properly. Plan to test on Windows. /opt/java/jre/bin/java -classpath .:my.jar Bug11940 2>/dev/null .Loading JDBC driver 'com.mysql.jdbc.Driver' Done. Done. 123456 123456 Time: 0,982 OK (1 test)
[15 Jul 2005 4:16]
Aleksey Kishkin
on win xp sp2, against mysql.5.0.7 and jdbc 3.1.10 was not able to reproduce it as well .Loading JDBC driver 'com.mysql.jdbc.Driver' Done. Done. Connected to 5.0.7-beta-nt 123456 123456 Time: 1,156 OK (1 test)
[15 Jul 2005 5:15]
Eugene Andrewhin
Java source illustrated trouble
Attachment: PreparedStatementBugFix.java (text/x-java), 3.47 KiB.
[15 Jul 2005 5:26]
Eugene Andrewhin
I am use MySQL 4.1.12 and java sdk version 1.4.2_08-b03 and latest MySQL Connector/J 3.1.10 verssion, and Windows XP sp2. I think, it is trouble Connector/J 3.1.10. Because simple replacement to backword version Connector/J (on 3.1.8 & 3.1.7) trouble is gone. I'm attach java test file for illustrated trouble.
[15 Jul 2005 5:38]
Eugene Andrewhin
I also tested with mysql-connector-java-3.2.0-alpha and too allright. I Ask to pay attention to mysql-connector-java-3.1.10
[15 Jul 2005 5:45]
Aleksey Kishkin
e:\java\bin\java -cp .;mysql-connector-java-3.1.10-bin.jar PreparedStatementBugFix 123456 123456 Win xp sp2, mysql 4.1.12 the only difference is - I use java -verson java version "1.5.0_02" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09) Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing) OK. going to try elder java
[15 Jul 2005 6:06]
Aleksey Kishkin
Finaly got: .Loading JDBC driver 'com.mysql.jdbc.Driver' Done. Done. Connected to 4.1.12a-nt 123456 4295090752 F Time: 0,547 There was 1 failure: 1) testUnsignedInt(Bug11940)junit.framework.AssertionFailedError: We must fetch 123456 but fetched 4295090752 at Bug11940.testUnsignedInt(Bug11940.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at Bug11940.main(Bug11940.java:38) FAILURES!!! Tests run: 1, Failures: 1, Errors: 0 It looks like rs.getObject(1).toString() returns that wrong value. If I test rs.getInt(), no error appears.
[15 Jul 2005 6:06]
Aleksey Kishkin
real test case
Attachment: Bug11940.java (text/x-java), 1.35 KiB.
[15 Jul 2005 9:42]
Eugene Andrewhin
Yes really, getInt() returns faithfull importance because working like this int value = (int) longValue, since in this instance returns rs.getObject().getClass().getName() = java.lang.Long. Usage getInt() this private output from situation, but the problem of convertation remain. I think so be must not. What do you think?
[15 Jul 2005 12:05]
Mark Matthews
Known issue already fixed in nightly builds of 3.1. See http://downloads.mysql.com/snapshots.php#connector-j for a version you can test.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.048 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: The 'PreparedStatement', where in query selected integer from unsigned integer field , gives the invalid numbers. But 'Statement' with such request gives the faithfull data. If the field to do signed, that problems no. In versions 3.1.8 and 3.1.7 such problems no - I have tested. Note: Occurs convertation from unsigned integer to signed long with adding two senior bytes with included sign bit. See example ("How to repeat" section). How to repeat: -- Example -- create table: CREATE TABLE `test_table` (`int_field` int(6) unsigned NOT NULL default '0') ENGINE=InnoDB insert value: INSERT `test_table` VALUES (123456); fetching with Statement (no error): Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT `int_field` FROM `test_table` WHERE `int_field` = 123456"); /* rs.getObject(1) = 123456 (can be other getXxx() int methods) */ fetching with PreparedStatement (error): PreparedStatement pstmt = conn.prepareStatement("SELECT `int_field` FROM `test_table` WHERE `int_field` = ?"); pstmt.setInt(1,123456); rs = pstmt.executeQuery(); /* ! rs.getObject(1) = 4295090752 (can use dif getXxx() int methods) */ Compares in bit notion: 123456 - 11110001001000000 4295090752 - 100000000000000011110001001000000 That is to say occurs convertation from unsigned integer to signed long with adding two senior bytes with included sign bit.