apache / datafusion

Apache DataFusion SQL Query Engine
https://datafusion.apache.org/
Apache License 2.0
5.92k stars 1.12k forks source link

Arrays of non-coercible types are coercible #12291

Open findepi opened 2 weeks ago

findepi commented 2 weeks ago

Describe the bug

Int64 and timestamp with time zone are not coercible:

> SELECT 2 x UNION ALL SELECT now() x;
type_coercion
caused by
Error during planning: Incompatible inputs for Union: Previous inputs were of type Int64, but got incompatible type Timestamp(Nanosecond, Some("+00:00")) on column 'x'

yet, the arrays of these types are

> SELECT make_array(2) x UNION ALL SELECT make_array(now()) x;
+-----------------------+
| x                     |
+-----------------------+
| [2]                   |
| [1725282161929740000] |
+-----------------------+
> SELECT make_array(now()) x UNION ALL SELECT make_array(2) x;
+----------------------------------+
| x                                |
+----------------------------------+
| [1970-01-01T00:00:00.000000002Z] |
| [2024-09-02T13:03:02.257080Z]    |
+----------------------------------+

To Reproduce

SELECT make_array(2) x UNION ALL SELECT make_array(now()) x;

Expected behavior

Failure, because array element types cannot be coerced.

Additional context

No response

findepi commented 1 week ago

Quoting @jayzhan211 https://github.com/apache/datafusion/issues/12292#issuecomment-2324827013

We should return error since integer is not able to cast to timestamp and vice versa

D SELECT DISTINCT x[0] FROM (SELECT [now()] x UNION ALL SELECT [2] x);
Conversion Error: Unimplemented type for cast (INTEGER -> TIMESTAMP WITH TIME ZONE)
LINE 1: ...OM (SELECT [now()] x UNION ALL SELECT [2] x);