[ https://issues.apache.org/jira/browse/PHOENIX-1376?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James Taylor resolved PHOENIX-1376. ----------------------------------- Resolution: Fixed Fix Version/s: 3.2 4.2 5.0.0 Assignee: James Taylor > java.lang.NullPointerException occurs in JDBC driver > ---------------------------------------------------- > > Key: PHOENIX-1376 > URL: https://issues.apache.org/jira/browse/PHOENIX-1376 > Project: Phoenix > Issue Type: Bug > Affects Versions: 4.1 > Environment: windows 7 > Reporter: Sergio Lob > Assignee: James Taylor > Fix For: 5.0.0, 4.2, 3.2 > > Attachments: PHOENIX-1376.patch > > > 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 (); > } > } > } -- This message was sent by Atlassian JIRA (v6.3.4#6332)