This is an automated email from the ASF dual-hosted git repository.
kxiao 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 ac55d45f79c [Fix](topn opt) fix heap use after free when shrink in
fetch phase (#24774)
ac55d45f79c is described below
commit ac55d45f79c1234dddf8be29bb549dc699954cc8
Author: lihangyu <[email protected]>
AuthorDate: Fri Sep 22 19:48:05 2023 +0800
[Fix](topn opt) fix heap use after free when shrink in fetch phase (#24774)
---
be/src/exec/rowid_fetcher.cpp | 15 +++----
.../data/query_p0/test_array_orderby_limit.out | 4 ++
.../query_p0/test_array_orderby_limit.groovy | 48 ++++++++++++++++++++++
3 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/be/src/exec/rowid_fetcher.cpp b/be/src/exec/rowid_fetcher.cpp
index 302fc34fcc5..e1a48276891 100644
--- a/be/src/exec/rowid_fetcher.cpp
+++ b/be/src/exec/rowid_fetcher.cpp
@@ -44,8 +44,9 @@
#include "olap/tablet_schema.h"
#include "olap/utils.h"
#include "runtime/descriptors.h"
-#include "runtime/exec_env.h" // ExecEnv
-#include "runtime/runtime_state.h" // RuntimeState
+#include "runtime/exec_env.h" // ExecEnv
+#include "runtime/runtime_state.h" // RuntimeState
+#include "runtime/types.h"
#include "util/brpc_client_cache.h" // BrpcClientCache
#include "util/defer_op.h"
#include "vec/columns/column.h"
@@ -233,17 +234,17 @@ Status RowIDFetcher::fetch(const vectorized::ColumnPtr&
column_row_ids,
// shrink for char type
std::vector<size_t> char_type_idx;
for (size_t i = 0; i < _fetch_option.desc->slots().size(); i++) {
- auto column_desc = _fetch_option.desc->slots()[i];
- auto type_desc = column_desc->type();
+ const auto& column_desc = _fetch_option.desc->slots()[i];
+ const TypeDescriptor* type_desc = &column_desc->type();
do {
- if (type_desc.type == TYPE_CHAR) {
+ if (type_desc->type == TYPE_CHAR) {
char_type_idx.emplace_back(i);
break;
- } else if (type_desc.type != TYPE_ARRAY) {
+ } else if (type_desc->type != TYPE_ARRAY) {
break;
}
// for Array<Char> or Array<Array<Char>>
- type_desc = type_desc.children[0];
+ type_desc = &type_desc->children[0];
} while (true);
}
res_block->shrink_char_type_column_suffix_zero(char_type_idx);
diff --git a/regression-test/data/query_p0/test_array_orderby_limit.out
b/regression-test/data/query_p0/test_array_orderby_limit.out
new file mode 100644
index 00000000000..abcea7af965
--- /dev/null
+++ b/regression-test/data/query_p0/test_array_orderby_limit.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select --
+100 [["abc"]]
+
diff --git a/regression-test/suites/query_p0/test_array_orderby_limit.groovy
b/regression-test/suites/query_p0/test_array_orderby_limit.groovy
new file mode 100644
index 00000000000..b63d936dfc6
--- /dev/null
+++ b/regression-test/suites/query_p0/test_array_orderby_limit.groovy
@@ -0,0 +1,48 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_array_char_orderby", "query") {
+ // define a sql table
+ def testTable = "test_array_char_orderby"
+
+ sql """
+ CREATE TABLE IF NOT EXISTS ${testTable} (
+ `k1` INT(11) NULL,
+ `k2` array<array<char(50)>> NULL,
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`k1`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "in_memory" = "false",
+ "storage_format" = "V2",
+ "disable_auto_compaction" = "false"
+ )
+ """
+ // prepare data
+ sql """ INSERT INTO ${testTable} VALUES (100, [['abc']]) """
+ // set topn_opt_limit_threshold = 1024 to make sure _internal_service to
be request with proto request
+ sql """ set topn_opt_limit_threshold = 1024 """
+
+ explain{
+ sql("select * from ${testTable} order by k1 limit 1")
+ contains "TOPN"
+ }
+
+ qt_select """ select * from ${testTable} order by k1 limit 1 """
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]