[ 
https://issues.apache.org/jira/browse/DRILL-6923?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Igor Guzenko updated DRILL-6923:
--------------------------------
    Summary: Show schemas uses default(user defined) schema first for resolving 
table from information_schema  (was: Show schemas after use doesn't work with 
Hive authorization)

> Show schemas uses default(user defined) schema first for resolving table from 
> information_schema
> ------------------------------------------------------------------------------------------------
>
>                 Key: DRILL-6923
>                 URL: https://issues.apache.org/jira/browse/DRILL-6923
>             Project: Apache Drill
>          Issue Type: Bug
>          Components: Storage - Hive
>            Reporter: Igor Guzenko
>            Assignee: Igor Guzenko
>            Priority: Major
>
> *Abstract*
> When Drill used with enabled Hive SQL Standard authorization, execution of 
> queries like,
> {code:sql}
> USE hive.db_general;
> SHOW SCHEMAS LIKE 'hive.%'; {code}
> results in error DrillRuntimeException: Failed to use the Hive authorization 
> components: Error getting object from metastore for Object 
> [type=TABLE_OR_VIEW, name=db_general.information_schema] . 
> *Details* 
> Consider showSchemas() test similar to one defined in 
> TestSqlStdBasedAuthorization : 
> {code:java}
> @Test
> public void showSchemas() throws Exception {
>   test("USE " + hivePluginName + "." + db_general);
>   testBuilder()
>       .sqlQuery("SHOW SCHEMAS LIKE 'hive.%'")
>       .unOrdered()
>       .baselineColumns("SCHEMA_NAME")
>       .baselineValues("hive.db_general")
>       .baselineValues("hive.default")
>       .go();
> }
> {code}
> Currently execution of such test will produce following stacktrace: 
> {code:none}
> Caused by: org.apache.drill.common.exceptions.DrillRuntimeException: Failed 
> to use the Hive authorization components: Error getting object from metastore 
> for Object [type=TABLE_OR_VIEW, name=db_general.information_schema]
> at 
> org.apache.drill.exec.store.hive.HiveAuthorizationHelper.authorize(HiveAuthorizationHelper.java:149)
> at 
> org.apache.drill.exec.store.hive.HiveAuthorizationHelper.authorizeReadTable(HiveAuthorizationHelper.java:134)
> at 
> org.apache.drill.exec.store.hive.DrillHiveMetaStoreClient$HiveClientWithAuthzWithCaching.getHiveReadEntry(DrillHiveMetaStoreClient.java:450)
> at 
> org.apache.drill.exec.store.hive.schema.HiveSchemaFactory$HiveSchema.getSelectionBaseOnName(HiveSchemaFactory.java:233)
> at 
> org.apache.drill.exec.store.hive.schema.HiveSchemaFactory$HiveSchema.getDrillTable(HiveSchemaFactory.java:214)
> at 
> org.apache.drill.exec.store.hive.schema.HiveDatabaseSchema.getTable(HiveDatabaseSchema.java:63)
> at 
> org.apache.calcite.jdbc.SimpleCalciteSchema.getImplicitTable(SimpleCalciteSchema.java:83)
> at org.apache.calcite.jdbc.CalciteSchema.getTable(CalciteSchema.java:288)
> at org.apache.calcite.sql.validate.EmptyScope.resolve_(EmptyScope.java:143)
> at org.apache.calcite.sql.validate.EmptyScope.resolveTable(EmptyScope.java:99)
> at 
> org.apache.calcite.sql.validate.DelegatingScope.resolveTable(DelegatingScope.java:203)
> at 
> org.apache.calcite.sql.validate.IdentifierNamespace.resolveImpl(IdentifierNamespace.java:105)
> at 
> org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl(IdentifierNamespace.java:177)
> at 
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:967)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:943)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3032)
> at 
> org.apache.drill.exec.planner.sql.SqlConverter$DrillValidator.validateFrom(SqlConverter.java:274)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3014)
> at 
> org.apache.drill.exec.planner.sql.SqlConverter$DrillValidator.validateFrom(SqlConverter.java:274)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3284)
> at 
> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
> at 
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:967)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:943)
> at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:225)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:918)
> at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:628)
> at 
> org.apache.drill.exec.planner.sql.SqlConverter.validate(SqlConverter.java:192)
> at 
> org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.validateNode(DefaultSqlHandler.java:664)
> at 
> org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.validateAndConvert(DefaultSqlHandler.java:200)
> at 
> org.apache.drill.exec.planner.sql.handlers.DefaultSqlHandler.getPlan(DefaultSqlHandler.java:173)
> at 
> org.apache.drill.exec.planner.sql.DrillSqlWorker.getQueryPlan(DrillSqlWorker.java:155)
> at 
> org.apache.drill.exec.planner.sql.DrillSqlWorker.getPlan(DrillSqlWorker.java:90)
> at org.apache.drill.exec.work.foreman.Foreman.runSQL(Foreman.java:584)
> at org.apache.drill.exec.work.foreman.Foreman.run(Foreman.java:272)
> at .......(:0)
> Caused by: 
> org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthzPluginException:
>  Error getting object from metastore for Object [type=TABLE_OR_VIEW, 
> name=db_general.information_schema]
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLAuthorizationUtils.throwGetObjErr(SQLAuthorizationUtils.java:310)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLAuthorizationUtils.isOwner(SQLAuthorizationUtils.java:272)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLAuthorizationUtils.getPrivilegesFromMetaStore(SQLAuthorizationUtils.java:212)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizationValidator.checkPrivileges(SQLStdHiveAuthorizationValidator.java:131)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizationValidator.checkPrivileges(SQLStdHiveAuthorizationValidator.java:83)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerImpl.checkPrivileges(HiveAuthorizerImpl.java:87)
> at 
> org.apache.drill.exec.store.hive.HiveAuthorizationHelper.authorize(HiveAuthorizationHelper.java:145)
> ... 36 more
> Caused by: NoSuchObjectException(message:db_general.information_schema table 
> not found)
> at 
> org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_table_req_result$get_table_req_resultStandardScheme.read(ThriftHiveMetastore.java:55064)
> at 
> org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_table_req_result$get_table_req_resultStandardScheme.read(ThriftHiveMetastore.java:55032)
> at 
> org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_table_req_result.read(ThriftHiveMetastore.java:54963)
> at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:86)
> at 
> org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_get_table_req(ThriftHiveMetastore.java:1563)
> at 
> org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.get_table_req(ThriftHiveMetastore.java:1550)
> at 
> org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getTable(HiveMetaStoreClient.java:1344)
> at 
> org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLAuthorizationUtils.isOwner(SQLAuthorizationUtils.java:269)
> ... 41 more
> {code}
> After analyzing of the stack trace you may notice that Drill tried to find 
> table with name `_information_schema_` in _*hive.db_general*_ schema. This 
> `information_schema` appeared after call to 
> _*ShowSchemasHandler.rewrite(sqlNode)*_ method , where our original query
> {code:sql}
> SHOW SCHEMAS LIKE 'hive.%' {code}
>  was rewritten to 
> {code:sql}
> SELECT `SCHEMA_NAME`
> FROM `information_schema`.`SCHEMATA`
> WHERE LOWER(`SCHEMA_NAME`) LIKE 'hive.%'
> {code}
>  After rewriting Drill initiates validation process mostly performed by 
> Calcite. After some chain of validation method calls, performed validation of 
> from section which results into call to Calcite's 
> EmptyScope.resolveTable(...) method. This method tries to resolve table using 
> following order: Look in the default schema, then default catalog, then root 
> schema. Since, before execution of SHOW SCHEMAS default schema was set to 
> _*hive.db_general*_ , Calcite assumes that `information_schema` is table name 
> and tries to find it using  _*hive.db_general*_ schema instance. Usually this 
> search mechanism works fine because this first attempt to find table in 
> default schema results into *null*, after that Calcite tries to resolve path 
> ["information_schema", "SCHEMATA"]  against root schema, which is like an 
> empty string, schema name becomes *information_schema* and table name is 
> *schemata*. Then as expected schema and table resolved successfully. 
> Please notice, that this issue isn't specific to only hive storage plugin, 
> there is high probability that under similar conditions it may be reproduced 
> with other storage plugins. 
> As a possible solution, we need to change table resolution to always search 
> against root schema and ignore default schema selected by user when search 
> performed for information_schema table. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to