jayzhan211 opened a new issue, #13285:
URL: https://github.com/apache/datafusion/issues/13285

   # Issue
   abs() is one of the example that support numeric string
   
   In Postgres, the type is determined lately so `-1.2` is not string type but 
inferred into float type for abs()
   
   [doc](https://www.postgresql.org/docs/current/typeconv-func.html)
   
   ```
   # abs: numeric string
   # TODO: In Postgres, '-1.2' is unknown type and interpreted to float8 so 
they don't fail on this query
   query error DataFusion error: This feature is not implemented: Unsupported 
data type Utf8 for function abs
   select abs('-1.2');
   
   query error DataFusion error: This feature is not implemented: Unsupported 
data type Utf8 for function abs
   select abs(arrow_cast('-1.2', 'Utf8'));
   ```
   
   # Additional context
   
                 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
   
   _Originally posted by @findepi in 
https://github.com/apache/datafusion/pull/13240#discussion_r1829086791_
               


-- 
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.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

Reply via email to