diff --git a/be/src/vec/functions/if.cpp b/be/src/vec/functions/if.cpp index d839142db3..0d36f462ae 100644 --- a/be/src/vec/functions/if.cpp +++ b/be/src/vec/functions/if.cpp @@ -455,6 +455,19 @@ public: cond_column.column = materialize_column_if_const(cond_column.column); const ColumnWithTypeAndName& arg_cond = block.get_by_position(arguments[0]); + if (auto* then_is_const = check_and_get_column(*arg_then.column)) { + if (check_and_get_column(then_is_const->get_data_column())) { + ColumnWithTypeAndName& then_column = block.get_by_position(arguments[1]); + then_column.column = materialize_column_if_const(then_column.column); + } + } + if (auto* else_is_const = check_and_get_column(*arg_else.column)) { + if (check_and_get_column(else_is_const->get_data_column())) { + ColumnWithTypeAndName& else_column = block.get_by_position(arguments[2]); + else_column.column = materialize_column_if_const(else_column.column); + } + } + Status ret = Status::OK(); if (execute_for_null_condition(context, block, arg_cond, arg_then, arg_else, result) || execute_for_null_then_else(context, block, arg_cond, arg_then, arg_else, result, diff --git a/regression-test/data/query_p0/sql_functions/conditional_functions/test_conditional_function.out b/regression-test/data/query_p0/sql_functions/conditional_functions/test_conditional_function.out index 52962b5c54..4038cc766c 100644 --- a/regression-test/data/query_p0/sql_functions/conditional_functions/test_conditional_function.out +++ b/regression-test/data/query_p0/sql_functions/conditional_functions/test_conditional_function.out @@ -191,3 +191,14 @@ true 999 999 +-- !if_true_then_nullable -- +4 + +-- !if_true_else_nullable -- +2 + +-- !if_false_then_nullable -- +2 + +-- !if_false_else_nullable -- +4 diff --git a/regression-test/suites/query_p0/sql_functions/conditional_functions/test_conditional_function.groovy b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_conditional_function.groovy index 57d8a42810..d8ebc0402b 100644 --- a/regression-test/suites/query_p0/sql_functions/conditional_functions/test_conditional_function.groovy +++ b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_conditional_function.groovy @@ -87,5 +87,11 @@ suite("test_conditional_function") { qt_sql "select ifnull( user_id, 999) r from ${tbName} order by r" + qt_if_true_then_nullable """select IF(true, DAYOFWEEK("2022-12-06 17:48:46"), 1) + 1;""" + qt_if_true_else_nullable """select IF(true, 1, DAYOFWEEK("2022-12-06 17:48:46")) + 1;""" + + qt_if_false_then_nullable """select IF(false, DAYOFWEEK("2022-12-06 17:48:46"), 1) + 1;""" + qt_if_false_else_nullable """select IF(false, 1, DAYOFWEEK("2022-12-06 17:48:46")) + 1;""" + sql "DROP TABLE ${tbName};" }