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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new dd7affb8f9c branch-2.1 [Fix](ShortCircuite) fix point query crash with 
prepared statement when encounter delete sign (#47227)
dd7affb8f9c is described below

commit dd7affb8f9c2007710d32e44a7dd6bf2be176d4c
Author: lihangyu <lihan...@selectdb.com>
AuthorDate: Sat Jan 25 08:33:06 2025 +0800

    branch-2.1 [Fix](ShortCircuite) fix point query crash with prepared 
statement when encounter delete sign (#47227)
    
    cherry-pick from #47178
---
 be/src/service/point_query_executor.cpp            |  25 ++++++++++++++-------
 .../data/point_query_p0/test_point_query.out       | Bin 9868 -> 9931 bytes
 .../suites/point_query_p0/test_point_query.groovy  |   7 ++++++
 3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/be/src/service/point_query_executor.cpp 
b/be/src/service/point_query_executor.cpp
index 4e9295ed53d..2138f03c43a 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -361,14 +361,23 @@ Status PointQueryExecutor::_lookup_row_data() {
     }
     // filter rows by delete sign
     if (_result_block->rows() > 0 && _reusable->delete_sign_idx() != -1) {
-        vectorized::ColumnPtr delete_filter_columns =
-                _result_block->get_columns()[_reusable->delete_sign_idx()];
-        const auto& filter =
-                assert_cast<const 
vectorized::ColumnInt8*>(delete_filter_columns.get())->get_data();
-        size_t count = filter.size() - 
simd::count_zero_num((int8_t*)filter.data(), filter.size());
-        if (count == filter.size()) {
-            _result_block->clear();
-        } else if (count > 0) {
+        size_t filtered = 0;
+        size_t total = 0;
+        {
+            // clear_column_data will check reference of ColumnPtr, so we need 
to release
+            // reference before clear_column_data
+            vectorized::ColumnPtr delete_filter_columns =
+                    _result_block->get_columns()[_reusable->delete_sign_idx()];
+            const auto& filter =
+                    assert_cast<const 
vectorized::ColumnInt8*>(delete_filter_columns.get())
+                            ->get_data();
+            filtered = filter.size() - 
simd::count_zero_num((int8_t*)filter.data(), filter.size());
+            total = filter.size();
+        }
+
+        if (filtered == total) {
+            _result_block->clear_column_data();
+        } else if (filtered > 0) {
             return Status::NotSupported("Not implemented since only single row 
at present");
         }
     }
diff --git a/regression-test/data/point_query_p0/test_point_query.out 
b/regression-test/data/point_query_p0/test_point_query.out
index d5045685851..292ce49cde4 100644
Binary files a/regression-test/data/point_query_p0/test_point_query.out and 
b/regression-test/data/point_query_p0/test_point_query.out differ
diff --git a/regression-test/suites/point_query_p0/test_point_query.groovy 
b/regression-test/suites/point_query_p0/test_point_query.groovy
index 6e4d79caedb..17a2d3e2033 100644
--- a/regression-test/suites/point_query_p0/test_point_query.groovy
+++ b/regression-test/suites/point_query_p0/test_point_query.groovy
@@ -396,6 +396,13 @@ suite("test_point_query", "nonConcurrent") {
         qe_point_select partial_prepared_stmt
         qe_point_select partial_prepared_stmt
 
+        partial_prepared_stmt = prepareStatement " select * from 
regression_test_point_query_p0.table_3821461 where col1 = ? and col2 = ? and 
loc3 = 'aabc'"
+        partial_prepared_stmt.setInt(1, 10)
+        partial_prepared_stmt.setInt(2, 20)
+        qe_point_select partial_prepared_stmt
+        qe_point_select partial_prepared_stmt
+        qe_point_select partial_prepared_stmt
+
         // test prepared statement should not be short-circuited plan which 
use nondeterministic function
         try (PreparedStatement pstmt = prepareStatement("select now(3) 
data_time from regression_test_point_query_p0.test_partial_prepared_statement 
where sk = 'sk' and user_guid = 'user_guid' and  feature = 'feature'")) {
             def result1 = ""


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

Reply via email to