ydb-platform / ydb-go-sdk

Pure Go native and database/sql driver for YDB
https://ydb.tech
Apache License 2.0
133 stars 69 forks source link

bug: Query service fails with error "result closed early at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.(*result).nextResultSet(result.go:129)`" #1245

Closed neyguvj closed 1 month ago

neyguvj commented 1 month ago

Bug Report

YDB GO SDK version: 3.67.2

Environment Linux amd64

Current behavior:

 non-retryable error occurred on attempt No.1 (idempotent=false): result closed early at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.(*result).nextResultSet(result.go:129)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.do.func1(client.go:77)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/pool.(*Pool).try(pool.go:408)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/pool.(*Pool).With.func2(pool.go:436)` at `github.com/ydb-platform/ydb-go-sdk/v3/retry.Retry(retry.go:324)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/pool.(*Pool).With(pool.go:448)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.do(client.go:91)`

Expectedt behavior: Query executes correctly.

Ecample:

func (s *ydbTestSuite) TestQuerySelect() {
    ctx, cancel := s.context()
    defer cancel()

    expectedValue := 1
    var actualValue int

    err := s.Query().Do(ctx, func(ctx context.Context, session query.Session) error {
        _, result, err := session.Execute(ctx, "SELECT 1 AS value")
        if err != nil {
            return err
        }
        defer func() { _ = result.Close(ctx) }()
        for {
            rs, err := result.NextResultSet(ctx)
            if err != nil {
                if errors.Is(err, io.EOF) {
                    break
                }
                return err
            }
            for {
                row, err := rs.NextRow(ctx)
                if err != nil {
                    if errors.Is(err, io.EOF) {
                        break
                    }
                    return err
                }
                if err = row.Scan(&actualValue); err != nil {
                    return err
                }
            }
        }
        return nil
    })
    s.Require().NoError(err)
    s.Require().Equal(expectedValue, actualValue)
}