This is an automated email from the ASF dual-hosted git repository.

yangzhg 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 4f9b46d  Fix String type column using zonemap to filter data maybe 
core dump (#6939)
4f9b46d is described below

commit 4f9b46d40383c2526bfd1fd604cb95063ae65c7c
Author: Zhengguo Yang <yangz...@gmail.com>
AuthorDate: Wed Oct 27 09:25:38 2021 +0800

    Fix String type column using zonemap to filter data maybe core dump (#6939)
    
    Fix String type column using zonemap to filter data maybe core dump, 
because of not allocating memory before parsing string type zonemap
---
 be/src/olap/wrapper_field.cpp | 11 +++++++++--
 be/src/olap/wrapper_field.h   |  4 ++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/be/src/olap/wrapper_field.cpp b/be/src/olap/wrapper_field.cpp
index 61f5f88..be908a2 100644
--- a/be/src/olap/wrapper_field.cpp
+++ b/be/src/olap/wrapper_field.cpp
@@ -17,6 +17,8 @@
 
 #include "olap/wrapper_field.h"
 
+#include "olap/row_cursor.h"
+
 namespace doris {
 
 const size_t DEFAULT_STRING_LENGTH = 50;
@@ -25,8 +27,9 @@ WrapperField* WrapperField::create(const TabletColumn& 
column, uint32_t len) {
     bool is_string_type =
             (column.type() == OLAP_FIELD_TYPE_CHAR || column.type() == 
OLAP_FIELD_TYPE_VARCHAR ||
              column.type() == OLAP_FIELD_TYPE_HLL || column.type() == 
OLAP_FIELD_TYPE_OBJECT ||
-                    column.type() == OLAP_FIELD_TYPE_STRING);
-    size_t max_length = column.type() == OLAP_FIELD_TYPE_STRING ? 
OLAP_STRING_MAX_LENGTH : OLAP_VARCHAR_MAX_LENGTH;
+             column.type() == OLAP_FIELD_TYPE_STRING);
+    size_t max_length = column.type() == OLAP_FIELD_TYPE_STRING ? 
OLAP_STRING_MAX_LENGTH
+                                                                : 
OLAP_VARCHAR_MAX_LENGTH;
     if (is_string_type && len > max_length) {
         OLAP_LOG_WARNING("length of string parameter is too long[len=%lu, 
max_len=%lu].", len,
                          max_length);
@@ -89,6 +92,10 @@ WrapperField::WrapperField(Field* rep, size_t variable_len, 
bool is_string_type)
         _string_content.reset(new char[slice->size]);
         slice->data = _string_content.get();
     }
+    if (_rep->type() == OLAP_FIELD_TYPE_STRING) {
+        _long_text_buf = (char*)malloc(RowCursor::DEFAULT_TEXT_LENGTH * 
sizeof(char));
+        rep->set_long_text_buf(&_long_text_buf);
+    }
 }
 
 WrapperField::WrapperField(Field* rep, const RowCursorCell& row_cursor_cell)
diff --git a/be/src/olap/wrapper_field.h b/be/src/olap/wrapper_field.h
index c14c019..3d22a7b 100644
--- a/be/src/olap/wrapper_field.h
+++ b/be/src/olap/wrapper_field.h
@@ -41,6 +41,9 @@ public:
     virtual ~WrapperField() {
         delete _rep;
         delete[] _owned_buf;
+        if (_long_text_buf) {
+            delete _long_text_buf;
+        }
     }
 
     // 将内部的value转成string输出
@@ -103,6 +106,7 @@ private:
     bool _is_string_type;
     char* _field_buf = nullptr;
     char* _owned_buf = nullptr;
+    char* _long_text_buf = nullptr;
 
     //include fixed and variable length and null bytes
     size_t _length;

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to