[ 
https://issues.apache.org/jira/browse/HIVE-23105?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Arnaud Linz updated HIVE-23105:
-------------------------------
    Description: 
Migrating from CDH 5.16 (Hive 1.1.0+) to CDH 6.3 (Hive 2.1.1+) introduced a 
regression in the the JDBC driver.

It was detected in a "agnostic" jdbc handling service which works for several 
DBMS including Teradata, Impala, and the former Hive driver.

 

java.sql.Statement JDBC Interface method :
{code:java}
 /** 
     *  Retrieves the current result as an update count; 
     *  if the result is a <code>ResultSet</code> object or there are no more 
results, -1 
     *  is returned. This method should be called only once per result. 
     * 
     * @return the current result as an update count; -1 if the current result 
is a 
     * <code>ResultSet</code> object or there are no more results 
     * @exception SQLException if a database access error occurs or 
     * this method is called on a closed <code>Statement</code> 
     * @see #execute 
     */ 
    int getUpdateCount() throws SQLException; {code}
    Does not return -1 when it should, it rather throws :

 
{code:java}
Caused by: java.sql.SQLException: 
org.apache.thrift.protocol.TProtocolException: Required field 'operationHandle' 
is unset! Struct:TGetOperationStatusReq(operationHandle:null) 
    at 
org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:395)
 
    at 
org.apache.hive.jdbc.HiveStatement.getUpdateCount(HiveStatement.java:688) 
    ... 30 more 
Caused by: org.apache.thrift.protocol.TProtocolException: Required field 
'operationHandle' is unset! Struct:TGetOperationStatusReq(operationHandle:null) 
    at 
org.apache.hive.service.rpc.thrift.TGetOperationStatusReq.validate(TGetOperationStatusReq.java:294)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.validate(TCLIService.java:12587)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12644)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12613)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.write(TCLIService.java:12564)
 
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:71) 
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62) 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$Client.send_GetOperationStatus(TCLIService.java:461)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$Client.GetOperationStatus(TCLIService.java:453)
 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at 
org.apache.hive.jdbc.HiveConnection$SynchronizedHandler.invoke(HiveConnection.java:1415)
 
    at com.sun.proxy.$Proxy20.GetOperationStatus(Unknown Source) 
    at 
org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:364)
 
    ... 33 more {code}
 

And method:
{code:java}
    /** 
     * Moves to this <code>Statement</code> object's next result, returns 
     * <code>true</code> if it is a <code>ResultSet</code> object, and 
     * implicitly closes any current <code>ResultSet</code> 
     * object(s) obtained with the method <code>getResultSet</code>. 
     * 
     * <P>There are no more results when the following is true: 
     * <PRE>{@code 
     *     // stmt is a Statement object 
     *     ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) 
     * }</PRE> 
     * 
     * @return <code>true</code> if the next result is a <code>ResultSet</code> 
     *         object; <code>false</code> if it is an update count or there are 
     *         no more results 
     * @exception SQLException if a database access error occurs or 
     * this method is called on a closed <code>Statement</code> 
     * @see #execute 
     */ 
    boolean getMoreResults() throws SQLException; 
{code}
Always returns true if the statement is not a result set whereas false is 
expected (especially since the javadoc's ((stmt.getMoreResults() == false) && 
(stmt.getUpdateCount() == -1)) throws an Exception...) 

 

 

 

 

  was:
Migrating from CDH 5.16 (Hive 1.1.0+) to CDH 6.3 (Hive 2.1.1+) introduced a 
regression in the the JDBC driver.

It was detected in a "agnostic" jdbc handling service which works for several 
DBMS including Teradata, Impala, and the former Hive driver.

 

 

Statement JDBC Method :
{code:java}
 /** 
     *  Retrieves the current result as an update count; 
     *  if the result is a <code>ResultSet</code> object or there are no more 
results, -1 
     *  is returned. This method should be called only once per result. 
     * 
     * @return the current result as an update count; -1 if the current result 
is a 
     * <code>ResultSet</code> object or there are no more results 
     * @exception SQLException if a database access error occurs or 
     * this method is called on a closed <code>Statement</code> 
     * @see #execute 
     */ 
    int getUpdateCount() throws SQLException; {code}
    Does not return -1 when it should it rather throws :

 
{code:java}
Caused by: java.sql.SQLException: 
org.apache.thrift.protocol.TProtocolException: Required field 'operationHandle' 
is unset! Struct:TGetOperationStatusReq(operationHandle:null) 
    at 
org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:395)
 
    at 
org.apache.hive.jdbc.HiveStatement.getUpdateCount(HiveStatement.java:688) 
    ... 30 more 
Caused by: org.apache.thrift.protocol.TProtocolException: Required field 
'operationHandle' is unset! Struct:TGetOperationStatusReq(operationHandle:null) 
    at 
org.apache.hive.service.rpc.thrift.TGetOperationStatusReq.validate(TGetOperationStatusReq.java:294)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.validate(TCLIService.java:12587)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12644)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12613)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.write(TCLIService.java:12564)
 
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:71) 
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62) 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$Client.send_GetOperationStatus(TCLIService.java:461)
 
    at 
org.apache.hive.service.rpc.thrift.TCLIService$Client.GetOperationStatus(TCLIService.java:453)
 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at 
