From 0dc4e3edb3f9021b02ed6f80d54cb88d2ef9b025 Mon Sep 17 00:00:00 2001 From: Robert Farr Date: Wed, 29 Jan 2025 11:33:52 -0600 Subject: [PATCH] fix(pgdialect): handle nill array on jsonb column --- dialect/pgdialect/array_parser.go | 5 +++++ internal/dbtest/pg_test.go | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/dialect/pgdialect/array_parser.go b/dialect/pgdialect/array_parser.go index b0eba379b..56db9fd07 100644 --- a/dialect/pgdialect/array_parser.go +++ b/dialect/pgdialect/array_parser.go @@ -18,6 +18,11 @@ type arrayParser struct { func newArrayParser(b []byte) *arrayParser { p := new(arrayParser) + if b[0] == 'n' { + p.p.Reset(nil) + return p + } + if len(b) < 2 || (b[0] != '{' && b[0] != '[') || (b[len(b)-1] != '}' && b[len(b)-1] != ']') { p.err = fmt.Errorf("pgdialect: can't parse array: %q", b) return p diff --git a/internal/dbtest/pg_test.go b/internal/dbtest/pg_test.go index 53be846cc..3228ea92f 100644 --- a/internal/dbtest/pg_test.go +++ b/internal/dbtest/pg_test.go @@ -922,6 +922,7 @@ func TestPostgresJSONB(t *testing.T) { ItemPtr *Item `bun:",type:jsonb"` Items []Item `bun:",type:jsonb"` ItemsP []*Item `bun:",type:jsonb"` + ItemsNull []*Item `bun:",type:jsonb"` TextItemA []UserID `bun:"type:text[]"` } @@ -939,6 +940,7 @@ func TestPostgresJSONB(t *testing.T) { ItemPtr: &item2, Items: []Item{item1, item2}, ItemsP: []*Item{&item1, &item2}, + ItemsNull: nil, TextItemA: []UserID{uid1, uid2}, } _, err := db.NewInsert().Model(model1).Exec(ctx) @@ -962,4 +964,9 @@ func TestPostgresJSONB(t *testing.T) { require.NoError(t, err) require.Equal(t, []Item{item1, item2}, items) + err = db.NewSelect().Model((*Model)(nil)). + Column("items_null"). + Scan(ctx, pgdialect.Array(&items)) + require.NoError(t, err) + require.Equal(t, []Item{}, items) }