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

Hudson commented on PHOENIX-2684:
---------------------------------

SUCCESS: Integrated in Phoenix-master #1137 (See 
[https://builds.apache.org/job/Phoenix-master/1137/])
PHOENIX-2684 LiteralExpression.getBooleanLiteralExpression should (jtaylor: rev 
60ef7cd54e26fd1635e503c7d7981ba2cdf4c6fc)
* 
phoenix-core/src/main/java/org/apache/phoenix/expression/LiteralExpression.java
* phoenix-core/src/it/java/org/apache/phoenix/end2end/PrimitiveTypeIT.java
* phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
* 
phoenix-core/src/it/java/org/apache/phoenix/end2end/CompareDecimalToLongIT.java


> 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