findepi commented on code in PR #13240: URL: https://github.com/apache/datafusion/pull/13240#discussion_r1829086791
########## datafusion/expr-common/src/signature.rs: ########## @@ -123,8 +124,19 @@ pub enum TypeSignature { /// Specifies Signatures for array functions ArraySignature(ArrayFunctionSignature), /// Fixed number of arguments of numeric types. - /// See <https://docs.rs/arrow/latest/arrow/datatypes/enum.DataType.html#method.is_numeric> to know which type is considered numeric + /// See [`NativeType::is_numeric`] to know which type is considered numeric + /// + /// [`NativeType::is_numeric`]: datafusion_common Numeric(usize), + /// Fixed number of arguments of numeric types. + /// See [`NativeType::is_numeric`] to know which type is considered numeric + /// This signature accepts numeric string + /// Example of functions In Postgres that support numeric string + /// 1. Mathematical Functions, like `abs` Review Comment: i confirm this works in PostgreSQL (was testing with PostgreSQL v 17) ```sql select abs('-123'); ``` https://www.postgresql.org/docs/17/typeconv-oper.html#id-1.5.9.7.8 suggests why this works '...' is not a varchar literal in PostgreSQL. it's "unknown-type" literal, which gets interpreted as float8 > Here the system has implicitly resolved the unknown-type literal as type float8 before applying the chosen operator. indeed, `select pg_typeof(abs('-123'));` returns `double precision` However, this doesn't work in PostgreSQL ```sql select abs(CAST('-123' AS varchar)); ``` This fails with "Query Error: function abs(character varying) does not exist" Indicating that there is no special coercion rules from varchar to numbers when calling functions like `abs()`. ----------- BTW, coercion rules can be retrieved from PostgreSQL from https://www.postgresql.org/docs/17/catalog-pg-cast.html PostgreSQL doesn't declare any implicit coercions between (selected) numeric types and (selected) varchar type, and `abs()` function resolution behavior as described above matches that. ```sql with selected_types(name) AS (VALUES ('int4'), ('int8'), ('float8'), ('varchar')) select src.typname src_type, dst.typname dst_type, castcontext, case castcontext when 'e' then 'only explicit' when 'a' then 'explicit | implicitly in assignment' when 'i' then 'implicitly in expressions, as well as the other cases' else '???' -- undocumented @ https://www.postgresql.org/docs/17/catalog-pg-cast.html end castcontext_explained from pg_cast join pg_type src on pg_cast.castsource = src.oid join pg_type dst on pg_cast.casttarget = dst.oid where true and src.oid != dst.oid and src.typname in (select name from selected_types) and dst.typname in (select name from selected_types) order by src.typname, dst.typname ; ``` src_type | dst_type | castcontext | castcontext_explained -- | -- | -- | -- float8 | int4 | a | explicit \| implicitly in assignment float8 | int8 | a | explicit \| implicitly in assignment int4 | float8 | i | implicitly in expressions, as well as the other cases int4 | int8 | i | implicitly in expressions, as well as the other cases int8 | float8 | i | implicitly in expressions, as well as the other cases int8 | int4 | a | explicit \| implicitly in assignment -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org