[ 
https://issues.apache.org/jira/browse/CASSANDRA-2734?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13043212#comment-13043212
 ] 

Aaron Morton commented on CASSANDRA-2734:
-----------------------------------------

All the keyspace meta data is read from the server and cached in the 
ColumnDecoder the first time o.a.c.cql.jdbc.Connection.execute() is run and 
cached for future calls. In the test this happens when the "CREATE 
COLUMNFAMILY" statement is run and so there are no CF's defined for the ks1.


The code for makeKeyColumn() expects that all the meta data is present, like 
the other functions on ColumnDecoder. And the NPE is because the CF does not 
exist in the ks metadata held by the Connection. 

The test passes if a new connection is created after CREATE COLUMNFAMILY. 

We could either:

1. Raise a StaleClientSchemaException or some such from ColumnDecoder if it 
does not have the meta data for a CF. Clients responsibility would be to create 
a new connection.  
2. Re-get the meta data if an unknown CF is returned. Unsure about the 
implications, if any, of lots of connections discovering they have bad meta 
data all at once. 


INSERT and CREATE COLUMNFAMILY return void resultsets, the 0 column count is to 
be expected. 

btw, thanks for the nice bug report :)
 

> NPE running res.next() for a select statement
> ---------------------------------------------
>
>                 Key: CASSANDRA-2734
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-2734
>             Project: Cassandra
>          Issue Type: Bug
>    Affects Versions: 0.8.0 beta 2
>            Reporter: Cathy Daw
>            Assignee: Aaron Morton
>            Priority: Minor
>              Labels: cql
>
> *The following statement fails when used with a Statement or 
> PreparedStatement*
> {code}
> res = stmt.executeQuery("SELECT bar FROM users");  
> res.next();
> {code}
> *Error Message*
> {code}
>     [junit] Testcase: simpleSelect(com.datastax.cql.reproBugTest):    Caused 
> an ERROR
>     [junit] null
>     [junit] java.lang.NullPointerException
>     [junit]   at 
> org.apache.cassandra.cql.jdbc.ColumnDecoder.makeKeyColumn(ColumnDecoder.java:136)
>     [junit]   at 
> org.apache.cassandra.cql.jdbc.CResultSet.next(CResultSet.java:388)
>     [junit]   at 
> com.datastax.cql.reproBugTest.simpleSelect(reproBugTest.java:57)
>     [junit] 
>     [junit] 
>     [junit] Test com.datastax.cql.reproBugTest FAILED
> {code}
> *Here is a quick repro.  Showing that res.next() works with other statements 
> but not select.*
> _Also notice that ResultSet.getMetaData().getColumnCount() always returns 
> zero._  
> _I noticed in the existing driver tests similar test cases, so not sure the 
> issue._
> *Steps to run script*
> * you will need to drop this in your test directory
> * change the package declaration
> * ant test -Dtest.name=reproBugTest
> {code}
> package com.datastax.cql;
> import java.sql.DriverManager;
> import java.sql.Connection;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> import org.junit.Test;
> public class reproBugTest {
>     
>     @Test
>     public void simpleSelect() throws Exception {   
>         Connection connection = null;
>         ResultSet res;
>         Statement stmt;
>         int colCount = 0;
>         
>         try {
>             Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
>             
>             // Check create keyspace
>             connection = 
> DriverManager.getConnection("jdbc:cassandra:root/[email protected]:9160/default");
>      
>             stmt = connection.createStatement();
>             try {
>               System.out.println("Running DROP KS Statement");  
>               res = stmt.executeQuery("DROP KEYSPACE ks1");  
>               res.next();
>               
>               System.out.println("Running CREATE KS Statement");
>               res = stmt.executeQuery("CREATE KEYSPACE ks1 with 
> strategy_class =  'org.apache.cassandra.locator.SimpleStrategy' and 
> strategy_options:replication_factor=1");  
>               res.next();
>             } catch (SQLException e) {
>                 if (e.getMessage().startsWith("Keyspace does not exist")) 
>                 {
>                     res = stmt.executeQuery("CREATE KEYSPACE ks1 with 
> strategy_class =  'org.apache.cassandra.locator.SimpleStrategy' and 
> strategy_options:replication_factor=1");  
>                 } 
>             }   
>             connection.close();    
>             
>             // Run Test
>             connection = 
> DriverManager.getConnection("jdbc:cassandra:root/[email protected]:9160/ks1");   
>   
>             stmt = connection.createStatement();
>             System.out.print("Running CREATE CF Statement");
>             res = stmt.executeQuery("CREATE COLUMNFAMILY users (KEY varchar 
> PRIMARY KEY, password varchar, gender varchar, session_token varchar, state 
> varchar, birth_year bigint)");    
>             colCount = res.getMetaData().getColumnCount();
>             System.out.println(" -- Column Count: " + colCount); 
>             res.next();
>             
>             System.out.print("Running INSERT Statement");
>             res = stmt.executeQuery("INSERT INTO users (KEY, password) VALUES 
> ('user1', 'ch@nge')");  
>             colCount = res.getMetaData().getColumnCount();
>             System.out.println(" -- Column Count: " + colCount); 
>             res.next();
>             
>             System.out.print("Running SELECT Statement");
>             res = stmt.executeQuery("SELECT bar FROM users");  
>             colCount = res.getMetaData().getColumnCount();
>             System.out.println(" -- Column Count: " + colCount); 
>             res.getRow();
>             res.next();
>                 
>             connection.close();               
>         } catch (SQLException e) {
>             e.printStackTrace();
>         }
>     }
>        
> }
> {code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to