Related to #113961
resolveType for Greatest and Least only checks that all the input data types are the same (or null). The toEvaluator function, however, has an explicit list of types it maps to evaluators, and if a type does not match we throw from there. Personally, I recommend a strategy like we used in the binary comparisons, where we have a map from data types to evaluators, and resolve types by checking if they are keys in the map. There are probably other solutions as well. The goal is that resolveType should be consistent with toEvaluator with regard to type support.