This is an automated email from the ASF dual-hosted git repository.
mrhhsg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 240f07badbd [fix](olap) The tablet schema cache caused incorrect
behavior in the complex-type column pruning functionality (#58373)
240f07badbd is described below
commit 240f07badbd5f3c5598a2273ed07f864d5aebe24
Author: Jerry Hu <[email protected]>
AuthorDate: Fri Nov 28 10:58:35 2025 +0800
[fix](olap) The tablet schema cache caused incorrect behavior in the
complex-type column pruning functionality (#58373)
### What problem does this PR solve?
TabletSchema with pruned column type should not be cached.
Related PR: #xxx
Problem Summary:
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [ ] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
---
be/src/vec/exec/scan/olap_scanner.cpp | 30 ++++++++++++++++++++++++------
1 file changed, 24 insertions(+), 6 deletions(-)
diff --git a/be/src/vec/exec/scan/olap_scanner.cpp
b/be/src/vec/exec/scan/olap_scanner.cpp
index 753d7b82a78..f54b226678d 100644
--- a/be/src/vec/exec/scan/olap_scanner.cpp
+++ b/be/src/vec/exec/scan/olap_scanner.cpp
@@ -169,16 +169,34 @@ Status OlapScanner::prepare() {
// value (e.g. select a from t where a .. and b ... limit 1),
// it will be very slow when reading data in segment iterator
_tablet_reader->set_batch_size(_state->batch_size());
-
TabletSchemaSPtr cached_schema;
std::string schema_key;
{
TOlapScanNode& olap_scan_node = local_state->olap_scan_node();
- if (olap_scan_node.__isset.schema_version &&
olap_scan_node.__isset.columns_desc &&
- !olap_scan_node.columns_desc.empty() &&
- olap_scan_node.columns_desc[0].col_unique_id >= 0 && // Why check
first column?
- tablet->tablet_schema()->num_variant_columns() == 0 &&
- tablet->tablet_schema()->num_virtual_columns() == 0) {
+
+ const auto check_can_use_cache = [&]() {
+ if (!(olap_scan_node.__isset.schema_version &&
olap_scan_node.__isset.columns_desc &&
+ !olap_scan_node.columns_desc.empty() &&
+ olap_scan_node.columns_desc[0].col_unique_id >= 0 && // Why
check first column?
+ tablet->tablet_schema()->num_variant_columns() == 0 &&
+ tablet->tablet_schema()->num_virtual_columns() == 0)) {
+ return false;
+ }
+
+ const bool has_pruned_column =
+ std::ranges::any_of(_output_tuple_desc->slots(), [](const
auto& slot) {
+ if ((slot->type()->get_primitive_type() ==
PrimitiveType::TYPE_STRUCT ||
+ slot->type()->get_primitive_type() ==
PrimitiveType::TYPE_MAP ||
+ slot->type()->get_primitive_type() ==
PrimitiveType::TYPE_ARRAY) &&
+ !slot->all_access_paths().empty()) {
+ return true;
+ }
+ return false;
+ });
+ return !has_pruned_column;
+ }();
+
+ if (check_can_use_cache) {
schema_key =
SchemaCache::get_schema_key(tablet->tablet_id(),
olap_scan_node.columns_desc,
olap_scan_node.schema_version);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]