org.apache.hive.jdbc.HiveConnection$SynchronizedHandler.invoke(HiveConnection.java:1415)
 
    at com.sun.proxy.$Proxy20.GetOperationStatus(Unknown Source) 
    at 
org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:364)
 
    ... 33 more {code}
 

And method:
{code:java}
    /** 
     * Moves to this <code>Statement</code> object's next result, returns 
     * <code>true</code> if it is a <code>ResultSet</code> object, and 
     * implicitly closes any current <code>ResultSet</code> 
     * object(s) obtained with the method <code>getResultSet</code>. 
     * 
     * <P>There are no more results when the following is true: 
     * <PRE>{@code 
     *     // stmt is a Statement object 
     *     ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) 
     * }</PRE> 
     * 
     * @return <code>true</code> if the next result is a <code>ResultSet</code> 
     *         object; <code>false</code> if it is an update count or there are 
     *         no more results 
     * @exception SQLException if a database access error occurs or 
     * this method is called on a closed <code>Statement</code> 
     * @see #execute 
     */ 
    boolean getMoreResults() throws SQLException; 
{code}
Always returns true if the statement is not a result set whereas false is 
expected (especially since the javadoc's ((stmt.getMoreResults() == false) && 
(stmt.getUpdateCount() == -1)) throws an Exception...) 

 

 

 

 


> HiveServer2 regression breaks getUpdateCount / getMoreResult API contract
> -------------------------------------------------------------------------
>
>                 Key: HIVE-23105
>                 URL: https://issues.apache.org/jira/browse/HIVE-23105
>             Project: Hive
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 2.1.1
>            Reporter: Arnaud Linz
>            Priority: Major
>
> Migrating from CDH 5.16 (Hive 1.1.0+) to CDH 6.3 (Hive 2.1.1+) introduced a 
> regression in the the JDBC driver.
> It was detected in a "agnostic" jdbc handling service which works for several 
> DBMS including Teradata, Impala, and the former Hive driver.
>  
> java.sql.Statement JDBC Interface method :
> {code:java}
>  /** 
>      *  Retrieves the current result as an update count; 
>      *  if the result is a <code>ResultSet</code> object or there are no more 
> results, -1 
>      *  is returned. This method should be called only once per result. 
>      * 
>      * @return the current result as an update count; -1 if the current 
> result is a 
>      * <code>ResultSet</code> object or there are no more results 
>      * @exception SQLException if a database access error occurs or 
>      * this method is called on a closed <code>Statement</code> 
>      * @see #execute 
>      */ 
>     int getUpdateCount() throws SQLException; {code}
>     Does not return -1 when it should, it rather throws :
>  
> {code:java}
> Caused by: java.sql.SQLException: 
> org.apache.thrift.protocol.TProtocolException: Required field 
> 'operationHandle' is unset! 
> Struct:TGetOperationStatusReq(operationHandle:null) 
>     at 
> org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:395)
>  
>     at 
> org.apache.hive.jdbc.HiveStatement.getUpdateCount(HiveStatement.java:688) 
>     ... 30 more 
> Caused by: org.apache.thrift.protocol.TProtocolException: Required field 
> 'operationHandle' is unset! 
> Struct:TGetOperationStatusReq(operationHandle:null) 
>     at 
> org.apache.hive.service.rpc.thrift.TGetOperationStatusReq.validate(TGetOperationStatusReq.java:294)
>  
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.validate(TCLIService.java:12587)
>  
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12644)
>  
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args$GetOperationStatus_argsStandardScheme.write(TCLIService.java:12613)
>  
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$GetOperationStatus_args.write(TCLIService.java:12564)
>  
>     at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:71) 
>     at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62) 
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$Client.send_GetOperationStatus(TCLIService.java:461)
>  
>     at 
> org.apache.hive.service.rpc.thrift.TCLIService$Client.GetOperationStatus(TCLIService.java:453)
>  
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>     at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
>     at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  
>     at java.lang.reflect.Method.invoke(Method.java:498) 
>     at 
> org.apache.hive.jdbc.HiveConnection$SynchronizedHandler.invoke(HiveConnection.java:1415)
>  
>     at com.sun.proxy.$Proxy20.GetOperationStatus(Unknown Source) 
>     at 
> org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:364)
>  
>     ... 33 more {code}
>  
> And method:
> {code:java}
>     /** 
>      * Moves to this <code>Statement</code> object's next result, returns 
>      * <code>true</code> if it is a <code>ResultSet</code> object, and 
>      * implicitly closes any current <code>ResultSet</code> 
>      * object(s) obtained with the method <code>getResultSet</code>. 
>      * 
>      * <P>There are no more results when the following is true: 
>      * <PRE>{@code 
>      *     // stmt is a Statement object 
>      *     ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == 
> -1)) 
>      * }</PRE> 
>      * 
>      * @return <code>true</code> if the next result is a 
> <code>ResultSet</code> 
>      *         object; <code>false</code> if it is an update count or there 
> are 
>      *         no more results 
>      * @exception SQLException if a database access error occurs or 
>      * this method is called on a closed <code>Statement</code> 
>      * @see #execute 
>      */ 
>     boolean getMoreResults() throws SQLException; 
> {code}
> Always returns true if the statement is not a result set whereas false is 
> expected (especially since the javadoc's ((stmt.getMoreResults() == false) && 
> (stmt.getUpdateCount() == -1)) throws an Exception...) 
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to