Daniel Barclay (Drill) created DRILL-3267:
---------------------------------------------
Summary: Distinguish non-query statements in SQL processing and
RPC protocol
Key: DRILL-3267
URL: https://issues.apache.org/jira/browse/DRILL-3267
Project: Apache Drill
Issue Type: Bug
Reporter: Daniel Barclay (Drill)
Drill needs to distinguish, in some way that the client side can detect,
between SQL statements whose purpose is to change state (e.g., DROP VIEW and
SET SCHEMA statements) and statements whose purpose is to return a result set
(e.g., SELECT statements).
This distinction is needed to support normal behavior of JDBC's execute
methods: When called to execute a DDL-like statement, an execute method will
not return until the action is completed. (See DRILL-2560.)
(For query statements, an execute method has to return before the query is
fully complete (the result set has been read), because of course it has to
return the ResultSet through which the results are read.)
Currently, Drill returns a result set for any SQL statement: the real result
set for a query statement, and a dummy/status result set (typically with
columns "ok" and "summary") for a DDL-like statement.
This means that the JDBC layer cannot distinguish between statements for which
execute methods should wait for completion before returning vs. statements for
which execute methods can return to client code. (Again, see DRILL-2560.)
One solution might be to not return any dummy/status result set for DDL-like
statements. If that meant that no QueryData messages were sent for such a
statement, then the first message after the query-ID message would be the
termination message.
In that case, the JDBC layer could wait for the first post-query-ID message
before returning from an execute method:
If the message is a termination message, then the statement was a DDL-like
statement, the JDBC should have waited for completion, it _has_ already waited,
and can return (returning no result set).
If the message is a QueryData message, then the statement was a query
statement, so the method doesn't need to wait any further (and has waited
enough to allow parsing or other up-front errors to be reported from the
execute method rather than later from ResultSet.next()), and can return
(returning a result set).
Another solution might be to have multiple forms (combinations of values) of
the QueryData message.
Another thing to keep in mind is JDBC's support for statements that return
multiple results, where each result can be either a result set or an integer
(e.g., an inserted-records count). If Drill ever needs to support that, then
QueryData or other messages will need something.)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)