@@ -169,16 +169,37 @@ Status OlapScanner::prepare() {
169169 // value (e.g. select a from t where a .. and b ... limit 1),
170170 // it will be very slow when reading data in segment iterator
171171 _tablet_reader->set_batch_size (_state->batch_size ());
172-
173172 TabletSchemaSPtr cached_schema;
174173 std::string schema_key;
175174 {
176175 TOlapScanNode& olap_scan_node = local_state->olap_scan_node ();
177- if (olap_scan_node.__isset .schema_version && olap_scan_node.__isset .columns_desc &&
178- !olap_scan_node.columns_desc .empty () &&
179- olap_scan_node.columns_desc [0 ].col_unique_id >= 0 && // Why check first column?
180- tablet->tablet_schema ()->num_variant_columns () == 0 &&
181- tablet->tablet_schema ()->num_virtual_columns () == 0 ) {
176+
177+ auto check_can_use_cache = [&]() {
178+ if (!(olap_scan_node.__isset .schema_version && olap_scan_node.__isset .columns_desc &&
179+ !olap_scan_node.columns_desc .empty () &&
180+ olap_scan_node.columns_desc [0 ].col_unique_id >= 0 && // Why check first column?
181+ tablet->tablet_schema ()->num_variant_columns () == 0 &&
182+ tablet->tablet_schema ()->num_virtual_columns () == 0 )) {
183+ return false ;
184+ }
185+
186+ const bool has_pruned_column =
187+ std::ranges::any_of (_output_tuple_desc->slots (), [](const auto & slot) {
188+ if (!slot->is_materialized ()) {
189+ return false ;
190+ }
191+ if ((slot->type ()->get_primitive_type () == PrimitiveType::TYPE_STRUCT ||
192+ slot->type ()->get_primitive_type () == PrimitiveType::TYPE_MAP ||
193+ slot->type ()->get_primitive_type () == PrimitiveType::TYPE_ARRAY) &&
194+ !slot->all_access_paths ().empty ()) {
195+ return true ;
196+ }
197+ return false ;
198+ });
199+ return !has_pruned_column;
200+ };
201+
202+ if (check_can_use_cache ()) {
182203 schema_key =
183204 SchemaCache::get_schema_key (tablet->tablet_id (), olap_scan_node.columns_desc ,
184205 olap_scan_node.schema_version );
0 commit comments