[ https://issues.apache.org/jira/browse/CALCITE-1052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15095098#comment-15095098 ]
Josh Elser commented on CALCITE-1052: ------------------------------------- I've hacked together a little script locally based on what you said here: {noformat} ==> create_integer_table.sql <== drop table if exists integer_table; create table integer_table (id integer not null primary key, column1 integer); UPSERT INTO INTEGER_TABLE VALUES(1, 1); UPSERT INTO INTEGER_TABLE VALUES(2, 2); UPSERT INTO INTEGER_TABLE VALUES(3, 3); ==> create_string_table.sql <== drop table if exists varchar_table; create table varchar_table (id integer not null primary key, column1 varchar(50)); UPSERT INTO VARCHAR_TABLE VALUES(1, 'str_1'); UPSERT INTO VARCHAR_TABLE VALUES(2, 'str_2'); UPSERT INTO VARCHAR_TABLE VALUES(3, 'str_3'); {noformat} I inserted 50k records this way (upserts 4 through 49999 omitted for obv reasons). I then ran two loops querying for records in the tables via sqlline-thin.py: {noformat} ==> query_integer.sql <== SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; SELECT column1 FROM INTEGER_TABLE where id = 5000; ... ==> query_string.sql <== SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; SELECT column1 FROM VARCHAR_TABLE where id = 5000; ... {noformat} {noformat} while true; do /usr/local/lib/phoenix/bin/sqlline-thin.py ~/query_string.sql; done {noformat} {noformat} while true; do /usr/local/lib/phoenix/bin/sqlline-thin.py ~/query_integer.sql; done {noformat} Given what you described, [~kliew], I should expected to see "5000" showing up while querying VARCHAR_TABLE and "str_5000" while querying INTEGER_TABLE (or some errors casting "str_5000" into an integer). However, I did not see this. I'll try updating Phoenix and Calcite to their most recent snapshots and re-running to check for a regression, but I am not anticipating seeing what you describe. If you can create a test case which shows this actually happening, that would extremely helpful. Right now, I can only assume that for your own driver, you did not create unique connectionIDs. I'm still baffled about seeing this with the JDBC driver as you said though. > Phoenix queryserver sends result set in response to the wrong request when > there are concurrent requests > -------------------------------------------------------------------------------------------------------- > > Key: CALCITE-1052 > URL: https://issues.apache.org/jira/browse/CALCITE-1052 > Project: Calcite > Issue Type: Bug > Reporter: Kevin Liew > Assignee: Josh Elser > Priority: Critical > Labels: phoenix, queryserver > > Create two tables > {code:sql} > DROP TABLE IF EXISTS SEN.VARCHAR_TABLE; > CREATE TABLE IF NOT EXISTS SEN.VARCHAR_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 VARCHAR(510)); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("One","1"); > {code} > {code:sql} > DROP TABLE IF EXISTS SEN.INTEGER_TABLE; > CREATE TABLE IF NOT EXISTS SEN.INTEGER_TABLE( > KeyColumn VARCHAR(255) PRIMARY KEY, > Column1 INTEGER); > UPSERT INTO SEN.VARCHAR_TABLE VALUES ("Two",2); > {code} > Running these two programs results in several crashes. > 1. select a varchar by parameterized statement resulting in > SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE KeyColumn = 'One' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765"); > conn.setAutoCommit(true); > String sqlStmt = "SELECT Column1 FROM SEN.VARCHAR_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "One"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > String column1 = rs.getString("column1"); > if (!column1.equals("1")) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > 2. select an integer by parameterized statement resulting in > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = 'Two' > {code:java} > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.SQLException; > import java.sql.PreparedStatement; > import java.sql.Statement; > public class Hello_World { > public static void main(String[] args) throws SQLException { > try { > Class.forName("org.apache.phoenix.queryserver.client.Driver"); > } catch (ClassNotFoundException e) { > System.out.println("Where is your PhoenixDriver"); > e.printStackTrace(); > return; > } > Connection conn = > DriverManager.getConnection("jdbc:phoenix:thin:url=http://192.168.222.52:8765"); > conn.setAutoCommit(true); > > String sqlStmt = "SELECT Column1 FROM SEN.INTEGER_TABLE WHERE > KeyColumn = ?"; > System.out.println("SQL Statement:\n\t" + sqlStmt); > > while(true) > { > ResultSet rset = null; > > //Statement stmt = conn.createStatement(); > PreparedStatement stmt = conn.prepareStatement(sqlStmt); > stmt.setString(1, "Two"); > ResultSet rs = stmt.executeQuery(); > > while (rs.next()) { > int column1 = rs.getInt("column1"); > if (column1 != 2) > { > System.out.println(column1); > } > } > } > > //conn.close(); > } > > } > {code} > There are several crashes (might be preventable by adding a pause in the > loops?), but the one relevant to this bug is: > {code:java} > SQL Statement: > SELECT Column1 FROM SEN.INTEGER_TABLE WHERE KeyColumn = ? > Exception in thread "main" java.lang.ClassCastException: java.lang.String > cannot be cast to java.lang.Number > at > org.apache.calcite.avatica.util.AbstractCursor$NumberAccessor.getNumber(AbstractCursor.java:661) > at > org.apache.calcite.avatica.util.AbstractCursor$BigNumberAccessor.getInt(AbstractCursor.java:602) > at > org.apache.calcite.avatica.AvaticaResultSet.getInt(AvaticaResultSet.java:314) > at Hello_World.main(Hello_World.java:36) > {code} > where we get a string from SEN.VARCHAR_TABLE while we are querying from the > SEN.INTEGER_TABLE. > The queryserver is sending the result set in response to a request made from > another connection id. The statement id was not checked but there may have > been a statement id collision -- This message was sent by Atlassian JIRA (v6.3.4#6332)