Skip to content

Commit fdea098

Browse files
authored
Merge pull request #1312 from ydb-platform/fix-resullt-set-parts-reading
Do not check ResultSetIndex when ResuilSet is nil.
2 parents 42ca696 + c811a3e commit fdea098

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Fixed bug with reading empty result set parts.
12
* Fixed nil pointer dereference when closing result set
23

34
## v3.74.4

internal/query/result_set.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (rs *resultSet) nextRow(ctx context.Context) (*row, error) {
143143
return nil, xerrors.WithStackTrace(io.EOF)
144144
}
145145
}
146-
if rs.index != rs.currentPart.GetResultSetIndex() {
146+
if rs.currentPart.GetResultSet() != nil && rs.index != rs.currentPart.GetResultSetIndex() {
147147
close(rs.done)
148148

149149
return nil, xerrors.WithStackTrace(fmt.Errorf(
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//go:build integration
2+
// +build integration
3+
4+
package integration
5+
6+
import (
7+
"context"
8+
"errors"
9+
"fmt"
10+
"io"
11+
"os"
12+
"testing"
13+
14+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/version"
15+
"github.com/ydb-platform/ydb-go-sdk/v3/query"
16+
)
17+
18+
func TestQueryMultiResultSets(t *testing.T) {
19+
if version.Lt(os.Getenv("YDB_VERSION"), "24.1") {
20+
t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'")
21+
}
22+
23+
scope := newScope(t)
24+
var i, j, k int
25+
db := scope.Driver()
26+
err := db.Query().Do(scope.Ctx, func(ctx context.Context, s query.Session) (err error) {
27+
_, res, err := s.Execute(ctx, `SELECT 42; SELECT 43, 44;`)
28+
if err != nil {
29+
return fmt.Errorf("can't get result: %w", err)
30+
}
31+
set, err := res.NextResultSet(ctx)
32+
if err != nil {
33+
return fmt.Errorf("set 0: get next result set: %w", err)
34+
}
35+
36+
for row, err := set.NextRow(ctx); !errors.Is(err, io.EOF); row, err = set.NextRow(ctx) {
37+
if err != nil {
38+
return fmt.Errorf("set 0: get next row: %w", err)
39+
}
40+
if err := row.Scan(&i); err != nil {
41+
return fmt.Errorf("set 0: scan row: %w", err)
42+
}
43+
fmt.Println(i)
44+
}
45+
46+
set, err = res.NextResultSet(ctx)
47+
if err != nil {
48+
return err
49+
}
50+
51+
for row, err := set.NextRow(ctx); !errors.Is(err, io.EOF); row, err = set.NextRow(ctx) {
52+
if err != nil {
53+
return fmt.Errorf("set 1: get next row: %w", err)
54+
}
55+
56+
if err := row.Scan(&j, &k); err != nil {
57+
return fmt.Errorf("set 1: scan row: %w", err)
58+
}
59+
fmt.Println(j, k)
60+
}
61+
_, err = res.NextResultSet(ctx)
62+
if !errors.Is(err, io.EOF) {
63+
return fmt.Errorf("get next result set: %w", err)
64+
}
65+
66+
if res.Err() != nil {
67+
return fmt.Errorf("res.Err() = %w", res.Err())
68+
}
69+
return nil
70+
}, query.WithIdempotent())
71+
72+
scope.Require.NoError(err)
73+
74+
scope.Require.Equal(42, i)
75+
scope.Require.Equal(43, j)
76+
scope.Require.Equal(44, k)
77+
}

0 commit comments

Comments
 (0)