Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 10.3.1.4, 10.5.3.0, 10.6.1.0
    • Fix Version/s: 10.5.3.1, 10.6.1.0
    • Component/s: SQL
    • Labels:
      None
    • Urgency:
      Urgent
    • Bug behavior facts:
      Seen in production

      Description

      A NPE occurs at org.apache.derby.iapi.util.JBitSet.or().

      A NPE occured at the same location before: http://issues.apache.org/jira/browse/DERBY-1574
      The bug was confirmed by Bryan Pendleton to show in the HEAD as well: http://mail-archives.apache.org/mod_mbox/db-derby-user/201002.mbox/%3C4B79F74E.1000005@amberpoint.com%3E

      To reproduce:
      ----------------------

      CREATE TABLE ABC (ID int PRIMARY KEY NOT NULL);
      CREATE TABLE DEF (ID int PRIMARY KEY NOT NULL);

      SELECT *
      FROM ABC t1
      WHERE (SELECT DISTINCT t2.ID FROM DEF t2)
      IN (SELECT t3.ID FROM DEF t3)

      ----------------------

      Leads to

      error message:
      Error: DERBY SQL error: SQLCODE: -1, SQLSTATE: XJ001, SQLERRMC: java.lang.NullPointerExceptionXJ001.U
      SQLState: XJ001
      ErrorCode: -1

      Stacktrace:
      java.lang.NullPointerException
      at org.apache.derby.iapi.util.JBitSet.or(Unknown Source)
      at org.apache.derby.impl.sql.compile.OptimizerImpl.<init>(Unknown Source)
      at org.apache.derby.impl.sql.compile.Level2OptimizerImpl.<init>(Unknown Source)
      at org.apache.derby.impl.sql.compile.Level2OptimizerFactoryImpl.getOptimizerImpl(Unknown Source)
      at org.apache.derby.impl.sql.compile.OptimizerFactoryImpl.getOptimizer(Unknown Source)
      at org.apache.derby.impl.sql.compile.ResultSetNode.getOptimizer(Unknown Source)
      at org.apache.derby.impl.sql.compile.SelectNode.optimize(Unknown Source)
      at org.apache.derby.impl.sql.compile.SubqueryNode.optimize(Unknown Source)
      at org.apache.derby.impl.sql.compile.SubqueryList.optimize(Unknown Source)
      at org.apache.derby.impl.sql.compile.SelectNode.optimize(Unknown Source)
      at org.apache.derby.impl.sql.compile.DMLStatementNode.optimizeStatement(Unknown Source)
      at org.apache.derby.impl.sql.compile.CursorNode.optimizeStatement(Unknown Source)
      at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
      at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
      at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
      at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
      at org.apache.derby.impl.drda.DRDAStatement.prepare(Unknown Source)
      at org.apache.derby.impl.drda.DRDAStatement.explicitPrepare(Unknown Source)
      at org.apache.derby.impl.drda.DRDAConnThread.parsePRPSQLSTT(Unknown Source)
      at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source)
      at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
      Cleanup action completed

      1. d4549-1a.diff
        3 kB
        Knut Anders Hatlen
      2. preprocess.diff
        0.7 kB
        Knut Anders Hatlen

        Issue Links

          Activity

          Hide
          Knut Anders Hatlen added a comment -

          [bulk update] Close all resolved issues that haven't been updated for more than one year.

          Show
          Knut Anders Hatlen added a comment - [bulk update] Close all resolved issues that haven't been updated for more than one year.
          Hide
          Knut Anders Hatlen added a comment -

          Merged fix to 10.5 and committed revision 916631.

          Show
          Knut Anders Hatlen added a comment - Merged fix to 10.5 and committed revision 916631.
          Hide
          Knut Anders Hatlen added a comment -

          Thanks for looking at the patch, Bryan!
          Committed revision 911315.

          I think this fix is a candidate for back-porting to 10.5. Will do that in a couple of days if it doesn't cause any problems in the nightly regression tests.

          Show
          Knut Anders Hatlen added a comment - Thanks for looking at the patch, Bryan! Committed revision 911315. I think this fix is a candidate for back-porting to 10.5. Will do that in a couple of days if it doesn't cause any problems in the nightly regression tests.
          Hide
          Bryan Pendleton added a comment -

          The patch looks good to me. I agree with your analysis the that missing preprocess() call is the cause.

          +1 to commit.

          Show
          Bryan Pendleton added a comment - The patch looks good to me. I agree with your analysis the that missing preprocess() call is the cause. +1 to commit.
          Hide
          Knut Anders Hatlen added a comment -

          Attaching an updated patch which includes a test case. All the regression tests ran cleanly with the patch.

          Show
          Knut Anders Hatlen added a comment - Attaching an updated patch which includes a test case. All the regression tests ran cleanly with the patch.
          Hide
          Knut Anders Hatlen added a comment -

          It looks like the problem is very similar to DERBY-1574, only that in this case it's SubqueryNode that forgets to call preprocess() recursively on leftOperand. The attached patch (preprocess.diff) makes the NPE go away, and all the lang tests ran cleanly with it.

          Show
          Knut Anders Hatlen added a comment - It looks like the problem is very similar to DERBY-1574 , only that in this case it's SubqueryNode that forgets to call preprocess() recursively on leftOperand. The attached patch (preprocess.diff) makes the NPE go away, and all the lang tests ran cleanly with it.
          Hide
          Murat Knecht added a comment -

          Confirmed bug for version 10.3.1.4 and added it as "affected".

          Show
          Murat Knecht added a comment - Confirmed bug for version 10.3.1.4 and added it as "affected".
          Hide
          Kristian Waagan added a comment -

          Ran repro on trunk, which also has the bug. Stack trace with line numbers below:

          ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
          java.sql.SQLException: Java exception: ': java.lang.NullPointerException'.
          [ snip ]
          Caused by: java.lang.NullPointerException
          at org.apache.derby.iapi.util.JBitSet.or(JBitSet.java:241)
          at org.apache.derby.impl.sql.compile.ReferencedTablesVisitor.visit(ReferencedTablesVisitor.java:77)
          at org.apache.derby.impl.sql.compile.QueryTreeNode.accept(QueryTreeNode.java:735)
          at org.apache.derby.impl.sql.compile.SubqueryNode.acceptChildren(SubqueryNode.java:2294)
          at org.apache.derby.impl.sql.compile.QueryTreeNode.accept(QueryTreeNode.java:738)
          at org.apache.derby.impl.sql.compile.ValueNode.getTablesReferenced(ValueNode.java:790)
          at org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.selfComparison(BinaryRelationalOperatorNode.java:531)
          at org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.optimizableEqualityNode(BinaryRelationalOperatorNode.java:1400)
          at org.apache.derby.impl.sql.compile.PredicateList.hasOptimizableEqualityPredicate(PredicateList.java:389)
          at org.apache.derby.impl.sql.compile.FromBaseTable.isOneRowResultSet(FromBaseTable.java:4432)
          at org.apache.derby.impl.sql.compile.FromBaseTable.isOneRowResultSet(FromBaseTable.java:3864)
          at org.apache.derby.impl.sql.compile.FromBaseTable.nextAccessPath(FromBaseTable.java:441)
          at org.apache.derby.impl.sql.compile.ProjectRestrictNode.nextAccessPath(ProjectRestrictNode.java:188)
          at org.apache.derby.impl.sql.compile.OptimizerImpl.getNextDecoratedPermutation(OptimizerImpl.java:1551)
          at org.apache.derby.impl.sql.compile.SelectNode.optimize(SelectNode.java:1912)
          at org.apache.derby.impl.sql.compile.DMLStatementNode.optimizeStatement(DMLStatementNode.java:315)
          at org.apache.derby.impl.sql.compile.CursorNode.optimizeStatement(CursorNode.java:558)
          at org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:381)
          at org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:90)
          at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:828)
          at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:606)
          ... 14 more

          Show
          Kristian Waagan added a comment - Ran repro on trunk, which also has the bug. Stack trace with line numbers below: ERROR XJ001: Java exception: ': java.lang.NullPointerException'. java.sql.SQLException: Java exception: ': java.lang.NullPointerException'. [ snip ] Caused by: java.lang.NullPointerException at org.apache.derby.iapi.util.JBitSet.or(JBitSet.java:241) at org.apache.derby.impl.sql.compile.ReferencedTablesVisitor.visit(ReferencedTablesVisitor.java:77) at org.apache.derby.impl.sql.compile.QueryTreeNode.accept(QueryTreeNode.java:735) at org.apache.derby.impl.sql.compile.SubqueryNode.acceptChildren(SubqueryNode.java:2294) at org.apache.derby.impl.sql.compile.QueryTreeNode.accept(QueryTreeNode.java:738) at org.apache.derby.impl.sql.compile.ValueNode.getTablesReferenced(ValueNode.java:790) at org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.selfComparison(BinaryRelationalOperatorNode.java:531) at org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.optimizableEqualityNode(BinaryRelationalOperatorNode.java:1400) at org.apache.derby.impl.sql.compile.PredicateList.hasOptimizableEqualityPredicate(PredicateList.java:389) at org.apache.derby.impl.sql.compile.FromBaseTable.isOneRowResultSet(FromBaseTable.java:4432) at org.apache.derby.impl.sql.compile.FromBaseTable.isOneRowResultSet(FromBaseTable.java:3864) at org.apache.derby.impl.sql.compile.FromBaseTable.nextAccessPath(FromBaseTable.java:441) at org.apache.derby.impl.sql.compile.ProjectRestrictNode.nextAccessPath(ProjectRestrictNode.java:188) at org.apache.derby.impl.sql.compile.OptimizerImpl.getNextDecoratedPermutation(OptimizerImpl.java:1551) at org.apache.derby.impl.sql.compile.SelectNode.optimize(SelectNode.java:1912) at org.apache.derby.impl.sql.compile.DMLStatementNode.optimizeStatement(DMLStatementNode.java:315) at org.apache.derby.impl.sql.compile.CursorNode.optimizeStatement(CursorNode.java:558) at org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:381) at org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:90) at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:828) at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:606) ... 14 more

            People

            • Assignee:
              Knut Anders Hatlen
              Reporter:
              Murat Knecht
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development