[ 
https://issues.apache.org/jira/browse/DERBY-716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12491734
 ] 

A B commented on DERBY-716:
---------------------------

I took a look at the functional spec for this issue and had the following 
questions.  Apologies in advance for anything painfully obvious that I may have 
missed...

Under the "New SELECT Syntax" section:
-------------------------------------------

 - Syntax for "TableFunctionInvocation" is missing parentheses that are 
required according to SQL 2003 7.6 <table function derived table>.  Need a left 
paren before "function-name" and a right paren at the end of the line.

   I think the example at the end of this section needs to be updated, as well.

 - "Value - A Value is an expression which could appear as a column in a 
standalone VALUES
    statement. That is, it is built out of literals, '?' parameters, and 
function calls."

 A standalone VALUES clause can include other types of expressions, as well.  
For example:

     ij> values (select distinct 2 from sys.systables);
 
 Would this kind of expression be allowed within a TableFunctionInvocation? I'm 
assuming not, but just thought I'd ask.  Note that such an expression is *not* 
currently allowed with the SYSCS_DIAG table functions (DERBY-2152).

 Also, what does "function calls" mean here?  Is this just referring to the SQL 
functions supported by Derby?  Or are we talking about JDBC escape functions 
and/or other user-defined functions ("CREATE FUNCTION") as well?

Under "System Tables":
----------------------------

 - "Each column in the returned table is represented by a row in SYSCOLUMNS 
just as each
    function parameter is."

 It's not clear to me why we need to store information about the function 
parameters in SYSCOLUMNS.  The Derby documentation says that SYSCOLUMNS 
"Describes the columns within all tables in the current database."  I'm not 
sure how function parameter info fits that description.  Can you elaborate on 
this?

 Note that based on some simple testing it would appear that we do *not* 
include info about parameters for other Derby functions.  Ex:

    ij version 10.3
    ij> connect 'dbdb;create=true';
    ij> select count(*) from sys.syscolumns;
    1
    -----------
    119

    1 row selected
    ij> create function myf (i int, vc varchar(200)) returns integer
        parameter style java language java external name 'hmm.myFunction';
    0 rows inserted/updated/deleted
    ij> select count(*) from sys.syscolumns;
    1
    -----------
    119

    1 row selected

 We can see that no rows are added for the function parameters "i" nor for 
"vc".  And that seems fine since information about the parameters is, as the 
spec says, available from the DBMD.getFunctionColumns() method.  So what is the 
need for having rows in SYSCOLUMNS for parameters defined in a table function?

 And going one step further, it even seems odd to me to keep the return columns 
themselves in SYSCOLUMNs.  For one thing, a table function is ultimately a 
*function*, not a *table*, and hence doesn't fall into the category of "all 
tables in the current database".  The argument here may be that the function 
ultimately _returns_ a table, and that the resultant table _does_ fit the 
description of "all tables in the current database". But in that case I think 
it's worth mentioning that the result is a *derived* table and is therefore 
neither persistent (the function is persistent but the table is not) nor 
referenceable outside of a specific query.  So it seems odd to me to add rows 
for such a table into SYSCOLUMNS.

 But it's quite possible I'm missing something obvious, so feel free to correct 
me :)

Under "Type System"
------------------------

 - "We introduce a new Derby type RowMultisetImpl. This is the return type of 
Table Functions.
   A RowMultisetImpl  contains all of the column names in the returned table as 
well as their
   datatypes."

 Okay, sorry for the really dumb question, but...how does this new type fit 
into the picture?

 From the spec the only use I can see is that this is what will be returned 
from a call to the proposed "getReturnType()" method on RoutineAliasInfo.

 In particular, I'm wondering if this is something the user will see, or is 
this just internal to Derby?  If it's internal to Derby then what is the need 
for this type here? The reason I ask is that we already have diagnostic table 
functions working in Derby (see DERBY-1852) and those functions do not depend 
on any new types; so what is it about the proposed DERBY-716 changes that 
require the new RowMultisetImpl type?  Is this related to the fact that we want 
the table function to map to a static Java method (which is different from the 
diagnostic VTIs)?

 Also, it's not immediately clear to me why we need a new Formatable id for 
this type.  My underlying assumption here is that a formatable id is only 
required for serialization of the object (typically for writing/reading to/from 
disk).  This is based on the following javadoc from 
iapi/services/io/StoredFormatIds:

    A format id identifies a stored form of an object for the
    purposes of locating a class which can read the stored form and
    reconstruct the object using the java.io.Externalizable interface.

So can you envision any places where we would need to store/reconstruct a 
RowMultisetImpl via (de-)serialization? It seems like if we want to store the 
derived table result persistently we would just create an actual table and then 
select into it.  Which is, for example, exactly what the example shown in the 
"New SELECT Syntax" section shows:

    INSERT INTO employees
      SELECT s.*
        FROM TABLE (externalEmployees('jdbc:mysql://localhost/hr')) s;

Or as an alternate example, Derby currently supports the following:

   ij> create table st as select * from
          table (syscs_diag.space_table('T1')) s with no data;

   ij> insert into st select * from table (syscs_diag.space_table('T1')) s;

There are of course other internal reasons to serialize an object, ex. 
iapi/types/SqlXmlUtil is serialized (and therefore needs a format id) because 
it used as a "saved object".  Do you foresee a scenario where this could happen 
with user-defined table functions?

> 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
>
>
> 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.

Reply via email to