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

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


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

commit 6a13fd85b2743210767a1b15235757a65cce6ef7
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Jan 23 13:13:34 2025 +0800

    branch-3.0: [Fix](ShortCircuite) fix point query crash with prepared 
statement when encounter delete sign #47178 (#47222)
    
    Cherry-picked from #47178
    
    Co-authored-by: lihangyu <lihan...@selectdb.com>
---
 be/src/service/point_query_executor.cpp            |  25 ++++++++++++++-------
 .../data/point_query_p0/test_point_query.out       | Bin 9833 -> 9896 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 1aee7f3604c..d3935745882 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -517,14 +517,23 @@ Status PointQueryExecutor::_lookup_row_data() {
     }
     // filter rows by delete sign
     if (_row_hits > 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 6707291aa38..30e1198451d 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 237103435a9..0463d9aa8f7 100644
--- a/regression-test/suites/point_query_p0/test_point_query.groovy
+++ b/regression-test/suites/point_query_p0/test_point_query.groovy
@@ -395,6 +395,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