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

yiguolei pushed a commit to branch branch-1.1-lts
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-1.1-lts by this push:
     new 4fa566f896 [fix](expr) avoid crashing caused by big depth of 
expression tree (#17346)
4fa566f896 is described below

commit 4fa566f8967c7e1ca2a8cf73c36f2cecc56af552
Author: Jerry Hu <mrh...@gmail.com>
AuthorDate: Thu Mar 2 21:50:35 2023 +0800

    [fix](expr) avoid crashing caused by big depth of expression tree (#17346)
---
 be/src/common/config.h           |  3 +++
 be/src/vec/exprs/vexpr.cpp       | 13 +++++++++++--
 be/src/vec/exprs/vexpr_context.h |  3 +++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/be/src/common/config.h b/be/src/common/config.h
index ba117fe1af..762802c957 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -745,6 +745,9 @@ CONF_mInt32(max_fragment_start_wait_time_seconds, "30");
 
 // limit the queue of pending batches which will be sent by a single 
nodechannel
 CONF_mInt64(nodechannel_pending_queue_max_bytes, "67108864");
+
+// max depth of expression tree allowed.
+CONF_Int32(max_depth_of_expr_tree, "200");
 } // namespace config
 
 } // namespace doris
diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp
index a8a04d8d0d..6fbdfb1fa7 100644
--- a/be/src/vec/exprs/vexpr.cpp
+++ b/be/src/vec/exprs/vexpr.cpp
@@ -28,10 +28,10 @@
 #include "vec/exprs/vcompound_pred.h"
 #include "vec/exprs/vectorized_fn_call.h"
 #include "vec/exprs/vin_predicate.h"
-#include "vec/exprs/vtuple_is_null_predicate.h"
+#include "vec/exprs/vinfo_func.h"
 #include "vec/exprs/vliteral.h"
 #include "vec/exprs/vslot_ref.h"
-#include "vec/exprs/vinfo_func.h"
+#include "vec/exprs/vtuple_is_null_predicate.h"
 
 namespace doris::vectorized {
 using doris::Status;
@@ -62,9 +62,18 @@ VExpr::VExpr(const TypeDescriptor& type, bool is_slotref, 
bool is_nullable)
 }
 
 Status VExpr::prepare(RuntimeState* state, const RowDescriptor& row_desc, 
VExprContext* context) {
+    ++context->_depth_num;
+    if (context->_depth_num > config::max_depth_of_expr_tree) {
+        return Status::InternalError(
+                fmt::format("The depth of the expression tree is too big, make 
it less than {}",
+                            config::max_depth_of_expr_tree));
+    }
+
     for (int i = 0; i < _children.size(); ++i) {
         RETURN_IF_ERROR(_children[i]->prepare(state, row_desc, context));
     }
+
+    --context->_depth_num;
     return Status::OK();
 }
 
diff --git a/be/src/vec/exprs/vexpr_context.h b/be/src/vec/exprs/vexpr_context.h
index 54b47d7d1b..5e606d9c79 100644
--- a/be/src/vec/exprs/vexpr_context.h
+++ b/be/src/vec/exprs/vexpr_context.h
@@ -92,5 +92,8 @@ private:
     std::unique_ptr<MemPool> _pool;
 
     int _last_result_column_id;
+
+    /// The depth of expression-tree.
+    int _depth_num = 0;
 };
 } // namespace doris::vectorized


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

Reply via email to