DdlUtils
  1. DdlUtils
  2. DDLUTILS-227

NullPointerException in ModelBasedResultSetIterator

    Details

      Description

      The bug is in initFromMetaData(Database)

      For subqueries in HSQLDB, tableOfColumn = metaData.getTableName(idx) = "SYSTEM_SUBQUERY", rather than null or "", so the if-block (see below) is executed.
      That table, of course is not in the model, so table = model.findTable... will set table to null.
      That is correct. But unlike the else-block, tableOfColumn is left unchanged.
      This causes the tableName to be wrong, which later on sets the _dynaClass to be null: _dynaClass = model.getDynaClassFor(tableName); // model does not contain a "SYSTEM_SUBQUERY"-table
      This finally causes a NullPointerException in the implementation of next():
      DynaBean bean = _dynaClass.newInstance();

      The solution is simple: Update the tableOfColumn not only in the else-block, but always (only the last few lines changed):

      if ((tableOfColumn != null) && (tableOfColumn.length() > 0))
      {
      _log.debug("Table from metadata: " + tableOfColumn);
      // jConnect might return a table name enclosed in quotes
      if (tableOfColumn.startsWith("\"") && tableOfColumn.endsWith("\"") && (tableOfColumn.length() > 1))

      { tableOfColumn = tableOfColumn.substring(1, tableOfColumn.length() - 1); }

      // the JDBC driver gave us enough meta data info
      table = model.findTable(tableOfColumn, _caseSensitive);
      }
      else

      { _log.debug("Try query hints"); // not enough info in the meta data of the result set, lets try the // user-supplied query hints table = (Table)_preparedQueryHints.get(_caseSensitive ? columnName : columnName.toLowerCase()); }

      tableOfColumn = (table == null ? null : table.getName()); // Moved out of the else-block

      1. DDLUtilsTest.java
        2 kB
        Rijk van Haaften

        Activity

        Hide
        Thomas Dudziak added a comment -

        I don't quite understand the problem here. Could you post a DB model and some sample code to exhibit the problem ?

        Show
        Thomas Dudziak added a comment - I don't quite understand the problem here. Could you post a DB model and some sample code to exhibit the problem ?
        Hide
        Rijk van Haaften added a comment - - edited

        Forgot data insertion in previous attachment. My console output is:
        DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source
        DEBUG - About to execute SQL – -----------------------------------------------------------------------
        – a
        – -----------------------------------------------------------------------

        DROP TABLE a IF EXISTS
        DEBUG - After execution, 0 row(s) have been changed
        DEBUG - About to execute SQL – -----------------------------------------------------------------------
        – a
        – -----------------------------------------------------------------------

        CREATE TABLE a
        (
        a BOOLEAN
        )
        DEBUG - After execution, 0 row(s) have been changed
        INFO - Executed 2 SQL command(s) with 0 error(s)
        DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source.
        Remaining connections: None
        DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source
        DEBUG - About to execute SQL: INSERT INTO a (a) VALUES
        DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source.
        Remaining connections: None
        DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source
        DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source.
        Remaining connections: None
        Exception in thread "main" org.apache.ddlutils.DatabaseOperationException: Exception while reading the row from the resultset
        at org.apache.ddlutils.platform.ModelBasedResultSetIterator.next(ModelBasedResultSetIterator.java:269)
        at org.apache.ddlutils.platform.PlatformImplBase.fetch(PlatformImplBase.java:1638)
        at org.apache.ddlutils.platform.PlatformImplBase.fetch(PlatformImplBase.java:1598)
        at DDLUtilsTest.main(DDLUtilsTest.java:44)
        Caused by: java.lang.NullPointerException
        at org.apache.ddlutils.platform.ModelBasedResultSetIterator.next(ModelBasedResultSetIterator.java:237)
        ... 3 more

        Show
        Rijk van Haaften added a comment - - edited Forgot data insertion in previous attachment. My console output is: DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source DEBUG - About to execute SQL – ----------------------------------------------------------------------- – a – ----------------------------------------------------------------------- DROP TABLE a IF EXISTS DEBUG - After execution, 0 row(s) have been changed DEBUG - About to execute SQL – ----------------------------------------------------------------------- – a – ----------------------------------------------------------------------- CREATE TABLE a ( a BOOLEAN ) DEBUG - After execution, 0 row(s) have been changed INFO - Executed 2 SQL command(s) with 0 error(s) DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source. Remaining connections: None DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source DEBUG - About to execute SQL: INSERT INTO a (a) VALUES DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source. Remaining connections: None DEBUG - Borrowed connection org.apache.commons.dbcp.PoolableConnection@87c268 from data source DEBUG - Returning connection org.apache.commons.dbcp.PoolableConnection@87c268 to data source. Remaining connections: None Exception in thread "main" org.apache.ddlutils.DatabaseOperationException: Exception while reading the row from the resultset at org.apache.ddlutils.platform.ModelBasedResultSetIterator.next(ModelBasedResultSetIterator.java:269) at org.apache.ddlutils.platform.PlatformImplBase.fetch(PlatformImplBase.java:1638) at org.apache.ddlutils.platform.PlatformImplBase.fetch(PlatformImplBase.java:1598) at DDLUtilsTest.main(DDLUtilsTest.java:44) Caused by: java.lang.NullPointerException at org.apache.ddlutils.platform.ModelBasedResultSetIterator.next(ModelBasedResultSetIterator.java:237) ... 3 more
        Hide
        Thomas Dudziak added a comment -

        Please note that fetching a SQL statement like

        SELECT * FROM (SELECT * FROM mytable)

        does not work in DBs like MySql, Derby, PostgreSql etc. Instead they want you to use an explicit alias:

        SELECT * FROM (SELECT * FROM mytable) AS mytable

        Show
        Thomas Dudziak added a comment - Please note that fetching a SQL statement like SELECT * FROM (SELECT * FROM mytable) does not work in DBs like MySql, Derby, PostgreSql etc. Instead they want you to use an explicit alias: SELECT * FROM (SELECT * FROM mytable) AS mytable

          People

          • Assignee:
            Thomas Dudziak
            Reporter:
            Rijk van Haaften
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development