[
https://issues.apache.org/jira/browse/DERBY-716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12493405
]
A B commented on DERBY-716:
---------------------------
Thank you for answering my previous questions, Rick, and for incorporating my
feedback into the second version of the spec. I took a look at the latest spec
and I have the following questions...
1) Under "Additional SELECT Syntax"
"Value - A Value is an expression which could appear as an argument in the
invocation
of one of the diagnostic VTI functions. This includes literals and '?'
parameters."
I wonder if it wouldn't be better to just explicitly state what is allowed
here, instead of referencing the diagnostic VTIs? I.e. "Value" can be any
expression which evaluates to a single value whose corresponding JDBC type
equals the JDBC equivalent of the relevant function parameter's declared SQL
type.
That's a mouthful (you'll probably want to wordsmith it a bit), but as an
example:
CREATE FUNCTION externalEmployees (LAST_NAME VARCHAR(50))
RETURNS TABLE ...
The function parameter "LAST_NAME" has a declared SQL type of VARCHAR. The
JDBC equivalent to this type is String. Call this PARAM_JDBC_TYPE. Then when
calling the function:
SELECT * FROM TABLE (externalEmployees( <Value> )) as EMP
<Value> can be any expression that evaluates to a type whose JDBC equivalent is
PARAM_JDBC_TYPE. One exception here may be LOBs; I don't think Derby allows
passing of LOBs as function parameters?
In this case PARAM_JDBC_TYPE is "String", so <Value> can be any character
expression. And yes, this includes literals and '?' parameters.
Note that something like:
SELECT * FROM TABLE (externalEmployees(SELECT DISTINCT 'hi' FROM
SYS.SYSTABLES)) as EMP
would not work because the subquery returns "a result set with a single row",
which is not the same as "a single value".
2) Under "Appendix E: Sample VTI"
It's great to have an example, so thank you for putting this together. Some
initial comments...
A -- The javadoc for the class includes:
* 3) When you are done siphoning out the rows you need, release the
* connection to the external database:
*
* EmployeeTable.close();
I don't quite understand who the "you" is in this sentence? It sounds like
it's referring to the user, but it seems odd to me to expect that the user is
responsible for explicitly calling "close" on the VTI class.
Is the assumption here that an application will typically execute code such as:
ResultSet rs = conn.createStatement().executeQuery(
"select * from TABLE (employeeTable()) emps");
while (rs.next())
{
...
}
rs.close();
EmployeeTable.close();
If this is not what you had in mind, can you perhaps include an example
program that would call the EmployeeTable VTI, process results, and then clean
up?
Intuitively I would expect that a call to "rs.close()" internally leads Derby
to call "close()" on the VTI class, sparing the user the need to do so. Which
brings me to my next question...
B -- What is "rs" in the following:
ResultSet rs = conn.createStatement().executeQuery(
"select * from TABLE (employeeTable()) emps");
Is it:
a) The exact same ResultSet object that is returned from EmployeeTable.read()
b) A Derby ResultSet that somehow wraps the the EmployeeTable VTI
c) A Derby ResultSet that somehow wraps the ResultSet returned from
EmployeeTable.read()
d) Something else entirely?
If it's "a" then the user/app would indeed be responsible for calling
EmployeeTable.close() explicitly, which seems odd. If it's "b" then Derby can
internally propagate "rs.close()" to EmployeeTable.close(), but would not have
direct access to the underlying result set (or would it?). If it's "c" then
Derby has more control over the behavior of the result set and can propagate
calls on "rs" to the underlying (user-defined) ResultSet--but Derby would not
be able to call methods on the VTI itself (such as EmployeeTable.close()). Can
you say which of these, if any, correlates to your plans for VTIs?
Thanks for your patience as I try to wrap my head around this...
> Re-enable VTIs
> --------------
>
> Key: DERBY-716
> URL: https://issues.apache.org/jira/browse/DERBY-716
> Project: Derby
> Issue Type: New Feature
> Components: SQL
> Reporter: Rick Hillegas
> Attachments: functionTables.html, functionTables.html
>
>
> Cloudscape used to expose Virtual Table Interfaces, by which any class which
> implemented ResultSet could be included in a query's FROM list. Derby still
> exposes a number of these VTIs as diagnostic tools. However, Derby now
> prevents customers from declaring their own VTIs. The parser raises an error
> if a VTI's package isn't one of the Derby diagnostic packages.
> This is a very powerful feature which customers can use to solve many
> problems. We should discuss the reasons that it was disabled and come up with
> a plan for putting this power back into our customers' hands.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.