Skip to content

Commit

Permalink
CASSGO-2 Marshal big int returns variable length slice.
Browse files Browse the repository at this point in the history
The marshalBigInt return 8 bytes slice in all cases except for big.Int,
which returns a variable length slice, but should be 8 bytes slice as well.

patch by Mykyta Oleksiienko; reviewed by João Reis for CASSGO-2
  • Loading branch information
OleksiienkoMykyta committed Nov 15, 2024
1 parent 7b7e6af commit a015fbb
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- CASSGO-2

## [1.7.0] - 2024-09-23

This release is the first after the donation of gocql to the Apache Software Foundation (ASF)
Expand Down
9 changes: 7 additions & 2 deletions marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ type Unmarshaler interface {
// tinyint, smallint, int | integer types |
// tinyint, smallint, int | string | formatted as base 10 number
// bigint, counter | integer types |
// bigint, counter | big.Int |
// bigint, counter | big.Int | according to cassandra bigint specification the big.Int value limited to int64 size(an eight-byte two's complement integer.)
// bigint, counter | string | formatted as base 10 number
// float | float32 |
// double | float64 |
Expand Down Expand Up @@ -671,7 +671,10 @@ func marshalBigInt(info TypeInfo, value interface{}) ([]byte, error) {
case uint8:
return encBigInt(int64(v)), nil
case big.Int:
return encBigInt2C(&v), nil
if !v.IsInt64() {
return nil, marshalErrorf("marshal bigint: value %v out of range", &v)
}
return encBigInt(v.Int64()), nil
case string:
i, err := strconv.ParseInt(value.(string), 10, 64)
if err != nil {
Expand Down Expand Up @@ -773,6 +776,8 @@ func marshalVarint(info TypeInfo, value interface{}) ([]byte, error) {
retBytes = make([]byte, 8)
binary.BigEndian.PutUint64(retBytes, v)
}
case big.Int:
retBytes = encBigInt2C(&v)
default:
retBytes, err = marshalBigInt(info, value)
}
Expand Down
30 changes: 29 additions & 1 deletion marshal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ import (
"time"

"gopkg.in/inf.v0"

"github.com/stretchr/testify/require"
)

type AliasInt int
Expand Down Expand Up @@ -1349,7 +1351,7 @@ func TestMarshal_Encode(t *testing.T) {
}
} else {
if _, err := Marshal(test.Info, test.Value); err != test.MarshalError {
t.Errorf("unmarshalTest[%d] (%v=>%t): %#v returned error %#v, want %#v.", i, test.Info, test.Value, test.Value, err, test.MarshalError)
t.Errorf("marshalTest[%d] (%v=>%t): %#v returned error %#v, want %#v.", i, test.Info, test.Value, test.Value, err, test.MarshalError)
}
}
}
Expand Down Expand Up @@ -1535,6 +1537,32 @@ func TestMarshalVarint(t *testing.T) {
}
}

func TestMarshalBigInt(t *testing.T) {
var testStruct = []struct {
Info TypeInfo
Value interface{}
MarshalError error
}{
{
NativeType{proto: 2, typ: TypeBigInt},
"-78635384813432117863538481343211",
MarshalError("can not marshal string to bigint: strconv.ParseInt: parsing \"-78635384813432117863538481343211\": value out of range"),
},
{
NativeType{proto: 2, typ: TypeBigInt},
"922337203685477692259749625974294",
MarshalError("can not marshal string to bigint: strconv.ParseInt: parsing \"922337203685477692259749625974294\": value out of range"),
},
}

t.Run("testMarshalBigInt", func(t *testing.T) {
for _, tc := range testStruct {
_, err := Marshal(tc.Info, tc.Value)
require.Equal(t, tc.MarshalError, err)
}
})
}

func equalStringPointerSlice(leftList, rightList []*string) bool {
if len(leftList) != len(rightList) {
return false
Expand Down

0 comments on commit a015fbb

Please sign in to comment.