Some functions are supposed to return different types depending on the types of the parameters.
We deal with this adjusting the expression type in the expression visitor (see + - * / operators) or in the native function visitor (see nvl) but other cases are not yet handled; abs, log, power and trunc.
The fact that we need to make this gymnastic should be enough to refactor the function abstraction as extending the expression interfaces.
Some functions are supposed to return different types depending on the types of the parameters.
We deal with this adjusting the expression type in the expression visitor (see + - * / operators) or in the native function visitor (see nvl) but other cases are not yet handled; abs, log, power and trunc.
The fact that we need to make this gymnastic should be enough to refactor the function abstraction as extending the expression interfaces.