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)
}
//-------------------------------------------------------------------
// 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)
}
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 ();
}
}
}