[CARBONDATA-3078] Disable explain collector for count star query without filter
An issue is found about count star query without filter in explain command. It is a special case. It uses different plan. Considering no useful information about block/blocklet pruning for count star query without filter, so disable explain collector and avoid the exception in https://issues.apache.org/jira/browse/CARBONDATA-3078 This closes #2900 Project: http://git-wip-us.apache.org/repos/asf/carbondata/repo Commit: http://git-wip-us.apache.org/repos/asf/carbondata/commit/2e5a4f55 Tree: http://git-wip-us.apache.org/repos/asf/carbondata/tree/2e5a4f55 Diff: http://git-wip-us.apache.org/repos/asf/carbondata/diff/2e5a4f55 Branch: refs/heads/branch-1.5 Commit: 2e5a4f55d8de398afce04d0ba69af433d9cab17d Parents: e8cd72d Author: Manhua <kevin...@qq.com> Authored: Mon Nov 5 20:17:59 2018 +0800 Committer: ravipesala <ravi.pes...@gmail.com> Committed: Wed Nov 21 22:39:53 2018 +0530 ---------------------------------------------------------------------- .../carbondata/hadoop/api/CarbonTableInputFormat.java | 9 +++++++++ .../spark/testsuite/filterexpr/CountStarTestCase.scala | 11 +++++++++++ 2 files changed, 20 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/carbondata/blob/2e5a4f55/hadoop/src/main/java/org/apache/carbondata/hadoop/api/CarbonTableInputFormat.java ---------------------------------------------------------------------- diff --git a/hadoop/src/main/java/org/apache/carbondata/hadoop/api/CarbonTableInputFormat.java b/hadoop/src/main/java/org/apache/carbondata/hadoop/api/CarbonTableInputFormat.java index ba3accf..86cbfec 100644 --- a/hadoop/src/main/java/org/apache/carbondata/hadoop/api/CarbonTableInputFormat.java +++ b/hadoop/src/main/java/org/apache/carbondata/hadoop/api/CarbonTableInputFormat.java @@ -43,6 +43,7 @@ import org.apache.carbondata.core.mutate.CarbonUpdateUtil; import org.apache.carbondata.core.mutate.SegmentUpdateDetails; import org.apache.carbondata.core.mutate.UpdateVO; import org.apache.carbondata.core.mutate.data.BlockMappingVO; +import org.apache.carbondata.core.profiler.ExplainCollector; import org.apache.carbondata.core.readcommitter.LatestFilesReadCommittedScope; import org.apache.carbondata.core.readcommitter.ReadCommittedScope; import org.apache.carbondata.core.readcommitter.TableStatusReadCommittedScope; @@ -575,6 +576,14 @@ public class CarbonTableInputFormat<T> extends CarbonInputFormat<T> { */ public BlockMappingVO getBlockRowCount(Job job, CarbonTable table, List<PartitionSpec> partitions) throws IOException { + // Normal query flow goes to CarbonInputFormat#getPrunedBlocklets and initialize the + // pruning info for table we queried. But here count star query without filter uses a different + // query plan, and no pruning info is initialized. When it calls default data map to + // prune(with a null filter), exception will occur during setting pruning info. + // Considering no useful information about block/blocklet pruning for such query + // (actually no pruning), so we disable explain collector here + ExplainCollector.remove(); + AbsoluteTableIdentifier identifier = table.getAbsoluteTableIdentifier(); TableDataMap blockletMap = DataMapStoreManager.getInstance().getDefaultDataMap(table); http://git-wip-us.apache.org/repos/asf/carbondata/blob/2e5a4f55/integration/spark-common-test/src/test/scala/org/apache/carbondata/spark/testsuite/filterexpr/CountStarTestCase.scala ---------------------------------------------------------------------- diff --git a/integration/spark-common-test/src/test/scala/org/apache/carbondata/spark/testsuite/filterexpr/CountStarTestCase.scala b/integration/spark-common-test/src/test/scala/org/apache/carbondata/spark/testsuite/filterexpr/CountStarTestCase.scala index f26d0e7..18ad1d7 100644 --- a/integration/spark-common-test/src/test/scala/org/apache/carbondata/spark/testsuite/filterexpr/CountStarTestCase.scala +++ b/integration/spark-common-test/src/test/scala/org/apache/carbondata/spark/testsuite/filterexpr/CountStarTestCase.scala @@ -54,6 +54,17 @@ class CountStarTestCase extends QueryTest with BeforeAndAfterAll { ) } + test("explain select count star without filter") { + CarbonProperties.getInstance() + .addProperty(CarbonCommonConstants.ENABLE_QUERY_STATISTICS, "true") + + sql("explain select count(*) from filterTimestampDataType").collect() + + CarbonProperties.getInstance() + .addProperty(CarbonCommonConstants.ENABLE_QUERY_STATISTICS, + CarbonCommonConstants.ENABLE_QUERY_STATISTICS_DEFAULT) + } + override def afterAll { sql("drop table if exists filtertestTables") sql("drop table if exists filterTimestampDataType")