in fe/src/compat-apache-hive-3/java/org/apache/impala/compat/MetastoreShim.java [706:975]
private static byte getAccessType(Table msTbl) {
Preconditions.checkNotNull(msTbl);
byte accessType = ACCESSTYPE_NONE;
Map<String, String> params = msTbl.getParameters();
if (params.containsKey(ACCESSTYPE)) {
String accessTypeStr = msTbl.getParameters().get(ACCESSTYPE);
accessType = accessTypeStr.getBytes()[0];
} else { // Table not created by Impala
if (!capabilitiestSet_) setHiveClientCapabilities();
// The following logic comes from hive's MetastoreDefaultTransformer.transform()
String tableType = msTbl.getTableType();
String tCapabilities = params.get(CatalogOpExecutor.CAPABILITIES_KEY);
int numBuckets = msTbl.isSetSd() ? msTbl.getSd().getNumBuckets() : 0;
boolean isBucketed = numBuckets > 0;
LOG.info("Table " + msTbl.getTableName() + ",#bucket=" + numBuckets + ",isBucketed:"
+ isBucketed + ",tableType=" + tableType + ",tableCapabilities="
+ tCapabilities);
// if the table has no tCapabilities
if (tCapabilities == null) {
LOG.debug("Table has no specific required capabilities");
switch (tableType) {
case "EXTERNAL_TABLE":
if (numBuckets > 0) {
if (processorCapabilities.contains(HIVEBUCKET2)) {
LOG.debug("External bucketed table with HB2 capability:RW");
accessType = ACCESSTYPE_READWRITE;
} else {
LOG.debug("External bucketed table without HB2 capability:RO");
accessType = ACCESSTYPE_READONLY;
}
} else { // Unbucketed
if (processorCapabilities.contains(EXTWRITE) && processorCapabilities
.contains(EXTREAD)) {
LOG.debug("External unbucketed table with EXTREAD/WRITE capability:RW");
accessType = ACCESSTYPE_READWRITE;
} else if (processorCapabilities.contains(EXTREAD)) {
LOG.debug("External unbucketed table with EXTREAD capability:RO");
accessType = ACCESSTYPE_READONLY;
} else {
LOG.debug(
"External unbucketed table without EXTREAD/WRITE capability:NONE");
accessType = ACCESSTYPE_NONE;
}
}
break;
case "MANAGED_TABLE":
String txnal = params.get(AcidUtils.TABLE_IS_TRANSACTIONAL);
if (txnal == null || txnal
.equalsIgnoreCase("FALSE")) { // non-ACID MANAGED table
LOG.debug("Managed non-acid table:RW");
accessType = ACCESSTYPE_READWRITE;
}
if (txnal != null && txnal.equalsIgnoreCase("TRUE")) { // ACID table
String txntype = params.get(AcidUtils.TABLE_TRANSACTIONAL_PROPERTIES);
if (txntype != null && txntype
.equalsIgnoreCase("insert_only")) { // MICRO_MANAGED Tables
// MGD table is insert only, not full ACID
if (processorCapabilities.contains(HIVEMANAGEDINSERTWRITE)
|| processorCapabilities.contains(CONNECTORWRITE)) {
LOG.debug("Managed acid table with INSERTWRITE or CONNECTORWRITE "
+ "capability:RW");
// clients have RW access to INSERT-ONLY ACID tables
accessType = ACCESSTYPE_READWRITE;
LOG.info("Processor has one of the write capabilities on insert-only, "
+ "granting RW");
} else if (processorCapabilities.contains(HIVEMANAGEDINSERTREAD)
|| processorCapabilities.contains(CONNECTORREAD)) {
LOG.debug("Managed acid table with INSERTREAD or CONNECTORREAD "
+ "capability:RO");
// clients have RO access to INSERT-ONLY ACID tables
accessType = ACCESSTYPE_READONLY;
LOG.info("Processor has one of the read capabilities on insert-only, "
+ "granting RO");
} else {
// clients have NO access to INSERT-ONLY ACID tables
accessType = ACCESSTYPE_NONE;
LOG.info("Processor has no read or write capabilities on insert-only, "
+ "NO access");
}
} else { // FULL ACID MANAGED TABLE
if (processorCapabilities.contains(HIVEFULLACIDWRITE)
|| processorCapabilities.contains(CONNECTORWRITE)) {
LOG.debug(
"Full acid table with ACIDWRITE or CONNECTORWRITE capability:RW");
// clients have RW access to IUD ACID tables
accessType = ACCESSTYPE_READWRITE;
} else if (processorCapabilities.contains(HIVEFULLACIDREAD)
|| processorCapabilities.contains(CONNECTORREAD)) {
LOG.debug(
"Full acid table with ACIDREAD or CONNECTORREAD capability:RO");
// clients have RO access to IUD ACID tables
accessType = ACCESSTYPE_READONLY;
} else {
LOG.debug("Full acid table without ACIDREAD/WRITE or "
+ "CONNECTORREAD/WRITE capability:NONE");
// clients have NO access to IUD ACID tables
accessType = ACCESSTYPE_NONE;
}
}
}
break;
case "VIRTUAL_VIEW":
if (processorCapabilities.contains(HIVESQL) ||
processorCapabilities.contains(CONNECTORREAD)) {
accessType = ACCESSTYPE_READONLY;
} else {
accessType = ACCESSTYPE_NONE;
}
break;
case "MATERIALIZED_VIEW":
if ((processorCapabilities.contains(CONNECTORREAD) ||
processorCapabilities.contains(HIVEFULLACIDREAD)) && processorCapabilities
.contains(HIVEMQT)) {
LOG.info(
"Processor has one of the READ abilities and HIVEMQT, AccessType=RO");
accessType = ACCESSTYPE_READONLY;
} else {
LOG.info("Processor has no READ abilities or HIVEMQT, AccessType=None");
accessType = ACCESSTYPE_NONE;
}
break;
default:
accessType = ACCESSTYPE_NONE;
break;
}
return accessType;
}
// WITH CAPABLITIES ON TABLE
tCapabilities = tCapabilities.replaceAll("\\s", "")
.toUpperCase(); // remove spaces between tCapabilities + toUppercase
List<String> requiredCapabilities = Arrays.asList(tCapabilities.split(","));
switch (tableType) {
case "EXTERNAL_TABLE":
if (processorCapabilities.containsAll(requiredCapabilities)) {
// AccessType is RW
LOG.info(
"Abilities for match: Table type=" + tableType + ",accesstype is RW");
accessType = ACCESSTYPE_READWRITE;
break;
}
if (requiredCapabilities.contains(EXTWRITE) && processorCapabilities
.contains(EXTWRITE)) {
if (!isBucketed) {
LOG.info("EXTWRITE Matches, accessType=" + ACCESSTYPE_READWRITE);
accessType = ACCESSTYPE_READWRITE;
return accessType;
}
}
if (requiredCapabilities.contains(EXTREAD) && processorCapabilities
.contains(EXTREAD)) {
LOG.info("EXTREAD Matches, accessType=" + ACCESSTYPE_READONLY);
accessType = ACCESSTYPE_READONLY;
} else {
LOG.debug("No matches, accessType=" + ACCESSTYPE_NONE);
accessType = ACCESSTYPE_NONE;
}
break;
case "MANAGED_TABLE":
if (processorCapabilities.size() == 0) { // processor has no capabilities
LOG.info("Client has no capabilities for type " + tableType
+ ",accesstype is NONE");
accessType = ACCESSTYPE_NONE;
return accessType;
}
if (processorCapabilities.containsAll(requiredCapabilities)) {
// AccessType is RW
LOG.info(
"Abilities for match: Table type=" + tableType + ",accesstype is RW");
accessType = ACCESSTYPE_READWRITE;
return accessType;
}
String txnal = params.get(AcidUtils.TABLE_IS_TRANSACTIONAL);
if (txnal == null || txnal
.equalsIgnoreCase("FALSE")) { // non-ACID MANAGED table
LOG.info("Table is non ACID, accesstype is RO");
accessType = ACCESSTYPE_READONLY;
return accessType;
}
if (txnal != null && txnal.equalsIgnoreCase("TRUE")) { // ACID table
String txntype = params.get(AcidUtils.TABLE_TRANSACTIONAL_PROPERTIES);
List<String> hintList = new ArrayList<>();
if (txntype != null && txntype
.equalsIgnoreCase("insert_only")) { // MICRO_MANAGED Tables
LOG.info("Table is INSERTONLY ACID");
// MGD table is insert only, not full ACID
if (processorCapabilities.containsAll(getWrites(requiredCapabilities))
// contains all writes on table
|| processorCapabilities.contains(HIVEFULLACIDWRITE)) {
LOG.info("Processor has all writes or full acid write, access is RW");
// clients have RW access to INSERT-ONLY ACID tables
accessType = ACCESSTYPE_READWRITE;
return accessType;
}
if (processorCapabilities.contains(CONNECTORWRITE)) {
LOG.debug("Managed acid table with CONNECTORWRITE capability:RW");
// clients have RW access to INSERT-ONLY ACID tables with CONNWRITE
accessType = ACCESSTYPE_READWRITE;
return accessType;
} else if (processorCapabilities.containsAll(getReads(requiredCapabilities))
|| processorCapabilities.contains(HIVEMANAGEDINSERTREAD)) {
LOG.debug("Managed acid table with MANAGEDREAD capability:RO");
accessType = ACCESSTYPE_READONLY;
return accessType;
} else if (processorCapabilities.contains(CONNECTORREAD)) {
LOG.debug("Managed acid table with CONNECTORREAD capability:RO");
accessType = ACCESSTYPE_READONLY;
return accessType;
} else {
LOG.debug("Managed acid table without any READ capability:NONE");
accessType = ACCESSTYPE_NONE;
return accessType;
}
} else { // MANAGED FULL ACID TABLES
LOG.info("Table is FULLACID");
if (processorCapabilities.containsAll(getWrites(requiredCapabilities))
// contains all writes on table
|| processorCapabilities.contains(HIVEFULLACIDWRITE)) {
LOG.info("Processor has all writes or atleast " + HIVEFULLACIDWRITE
+ ", access is RW");
// clients have RW access to ACID tables
accessType = ACCESSTYPE_READWRITE;
return accessType;
}
if (processorCapabilities.contains(CONNECTORWRITE)) {
LOG.debug("Full acid table with CONNECTORWRITE capability:RW");
// clients have RW access to IUD ACID tables
accessType = ACCESSTYPE_READWRITE;
return accessType;
} else if (processorCapabilities.contains(HIVEFULLACIDREAD)
|| (processorCapabilities.contains(CONNECTORREAD))) {
LOG.debug("Full acid table with CONNECTORREAD/ACIDREAD capability:RO");
// clients have RO access to IUD ACID tables
accessType = ACCESSTYPE_READONLY;
return accessType;
} else {
LOG.debug("Full acid table without READ capability:RO");
// clients have NO access to IUD ACID tables
accessType = ACCESSTYPE_NONE;
return accessType;
}
}
}
break;
case "VIRTUAL_VIEW":
case "MATERIALIZED_VIEW":
if (processorCapabilities.containsAll(requiredCapabilities)) {
accessType = ACCESSTYPE_READONLY;
} else {
accessType = ACCESSTYPE_NONE;
}
break;
default:
accessType = ACCESSTYPE_NONE;
break;
}
}
return accessType;
}