Ensure dict encoded index types match from record batch to record batch (#148)
authorJacob Quinn <quinn.jacobd@gmail.com>
Fri, 12 Mar 2021 05:16:34 +0000 (22:16 -0700)
committerGitHub <noreply@github.com>
Fri, 12 Mar 2021 05:16:34 +0000 (22:16 -0700)
commitd7a1e32c971611ca9822b296c7587d0da3ba6850
tree58c5efc05fbd1ff9d8b3e0cc48153d570a9ad8da
parent0f1b3500b78edc48861ce4782aaf994d355cbf44
Ensure dict encoded index types match from record batch to record batch (#148)

Fixes #144. The core issue here was the initial record batch had a
dict-encoded column that ended up having an index type of Int8. However,
in a subsequent record batch, we use a different code path for dict
encoded columns because we need to check if a dictionary delta message
needs to be sent (i.e. there are new pooled values that need to be
serialized). The problem was in this code path, the index type was
computed from the total length of the input column instead of matching
what was already serialized in the initial schema message.

This does open up the question of another possible failure: if an
initial dict encoded column is serialized with an index type of Int8,
yet subsequent record batches end up including enough unique values that
this index type will be overflowed. I've added in an error check for
this case. Currently it's a fatal error that will stop the `Arrow.write`
process completely. I'm not quite sure what the best recommendation
would be in that case; ultimately the user needs to either widen the
first record batch column index type, but perhaps we should allow
passing a dict-encoded index type to the overall `Arrow.write` function
so users can easily specify what that type should be.

The other change that had to be made in this PR is on the reading side,
since we're now tracking the index type in the DictEncoding type itself,
which probably not coincidentally is what the arrow-json struct already
does. For reading, we already have access to the dictionary field, so
it's just a matter of deserializing the index type before constructing
the DictEncoding struct.
src/arraytypes/dictencoding.jl
src/table.jl
test/runtests.jl