diff --git a/be/src/exprs/function/uniform.cpp b/be/src/exprs/function/uniform.cpp index 315392bcc12fbb..2206fb6f50792b 100644 --- a/be/src/exprs/function/uniform.cpp +++ b/be/src/exprs/function/uniform.cpp @@ -30,6 +30,7 @@ #include "core/block/block.h" #include "core/block/column_numbers.h" #include "core/column/column.h" +#include "core/column/column_execute_util.h" #include "core/column/column_vector.h" #include "core/data_type/data_type_number.h" // IWYU pragma: keep #include "core/data_type/primitive_type.h" @@ -73,12 +74,12 @@ struct UniformIntImpl { "uniform's min should be less than max, but got [{}, {})", min, max); } - // Get gen column (seed values) - const auto& gen_column = block.get_by_position(arguments[2]).column; + auto gen_column = + ColumnView::create(block.get_by_position(arguments[2]).column); for (int i = 0; i < input_rows_count; i++) { // Use gen value as seed for each row - auto seed = (*gen_column)[i].get(); + auto seed = gen_column.value_at(i); std::mt19937_64 generator(seed); std::uniform_int_distribution distribution(min, max); res_data[i] = distribution(generator); @@ -122,11 +123,12 @@ struct UniformDoubleImpl { } // Get gen column (seed values) - const auto& gen_column = block.get_by_position(arguments[2]).column; + auto gen_column = + ColumnView::create(block.get_by_position(arguments[2]).column); for (int i = 0; i < input_rows_count; i++) { // Use gen value as seed for each row - auto seed = (*gen_column)[i].get(); + auto seed = gen_column.value_at(i); std::mt19937_64 generator(seed); std::uniform_real_distribution distribution(min, max); res_data[i] = distribution(generator); @@ -157,6 +159,8 @@ class FunctionUniform : public IFunction { return Impl::get_variadic_argument_types(); } + ColumnNumbers get_arguments_that_are_always_constant() const override { return {0, 1}; } + Status open(FunctionContext* context, FunctionContext::FunctionStateScope scope) override { // init_function_context do set_constant_cols for FRAGMENT_LOCAL scope if (scope == FunctionContext::FRAGMENT_LOCAL) { diff --git a/regression-test/suites/nereids_function_p0/scalar_function/U.groovy b/regression-test/suites/nereids_function_p0/scalar_function/U.groovy index 68642fa31ec91b..f43bc4cb6eea97 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/U.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/U.groovy @@ -62,6 +62,8 @@ suite("nereids_scalar_fn_U") { def result = sql """select uniform(1, 100, random()*10000) from numbers("number" = "10");""" assertTrue(result.size() == 10) + def doubleResult = sql """select uniform(1.23, 100.100, random()*10000) from numbers("number" = "10");""" + assertTrue(doubleResult.size() == 10) test { sql """select uniform(100, 1, random()*10000) from numbers("number" = "10");""" exception "uniform's min should be less than max"