FYI. 

The following information comes from `java.sql.ResultSetMetaData`.


    /**
     * Gets the designated column's table name.
     *
     * @param column the first column is 1, the second is 2, ...
     * @return table name or "" if not applicable
     * @exception SQLException if a database access error occurs
     */
    String getTableName(int column) throws SQLException;


 Juan Pan (Trista) 
                         
Senior DBA & PPMC of Apache ShardingSphere(Incubating)
E-mail: panj...@apache.org




On 01/7/2020 10:56,Juan Pan<panj...@apache.org> wrote:
Hi Julian,


You’re right. From my tests, since “a” is not from table test, 
getTableName(columnIndex) returns `empty string` from MySQL and H2 databases, 
and `null` from calcite. It makes sense.
The scenario happened to me is that  some of third-part applications or 
open-source projects would call some jdbc interfaces, like 
getTableName(columnIndex). 
As a result, when they call getTableName(columnIndex), the null result from 
calcite makes them throw NPE, but empty string from DBs avoid this case.


Julian, very appreciated your help. :-)


Best wishes,
Trista


 Juan Pan (Trista) 
                         
Senior DBA & PPMC of Apache ShardingSphere(Incubating)
E-mail: panj...@apache.org




On 01/7/2020 04:12,Julian Hyde<jh...@apache.org> wrote:
JDBC table names and column names are of limited use. They tell you where a 
particular column comes from, and your “a” column does not come (directly) from 
a table. I think you’ll find that Calcite is implementing the JDBC standard 
correctly, and is consistent with other databases.

What do you need the table name for?

If you want to understand the structure of the query - e.g. the fact that the 
query is sourced from the “test” table - then your might be better working with 
the SqlNode or RelNode representations. The RelNode representation of your 
query is


Aggregate(count(*) as a)
^
|
TableScan(“test”)

and that probably tells you what you need to know.

Julian


On Jan 5, 2020, at 11:42 PM, Juan Pan <panj...@apache.org> wrote:



Hi Calcite Community,


Thanks for your attention. After failing self-helping by debug source code, i 
sent this email for your help. :)


My query SQL is `SELECT count(*) a FROM test`, and i called JDBC interface, 
i.e, `ResultSet.getMetaData().getTableName(1)` to get table name, i.e, test, 
however the result of which is null.
I traced the process and found that if !(selectItem instanceof SqlIdentifier) 
then return null in `SqlValidatorImpl.java`. Is there any way to get the real 
table name, i.e, test?


Thanks in advance,


Trista






Juan Pan (Trista)

Senior DBA & PPMC of Apache ShardingSphere(Incubating)
E-mail: panj...@apache.org



Reply via email to