Derby
  1. Derby
  2. DERBY-3964

NullPointerException when re-evaluating generated column during ON DELETE SET NULL referential action

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 10.5.1.1
    • Fix Version/s: 10.5.1.1
    • Component/s: SQL
    • Labels:
      None

      Description

      Cf repro RegenerateAfterOnDeleteSetNullError.java enclosed.

      1) test_1(org.apache.derbyTesting.functionTests.tests.lang.RegenerateAfterOnDeleteSetNullError)java.sql.SQLException: The exception 'java.lang.NullPointerException' was thrown while evaluating an expression.
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:95)
      at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
      at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:223)
      at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:398)
      at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:346)
      at org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2201)
      at org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:81)
      at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1323)
      at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:625)
      at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(EmbedStatement.java:175)
      at org.apache.derbyTesting.functionTests.tests.lang.RegenerateAfterOnDeleteSetNullError.test_1(RegenerateAfterOnDeleteSetNullError.java:60)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:105)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
      at junit.extensions.TestSetup.run(TestSetup.java:25)
      at org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
      Caused by: java.sql.SQLException: The exception 'java.lang.NullPointerException' was thrown while evaluating an expression.
      at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:119)
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
      ... 31 more
      Caused by: java.sql.SQLException: Java exception: ': java.lang.NullPointerException'.
      at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:119)
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
      at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
      at org.apache.derby.impl.jdbc.Util.javaException(Util.java:244)
      at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:403)
      ... 29 more
      Caused by: java.lang.NullPointerException
      at org.apache.derby.impl.sql.execute.BaseActivation.getColumnFromRow(BaseActivation.java:1451)
      at org.apache.derby.exe.ac30fbc0bbx011dxd4a8x4baexffffd28a99d54.e5(Unknown Source)
      at org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:149)
      at org.apache.derby.impl.sql.execute.NoRowsResultSetImpl.evaluateGenerationClauses(NoRowsResultSetImpl.java:623)
      at org.apache.derby.impl.sql.execute.UpdateResultSet.collectAffectedRows(UpdateResultSet.java:451)
      at org.apache.derby.impl.sql.execute.DeleteCascadeResultSet.collectAffectedRows(DeleteCascadeResultSet.java:195)
      at org.apache.derby.impl.sql.execute.DeleteCascadeResultSet.open(DeleteCascadeResultSet.java:120)
      at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:416)
      at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:297)
      at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1235)
      ... 24 more

        Issue Links

          Activity

          Gavin made changes -
          Workflow jira [ 12447004 ] Default workflow, editable Closed status [ 12800000 ]
          Dag H. Wanvik made changes -
          Status Resolved [ 5 ] Closed [ 6 ]
          Myrna van Lunteren made changes -
          Affects Version/s 10.5.1.1 [ 12313771 ]
          Affects Version/s 10.5.0.0 [ 12313010 ]
          Fix Version/s 10.5.1.1 [ 12313771 ]
          Fix Version/s 10.5.0.0 [ 12313010 ]
          Knut Anders Hatlen made changes -
          Derby Info [Patch Available]
          Affects Version/s 10.5.0.0 [ 12313010 ]
          Fix Version/s 10.5.0.0 [ 12313010 ]
          Hide
          Knut Anders Hatlen added a comment -

          (Setting affects-version and fix-version to 10.5.0.0.)

          Chip,

          As I understand this bug, it only affects a new feature in 10.5 (generated columns), so I think you must be seeing something else. Just a guess, but it looks similar to DERBY-2353 (at least if you happen to run with derby.language.logQueryPlan=true). There should be a stack trace for the NullPointerException in derby.log which could give a clue.

          Show
          Knut Anders Hatlen added a comment - (Setting affects-version and fix-version to 10.5.0.0.) Chip, As I understand this bug, it only affects a new feature in 10.5 (generated columns), so I think you must be seeing something else. Just a guess, but it looks similar to DERBY-2353 (at least if you happen to run with derby.language.logQueryPlan=true). There should be a stack trace for the NullPointerException in derby.log which could give a clue.
          Hide
          Chip Hartney added a comment -

          I cannot tell from this report which versions it occurs in nor which it is fixed in.

          I also need to know whether it could be the same as the error I am incurring in both v10.3.3.0 and v10.4.2.0 (but not v10.3.2.1).

          It is an error in which I incur a NullPointerException trying to delete a row from a table with ON DELETE referential actions (though not a SET NULL action). The error is exemplified by the following sequence in IJ:

          ij> delete from app."LineItem" where "Id" = 60275;
          ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
          ij> select * from app."LineItem" where "Id" = 60275;
          ERROR 08003: No current connection.

          The LineItem table has the following constraints:
          ALTER TABLE "APP"."LineItem" ADD CONSTRAINT "LineItem_FK_OrderId" FOREIGN KEY ("OrderId") REFERENCES "APP"."Order" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION;
          ALTER TABLE "APP"."LineItem" ADD CONSTRAINT "LineItem_FK_ProductId" FOREIGN KEY ("ProductId") REFERENCES "APP"."Product" ("Id") ON DELETE RESTRICT ON UPDATE NO ACTION;

          Show
          Chip Hartney added a comment - I cannot tell from this report which versions it occurs in nor which it is fixed in. I also need to know whether it could be the same as the error I am incurring in both v10.3.3.0 and v10.4.2.0 (but not v10.3.2.1). It is an error in which I incur a NullPointerException trying to delete a row from a table with ON DELETE referential actions (though not a SET NULL action). The error is exemplified by the following sequence in IJ: ij> delete from app."LineItem" where "Id" = 60275; ERROR XJ001: Java exception: ': java.lang.NullPointerException'. ij> select * from app."LineItem" where "Id" = 60275; ERROR 08003: No current connection. The LineItem table has the following constraints: ALTER TABLE "APP"."LineItem" ADD CONSTRAINT "LineItem_FK_OrderId" FOREIGN KEY ("OrderId") REFERENCES "APP"."Order" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION; ALTER TABLE "APP"."LineItem" ADD CONSTRAINT "LineItem_FK_ProductId" FOREIGN KEY ("ProductId") REFERENCES "APP"."Product" ("Id") ON DELETE RESTRICT ON UPDATE NO ACTION;
          Rick Hillegas made changes -
          Status Open [ 1 ] Resolved [ 5 ]
          Resolution Fixed [ 1 ]
          Rick Hillegas made changes -
          Derby Info [Patch Available]
          Hide
          Rick Hillegas added a comment -

          Tests passed cleanly for me on derby-3964-01-aa-onDeleteSetNull.diff except for the heisenbug in the stress multi tests. Committed at subversion revision 722623.

          Show
          Rick Hillegas added a comment - Tests passed cleanly for me on derby-3964-01-aa-onDeleteSetNull.diff except for the heisenbug in the stress multi tests. Committed at subversion revision 722623.
          Rick Hillegas made changes -
          Attachment derby-3964-01-aa-onDeleteSetNull.diff [ 12395112 ]
          Hide
          Rick Hillegas added a comment -

          Attaching derby-3964-01-aa-onDeleteSetNull.diff. This patch fixes the NPE triggered when a primary key deletion cascades changes to a foreign key table. Tests are running.

          Here's what was going on:

          o The cascaded change translated into an UPDATE on the foreign key table.

          o During the cascaded change, generation clauses were being evaluated on the pre-images of columns as well as on the after images in the UPDATE row.

          o The pre-image referred to a ResultSet whose row was not available at execution time.

          o That triggered the NPE.

          The fix was to eliminate the useless evaluation of the generation clause on the pre-image of the column.

          Touches the following files:

          M java/engine/org/apache/derby/impl/sql/compile/DMLModStatementNode.java

          The code-generation of generation clauses is changed to only build code for after images. This involves adding an argument to generateGenerationClauses(), flagging whether the statement is an UPDATE.

          M java/engine/org/apache/derby/impl/sql/compile/UpdateNode.java
          M java/engine/org/apache/derby/impl/sql/compile/InsertNode.java

          Adds the extra argument to the callers of generateGenerationClauses.

          M java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java

          Adds a test case.

          Show
          Rick Hillegas added a comment - Attaching derby-3964-01-aa-onDeleteSetNull.diff. This patch fixes the NPE triggered when a primary key deletion cascades changes to a foreign key table. Tests are running. Here's what was going on: o The cascaded change translated into an UPDATE on the foreign key table. o During the cascaded change, generation clauses were being evaluated on the pre-images of columns as well as on the after images in the UPDATE row. o The pre-image referred to a ResultSet whose row was not available at execution time. o That triggered the NPE. The fix was to eliminate the useless evaluation of the generation clause on the pre-image of the column. Touches the following files: M java/engine/org/apache/derby/impl/sql/compile/DMLModStatementNode.java The code-generation of generation clauses is changed to only build code for after images. This involves adding an argument to generateGenerationClauses(), flagging whether the statement is an UPDATE. M java/engine/org/apache/derby/impl/sql/compile/UpdateNode.java M java/engine/org/apache/derby/impl/sql/compile/InsertNode.java Adds the extra argument to the callers of generateGenerationClauses. M java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java Adds a test case.
          Rick Hillegas made changes -
          Assignee Rick Hillegas [ rhillegas ]
          Rick Hillegas made changes -
          Link This issue is part of DERBY-481 [ DERBY-481 ]
          Dag H. Wanvik made changes -
          Attachment RegenerateAfterOnDeleteSetNullError.java [ 12394666 ]
          Dag H. Wanvik made changes -
          Dag H. Wanvik made changes -
          Field Original Value New Value
          Attachment RegenerateAfterOnDeleteSetNullError.java [ 12394666 ]
          Dag H. Wanvik created issue -

            People

            • Assignee:
              Rick Hillegas
              Reporter:
              Dag H. Wanvik
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development