arrow-julia icon indicating copy to clipboard operation
arrow-julia copied to clipboard

VersionNumber issues when you also have `missing`

Open ericphanson opened this issue 4 years ago • 0 comments

julia> using Arrow # v1.6.2

julia> table = (; col = [(; v=v"1"), (; v=v"2"), missing])
(col = Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}[(v = v"1.0.0",), (v = v"2.0.0",), missing],)

julia> Arrow.Table(Arrow.tobuffer(table))
ERROR: MethodError: no method matching zero(::Type{VersionNumber})
Closest candidates are:
  zero(::Union{Type{P}, P}) where P<:Dates.Period at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Dates/src/periods.jl:53
  zero(::CartesianIndex{N}) where N at multidimensional.jl:106
  zero(::SparseArrays.AbstractSparseArray) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/SparseArrays/src/SparseArrays.jl:55
  ...
Stacktrace:
  [1] default(T::Type)
    @ ArrowTypes ~/.julia/packages/ArrowTypes/dkiHE/src/ArrowTypes.jl:305
  [2] getindex
    @ ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/struct.jl:80 [inlined]
  [3] getindex
    @ ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/struct.jl:79 [inlined]
  [4] ArrowTypes.ToArrow(x::Arrow.ToStruct{Tuple{Vararg{Union{UInt64, String}, N} where N}, 4, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}})
    @ ArrowTypes ~/.julia/packages/ArrowTypes/dkiHE/src/ArrowTypes.jl:348
  [5] arrowvector(x::Arrow.ToStruct{Tuple{Vararg{Union{UInt64, String}, N} where N}, 4, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; dictencoding::Bool, dictencode::Bool, maxdepth::Int64, kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Bool}, NTuple{4, Symbol}, NamedTuple{(:compression, :largelists, :denseunions, :dictencodenested), Tuple{Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:61
  [6] (::Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}})(j::Int64)
    @ Arrow ./none:0
  [7] iterate
    @ ./generator.jl:47 [inlined]
  [8] collect_to!(dest::Vector{Arrow.Primitive{UInt32, A} where A}, itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}}, offs::Int64, st::Int64)
    @ Base ./array.jl:724
  [9] collect_to!(dest::Vector{Arrow.Primitive{UInt32, Arrow.ToStruct{UInt32, 1, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}}}, itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}}, offs::Int64, st::Int64)
    @ Base ./array.jl:732
 [10] collect_to_with_first!(dest::Vector{Arrow.Primitive{UInt32, Arrow.ToStruct{UInt32, 1, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}}}, v1::Arrow.Primitive{UInt32, Arrow.ToStruct{UInt32, 1, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}}, itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}}, st::Int64)
    @ Base ./array.jl:702
 [11] collect(itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}})
    @ Base ./array.jl:683
 [12] _totuple
    @ ./tuple.jl:331 [inlined]
 [13] Tuple
    @ ./tuple.jl:303 [inlined]
 [14] arrowvector(::ArrowTypes.StructKind, x::Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Dict{String, String}; kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/struct.jl:93
 [15] arrowvector(::Type{VersionNumber}, x::Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Dict{String, String}; kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:85
 [16] arrowvector(x::Arrow.ToStruct{VersionNumber, 1, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; dictencoding::Bool, dictencode::Bool, maxdepth::Int64, kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Bool}, NTuple{4, Symbol}, NamedTuple{(:compression, :largelists, :denseunions, :dictencodenested), Tuple{Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:69
 [17] (::Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}})(j::Int64)
    @ Arrow ./none:0
 [18] iterate
    @ ./generator.jl:47 [inlined]
 [19] collect(itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}})
    @ Base ./array.jl:678
 [20] _totuple
    @ ./tuple.jl:331 [inlined]
 [21] Tuple(itr::Base.Generator{UnitRange{Int64}, Arrow.var"#39#40"{Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}}, Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, Int64, Int64, Dict{Int64, Any}, Vector{Arrow.DictEncoding}}})
    @ Base ./tuple.jl:303
 [22] arrowvector(::ArrowTypes.StructKind, x::Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/struct.jl:93
 [23] arrowvector(::Type{NamedTuple{(:v,), Tuple{VersionNumber}}}, x::Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Integer}, NTuple{6, Symbol}, NamedTuple{(:dictencode, :maxdepth, :compression, :largelists, :denseunions, :dictencodenested), Tuple{Bool, Int64, Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:85
 [24] arrowvector(x::Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, i::Int64, nl::Int64, fi::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; dictencoding::Bool, dictencode::Bool, maxdepth::Int64, kw::Base.Iterators.Pairs{Symbol, Union{Nothing, Bool}, NTuple{4, Symbol}, NamedTuple{(:compression, :largelists, :denseunions, :dictencodenested), Tuple{Nothing, Bool, Bool, Bool}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:69
 [25] toarrowvector(x::Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, i::Int64, de::Dict{Int64, Any}, ded::Vector{Arrow.DictEncoding}, meta::Nothing; compression::Nothing, kw::Base.Iterators.Pairs{Symbol, Integer, NTuple{5, Symbol}, NamedTuple{(:largelists, :denseunions, :dictencode, :dictencodenested, :maxdepth), Tuple{Bool, Bool, Bool, Bool, Int64}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/arraytypes/arraytypes.jl:36
 [26] (::Arrow.var"#111#112"{Dict{Int64, Any}, Bool, Nothing, Bool, Bool, Bool, Int64, Vector{Arrow.DictEncoding}, Vector{Type}, Vector{Any}})(col::Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}, i::Int64, nm::Symbol)
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:246
 [27] eachcolumn
    @ ~/.julia/packages/Tables/i6z2B/src/utils.jl:70 [inlined]
 [28] toarrowtable(cols::NamedTuple{(:col,), Tuple{Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}, dictencodings::Dict{Int64, Any}, largelists::Bool, compress::Nothing, denseunions::Bool, dictencode::Bool, dictencodenested::Bool, maxdepth::Int64)
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:245
 [29] macro expansion
    @ ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:140 [inlined]
 [30] macro expansion
    @ ./task.jl:387 [inlined]
 [31] write(io::IOBuffer, source::NamedTuple{(:col,), Tuple{Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}}, writetofile::Bool, largelists::Bool, compress::Nothing, denseunions::Bool, dictencode::Bool, dictencodenested::Bool, alignment::Int64, maxdepth::Int64, ntasks::Float64)
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:132
 [32] #write#100
    @ ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:95 [inlined]
 [33] write
    @ ~/.julia/packages/Arrow/PQ5Mm/src/write.jl:95 [inlined]
 [34] #tobuffer#3
    @ ~/.julia/packages/Arrow/PQ5Mm/src/utils.jl:206 [inlined]
 [35] tobuffer(data::NamedTuple{(:col,), Tuple{Vector{Union{Missing, NamedTuple{(:v,), Tuple{VersionNumber}}}}}})
    @ Arrow ~/.julia/packages/Arrow/PQ5Mm/src/utils.jl:205
 [36] top-level scope
    @ REPL[40]:1

My workaround:

ArrowTypes.default(::Type{VersionNumber}) = v"0"

(Ref #200, #205 for a different issue that was fixed, namely the case if you don't have missing).

ericphanson avatar Sep 22 '21 11:09 ericphanson