[ 
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)

Reply via email to