1 package pgtype_test
2
3 import (
4 "context"
5 "reflect"
6 "testing"
7
8 pgx "github.com/jackc/pgx/v5"
9 "github.com/jackc/pgx/v5/pgtype"
10 "github.com/jackc/pgx/v5/pgxtest"
11 "github.com/stretchr/testify/require"
12 )
13
14 func TestMultirangeCodecTranscode(t *testing.T) {
15 skipPostgreSQLVersionLessThan(t, 14)
16 skipCockroachDB(t, "Server does not support range types (see https://github.com/cockroachdb/cockroach/issues/27791)")
17
18 pgxtest.RunValueRoundTripTests(context.Background(), t, defaultConnTestRunner, nil, "int4multirange", []pgxtest.ValueRoundTripTest{
19 {
20 pgtype.Multirange[pgtype.Range[pgtype.Int4]](nil),
21 new(pgtype.Multirange[pgtype.Range[pgtype.Int4]]),
22 func(a any) bool { return reflect.DeepEqual(pgtype.Multirange[pgtype.Range[pgtype.Int4]](nil), a) },
23 },
24 {
25 pgtype.Multirange[pgtype.Range[pgtype.Int4]]{},
26 new(pgtype.Multirange[pgtype.Range[pgtype.Int4]]),
27 func(a any) bool { return reflect.DeepEqual(pgtype.Multirange[pgtype.Range[pgtype.Int4]]{}, a) },
28 },
29 {
30 pgtype.Multirange[pgtype.Range[pgtype.Int4]]{
31 {
32 Lower: pgtype.Int4{Int32: 1, Valid: true},
33 Upper: pgtype.Int4{Int32: 5, Valid: true},
34 LowerType: pgtype.Inclusive,
35 UpperType: pgtype.Exclusive,
36 Valid: true,
37 },
38 {
39 Lower: pgtype.Int4{Int32: 7, Valid: true},
40 Upper: pgtype.Int4{Int32: 9, Valid: true},
41 LowerType: pgtype.Inclusive,
42 UpperType: pgtype.Exclusive,
43 Valid: true,
44 },
45 },
46 new(pgtype.Multirange[pgtype.Range[pgtype.Int4]]),
47 func(a any) bool {
48 return reflect.DeepEqual(pgtype.Multirange[pgtype.Range[pgtype.Int4]]{
49 {
50 Lower: pgtype.Int4{Int32: 1, Valid: true},
51 Upper: pgtype.Int4{Int32: 5, Valid: true},
52 LowerType: pgtype.Inclusive,
53 UpperType: pgtype.Exclusive,
54 Valid: true,
55 },
56 {
57 Lower: pgtype.Int4{Int32: 7, Valid: true},
58 Upper: pgtype.Int4{Int32: 9, Valid: true},
59 LowerType: pgtype.Inclusive,
60 UpperType: pgtype.Exclusive,
61 Valid: true,
62 },
63 }, a)
64 },
65 },
66 })
67 }
68
69 func TestMultirangeCodecDecodeValue(t *testing.T) {
70 skipPostgreSQLVersionLessThan(t, 14)
71 skipCockroachDB(t, "Server does not support range types (see https://github.com/cockroachdb/cockroach/issues/27791)")
72
73 defaultConnTestRunner.RunTest(context.Background(), t, func(ctx context.Context, _ testing.TB, conn *pgx.Conn) {
74
75 for _, tt := range []struct {
76 sql string
77 expected any
78 }{
79 {
80 sql: `select int4multirange(int4range(1, 5), int4range(7,9))`,
81 expected: pgtype.Multirange[pgtype.Range[any]]{
82 {
83 Lower: int32(1),
84 Upper: int32(5),
85 LowerType: pgtype.Inclusive,
86 UpperType: pgtype.Exclusive,
87 Valid: true,
88 },
89 {
90 Lower: int32(7),
91 Upper: int32(9),
92 LowerType: pgtype.Inclusive,
93 UpperType: pgtype.Exclusive,
94 Valid: true,
95 },
96 },
97 },
98 } {
99 t.Run(tt.sql, func(t *testing.T) {
100 rows, err := conn.Query(ctx, tt.sql)
101 require.NoError(t, err)
102
103 for rows.Next() {
104 values, err := rows.Values()
105 require.NoError(t, err)
106 require.Len(t, values, 1)
107 require.Equal(t, tt.expected, values[0])
108 }
109
110 require.NoError(t, rows.Err())
111 })
112 }
113 })
114 }
115
View as plain text