Skip to content

Commit 8e7f23f

Browse files
authored
HIVE-25616: Hive-24741 backport to 2.3 (Neelesh Srinivas Salian reviewed by Vihang Karajgaonkar)
Closes (#2730)
1 parent efd5212 commit 8e7f23f

File tree

2 files changed

+104
-14
lines changed

2 files changed

+104
-14
lines changed

metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@
169169
import org.slf4j.LoggerFactory;
170170

171171
import com.google.common.annotations.VisibleForTesting;
172+
import com.google.common.base.Joiner;
172173
import com.google.common.collect.Lists;
173174
import com.google.common.collect.Maps;
174175

@@ -2565,34 +2566,67 @@ private Collection getPartitionPsQueryResults(String dbName, String tableName,
25652566
return (Collection) query.execute(dbName, tableName, partNameMatcher);
25662567
}
25672568

2569+
/**
2570+
* If partVals all the values are empty strings, it means we are returning
2571+
* all the partitions and hence we can attempt to use a directSQL equivalent API which
2572+
* is considerably faster.
2573+
* @param partVals The partitions values used to filter out the partitions.
2574+
* @return true only when partVals is non-empty and contains only empty strings,
2575+
* otherwise false. If user or groups is valid then returns false since the directSQL
2576+
* doesn't support partition privileges.
2577+
*/
2578+
private boolean canTryDirectSQL(List<String> partVals) {
2579+
if (partVals.isEmpty()) {
2580+
return false;
2581+
}
2582+
for (String val : partVals) {
2583+
if (val != null && !val.isEmpty()) {
2584+
return false;
2585+
}
2586+
}
2587+
return true;
2588+
}
2589+
25682590
@Override
25692591
public List<Partition> listPartitionsPsWithAuth(String db_name, String tbl_name,
25702592
List<String> part_vals, short max_parts, String userName, List<String> groupNames)
25712593
throws MetaException, InvalidObjectException, NoSuchObjectException {
2572-
List<Partition> partitions = new ArrayList<Partition>();
2594+
List<Partition> partitions = new ArrayList<>();
25732595
boolean success = false;
25742596
QueryWrapper queryWrapper = new QueryWrapper();
2575-
25762597
try {
25772598
openTransaction();
2578-
LOG.debug("executing listPartitionNamesPsWithAuth");
2579-
Collection parts = getPartitionPsQueryResults(db_name, tbl_name,
2580-
part_vals, max_parts, null, queryWrapper);
2599+
25812600
MTable mtbl = getMTable(db_name, tbl_name);
2601+
if (mtbl == null) {
2602+
throw new NoSuchObjectException(db_name + "." + tbl_name + " table not found");
2603+
}
2604+
boolean getauth = null != userName && null != groupNames &&
2605+
"TRUE".equalsIgnoreCase(mtbl.getParameters().get("PARTITION_LEVEL_PRIVILEGE"));
2606+
if(!getauth && canTryDirectSQL(part_vals)) {
2607+
LOG.debug(
2608+
"Redirecting to directSQL enabled API: db: {} tbl: {} partVals: {}",
2609+
db_name, tbl_name, Joiner.on(',').join(part_vals));
2610+
return getPartitions(db_name, tbl_name, -1);
2611+
}
2612+
LOG.debug("executing listPartitionNamesPsWithAuth");
2613+
Collection parts = getPartitionPsQueryResults(db_name, tbl_name, part_vals,
2614+
max_parts, null, queryWrapper);
25822615
for (Object o : parts) {
25832616
Partition part = convertToPart((MPartition) o);
2584-
//set auth privileges
2585-
if (null != userName && null != groupNames &&
2586-
"TRUE".equalsIgnoreCase(mtbl.getParameters().get("PARTITION_LEVEL_PRIVILEGE"))) {
2587-
String partName = Warehouse.makePartName(this.convertToFieldSchemas(mtbl
2588-
.getPartitionKeys()), part.getValues());
2589-
PrincipalPrivilegeSet partAuth = getPartitionPrivilegeSet(db_name,
2590-
tbl_name, partName, userName, groupNames);
2591-
part.setPrivileges(partAuth);
2592-
}
2617+
// set auth privileges
2618+
String partName = Warehouse.makePartName(this.convertToFieldSchemas(mtbl
2619+
.getPartitionKeys()), part.getValues());
2620+
PrincipalPrivilegeSet partAuth = getPartitionPrivilegeSet(db_name,
2621+
tbl_name, partName, userName, groupNames);
2622+
part.setPrivileges(partAuth);
25932623
partitions.add(part);
25942624
}
25952625
success = commitTransaction();
2626+
} catch (InvalidObjectException | NoSuchObjectException | MetaException e) {
2627+
throw e;
2628+
} catch (Exception e) {
2629+
throw new MetaException(e.getMessage());
25962630
} finally {
25972631
rollbackAndCleanup(success, queryWrapper);
25982632
}

ql/src/test/org/apache/hadoop/hive/ql/metadata/TestHive.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,62 @@ public void testPartition() throws Throwable {
679679
System.err.println(StringUtils.stringifyException(e));
680680
assertTrue("Unable to create parition for table: " + tableName, false);
681681
}
682+
part_spec.clear();
683+
part_spec.put("ds", "2008-04-08");
684+
part_spec.put("hr", "13");
685+
try {
686+
hm.createPartition(tbl, part_spec);
687+
} catch (HiveException e) {
688+
System.err.println(StringUtils.stringifyException(e));
689+
assertTrue("Unable to create parition for table: " + tableName, false);
690+
}
691+
part_spec.clear();
692+
part_spec.put("ds", "2008-04-08");
693+
part_spec.put("hr", "14");
694+
try {
695+
hm.createPartition(tbl, part_spec);
696+
} catch (HiveException e) {
697+
System.err.println(StringUtils.stringifyException(e));
698+
assertTrue("Unable to create parition for table: " + tableName, false);
699+
}
700+
part_spec.clear();
701+
part_spec.put("ds", "2008-04-07");
702+
part_spec.put("hr", "12");
703+
try {
704+
hm.createPartition(tbl, part_spec);
705+
} catch (HiveException e) {
706+
System.err.println(StringUtils.stringifyException(e));
707+
assertTrue("Unable to create parition for table: " + tableName, false);
708+
}
709+
part_spec.clear();
710+
part_spec.put("ds", "2008-04-07");
711+
part_spec.put("hr", "13");
712+
try {
713+
hm.createPartition(tbl, part_spec);
714+
} catch (HiveException e) {
715+
System.err.println(StringUtils.stringifyException(e));
716+
assertTrue("Unable to create parition for table: " + tableName, false);
717+
}
718+
719+
Map<String, String> partialSpec = new HashMap<>();
720+
partialSpec.put("ds", "2008-04-07");
721+
assertEquals(2, hm.getPartitions(tbl, partialSpec).size());
722+
723+
partialSpec = new HashMap<>();
724+
partialSpec.put("ds", "2008-04-08");
725+
assertEquals(3, hm.getPartitions(tbl, partialSpec).size());
726+
727+
partialSpec = new HashMap<>();
728+
partialSpec.put("hr", "13");
729+
assertEquals(2, hm.getPartitions(tbl, partialSpec).size());
730+
731+
partialSpec = new HashMap<>();
732+
assertEquals(5, hm.getPartitions(tbl, partialSpec).size());
733+
734+
partialSpec = new HashMap<>();
735+
partialSpec.put("hr", "14");
736+
assertEquals(1, hm.getPartitions(tbl, partialSpec).size());
737+
682738
hm.dropTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName);
683739
} catch (Throwable e) {
684740
System.err.println(StringUtils.stringifyException(e));

0 commit comments

Comments
 (0)