Hi, Shamit Jain, In fact, it is an optimization to simplify expression. If a Udf has no parameters, optimizer would be look it as an expression which always generate constants results. So it would be calculated once in optimization phase instead of run by per record in. runtime phase.
The optimization would be disabled if any of the following condition is satisfied: (1) Expression has at least one parameter (2) Udf is not deterministic.(default value of `isDeterministic` is true, you could change the behavior by override the metjod `isDeterministic` of FunctionDefinition) (3) Udf is a dynamic function. (not applied for UDF, it is used for flink built-in SqlOperator). Best, JING ZHANG shamit jain <jainsha...@gmail.com> 于2021年7月14日周三 上午3:00写道: > Hi, > > I am facing an issue where scalar UDF called once in case if no parameter > passed as given below:- > > public class DateTimeToEpochUDF extends ScalarFunction { > public Long eval() { > System.out.print("Test"); > return Instant.now().toEpochMilli(); > } > } > > Now if I run the below query I will get the same time, looks like the > function is called only one time, as the SOP also not printed. > > select DateTimeToEpochUDF(), employee_ID from Employee; > > Please note if I passed the parameter in UDF like primary key it is called > separately for each record of employee. > > Request you to please let me know if I am doing something wrong. > > regards, > Shamit Jain >