[
https://issues.apache.org/jira/browse/CALCITE-5443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17650023#comment-17650023
]
Gregory Hart commented on CALCITE-5443:
---------------------------------------
I updated the description. Let me know if it's still not clear what is the
problem.
Yes, this issue applies to both {{getMoreResults()}} and
{{{}getMoreResults(int){}}}. They both return {{false}} to indicate that the
client should call {{getUpdateCount()}} to determine if there are additional
results that provide an update count. The patch I provided fixes it for both
methods.
> Reset update count when checking for more results
> -------------------------------------------------
>
> Key: CALCITE-5443
> URL: https://issues.apache.org/jira/browse/CALCITE-5443
> Project: Calcite
> Issue Type: Bug
> Components: avatica
> Reporter: Gregory Hart
> Assignee: Gregory Hart
> Priority: Major
> Time Spent: 10m
> Remaining Estimate: 0h
>
> After {{java.sql.Statement.getMoreResults()}} has returned false,
> {{Statement.getUpdateCount()}} should return {{{}-1{}}}. This indicates to
> the client that there are no additional result sets available. Calcite
> currently supports at most one result set per SQL statement.
> *Background*
> Some databases, such as Oracle Database, allow stored procedures to return
> multiple result sets. The JDBC API provides {{Statement.getMoreResults()}}
> for users to check if the statement has more than one result set and to
> retrieve the next result set. Calcite does not support this feature and only
> returns zero or one result set. The problem is that Calcite sometimes returns
> the wrong value for {{Statement.getUpdateCount()}} and indicates that
> additional results are available.
> The JavaDoc for {{java.sql.Statement#getMoreResults(int)}} says there are no
> more results when the following is true:
> {code:java}
> // stmt is a Statement object
> ((stmt.getMoreResults(current) == false) && (stmt.getUpdateCount() == -1))
> {code}
> In {{{}AvaticaStatement{}}}, {{getMoreResults(int)}} always returns {{false}}
> to indicate there are no more {{ResultSet}} objects, but does not reset the
> {{updateCount}} which can indicate that there was an additional result (but
> that's not true). Since the JavaDoc states that clients should call both
> {{getMoreResults}} and {{getUpdateCount}} to determine if there are more
> results, any client that has the above Java code in a while loop would never
> reach an exit condition resulting in an infinite loop.
> *Steps to reproduce:*
> # Execute an INSERT query by calling Statement#execute(String). Verify that
> the return value is false indicating it is an update count.
> # Call Statement#getMoreResults(). Verify that the return value is false
> indicating it is an update count or there are no more results.
> # Call Statement#getUpdateCount().
> *Expected results:*
> The call to getUpdateCount() returns -1 indicating there are no more results.
> *Actual results:*
> The call to getUpdateCount() returns the update count for the INSERT query,
> which should only have one result.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)