diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SimpleFetchOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SimpleFetchOptimizer.java index e469f679faa2..aaabc602fc8a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SimpleFetchOptimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SimpleFetchOptimizer.java @@ -60,6 +60,7 @@ 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.io.AcidUtils; import org.apache.hadoop.hive.ql.io.ContentSummaryInputFormat; import org.apache.hadoop.hive.ql.io.HiveInputFormat; import org.apache.hadoop.hive.ql.metadata.HiveException; @@ -144,8 +145,15 @@ private FetchTask optimize(ParseContext pctx, String alias, TableScanOperator so if (fetch != null && checkThreshold(fetch, limit, pctx)) { FetchWork fetchWork = fetch.convertToWork(); FetchTask fetchTask = (FetchTask) TaskFactory.get(fetchWork); - fetchTask.setCachingEnabled(HiveConf.getBoolVar(pctx.getConf(), - HiveConf.ConfVars.HIVE_FETCH_TASK_CACHING)); + boolean cachingEnabled = HiveConf.getBoolVar(pctx.getConf(), + HiveConf.ConfVars.HIVE_FETCH_TASK_CACHING); + if (cachingEnabled && !AcidUtils.isTransactionalTable(fetch.table)) { + LOG.debug("Fetch task caching is enabled but table {} is not transactional. " + + "Caching is only supported for ACID tables to prevent Cleaner race conditions. Disabling.", + fetch.table.getCompleteName()); + cachingEnabled = false; + } + fetchTask.setCachingEnabled(cachingEnabled); fetchWork.setSink(fetch.completed(pctx, fetchWork)); fetchWork.setSource(source); fetchWork.setLimit(limit);