Uploaded image for project: 'OpenJPA'
  1. OpenJPA
  2. OPENJPA-2195

Native Query with specified result class can throw NPE when return data contains a null-valued column

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.2.0
    • Fix Version/s: None
    • Component/s: kernel
    • Labels:
      None

      Description

      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

        Attachments

        1. OPENJPA-2195-2.0.x.patch
          7 kB
          Jody Grassel

          Issue Links

            Activity

              People

              • Assignee:
                fyrewyld Jody Grassel
                Reporter:
                fyrewyld Jody Grassel
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: