**Use case**

Please look at the next request:
```
SELECT * FROM numbers(1000000) WHERE number % 10000 == 0 and extremely_heavy_udf(number) == 'ok'
```
Now as far as all the functions are "eager" the heavy UDF will drastically reduce performance of the request. 

**Describe the solution you'd like**

As far as I understood after a conversation with @alexey-milovidov you have a "Short Circuit Processing" optimization for simple logical predicates (like conjunctive normal form) doing "lazy calculate" for heavy functions.

So it would be nice to assume all UDF functions as heavy-to-process (which is very close to the truth).

size_t argument_size = arguments.size();
        auto arguments_copy = arguments;
        for (size_t i = 0; i < argument_size; ++i)
        {
            auto & column_with_type = arguments_copy[i];
            column_with_type.column = column_with_type.column->convertToFullColumnIfConst();
            const auto & argument = configuration.arguments[i];
            column_with_type.name = argument.name;
            const auto & argument_type = argument.type;
            if (areTypesEqual(arguments_copy[i].type, argument_type))
                continue;
            ColumnWithTypeAndName column_to_cast = {column_with_type.column, column_with_type.type, column_with_type.name};
            column_with_type.column = castColumnAccurate(column_to_cast, argument_type);
            column_with_type.type = argument_type;
            column_with_type = std::move(column_to_cast);
        }
        ColumnWithTypeAndName result(result_type, configuration.result_name);
        Block result_block({result});
        Block arguments_block(arguments_copy);
        auto source = std::make_shared<SourceFromSingleChunk>(std::move(arguments_block));
        auto shell_input_pipe = Pipe(std::move(source));
        ShellCommandSourceConfiguration shell_command_source_configuration;
        if (coordinator_configuration.is_executable_pool)
        {
            shell_command_source_configuration.read_fixed_number_of_rows = true;
            shell_command_source_configuration.number_of_rows_to_read = input_rows_count;
        }
        Pipes shell_input_pipes;
        shell_input_pipes.emplace_back(std::move(shell_input_pipe));
        Pipe pipe = coordinator->createPipe(