Seems like the type combination you're using (int32 -> uint32) and (int32
-> uint64) don't match the following pattern-matching

https://github.com/apache/arrow/blob/master/cpp/src/arrow/compute/kernels/cast.cc#L191-L192

which avoid using "safe" cast and revert to the following cast
implementation (with no explicit check):

https://github.com/apache/arrow/blob/master/cpp/src/arrow/compute/kernels/cast.cc#L316-L318

My take on this is that downcasting concept should only apply to same sign
integers. I'd propose the following refactor:

1. Rename `allow_int_overflow` to `allow_int_truncate`. Since truncation is
still applicable even if there's no downcasting.
2. Refactor code such that the pattern matching is done on possible
truncation and not downcasting. The fast casting is only applied to
same-sign and size(O) >= size(I). The (possible according to
allow_int_truncate) slow and bound checking is done when signed-ness is not
matching or there's downcasting.

Can you open a JIRA ticket?

François

On Wed, Nov 14, 2018 at 6:10 AM Romain Francois <rom...@purrple.cat> wrote:

> I'm implementing Array$cast() in the R package, i.e.
> https://issues.apache.org/jira/browse/ARROW-3741?filter=12344983
>
> I'm seeing some weird results when casting from int32 to uint32 and uint64
> (I'm expecting errors here as it's supposed to be safe
>
> https://github.com/apache/arrow/pull/2959#issuecomment-438606974
>
> a <- array(-(1:3))
> a$cast(uint16())
> #> Error in Array__cast(self, target_type, options): Invalid: Integer
> value out of bounds
> a$cast(uint16())
> #> Error in Array__cast(self, target_type, options): Invalid: Integer
> value out of bounds
> a$cast(uint32())
> #> arrow::Array
> #> [
> #>   4294967295,
> #>   4294967294,
> #>   4294967293
> #> ]
> a$cast(uint32())$type()
> #> arrow::UInt32
> #> uint32
>
> a$cast(uint64())
> #> arrow::Array
> #> [
> #>   -1,
> #>   -2,
> #>   -3
> #> ]
> a$cast(uint64())$type()
> #> arrow::UInt64
> #> uint64
>
> I don't think this is an R issue.
>
> Can someone using other front ends to the C++ library check if they get
> the same problem ?
>
>
>
>

-- 
Sent from my jetpack.

Reply via email to