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

Jody Grassel resolved OPENJPA-2195.
-----------------------------------

    Resolution: Fixed

Fixed by OJ-2267.
                
> Native Query with specified result class can throw NPE when return data 
> contains a null-valued column
> -----------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2195
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2195
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.2.0
>            Reporter: Jody Grassel
>            Assignee: Jody Grassel
>         Attachments: OPENJPA-2195-2.0.x.patch
>
>
> When fetching a column from the current row in the ResultSet, there is the 
> potential for the value returned to be null (through nullable columns or SQL 
> aggregate functions such as MAX that can possible return a null value).   If 
> there is no ResultPacker (such is the case when the query is created without 
> a result class type specified), this null value is stored in the 
> EagerResultList without any problem.  
> However, when a result class type is specified when the query is created, a 
> ResultPacker is instantiated and used to 'pack' each entry fetched from the 
> result set before saving it in the EagerResultList's internal List structure. 
>  The problem is that the ResultPacker.pack(Object result) method is not 
> null-argument safe.  The first thing the method attempts is try call 
> getClass() on its argument, which results in a NullPointerException in this 
> situation:
> java.lang.RuntimeException: <openjpa-2.0.2-SNAPSHOT-r422266:1334144M nonfatal 
> user error> org.apache.openjpa.persistence.ArgumentException: Failed to 
> execute query "select NULLABLE_LNG_DATA FROM JAGNullField WHERE NFD_ID =?". 
> Check the query syntax for correctness. See nested exception for details.
>       at test.SimpleNullTest.test005(SimpleNullTest.java:152)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>       at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>       at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
>       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>       at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>       at 
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>       at 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: <openjpa-2.0.2-SNAPSHOT-r422266:1334144M nonfatal user error> 
> org.apache.openjpa.persistence.ArgumentException: Failed to execute query 
> "select NULLABLE_LNG_DATA FROM JAGNullField WHERE NFD_ID =?". Check the query 
> syntax for correctness. See nested exception for details.
>       at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:870)
>       at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792)
>       at 
> org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
>       at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288)
>       at 
> org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
>       at test.SimpleNullTest.test005(SimpleNullTest.java:148)
>       ... 25 more
> Caused by: java.lang.NullPointerException
>       at org.apache.openjpa.kernel.ResultPacker.pack(ResultPacker.java:196)
>       at 
> org.apache.openjpa.jdbc.kernel.SQLProjectionResultObjectProvider.getResultObject(SQLProjectionResultObjectProvider.java:88)
>       at 
> org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:36)
>       at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1246)
>       at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
>       at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861)
>       ... 30 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to