This is an automated email from the ASF dual-hosted git repository.
caiconghui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 7b3865b524 [fix](ut)(vectorized) fix a potential stack overflow bug
and some unit test (#9140)
7b3865b524 is described below
commit 7b3865b5249977f06df876671f621bec6e3b8bd3
Author: Mingyu Chen <[email protected]>
AuthorDate: Thu Apr 21 12:17:03 2022 +0800
[fix](ut)(vectorized) fix a potential stack overflow bug and some unit test
(#9140)
---
be/src/vec/io/var_int.h | 2 +-
be/test/CMakeLists.txt | 1 -
be/test/runtime/free_list_test.cpp | 153 ---------------------
.../apache/doris/common/util/VectorizedUtil.java | 7 +-
.../java/org/apache/doris/utframe/DorisAssert.java | 2 +
5 files changed, 9 insertions(+), 156 deletions(-)
diff --git a/be/src/vec/io/var_int.h b/be/src/vec/io/var_int.h
index b5f675610d..e932c506b7 100644
--- a/be/src/vec/io/var_int.h
+++ b/be/src/vec/io/var_int.h
@@ -125,7 +125,7 @@ inline void read_var_uint(UInt64& x, BufferReadable& buf) {
}
inline void write_var_uint(UInt64 x, BufferWritable& ostr) {
- char bytes[8];
+ char bytes[9];
uint8_t i = 0;
while (i < 9) {
uint8_t byte = x & 0x7F;
diff --git a/be/test/CMakeLists.txt b/be/test/CMakeLists.txt
index a1b0cfddbf..c443bcaa95 100644
--- a/be/test/CMakeLists.txt
+++ b/be/test/CMakeLists.txt
@@ -230,7 +230,6 @@ set(RUNTIME_TEST_FILES
# runtime/export_task_mgr_test.cpp
# runtime/minidump_test.cpp
runtime/mem_pool_test.cpp
- runtime/free_list_test.cpp
runtime/string_buffer_test.cpp
runtime/decimalv2_value_test.cpp
runtime/large_int_value_test.cpp
diff --git a/be/test/runtime/free_list_test.cpp
b/be/test/runtime/free_list_test.cpp
deleted file mode 100644
index 875c97ad8c..0000000000
--- a/be/test/runtime/free_list_test.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-// 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.
-
-#include "runtime/free_list.hpp"
-
-#include <gtest/gtest.h>
-
-#include <string>
-
-#include "runtime/mem_pool.h"
-#include "runtime/mem_tracker.h"
-
-namespace doris {
-
-TEST(FreeListTest, Basic) {
- MemTracker tracker;
- MemPool pool(&tracker);
- FreeList list;
-
- int allocated_size;
- uint8_t* free_list_mem = list.allocate(FreeList::min_size(),
&allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- uint8_t* mem = pool.allocate(FreeList::min_size());
- EXPECT_TRUE(mem != nullptr);
-
- list.add(mem, FreeList::min_size());
- free_list_mem = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_EQ(mem, free_list_mem);
- EXPECT_EQ(allocated_size, FreeList::min_size());
-
- free_list_mem = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- // Make 3 allocations and add them to the free list.
- // Get them all back from the free list, scribbling to the
- // returned memory in between.
- // Attempt a 4th allocation from the free list and make sure
- // we get nullptr.
- // Repeat with the same memory blocks.
- uint8_t* free_list_mem1 = nullptr;
- uint8_t* free_list_mem2 = nullptr;
- uint8_t* free_list_mem3 = nullptr;
-
- mem = pool.allocate(FreeList::min_size());
- list.add(mem, FreeList::min_size());
- mem = pool.allocate(FreeList::min_size());
- list.add(mem, FreeList::min_size());
- mem = pool.allocate(FreeList::min_size());
- list.add(mem, FreeList::min_size());
-
- free_list_mem1 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem1 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem1, FreeList::min_size());
-
- free_list_mem2 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem2 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem2, FreeList::min_size());
-
- free_list_mem3 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem3 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem3, FreeList::min_size());
-
- free_list_mem = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- list.add(free_list_mem1, FreeList::min_size());
- list.add(free_list_mem2, FreeList::min_size());
- list.add(free_list_mem3, FreeList::min_size());
-
- free_list_mem1 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem1 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem1, FreeList::min_size());
-
- free_list_mem2 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem2 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem2, FreeList::min_size());
-
- free_list_mem3 = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_TRUE(free_list_mem3 != nullptr);
- EXPECT_EQ(allocated_size, FreeList::min_size());
- bzero(free_list_mem3, FreeList::min_size());
-
- free_list_mem = list.allocate(FreeList::min_size(), &allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- // Try some allocations with different sizes
- int size1 = FreeList::min_size();
- int size2 = FreeList::min_size() * 2;
- int size4 = FreeList::min_size() * 4;
-
- uint8_t* mem1 = pool.allocate(size1);
- uint8_t* mem2 = pool.allocate(size2);
- uint8_t* mem4 = pool.allocate(size4);
-
- list.add(mem2, size2);
- free_list_mem = list.allocate(size4, &allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- free_list_mem = list.allocate(size1, &allocated_size);
- EXPECT_TRUE(free_list_mem != nullptr);
- EXPECT_EQ(allocated_size, size2);
- bzero(free_list_mem, size1);
-
- free_list_mem = list.allocate(size1, &allocated_size);
- EXPECT_EQ(nullptr, free_list_mem);
- EXPECT_EQ(allocated_size, 0);
-
- list.add(mem2, size2);
- list.add(mem4, size4);
- list.add(mem1, size1);
-
- free_list_mem = list.allocate(size4, &allocated_size);
- EXPECT_EQ(mem4, free_list_mem);
- EXPECT_EQ(allocated_size, size4);
- bzero(free_list_mem, size4);
-
- free_list_mem = list.allocate(size2, &allocated_size);
- EXPECT_EQ(mem2, free_list_mem);
- EXPECT_EQ(allocated_size, size2);
- bzero(free_list_mem, size2);
-
- free_list_mem = list.allocate(size1, &allocated_size);
- EXPECT_EQ(mem1, free_list_mem);
- EXPECT_EQ(allocated_size, size1);
- bzero(free_list_mem, size1);
-}
-
-} // namespace doris
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
b/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
index b094389db9..4b793a0e9b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/VectorizedUtil.java
@@ -19,6 +19,7 @@ package org.apache.doris.common.util;
import org.apache.doris.analysis.Analyzer;
import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
public class VectorizedUtil {
/**
@@ -32,7 +33,11 @@ public class VectorizedUtil {
if (connectContext == null) {
return false;
}
- Analyzer analyzer = connectContext.getExecutor().getAnalyzer();
+ StmtExecutor stmtExecutor = connectContext.getExecutor();
+ if (stmtExecutor == null) {
+ return
connectContext.getSessionVariable().enableVectorizedEngine();
+ }
+ Analyzer analyzer = stmtExecutor.getAnalyzer();
if (analyzer == null) {
return
connectContext.getSessionVariable().enableVectorizedEngine();
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
index f6d763433e..eabaab95c8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
@@ -191,6 +191,8 @@ public class DorisAssert {
private String internalExecute(String sql) throws Exception {
StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql);
+ connectContext.setExecutor(stmtExecutor);
+ ConnectContext.get().setExecutor(stmtExecutor);
stmtExecutor.execute();
QueryState queryState = connectContext.getState();
if (queryState.getStateType() == QueryState.MysqlStateType.ERR) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]