From 425fbe1c88c42a19e99a26444a1dea826a6e363d Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 4 Nov 2017 14:03:46 -0500 Subject: [PATCH] Fix ranges with text format where end is unbounded fixes #342 --- pgtype/int4range_test.go | 2 ++ pgtype/int8range_test.go | 2 ++ pgtype/numrange_test.go | 12 ++++++++++++ pgtype/range.go | 26 +++++++++++++------------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/pgtype/int4range_test.go b/pgtype/int4range_test.go index 088097d8..961678bb 100644 --- a/pgtype/int4range_test.go +++ b/pgtype/int4range_test.go @@ -12,6 +12,8 @@ func TestInt4rangeTranscode(t *testing.T) { &pgtype.Int4range{LowerType: pgtype.Empty, UpperType: pgtype.Empty, Status: pgtype.Present}, &pgtype.Int4range{Lower: pgtype.Int4{Int: 1, Status: pgtype.Present}, Upper: pgtype.Int4{Int: 10, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Exclusive, Status: pgtype.Present}, &pgtype.Int4range{Lower: pgtype.Int4{Int: -42, Status: pgtype.Present}, Upper: pgtype.Int4{Int: -5, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Exclusive, Status: pgtype.Present}, + &pgtype.Int4range{Lower: pgtype.Int4{Int: 1, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Unbounded, Status: pgtype.Present}, + &pgtype.Int4range{Upper: pgtype.Int4{Int: 1, Status: pgtype.Present}, LowerType: pgtype.Unbounded, UpperType: pgtype.Exclusive, Status: pgtype.Present}, &pgtype.Int4range{Status: pgtype.Null}, }) } diff --git a/pgtype/int8range_test.go b/pgtype/int8range_test.go index c039ec65..f33ae4d8 100644 --- a/pgtype/int8range_test.go +++ b/pgtype/int8range_test.go @@ -12,6 +12,8 @@ func TestInt8rangeTranscode(t *testing.T) { &pgtype.Int8range{LowerType: pgtype.Empty, UpperType: pgtype.Empty, Status: pgtype.Present}, &pgtype.Int8range{Lower: pgtype.Int8{Int: 1, Status: pgtype.Present}, Upper: pgtype.Int8{Int: 10, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Exclusive, Status: pgtype.Present}, &pgtype.Int8range{Lower: pgtype.Int8{Int: -42, Status: pgtype.Present}, Upper: pgtype.Int8{Int: -5, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Exclusive, Status: pgtype.Present}, + &pgtype.Int8range{Lower: pgtype.Int8{Int: 1, Status: pgtype.Present}, LowerType: pgtype.Inclusive, UpperType: pgtype.Unbounded, Status: pgtype.Present}, + &pgtype.Int8range{Upper: pgtype.Int8{Int: 1, Status: pgtype.Present}, LowerType: pgtype.Unbounded, UpperType: pgtype.Exclusive, Status: pgtype.Present}, &pgtype.Int8range{Status: pgtype.Null}, }) } diff --git a/pgtype/numrange_test.go b/pgtype/numrange_test.go index 32267c86..ccc794d5 100644 --- a/pgtype/numrange_test.go +++ b/pgtype/numrange_test.go @@ -29,6 +29,18 @@ func TestNumrangeTranscode(t *testing.T) { UpperType: pgtype.Exclusive, Status: pgtype.Present, }, + &pgtype.Numrange{ + Lower: pgtype.Numeric{Int: big.NewInt(-42), Exp: 1, Status: pgtype.Present}, + LowerType: pgtype.Inclusive, + UpperType: pgtype.Unbounded, + Status: pgtype.Present, + }, + &pgtype.Numrange{ + Upper: pgtype.Numeric{Int: big.NewInt(-42), Exp: 1, Status: pgtype.Present}, + LowerType: pgtype.Unbounded, + UpperType: pgtype.Exclusive, + Status: pgtype.Present, + }, &pgtype.Numrange{Status: pgtype.Null}, }) } diff --git a/pgtype/range.go b/pgtype/range.go index a200825e..54fc6ca0 100644 --- a/pgtype/range.go +++ b/pgtype/range.go @@ -79,28 +79,28 @@ func ParseUntypedTextRange(src string) (*UntypedTextRange, error) { if err != nil { return nil, errors.Errorf("invalid upper value: %v", err) } - buf.UnreadRune() if r == ')' || r == ']' { utr.UpperType = Unbounded } else { + buf.UnreadRune() utr.Upper, err = rangeParseValue(buf) if err != nil { return nil, errors.Errorf("invalid upper value: %v", err) } - } - r, _, err = buf.ReadRune() - if err != nil { - return nil, errors.Errorf("missing upper bound: %v", err) - } - switch r { - case ')': - utr.UpperType = Exclusive - case ']': - utr.UpperType = Inclusive - default: - return nil, errors.Errorf("missing upper bound, instead got: %v", string(r)) + r, _, err = buf.ReadRune() + if err != nil { + return nil, errors.Errorf("missing upper bound: %v", err) + } + switch r { + case ')': + utr.UpperType = Exclusive + case ']': + utr.UpperType = Inclusive + default: + return nil, errors.Errorf("missing upper bound, instead got: %v", string(r)) + } } skipWhitespace(buf)