This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 94a8fa6bc9 [bug](function) fix explode_number function return wrong
rows (#23603)
94a8fa6bc9 is described below
commit 94a8fa6bc940636e93e96b19205d76c90a762d42
Author: zhangstar333 <[email protected]>
AuthorDate: Tue Aug 29 19:02:49 2023 +0800
[bug](function) fix explode_number function return wrong rows (#23603)
before the explode_number function result is random with const value.
because the _cur_size is reset, so it's can't insert values to column.
---
be/src/vec/exec/vtable_function_node.h | 4 +-
be/src/vec/exprs/table_function/table_function.h | 6 +-
be/src/vec/exprs/table_function/vexplode.cpp | 2 +-
be/src/vec/exprs/table_function/vexplode.h | 2 +-
.../vec/exprs/table_function/vexplode_bitmap.cpp | 2 +-
be/src/vec/exprs/table_function/vexplode_bitmap.h | 2 +-
.../exprs/table_function/vexplode_json_array.cpp | 2 +-
.../vec/exprs/table_function/vexplode_json_array.h | 2 +-
.../vec/exprs/table_function/vexplode_numbers.cpp | 10 +-
be/src/vec/exprs/table_function/vexplode_numbers.h | 6 +-
be/src/vec/exprs/table_function/vexplode_split.cpp | 2 +-
be/src/vec/exprs/table_function/vexplode_split.h | 2 +-
be/test/vec/function/function_test_util.cpp | 4 +-
.../sql_functions/table_function/explode.out | 229 +++++++++++++++++++++
.../sql_functions/table_function/explode.groovy | 21 ++
15 files changed, 276 insertions(+), 20 deletions(-)
diff --git a/be/src/vec/exec/vtable_function_node.h
b/be/src/vec/exec/vtable_function_node.h
index 040ca3f7af..db88147cf4 100644
--- a/be/src/vec/exec/vtable_function_node.h
+++ b/be/src/vec/exec/vtable_function_node.h
@@ -69,14 +69,14 @@ public:
ExecNode::release_resource(state);
}
- Status push(RuntimeState*, Block* input_block, bool eos) override {
+ Status push(RuntimeState* state, Block* input_block, bool eos) override {
_child_eos = eos;
if (input_block->rows() == 0) {
return Status::OK();
}
for (TableFunction* fn : _fns) {
- RETURN_IF_ERROR(fn->process_init(input_block));
+ RETURN_IF_ERROR(fn->process_init(input_block, state));
}
RETURN_IF_ERROR(_process_next_child_row());
return Status::OK();
diff --git a/be/src/vec/exprs/table_function/table_function.h
b/be/src/vec/exprs/table_function/table_function.h
index 4b31a681b1..7ba6379a20 100644
--- a/be/src/vec/exprs/table_function/table_function.h
+++ b/be/src/vec/exprs/table_function/table_function.h
@@ -36,10 +36,12 @@ public:
virtual Status open() { return Status::OK(); }
- virtual Status process_init(Block* block) = 0;
+ virtual Status process_init(Block* block, RuntimeState* state) = 0;
virtual Status process_row(size_t row_idx) {
- _cur_size = 0;
+ if (!_is_const) {
+ _cur_size = 0;
+ }
return reset();
}
diff --git a/be/src/vec/exprs/table_function/vexplode.cpp
b/be/src/vec/exprs/table_function/vexplode.cpp
index 1340ff74bb..6f13a710e2 100644
--- a/be/src/vec/exprs/table_function/vexplode.cpp
+++ b/be/src/vec/exprs/table_function/vexplode.cpp
@@ -36,7 +36,7 @@ VExplodeTableFunction::VExplodeTableFunction() {
_fn_name = "vexplode";
}
-Status VExplodeTableFunction::process_init(Block* block) {
+Status VExplodeTableFunction::process_init(Block* block, RuntimeState* state) {
CHECK(_expr_context->root()->children().size() == 1)
<< "VExplodeTableFunction only support 1 child but has "
<< _expr_context->root()->children().size();
diff --git a/be/src/vec/exprs/table_function/vexplode.h
b/be/src/vec/exprs/table_function/vexplode.h
index 26771bd2b2..2da97d11a4 100644
--- a/be/src/vec/exprs/table_function/vexplode.h
+++ b/be/src/vec/exprs/table_function/vexplode.h
@@ -40,7 +40,7 @@ public:
~VExplodeTableFunction() override = default;
- Status process_init(Block* block) override;
+ Status process_init(Block* block, RuntimeState* state) override;
Status process_row(size_t row_idx) override;
Status process_close() override;
void get_value(MutableColumnPtr& column) override;
diff --git a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
index 152566d00b..9ce7771454 100644
--- a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
@@ -40,7 +40,7 @@ VExplodeBitmapTableFunction::VExplodeBitmapTableFunction() {
_fn_name = "vexplode_bitmap";
}
-Status VExplodeBitmapTableFunction::process_init(Block* block) {
+Status VExplodeBitmapTableFunction::process_init(Block* block, RuntimeState*
state) {
CHECK(_expr_context->root()->children().size() == 1)
<< "VExplodeNumbersTableFunction must be have 1 children but have "
<< _expr_context->root()->children().size();
diff --git a/be/src/vec/exprs/table_function/vexplode_bitmap.h
b/be/src/vec/exprs/table_function/vexplode_bitmap.h
index 0dfde605de..18cdc6bb22 100644
--- a/be/src/vec/exprs/table_function/vexplode_bitmap.h
+++ b/be/src/vec/exprs/table_function/vexplode_bitmap.h
@@ -45,7 +45,7 @@ public:
void get_value(MutableColumnPtr& column) override;
Status forward(int step = 1) override;
- Status process_init(Block* block) override;
+ Status process_init(Block* block, RuntimeState* state) override;
Status process_row(size_t row_idx) override;
Status process_close() override;
diff --git a/be/src/vec/exprs/table_function/vexplode_json_array.cpp
b/be/src/vec/exprs/table_function/vexplode_json_array.cpp
index 840923d018..7c8c48733f 100644
--- a/be/src/vec/exprs/table_function/vexplode_json_array.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_json_array.cpp
@@ -162,7 +162,7 @@
VExplodeJsonArrayTableFunction::VExplodeJsonArrayTableFunction(ExplodeJsonArrayT
_fn_name = "vexplode_json_array";
}
-Status VExplodeJsonArrayTableFunction::process_init(Block* block) {
+Status VExplodeJsonArrayTableFunction::process_init(Block* block,
RuntimeState* state) {
CHECK(_expr_context->root()->children().size() == 1)
<< _expr_context->root()->children().size();
diff --git a/be/src/vec/exprs/table_function/vexplode_json_array.h
b/be/src/vec/exprs/table_function/vexplode_json_array.h
index db1784e5ad..6b5a0f7651 100644
--- a/be/src/vec/exprs/table_function/vexplode_json_array.h
+++ b/be/src/vec/exprs/table_function/vexplode_json_array.h
@@ -111,7 +111,7 @@ public:
VExplodeJsonArrayTableFunction(ExplodeJsonArrayType type);
~VExplodeJsonArrayTableFunction() override = default;
- Status process_init(Block* block) override;
+ Status process_init(Block* block, RuntimeState* state) override;
Status process_row(size_t row_idx) override;
Status process_close() override;
void get_value(MutableColumnPtr& column) override;
diff --git a/be/src/vec/exprs/table_function/vexplode_numbers.cpp
b/be/src/vec/exprs/table_function/vexplode_numbers.cpp
index fe450c8096..8149d4d958 100644
--- a/be/src/vec/exprs/table_function/vexplode_numbers.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_numbers.cpp
@@ -23,6 +23,7 @@
#include <vector>
#include "common/status.h"
+#include "runtime/runtime_state.h"
#include "vec/columns/column.h"
#include "vec/columns/column_const.h"
#include "vec/columns/column_nullable.h"
@@ -40,7 +41,7 @@ VExplodeNumbersTableFunction::VExplodeNumbersTableFunction() {
_fn_name = "vexplode_numbers";
}
-Status VExplodeNumbersTableFunction::process_init(Block* block) {
+Status VExplodeNumbersTableFunction::process_init(Block* block, RuntimeState*
state) {
CHECK(_expr_context->root()->children().size() == 1)
<< "VExplodeSplitTableFunction must be have 1 children but have "
<< _expr_context->root()->children().size();
@@ -61,9 +62,10 @@ Status VExplodeNumbersTableFunction::process_init(Block*
block) {
} else {
_cur_size = column_nested->get_int(0);
}
-
- if (_cur_size && _cur_size <= block->rows()) { // avoid
elements_column too big or empty
- _is_const = true; // use const optimize
+ ((ColumnInt32*)_elements_column.get())->clear();
+ if (_cur_size &&
+ _cur_size <= state->batch_size()) { // avoid elements_column too
big or empty
+ _is_const = true; // use const optimize
for (int i = 0; i < _cur_size; i++) {
((ColumnInt32*)_elements_column.get())->insert_value(i);
}
diff --git a/be/src/vec/exprs/table_function/vexplode_numbers.h
b/be/src/vec/exprs/table_function/vexplode_numbers.h
index f4f86e8d4d..7bdde9278b 100644
--- a/be/src/vec/exprs/table_function/vexplode_numbers.h
+++ b/be/src/vec/exprs/table_function/vexplode_numbers.h
@@ -43,7 +43,7 @@ public:
VExplodeNumbersTableFunction();
~VExplodeNumbersTableFunction() override = default;
- Status process_init(Block* block) override;
+ Status process_init(Block* block, RuntimeState* state) override;
Status process_row(size_t row_idx) override;
Status process_close() override;
void get_value(MutableColumnPtr& column) override;
@@ -53,13 +53,13 @@ public:
if (_is_nullable) {
static_cast<ColumnInt32*>(
static_cast<ColumnNullable*>(column.get())->get_nested_column_ptr().get())
- ->insert_many_from(*_elements_column, _cur_offset,
max_step);
+ ->insert_range_from(*_elements_column, _cur_offset,
max_step);
static_cast<ColumnUInt8*>(
static_cast<ColumnNullable*>(column.get())->get_null_map_column_ptr().get())
->insert_many_defaults(max_step);
} else {
static_cast<ColumnInt32*>(column.get())
- ->insert_many_from(*_elements_column, _cur_offset,
max_step);
+ ->insert_range_from(*_elements_column, _cur_offset,
max_step);
}
forward(max_step);
diff --git a/be/src/vec/exprs/table_function/vexplode_split.cpp
b/be/src/vec/exprs/table_function/vexplode_split.cpp
index c3ae83f9f3..c2a48f456a 100644
--- a/be/src/vec/exprs/table_function/vexplode_split.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_split.cpp
@@ -43,7 +43,7 @@ Status VExplodeSplitTableFunction::open() {
return Status::OK();
}
-Status VExplodeSplitTableFunction::process_init(Block* block) {
+Status VExplodeSplitTableFunction::process_init(Block* block, RuntimeState*
state) {
CHECK(_expr_context->root()->children().size() == 2)
<< "VExplodeSplitTableFunction must be have 2 children but have "
<< _expr_context->root()->children().size();
diff --git a/be/src/vec/exprs/table_function/vexplode_split.h
b/be/src/vec/exprs/table_function/vexplode_split.h
index 1155090bb1..629e2259b6 100644
--- a/be/src/vec/exprs/table_function/vexplode_split.h
+++ b/be/src/vec/exprs/table_function/vexplode_split.h
@@ -45,7 +45,7 @@ public:
~VExplodeSplitTableFunction() override = default;
Status open() override;
- Status process_init(Block* block) override;
+ Status process_init(Block* block, RuntimeState* state) override;
Status process_row(size_t row_idx) override;
Status process_close() override;
void get_value(MutableColumnPtr& column) override;
diff --git a/be/test/vec/function/function_test_util.cpp
b/be/test/vec/function/function_test_util.cpp
index f75be08910..c61d272cca 100644
--- a/be/test/vec/function/function_test_util.cpp
+++ b/be/test/vec/function/function_test_util.cpp
@@ -23,6 +23,7 @@
#include <iostream>
#include "runtime/jsonb_value.h"
+#include "runtime/runtime_state.h"
#include "util/binary_cast.hpp"
#include "util/bitmap_value.h"
#include "vec/data_types/data_type_array.h"
@@ -341,8 +342,9 @@ Block* process_table_function(TableFunction* fn, Block*
input_block,
return nullptr;
}
+ RuntimeState runtime_state((TQueryGlobals()));
// process table function init
- if (fn->process_init(input_block) != Status::OK()) {
+ if (fn->process_init(input_block, &runtime_state) != Status::OK()) {
LOG(WARNING) << "TableFunction process_init failed";
return nullptr;
}
diff --git
a/regression-test/data/query_p0/sql_functions/table_function/explode.out
b/regression-test/data/query_p0/sql_functions/table_function/explode.out
index c3e327625a..2c06dc5d81 100644
--- a/regression-test/data/query_p0/sql_functions/table_function/explode.out
+++ b/regression-test/data/query_p0/sql_functions/table_function/explode.out
@@ -46,3 +46,232 @@
3 1
4 1
+-- !test4 --
+1 0
+1 1
+1 2
+1 3
+1 4
+2 0
+2 1
+2 2
+2 3
+2 4
+3 0
+3 1
+3 2
+3 3
+3 4
+4 0
+4 1
+4 2
+4 3
+4 4
+5 0
+5 1
+5 2
+5 3
+5 4
+6 0
+6 1
+6 2
+6 3
+6 4
+7 0
+7 1
+7 2
+7 3
+7 4
+8 0
+8 1
+8 2
+8 3
+8 4
+9 0
+9 1
+9 2
+9 3
+9 4
+10 0
+10 1
+10 2
+10 3
+10 4
+11 0
+11 1
+11 2
+11 3
+11 4
+12 0
+12 1
+12 2
+12 3
+12 4
+13 0
+13 1
+13 2
+13 3
+13 4
+14 0
+14 1
+14 2
+14 3
+14 4
+15 0
+15 1
+15 2
+15 3
+15 4
+
+-- !test5 --
+1 0
+1 1
+1 2
+1 3
+1 4
+1 5
+1 6
+1 7
+1 8
+1 9
+2 0
+2 1
+2 2
+2 3
+2 4
+2 5
+2 6
+2 7
+2 8
+2 9
+3 0
+3 1
+3 2
+3 3
+3 4
+3 5
+3 6
+3 7
+3 8
+3 9
+4 0
+4 1
+4 2
+4 3
+4 4
+4 5
+4 6
+4 7
+4 8
+4 9
+5 0
+5 1
+5 2
+5 3
+5 4
+5 5
+5 6
+5 7
+5 8
+5 9
+6 0
+6 1
+6 2
+6 3
+6 4
+6 5
+6 6
+6 7
+6 8
+6 9
+7 0
+7 1
+7 2
+7 3
+7 4
+7 5
+7 6
+7 7
+7 8
+7 9
+8 0
+8 1
+8 2
+8 3
+8 4
+8 5
+8 6
+8 7
+8 8
+8 9
+9 0
+9 1
+9 2
+9 3
+9 4
+9 5
+9 6
+9 7
+9 8
+9 9
+10 0
+10 1
+10 2
+10 3
+10 4
+10 5
+10 6
+10 7
+10 8
+10 9
+11 0
+11 1
+11 2
+11 3
+11 4
+11 5
+11 6
+11 7
+11 8
+11 9
+12 0
+12 1
+12 2
+12 3
+12 4
+12 5
+12 6
+12 7
+12 8
+12 9
+13 0
+13 1
+13 2
+13 3
+13 4
+13 5
+13 6
+13 7
+13 8
+13 9
+14 0
+14 1
+14 2
+14 3
+14 4
+14 5
+14 6
+14 7
+14 8
+14 9
+15 0
+15 1
+15 2
+15 3
+15 4
+15 5
+15 6
+15 7
+15 8
+15 9
+
diff --git
a/regression-test/suites/query_p0/sql_functions/table_function/explode.groovy
b/regression-test/suites/query_p0/sql_functions/table_function/explode.groovy
index 7118ebf43b..fabb847189 100644
---
a/regression-test/suites/query_p0/sql_functions/table_function/explode.groovy
+++
b/regression-test/suites/query_p0/sql_functions/table_function/explode.groovy
@@ -49,4 +49,25 @@ suite("explode") {
qt_test1 """select e1 from (select k1 from d_table) as t lateral view
explode_numbers(5) tmp1 as e1;"""
qt_test2 """select e1 from (select k1 from d_table) as t lateral view
explode_numbers(5) tmp1 as e1 where e1=k1;"""
qt_test3 """select e1,k1 from (select k1 from d_table) as t lateral view
explode_numbers(5) tmp1 as e1;"""
+
+ sql """ DROP TABLE IF EXISTS baseall_explode_numbers; """
+ sql """
+ CREATE TABLE `baseall_explode_numbers` (
+ `k3` int(11) NULL
+ ) ENGINE=OLAP
+ duplicate KEY(`k3`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`k3`) BUCKETS 5
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "is_being_synced" = "false",
+ "storage_format" = "V2",
+ "light_schema_change" = "true",
+ "disable_auto_compaction" = "false",
+ "enable_single_replica_compaction" = "false"
+ );
+ """
+ sql "insert into baseall_explode_numbers
values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);"
+ qt_test4 """select k3,e from baseall_explode_numbers as U lateral view
explode_numbers(5) tmp1 as e order by k3,e;"""
+ qt_test5 """select k3,e from baseall_explode_numbers as U lateral view
explode_numbers(10) tmp1 as e order by k3,e;"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]