Skip to content
2 changes: 2 additions & 0 deletions arrow/array/binarybuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ func (b *BinaryBuilder) Unmarshal(dec *json.Decoder) error {

func (b *BinaryBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down Expand Up @@ -669,6 +670,7 @@ func (b *BinaryViewBuilder) Unmarshal(dec *json.Decoder) error {

func (b *BinaryViewBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/decimal.go
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ func (b *baseDecimalBuilder[T]) Unmarshal(dec *json.Decoder) error {

func (b *baseDecimalBuilder[T]) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/dictionary.go
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,7 @@ func (b *dictionaryBuilder) IsNull(i int) bool { return b.idxBuilder.IsNull(i) }

func (b *dictionaryBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/encoded.go
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,7 @@ func (b *RunEndEncodedBuilder) Unmarshal(dec *json.Decoder) error {
// UnmarshalJSON can't be used in conjunction with AppendValueFromString (as it calls UnmarshalOne)
func (b *RunEndEncodedBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/fixed_size_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,7 @@ func (b *FixedSizeListBuilder) Unmarshal(dec *json.Decoder) error {

func (b *FixedSizeListBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/fixedsize_binarybuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ func (b *FixedSizeBinaryBuilder) Unmarshal(dec *json.Decoder) error {

func (b *FixedSizeBinaryBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/float16_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ func (b *Float16Builder) Unmarshal(dec *json.Decoder) error {
// be silently truncated.
func (b *Float16Builder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
3 changes: 3 additions & 0 deletions arrow/array/interval.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ func (b *MonthIntervalBuilder) Unmarshal(dec *json.Decoder) error {
// value that will be added to the builder.
func (b *MonthIntervalBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down Expand Up @@ -631,6 +632,7 @@ func (b *DayTimeIntervalBuilder) Unmarshal(dec *json.Decoder) error {
// with the values expected to be objects of the form {"days": #, "milliseconds": #}
func (b *DayTimeIntervalBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down Expand Up @@ -936,6 +938,7 @@ func (b *MonthDayNanoIntervalBuilder) Unmarshal(dec *json.Decoder) error {
// {"months": #, "days": #, "nanoseconds": #}
func (b *MonthDayNanoIntervalBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
4 changes: 3 additions & 1 deletion arrow/array/json_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ func NewJSONReader(r io.Reader, schema *arrow.Schema, opts ...Option) *JSONReade
o(rr)
}

rr.r.UseNumber()

if rr.mem == nil {
rr.mem = memory.DefaultAllocator
}
Expand Down Expand Up @@ -166,7 +168,7 @@ func (r *JSONReader) Next() bool {
}

func (r *JSONReader) readNext() bool {
r.err = r.r.Decode(r.bldr)
r.err = r.bldr.UnmarshalOne(r.r)
if r.err != nil {
r.done = true
if errors.Is(r.err, io.EOF) {
Expand Down
25 changes: 25 additions & 0 deletions arrow/array/json_reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/apache/arrow-go/v18/arrow/memory"
"github.com/apache/arrow-go/v18/internal/json"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

const jsondata = `
Expand Down Expand Up @@ -246,6 +247,30 @@ func jsonArrayToNDJSON(data []byte) ([]byte, error) {
return ndjson.Bytes(), nil
}

func TestJSONReaderLargeInt64(t *testing.T) {
schema := arrow.NewSchema([]arrow.Field{
{Name: "a", Type: arrow.PrimitiveTypes.Int64},
}, nil)

mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
defer mem.AssertSize(t, 0)

const ndjson = "{\"a\": 9223372036854775807}\n{\"a\": -9223372036854775808}\n"
rdr := array.NewJSONReader(strings.NewReader(ndjson), schema,
array.WithAllocator(mem), array.WithChunk(-1))
defer rdr.Release()

assert.True(t, rdr.Next())
rec := rdr.RecordBatch()
require.NotNil(t, rec)
assert.NoError(t, rdr.Err())
assert.EqualValues(t, 2, rec.NumRows())

col := rec.Column(0).(*array.Int64)
assert.EqualValues(t, int64(9223372036854775807), col.Value(0))
assert.EqualValues(t, int64(-9223372036854775808), col.Value(1))
}

func BenchmarkRecordFromJSON(b *testing.B) {
schema := arrow.NewSchema([]arrow.Field{
{Name: "id", Type: arrow.PrimitiveTypes.Int64},
Expand Down
2 changes: 2 additions & 0 deletions arrow/array/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,7 @@ func (b *baseListBuilder) Unmarshal(dec *json.Decoder) error {

func (b *baseListBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down Expand Up @@ -1415,6 +1416,7 @@ func (b *baseListViewBuilder) Unmarshal(dec *json.Decoder) error {

func (b *baseListViewBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ func (b *MapBuilder) Unmarshal(dec *json.Decoder) error {

func (b *MapBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions arrow/array/null.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ func (b *NullBuilder) Unmarshal(dec *json.Decoder) error {

func (b *NullBuilder) UnmarshalJSON(data []byte) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.UseNumber()
t, err := dec.Token()
if err != nil {
return err
Expand Down
Loading