[ 
https://issues.apache.org/jira/browse/DERBY-7095?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17258293#comment-17258293
 ] 

Richard N. Hillegas commented on DERBY-7095:
--------------------------------------------

Your analysis sounds correct to me. The values change when Java widens the 
32-bit literal into a 64-bit literal, as demonstrated by the following 
program...

{noformat}
public class Z
{
    public static void main(String... args) throws Exception
    {
        castToDouble(108.0108f);
        castToDouble(109.0109f);
    }

    private static void castToDouble(float floatValue)
    {
        double doubleValue = floatValue;

        println("Float " + floatValue + " casts to double " + doubleValue);
    }

    private static void println(String text) { System.out.println(text); }
}
{noformat}

...which produces the following output:

{noformat}
Float 108.0108 casts to double 108.01080322265625
Float 109.0109 casts to double 109.01090240478516
{noformat}


> Different query results with parameter binding vs literals
> ----------------------------------------------------------
>
>                 Key: DERBY-7095
>                 URL: https://issues.apache.org/jira/browse/DERBY-7095
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.12.1.1
>            Reporter: Will Dazey
>            Priority: Minor
>
> I was running some tests locally today and I noticed a weird behavior when 
> executing SQL with parameters vs literals. Maybe I am wrong here, but it 
> seems wrong to me.
> Here is the simple test I threw together:
> {code:java}
>     cstmt = con.prepareCall("CREATE TABLE SIMPLE_TABLE (ID1 FLOAT NOT NULL, 
> ID2 FLOAT NOT NULL, STRING01 VARCHAR(255), PRIMARY KEY (ID1, ID2))");
>     cstmt.execute();
>     cstmt = con.prepareCall("INSERT INTO SIMPLE_TABLE (ID1,ID2,STRING01) 
> VALUES (108.01080322265625,109.01090240478516,'TEST_STR')");
>     cstmt.execute();
>               
>     cstmt = con.prepareCall("SELECT ID1, ID2, STRING01 FROM SIMPLE_TABLE 
> WHERE ((ID1 = 108.0108) AND (ID2 = 109.0109))");
>     ResultSet res = cstmt.executeQuery();
>     System.out.println("Test literals: ");
>     while(res.next()) {
>         System.out.println(res.getFloat("ID1"));
>         System.out.println(res.getFloat("ID2"));
>     }
>     System.out.println();
>     cstmt = con.prepareCall("SELECT ID1, ID2, STRING01 FROM SIMPLE_TABLE 
> WHERE ((ID1 = ?) AND (ID2 = ?))");
>     cstmt.setFloat(1, 108.0108f);
>     cstmt.setFloat(2, 109.0109f);
>     res = cstmt.executeQuery();
>     System.out.println("Test bind parameters: ");
>     while(res.next()) {
>         System.out.println(res.getFloat("ID1"));
>         System.out.println(res.getFloat("ID2"));
>     }
>     System.out.println();
> {code}
> The output I get running this against Derby is:
> {code:java}
> Test literals: 
> Test bind parameters: 
> 108.0108
> 109.0109
> {code}
> ----
> According to the FLOAT doc 
> (https://db.apache.org/derby/docs/10.1/ref/rrefsqlj27281.html), the default 
> precision should be 53. It seems odd to me that there should be different 
> behavior between these two queries and setting the bind parameters returns 
> results when the table values don't even match the WHERE clause parameters. 
> I can then change to a different database, like DB2 or MySQL, and I get no 
> results from either query (which is what I expected really). Thoughts?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to