diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java index b373223..43eebc6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java @@ -3484,4 +3484,19 @@ public static String getQualifiedPath(HiveConf conf, Path path) throws HiveExcep public static boolean isDefaultNameNode(HiveConf conf) { return !conf.getChangedProperties().containsKey(HiveConf.ConfVars.HADOOPFS.varname); } + + public static String[] getDbTableName(String defaultDb, String dbtable) throws SemanticException { + if (dbtable == null) { + return new String[2]; + } + String[] names = dbtable.split("\\."); + switch (names.length) { + case 2: + return names; + case 1: + return new String [] {defaultDb, dbtable}; + default: + throw new SemanticException(ErrorMsg.INVALID_TABLE_NAME, dbtable); + } + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java index ae87aac..d4b7bad 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hive.ql.exec.TableScanOperator; import org.apache.hadoop.hive.ql.exec.Task; import org.apache.hadoop.hive.ql.exec.TaskFactory; +import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.hooks.ReadEntity; import org.apache.hadoop.hive.ql.hooks.WriteEntity; import org.apache.hadoop.hive.ql.index.IndexMetadataChangeTask; @@ -121,7 +122,11 @@ private IndexUtils(){ return indexTables; } for (Index index : indexes.get(partitionedTable)) { - Table indexTable = hive.getTable(index.getIndexTableName()); + // index.getDbName() is used as a default database, which is database of + // target table, + // if index.getIndexTableName() does not contain database name + String[] qualified = Utilities.getDbTableName(index.getDbName(), index.getIndexTableName()); + Table indexTable = hive.getTable(qualified[0], qualified[1]); indexToIndexTable.put(index, indexTable); indexTables.add(indexTable); } diff --git a/ql/src/test/queries/clientpositive/index_in_db.q b/ql/src/test/queries/clientpositive/index_in_db.q new file mode 100644 index 0000000..253870c --- /dev/null +++ b/ql/src/test/queries/clientpositive/index_in_db.q @@ -0,0 +1,13 @@ +set hive.optimize.index.filter=true; +drop database if exists index_test_db cascade; +-- Test selecting selecting from a table that is backed by an index +-- create table, index in a db, then set default db as current db, and try selecting + +create database index_test_db; + +use index_test_db; +create table testtb (id int, name string); +create index id_index on table testtb (id) as 'COMPACT' WITH DEFERRED REBUILD in table testdb_id_idx_tb; + +use default; +select * from index_test_db.testtb where id>2; diff --git a/ql/src/test/results/clientpositive/index_in_db.q.out b/ql/src/test/results/clientpositive/index_in_db.q.out new file mode 100644 index 0000000..53faf99 --- /dev/null +++ b/ql/src/test/results/clientpositive/index_in_db.q.out @@ -0,0 +1,42 @@ +PREHOOK: query: drop database if exists index_test_db cascade +PREHOOK: type: DROPDATABASE +POSTHOOK: query: drop database if exists index_test_db cascade +POSTHOOK: type: DROPDATABASE +PREHOOK: query: -- Test selecting selecting from a table that is backed by an index +-- create table, index in a db, then set default db as current db, and try selecting + +create database index_test_db +PREHOOK: type: CREATEDATABASE +POSTHOOK: query: -- Test selecting selecting from a table that is backed by an index +-- create table, index in a db, then set default db as current db, and try selecting + +create database index_test_db +POSTHOOK: type: CREATEDATABASE +PREHOOK: query: use index_test_db +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: use index_test_db +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: create table testtb (id int, name string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:index_test_db +POSTHOOK: query: create table testtb (id int, name string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:index_test_db +POSTHOOK: Output: index_test_db@testtb +PREHOOK: query: create index id_index on table testtb (id) as 'COMPACT' WITH DEFERRED REBUILD in table testdb_id_idx_tb +PREHOOK: type: CREATEINDEX +POSTHOOK: query: create index id_index on table testtb (id) as 'COMPACT' WITH DEFERRED REBUILD in table testdb_id_idx_tb +POSTHOOK: type: CREATEINDEX +POSTHOOK: Output: index_test_db@testdb_id_idx_tb +PREHOOK: query: use default +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: use default +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: select * from index_test_db.testtb where id>2 +PREHOOK: type: QUERY +PREHOOK: Input: index_test_db@testtb +#### A masked pattern was here #### +POSTHOOK: query: select * from index_test_db.testtb where id>2 +POSTHOOK: type: QUERY +POSTHOOK: Input: index_test_db@testtb +#### A masked pattern was here ####