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 史少锋
