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

morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/dev-1.0.1 by this push:
     new 4f670020fd [BUGFIX] wrong answer with `with as` + two phase agg 
(#10303)
4f670020fd is described below

commit 4f670020fdc6a36962aa4901840a735d1d28cd80
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Wed Jun 22 14:39:39 2022 +0800

    [BUGFIX] wrong answer with `with as` + two phase agg (#10303)
---
 be/src/vec/exec/vaggregation_node.cpp | 12 ++++++++++--
 be/src/vec/exprs/vectorized_agg_fn.h  |  1 +
 be/src/vec/exprs/vslot_ref.h          |  2 ++
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/exec/vaggregation_node.cpp 
b/be/src/vec/exec/vaggregation_node.cpp
index dcd7b375d7..8230d4d697 100644
--- a/be/src/vec/exec/vaggregation_node.cpp
+++ b/be/src/vec/exec/vaggregation_node.cpp
@@ -526,8 +526,12 @@ Status AggregationNode::_merge_without_key(Block* block) {
     std::unique_ptr<char[]> deserialize_buffer(new 
char[_total_size_of_aggregate_states]);
     int rows = block->rows();
     for (int i = 0; i < _aggregate_evaluators.size(); ++i) {
+        DCHECK(_aggregate_evaluators[i]->input_exprs_ctxs().size() == 1 &&
+               
_aggregate_evaluators[i]->input_exprs_ctxs()[0]->root()->is_slot_ref());
+        int col_id =
+                
((VSlotRef*)_aggregate_evaluators[i]->input_exprs_ctxs()[0]->root())->column_id();
         if (_aggregate_evaluators[i]->is_merge()) {
-            auto column = block->get_by_position(i).column;
+            auto column = block->get_by_position(col_id).column;
             if (column->is_nullable()) {
                 column = 
((ColumnNullable*)column.get())->get_nested_column_ptr();
             }
@@ -1046,8 +1050,12 @@ Status 
AggregationNode::_merge_with_serialized_key(Block* block) {
     std::unique_ptr<char[]> deserialize_buffer(new 
char[_total_size_of_aggregate_states]);
 
     for (int i = 0; i < _aggregate_evaluators.size(); ++i) {
+        DCHECK(_aggregate_evaluators[i]->input_exprs_ctxs().size() == 1 &&
+               
_aggregate_evaluators[i]->input_exprs_ctxs()[0]->root()->is_slot_ref());
+        int col_id =
+                
((VSlotRef*)_aggregate_evaluators[i]->input_exprs_ctxs()[0]->root())->column_id();
         if (_aggregate_evaluators[i]->is_merge()) {
-            auto column = block->get_by_position(i + key_size).column;
+            auto column = block->get_by_position(col_id).column;
             if (column->is_nullable()) {
                 column = 
((ColumnNullable*)column.get())->get_nested_column_ptr();
             }
diff --git a/be/src/vec/exprs/vectorized_agg_fn.h 
b/be/src/vec/exprs/vectorized_agg_fn.h
index f3e7c04b47..0f1f145ced 100644
--- a/be/src/vec/exprs/vectorized_agg_fn.h
+++ b/be/src/vec/exprs/vectorized_agg_fn.h
@@ -67,6 +67,7 @@ public:
     static std::string debug_string(const std::vector<AggFnEvaluator*>& exprs);
     std::string debug_string() const;
     bool is_merge() const { return _is_merge; }
+    const std::vector<VExprContext*>& input_exprs_ctxs() const { return 
_input_exprs_ctxs; }
 
 private:
     const TFunction _fn;
diff --git a/be/src/vec/exprs/vslot_ref.h b/be/src/vec/exprs/vslot_ref.h
index 975b90a223..1bc78a4c5c 100644
--- a/be/src/vec/exprs/vslot_ref.h
+++ b/be/src/vec/exprs/vslot_ref.h
@@ -39,6 +39,8 @@ public:
     virtual std::string debug_string() const override;
     virtual bool is_constant() const override { return false; }
 
+    const int column_id() const { return _column_id; }
+
 private:
     FunctionPtr _function;
     int _slot_id;


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

Reply via email to