Uploaded image for project: 'Phoenix'
  1. Phoenix
  2. PHOENIX-1376

java.lang.NullPointerException occurs in JDBC driver

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.1.0
    • 4.2.0, 3.2.0
    • None
    • None
    • windows 7

    Description

      When our software attempts to print out a valid resultSet object via System.out.println(), a java.lang.NullPointerException is generated within the Phoenix JDBC driver. I would expect that performing toString() on an object should not cause a problem. My experience is that normally the address of the object (among other things) is usually returned. This in effect causes the diagnostic mode of our software to be un-usable, which makes this a major issue for us.

      Here is the program log showing the exception and the java program:
      ======================================================
      program log:
      =========
      log4j:WARN No appenders could be found for logger (org.apache.hadoop.conf.Configuration.deprecation).
      log4j:WARN Please initialize the log4j system properly.
      log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

      Connected to jdbc:phoenix:cdh5hive:2181
      Driver org.apache.phoenix.jdbc.PhoenixDriver
      Version 4.1

      Preparing statement
      Executing prepared statement
      call rs=stmt.executeQuery(), stmt =SELECT * FROM SERGIO
      java.lang.NullPointerException
      at org.apache.phoenix.schema.tuple.ResultTuple.toString(ResultTuple.java:68)
      at java.lang.String.valueOf(Unknown Source)
      at java.lang.StringBuilder.append(Unknown Source)
      at org.apache.phoenix.jdbc.PhoenixResultSet.toString(PhoenixResultSet.java:1236)
      at java.lang.String.valueOf(Unknown Source)
      at java.lang.StringBuilder.append(Unknown Source)
      at SimpleSelect.main(SimpleSelect.java:60)

      ========================================================

      The program follows:
      ================
      import java.net.URL;
      import java.sql.*;

      class SimpleSelect {

      public static void main (String args[]) {
      String url = "jdbc:phoenix:cdh5hive:2181";
      String query = "SELECT * FROM SERGIO";

      try

      { // Load the phoenix driver Class.forName ("org.apache.phoenix.jdbc.PhoenixDriver"); // DriverManager.setLogStream(System.out); // Attempt to connect to a driver. Each one // of the registered drivers will be loaded until // one is found that can process this URL Connection con = DriverManager.getConnection ( url, null, null); // If we were unable to connect, an exception // would have been thrown. So, if we get here, // we are successfully connected to the URL // Check for, and display and warnings generated // by the connect. checkForWarning (con.getWarnings ()); // Get the DatabaseMetaData object and display // some information about the connection DatabaseMetaData dma = con.getMetaData (); System.out.println("\nConnected to " + dma.getURL()); System.out.println("Driver " + dma.getDriverName()); System.out.println("Version " + dma.getDriverVersion()); System.out.println(""); // Create a Statement object so we can submit // SQL statements to the driver System.out.println("Preparing statement"); PreparedStatement stmt = con.prepareStatement (query); // Submit a query, creating a ResultSet object System.out.println("Executing prepared statement"); System.out.println("call rs=stmt.executeQuery(), stmt ="+stmt); ResultSet rs = stmt.executeQuery(); // The following line causes NullPointerException System.out.println("return rs=stmt.executeQuery(), rs ="+rs); // Display all columns and rows from the result set System.out.println("Displaying result set"); dispResultSet (rs); // Close the result set rs.close(); // Close the statement stmt.close(); // Close the connection con.close(); }

      catch (SQLException ex) {

      // A SQLException was generated. Catch it and
      // display the error information. Note that there
      // could be multiple error objects chained
      // together

      System.out.println ("\n*** SQLException caught ***\n");

      while (ex != null)

      { System.out.println ("SQLState: " + ex.getSQLState ()); System.out.println ("Message: " + ex.getMessage ()); System.out.println ("Vendor: " + ex.getErrorCode ()); ex = ex.getNextException (); System.out.println (""); }

      }
      catch (java.lang.Exception ex)

      { // Got some other type of exception. Dump it. ex.printStackTrace (); }

      }

      //-------------------------------------------------------------------
      // checkForWarning
      // Checks for and displays warnings. Returns true if a warning
      // existed
      //-------------------------------------------------------------------

      private static boolean checkForWarning (SQLWarning warn)
      throws SQLException {
      boolean rc = false;

      // If a SQLWarning object was given, display the
      // warning messages. Note that there could be
      // multiple warnings chained together

      if (warn != null) {
      System.out.println ("\n *** Warning ***\n");
      rc = true;
      while (warn != null)

      { System.out.println ("SQLState: " + warn.getSQLState ()); System.out.println ("Message: " + warn.getMessage ()); System.out.println ("Vendor: " + warn.getErrorCode ()); System.out.println (""); warn = warn.getNextWarning (); }

      }
      return rc;
      }

      //-------------------------------------------------------------------
      // dispResultSet
      // Displays all columns and rows in the given result set
      //-------------------------------------------------------------------

      private static void dispResultSet (ResultSet rs)
      throws SQLException
      {
      int i;

      // Get the ResultSetMetaData. This will be used for
      // the column headings

      ResultSetMetaData rsmd = rs.getMetaData ();

      // Get the number of columns in the result set

      int numCols = rsmd.getColumnCount ();

      // Display column headings

      for (i=1; i<=numCols; i++)

      { if (i > 1) System.out.print(","); System.out.print(rsmd.getColumnLabel(i)); }

      System.out.println("");

      // Display data, fetching until end of the result set

      boolean more = rs.next ();
      while (more) {

      // Loop through each column, getting the
      // column data and displaying

      for (i=1; i<=numCols; i++)

      { if (i > 1) System.out.print(","); System.out.print(rs.getString(i)); }

      System.out.println("");

      // Fetch the next result set row

      more = rs.next ();
      }
      }

      }

      Attachments

        1. PHOENIX-1376.patch
          1 kB
          James R. Taylor

        Activity

          People

            jamestaylor James R. Taylor
            sergiolob Sergio Lob
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: