Coerce left/right for eq_null_safe so string–numeric compares like PySpark (try_to_number on string side).
Infers types from literals; assumes String for column (so string–numeric gets coerced).
Determine the common type for two columns based on PySpark’s type precedence rules
Returns the tightest (highest precedence) common type that both can be coerced to