I have logged https://issues.apache.org/jira/browse/CALCITE-3716. No
one is working on fixing it currently.

On Tue, Jan 7, 2020 at 2:14 AM Juan Pan <[email protected]> wrote:
>
> Thanks your explanation, Julian. Does it mean the optimization of this JDBC 
> interface may be included in next release of Calcite?
>
>
>  Juan Pan (Trista)
>
> Senior DBA & PPMC of Apache ShardingSphere(Incubating)
> E-mail: [email protected]
>
>
>
>
> On 01/7/2020 11:17,Julian Hyde<[email protected]> wrote:
> Yes, we should be returning “” rather than null.
>
> (Not an excuse, but that method is so old that I suspect that the authors of 
> JDBC were still thinking in terms of ODBC. In C it’s difficult to return a 
> null, it’s easier to return an empty string.)
>
> Julian
>
>
> On Jan 6, 2020, at 7:03 PM, Juan Pan <[email protected]> wrote:
>
> 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: [email protected]
>
>
>
>
> On 01/7/2020 10:56,Juan Pan<[email protected]> 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: [email protected]
>
>
>
>
> On 01/7/2020 04:12,Julian Hyde<[email protected]> 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 <[email protected]> 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: [email protected]
>
>
>

Reply via email to