[ 
https://issues.apache.org/jira/browse/PHOENIX-2684?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James Taylor resolved PHOENIX-2684.
-----------------------------------
    Resolution: Fixed

> LiteralExpression.getBooleanLiteralExpression should compare with .equals()
> ---------------------------------------------------------------------------
>
>                 Key: PHOENIX-2684
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-2684
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.5.2
>            Reporter: Julian Eberius
>            Assignee: Julian Eberius
>             Fix For: 4.7.0
>
>         Attachments: PHOENIX-2684.patch
>
>
> I'm using Phoenix 4.5.2 for HBase 1.0 on CDH 5.4.7 using the 
> Cloudera-distributed packages of Phoenix and the minimal client Jar in my 
> application, but as far as I can see, this should affect current versions as 
> well. 
> Setting a Boolean parameter via .setObject() in a prepared upsert statement 
> to a Java Boolean object that evaluates to false, but is not equal to 
> Boolean.FALSE, will lead to a value true (0x01) being inserted into 
> Phoenix/Hbase.
> Such an object can be created, e.g., using new Boolean("false"). The problem 
> is that LiteralExpression.getBooleanLiteralExpression compares using "==", 
> and not using ".equals()".
> A minimal example would create a table "create table test (a integer primary 
> key, b boolean)" and then create a PreparedStatement:
>     PreparedStatement ps = conn.prepareStatement("upsert into test values (1, 
> ?)");
> Finally, set a non-literal Java Boolean as a Object parameter:
>     ps.setObject(1, new Boolean("false"))
> Execute and commit, and a value 0x01 will be inserted, because of the 
> comparison as described above. Using ps.setBoolean() instead of 
> ps.setObject() masks this problem due to unboxing. Obviously, the application 
> should call setBoolean(), but some more generic frameworks will pass 
> parameters through setObject, triggering to this bug (I used Spring's 
> NamedParameterJdbcTemplate and found this). 
> The underlying Java issue can be demonstrated with a simple program such as:
>     System.out.println(new Boolean("false") == Boolean.FALSE);
>     System.out.println(false == Boolean.FALSE);
>     System.out.println(new Boolean("false").equals(Boolean.FALSE));



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to