diff --git a/src/Interpreters/Cache/QueryCache.cpp b/src/Interpreters/Cache/QueryCache.cpp index ba5388847f5..fede871aba3 100644 --- a/src/Interpreters/Cache/QueryCache.cpp +++ b/src/Interpreters/Cache/QueryCache.cpp @@ -242,8 +242,9 @@ void QueryCache::Writer::finalizeWrite() Chunks squashed_chunks; size_t rows_remaining_in_squashed = 0; /// how many further rows can the last squashed chunk consume until it reaches max_block_size - for (const auto & chunk : *query_result) + for (auto & chunk : *query_result) { + convertToFullIfSparse(chunk); const size_t rows_chunk = chunk.getNumRows(); size_t rows_chunk_processed = 0; diff --git a/tests/queries/0_stateless/02708_query_cache_sparse_columns.reference b/tests/queries/0_stateless/02708_query_cache_sparse_columns.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/02708_query_cache_sparse_columns.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/02708_query_cache_sparse_columns.sql b/tests/queries/0_stateless/02708_query_cache_sparse_columns.sql new file mode 100644 index 00000000000..952c3227852 --- /dev/null +++ b/tests/queries/0_stateless/02708_query_cache_sparse_columns.sql @@ -0,0 +1,23 @@ +-- Tags: no-parallel + +DROP TABLE IF EXISTS t_cache_sparse; +SYSTEM DROP QUERY CACHE; + +CREATE TABLE t_cache_sparse (id UInt64, v UInt64) +ENGINE = MergeTree ORDER BY id +SETTINGS ratio_of_defaults_for_sparse_serialization = 0.9; + +SYSTEM STOP MERGES t_cache_sparse; + +INSERT INTO t_cache_sparse SELECT number, number FROM numbers(10000); +INSERT INTO t_cache_sparse SELECT number, 0 FROM numbers(10000); + +SET allow_experimental_query_cache = 1; +SET use_query_cache = 1; +SET max_threads = 1; + +SELECT v FROM t_cache_sparse FORMAT Null; +SELECT v FROM t_cache_sparse FORMAT Null; +SELECT count() FROM system.query_cache WHERE query LIKE 'SELECT v FROM t_cache_sparse%'; + +DROP TABLE t_cache_sparse;