uptrace / bun

SQL-first Golang ORM
https://bun.uptrace.dev
BSD 2-Clause "Simplified" License
3.78k stars 231 forks source link

Panic on has-many relation with join on byte array #779

Open iam047801 opened 1 year ago

iam047801 commented 1 year ago

The example below panics with hash of unhashable type []uint8 runtime error on Select query.

Expected behavior: first block with second and third in it.

Reproduced on the latest version v1.1.11.

Can we fix it?

package main

import (
    "context"
    "database/sql"

    "github.com/uptrace/bun"
    "github.com/uptrace/bun/dialect/pgdialect"
    "github.com/uptrace/bun/driver/pgdriver"
)

type Block struct {
    bun.BaseModel `bun:"table:block_info"`

    Shard int64  `bun:",pk,notnull"`
    SeqNo uint32 `bun:",pk,notnull"`
    Hash  []byte `bun:"type:bytea,unique,notnull"`

    MasterHash []byte `bun:"type:bytea"`

    Shards []*Block `bun:"rel:has-many,join:hash=master_hash"`
}

func main() {
    dsnPG := "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable"

    sqlDB := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsnPG)))
    pg := bun.NewDB(sqlDB, pgdialect.New())

    ctx := context.Background()

    _, err := pg.NewDropTable().Model((*Block)(nil)).IfExists().Exec(ctx)
    if err != nil {
        panic(err)
    }
    _, err = pg.NewCreateTable().Model((*Block)(nil)).Exec(ctx)
    if err != nil {
        panic(err)
    }

    b := []*Block{{
        Shard: -1,
        SeqNo: 1000,
        Hash:  []byte("first"),
    }, {
        Shard:      0,
        SeqNo:      1000,
        Hash:       []byte("second"),
        MasterHash: []byte("first"),
    }, {
        Shard:      0,
        SeqNo:      1001,
        Hash:       []byte("third"),
        MasterHash: []byte("first"),
    }}

    _, err = pg.NewInsert().Model(&b).Exec(ctx)
    if err != nil {
        panic(err)
    }

    var res = new(Block)

    err = pg.NewSelect().Model(res).Relation("Shards").Where("hash = ?", b[0].Hash).Scan(ctx)
    if err != nil {
        panic(err)
    }
}
panic: runtime error: hash of unhashable type []uint8

goroutine 1 [running]:
github.com/uptrace/bun.baseValues.func1({0x10442bd20?, 0x14000090420?, 0x1400014fb98?})
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/model_table_has_many.go:139 +0x114
github.com/uptrace/bun.visitField({0x10442bd20?, 0x14000090420?, 0x1046a45b8?}, {0x140000a60e0, 0x0, 0x1}, 0x1400014fc20)
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/util.go:38 +0xe4
github.com/uptrace/bun.walk({0x10442bd20?, 0x14000090420?, 0x1400014fbe8?}, {0x140000a60e0, 0x0, 0x1}, 0xfbe8?)
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/util.go:25 +0x8c
github.com/uptrace/bun.baseValues({0x104448348, 0x140000c60f0}, {0x140001326b8, 0x1, 0x1})
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/model_table_has_many.go:136 +0x134
github.com/uptrace/bun.newHasManyModel(0x140000aa050)
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/model_table_has_many.go:27 +0x7c
github.com/uptrace/bun.(*relationJoin).manyQuery(0x1400014fd48?, 0x140000ca1e0)
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/relation_join.go:57 +0x28
github.com/uptrace/bun.(*relationJoin).selectMany(0x1400014fe78?, {0x1044476c8, 0x14000124000}, 0x104191b90?)
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/relation_join.go:49 +0x2c
github.com/uptrace/bun.(*SelectQuery).selectJoins(0x140000ca000, {0x1044476c8, 0x14000124000}, {0x140000aa050, 0x1, 0x140000c9000?})
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/query_select.go:473 +0x424
github.com/uptrace/bun.(*SelectQuery).Scan(0x140000ca000, {0x1044476c8, 0x14000124000}, {0x0?, 0x0?, 0x0?})
        /Users/user/go/pkg/mod/github.com/uptrace/bun@v1.1.10/query_select.go:888 +0x1a8
main.main()
        go-bun-bug/main.go:64 +0x6d4
Shanaiyaa commented 1 year ago

got the same error with a table that has []byte field, have you found some kind of workaround?

github-actions[bot] commented 4 days ago

This issue has been automatically marked as stale because it has not had activity in the last 30 days. If there is no update within the next 7 days, this issue will be closed.