Sure I'll do that :)

Best Regards,
Hari

On Tue, 25 Sep 2018, 09:05 ShaoFeng Shi, <[email protected]> wrote:

> Hi Hari,
>
> Thanks for your comment. The default schema is supported, but please aware
> that the 'default' is a keyword in Calcite, so in the SQL please use
> "DEFAULT" to escape. For example:
>
> select count(*) from "DEFAULT".kylin_sales
>
> Regarding the catalog issue, would you like to report a JIRA to track the
> problem? Kylin should follow the JDBC standard as much as possible.
>
> hosur narahari <[email protected]> 于2018年9月24日周一 下午8:14写道:
>
>> Hi,
>>
>> Yes whatever you said about mysql is true. But when queried from JDBC
>> driver, the values in column "SCHEMA_NAME" is returned for *getCatalogs()
>> *call and *getSchemas()* return empty resultset.
>>
>> All databases' jdbc drivers have one thing in common. If catalog or
>> schema is not empty, it can be used in select query to get the data.
>>
>> I'll explain the scenario where I'm facing problem currently. I'm trying
>> to integrate Kylin with query engines like presto and drill, since Kylin is
>> one of the very few open source cube engines. All query engines query as
>> [catalogName.][schemaName.]tableName. So both will fail to query from
>> Kylin. By adhering it to JDBC standards, we can make integration of Kylin
>> with other open source tools easier.
>>
>> Also is it possible to actually create Catalog in Kylin. If so I can test
>> creating custom catalog and see how it works.
>>
>> Best Regards,
>> Hari
>>
>> On Mon, Sep 24, 2018 at 5:10 PM Xiaoxiang Yu <[email protected]>
>> wrote:
>>
>>> Hi,
>>>
>>> I interested in your question and I check it carefully. I want to share
>>> what I found and I guess it will be a bit helpful.
>>>
>>>
>>>
>>> It is a problem about how to realize/obey SQL standard and JDBC
>>> standard. You think JDBC standard/SQL standard should support [ [
>>> catalogName . ] schemaName . ] tableName in *from clause*. I think it
>>> is right, I found a link(https://calcite.apache.org/docs/reference.html),
>>> apache calcite says they can resolve that pattern.
>>>
>>>
>>>
>>> *tablePrimary:*
>>>
>>> *      [ [ catalogName . ] schemaName . ] tableName*
>>>
>>> *      '(' TABLE [ [ catalogName . ] schemaName . ] tableName ')'*
>>>
>>> *  |   tablePrimary [ EXTEND ] '(' columnDecl [, columnDecl ]* ')'*
>>>
>>> *  |   [ LATERAL ] '(' query ')'*
>>>
>>> *  |   UNNEST '(' expression ')' [ WITH ORDINALITY ]*
>>>
>>> *  |   [ LATERAL ] TABLE '(' [ SPECIFIC ] functionName '(' expression [,
>>> expression ]* ')' ')'*
>>>
>>>
>>>
>>>
>>>
>>> And in JDBC interface these two methods as defined as followed:
>>> (java.sql.DatabaseMetaData)
>>>
>>> [image: * * * * * * * Retrieves the schema names available in this
>>> database. are ordered by and <P>The schema columns are: COL >
>>> <LI><B>TABLE_SCHEM</B> String {Ocode =>} schema name The results String
>>> {ä)code catalog name (may be <code>null</code>) aparam catalog a catalog
>>> name; must match the catalog name as it is stored in the database;
>>> retrieves those without a catalog; null means catalog name should not be
>>> used to narrow down the search. aparam schemapattern a schema name; must
>>> match the schema name as it is stored in the database; null means schema
>>> name should not be used to narrow down the search. areturn a object in
>>> which each row is a schema description Dexception SQLException if a
>>> database access error occurs asee #getSearchStringEscape asince 1.6
>>> ResultSet —(string catalog, String schemapattern) throws SQLException;]
>>>
>>>
>>>
>>> [image: * Retrieves the catalog names available in this database. * are
>>> ordered by catalog name. * catalog column is: * String {acode =>} catalog
>>> name The results * areturn a object in which each row has a single
>>> <code>String</code> column that is a catalog name * aexception SQLException
>>> if a database access error occurs ( ) throws SQLException; ResultSet]
>>>
>>>
>>>
>>> And I write a simple program to test behavior of MySQL JDBC driver and Kylin
>>> JDBC driver. Here are the code and output.
>>>
>>> MySQL did not return empty when call *getSchemas* and return four items
>>> in *getCatalogs*
>>>
>>>
>>>
>>> [image: public static void main(string[] args) throws Exception {
>>> testDriver( •tariverNameSD "org.apache.kylin.jdbc.Driver" , " 7079/1acus" ,
>>> cuserrqame:' "ADMIN", coassworoo "IQ'LIN"); testDriver( 'griverNametSD
>>> "com.mysql . jdbc . Driver" , " jdbc :mysql ://localhost: 3306" , " root" ,
>>> "lacus" ) ; public static void testDriver(String driverName, String url,
>>> String userName, + driverName); Class . forName(driverName) ; Connection
>>> conn = DriverManager.getConnection(ur1, userName, password); getMetaData( )
>>> ; DatabaseMetaData db conn. ResultSet catalogSet = db. getcatalogs() String
>>> catalog = " while (catalogset.next()) { String password) throws Exception {
>>> .getschemas(), Resultset schemaset = db String schema " "; while
>>> (schemaset.next()) { " + "TABLE_CATALOG")); close() conn .]
>>>
>>>
>>>
>>> [image: /Library/Java/JavaVirtuaIMachines/jdk1.8.Ø_181.
>>> jdk/Contents/Home/bin/java . Test log4j • log4j • log4j • TABLE TABLE
>>> org.apache.kylin.jdbc.Driver •WARN No appenders could be found for logger
>>> (org.apache.kylin.jdbc.KylinConnection) . •WARQ Please initialize the log4j
>>> system properly. •WARN See
>>> http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. _CAT
>>> defaultCatalog TABLE_SCHEM LACUS _CATALOG defaultCatalog Test
>>> com.mysql.jdbc.Driver Loading class 'com.mysql.jdbc.Driver'. This is
>>> deprecated. The new driver class is •com.mysql.cj.jdbc.Driver'. The driver
>>> is automatically regis driver class is generally unnecessary. Mon Sep 24
>>> 17:46:33 CST 2018 WAR•J: Establishing SSL connection without server's
>>> identity verification is not recommended. According to MySQL 5.5 connection
>>> must be established by default if explicit option isn't set. For compliance
>>> with existing applications not using SSL the verifyServf You TABLE TABLE
>>> TABLE TABLE need either to explicitly disable SSL by setting useSSL=false,
>>> or set useSSL=true and provide truststore for server certificate
>>> verificatit _CAT _CAT _CAT _CAT information_schema mysql performance_schema
>>> sys]
>>>
>>>
>>>
>>>
>>>
>>> Here is code of how MySQL JDBC do.(com.mysql.jdbc.DatabaseMetadata)
>>>
>>> [image: ( ) throws SQLException { public ResultSet ResultSet results
>>> null; Statement stmt = nut Z; try { - this. conn.createstatement(); stmt -
>>> stmt . setEscapeprocessing( false); stmt. executeQuery( "SHOW DATABASES");
>>> results = ResultsetMetaData resultsMD = results.getMetaData( fields new
>>> Field( " = new ArrayList(); ArrayList tuples eolumnNamee "TABLE _ CAT" ,
>>> (LßDcTypeVD 12 , resul tsMD. getCoIumnD - new acolum rowval tuples. add(new
>>> ByteArrayRow(rowVa1, this. getExceptionIn tuples); Resultset var18 = this.
>>> return var18; finally { if (results null) { try { results . } catch
>>> (SQLException var16) { Assertion Fai led Except ion . shouldNotHappen(
>>> var16) ; eptor())); results = null; if (stmt != null) { try { stmt } catch
>>> (SQLException var15) { Assert ion Failed Exception . shouldNotHappen(
>>> var15) ; - null; stmt -]
>>>
>>>
>>>
>>> [image: public ResultSet Field[] fields hemas() throws SQLException { =
>>> new Field( catablet•ämeo " " , "TABLE_SCHEM", CLBDCTYP%DI, .:tengtmJJ O ) ,
>>> new Field( , ArrayList tuples = new ArrayList(); ResultSet results -
>>> tuples); - this. return results;]
>>>
>>>
>>>
>>>
>>>
>>> Let us look how mysql store infomation of catalog/schema/table, It seems
>>> that MySQL JDBC did not use column CATALOG_NAME of table SCHEMATA.
>>>
>>>
>>>
>>>
>>>
>>> *My opinion:*
>>>
>>> So, MySQL JDBC did not follow standard strictly . As far as I concerned,
>>> kylin jdbc driver may not need to follow SQL standard so strictly.
>>>
>>> You can avoid misleading/error message if you do not use  [ [
>>> catalogName . ] schemaName . ] tableName  pattern in your *from clause*.
>>>
>>>
>>>
>>>
>>> But I think Kylin should not return a ugly error stacktrace when user
>>> use that pattern. I think I may find a better way to avoid such ugly error
>>> stacktrace.
>>>
>>>
>>>
>>>
>>>
>>> Link:
>>>
>>>
>>> https://stackoverflow.com/questions/7022755/whats-the-difference-between-a-catalog-and-a-schema-in-a-relational-database
>>>
>>> https://en.wikipedia.org/wiki/Database_catalog
>>>
>>> http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
>>>
>>>
>>>
>>>
>>>
>>> If I mistake anything, please let me know.
>>>
>>> Best Regards,
>>>
>>> Xiaoxiang Yu
>>>
>>> *发件人**: *hosur narahari <[email protected]>
>>> *答复**: *"[email protected]" <[email protected]>
>>> *日期**: *2018年9月20日 星期四 11:43
>>> *收件人**: *"[email protected]" <[email protected]>
>>> *主题**: *select with catalog fails
>>>
>>>
>>>
>>> Hi,
>>>
>>>
>>>
>>> I was using kylin JDBC driver to fetch data. By using DatabaseMetaData
>>> if we get catalog using getCatalogs() method, it return value
>>> "defaultCatalog". It returns actual hive schema when we execute
>>> getSchemas().
>>>
>>>
>>>
>>> According to JDBC contract, catalog.schema.table should be valid from
>>> clause and many query layers use that. But kylin fails when we execute that
>>> query.
>>>
>>> I've tried to write sample code piece for that below.
>>>
>>>
>>>
>>> *DatabaseMetaData db = conn.getMetaData();*
>>>
>>> *        ResultSet catalogSet = db.getCatalogs();*
>>>
>>> *        String catalog = "";*
>>>
>>> *        if(catalogSet.next()) {*
>>>
>>> *            catalog = catalogSet.getString("TABLE_CAT");*
>>>
>>> *        }*
>>>
>>> *        ResultSet schemaSet = db.getSchemas();*
>>>
>>> *        String schema = "";*
>>>
>>> *        if(schemaSet.next()) {*
>>>
>>> *            schema = schemaSet.getString("TABLE_SCHEM");*
>>>
>>> *        }*
>>>
>>> *        StringBuilder sb = new StringBuilder("SELECT * FROM ");*
>>>
>>> *        if(!catalog.isEmpty()) {*
>>>
>>> *            sb.append(catalog + ".");*
>>>
>>> *        }*
>>>
>>> *        if(!schema.isEmpty()) {*
>>>
>>> *            sb.append(schema + ".");*
>>>
>>> *        }*
>>>
>>> *        sb.append("kylin_sales limit 10");*
>>>
>>> *        String query = sb.toString();*
>>>
>>> *        Statement stat = conn.createStatement();*
>>>
>>> *        ResultSet rs = stat.executeQuery(query);*
>>>
>>> *        while(rs.next()) {*
>>>
>>> *            System.out.println(rs.getObject("trans_id"));*
>>>
>>> *        }*
>>>
>>>
>>>
>>> In short, the above snippet is executing the query,
>>>
>>> *select * from defaultCatalog.DEFAULT.kylin_sales.*
>>>
>>>
>>>
>>> Same thing happens even with different schemas if we have like,
>>>
>>> *select * from defaultCatalog.test.kylin_sales* also fails.
>>>
>>>
>>>
>>> Also if hive schema is anything other than default, then <schema
>>> name>.<table name> in from clause works. But with default schema it fails.
>>>
>>>
>>>
>>> Ex. If tables are in *test *schema of hive, then *select * from
>>> test.kylin_sales *works. But when the tables are in *default *schema of
>>> hive, then *select * from default.kylin_sales *fails.
>>>
>>>
>>>
>>> Please let me know if I'm doing something wrong.
>>>
>>>
>>>
>>> Best Regards,
>>>
>>> Hari
>>>
>>
>
> --
> Best regards,
>
> Shaofeng Shi 史少锋
>
>

Reply via email to