Skip to content

Commit 018564d

Browse files
authored
Merge pull request #857 from ydb-platform/fix-scan-wide-results
fix unwrap raw values in wide results
2 parents 4f6a7b2 + 26f70a6 commit 018564d

File tree

3 files changed

+100
-3
lines changed

3 files changed

+100
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Fixed panic when try to unwrap values with more than 127 columns with custom ydb unmarshaler
2+
13
## v3.53.1
24
* Bumps `github.com/ydb-platform/ydb-go-genproto` for support `query` service
35
* Bumps `golang.org/x/net` from `0.7.0` to `0.17.0`

internal/table/scanner/scanner.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,15 +1175,15 @@ func (x item) isEmpty() bool {
11751175

11761176
type scanStack struct {
11771177
v []item
1178-
p int8
1178+
p int
11791179
scanItem item
11801180
}
11811181

11821182
func (s *scanStack) size() int {
11831183
if !s.scanItem.isEmpty() {
11841184
s.set(s.scanItem)
11851185
}
1186-
return int(s.p) + 1
1186+
return s.p + 1
11871187
}
11881188

11891189
func (s *scanStack) get(i int) item {
@@ -1212,7 +1212,7 @@ func (s *scanStack) leave() {
12121212
}
12131213

12141214
func (s *scanStack) set(v item) {
1215-
if int(s.p) == len(s.v) {
1215+
if s.p == len(s.v) {
12161216
s.v = append(s.v, v)
12171217
} else {
12181218
s.v[s.p] = v
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
//go:build integration
2+
// +build integration
3+
4+
package integration
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"strconv"
10+
"strings"
11+
"testing"
12+
13+
"github.com/stretchr/testify/require"
14+
15+
"github.com/ydb-platform/ydb-go-sdk/v3/table"
16+
"github.com/ydb-platform/ydb-go-sdk/v3/table/result"
17+
"github.com/ydb-platform/ydb-go-sdk/v3/table/result/indexed"
18+
"github.com/ydb-platform/ydb-go-sdk/v3/table/result/named"
19+
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
20+
)
21+
22+
type rawInt64 struct {
23+
val int64
24+
}
25+
26+
func (r *rawInt64) UnmarshalYDB(raw types.RawValue) error {
27+
raw.Unwrap()
28+
r.val = raw.Int64()
29+
return nil
30+
}
31+
32+
func TestIssueWideResultWithUnwrap(t *testing.T) {
33+
const columnsCount = 200
34+
var columns []string
35+
for i := 0; i < columnsCount; i++ {
36+
column := fmt.Sprintf("CAST(%v AS Int64?) as c%v", i, i)
37+
columns = append(columns, column)
38+
}
39+
40+
query := "SELECT " + strings.Join(columns, ", ")
41+
t.Run("named", func(t *testing.T) {
42+
scope := newScope(t)
43+
var res result.Result
44+
var err error
45+
err = scope.Driver().Table().DoTx(scope.Ctx, func(ctx context.Context, tx table.TransactionActor) error {
46+
res, err = tx.Execute(ctx, query, nil)
47+
return err
48+
})
49+
require.NoError(t, err)
50+
51+
res.NextResultSet(scope.Ctx)
52+
require.NoError(t, res.Err())
53+
res.NextRow()
54+
require.NoError(t, res.Err())
55+
56+
results := make([]rawInt64, columnsCount)
57+
resultsPointers := make([]named.Value, columnsCount)
58+
for i := range results {
59+
resultsPointers[i] = named.Required("c"+strconv.Itoa(i), &results[i])
60+
}
61+
err = res.ScanNamed(resultsPointers...)
62+
require.NoError(t, err)
63+
64+
for i, val := range results {
65+
require.Equal(t, int64(i), val.val)
66+
}
67+
})
68+
t.Run("indexed", func(t *testing.T) {
69+
scope := newScope(t)
70+
var res result.Result
71+
var err error
72+
err = scope.Driver().Table().DoTx(scope.Ctx, func(ctx context.Context, tx table.TransactionActor) error {
73+
res, err = tx.Execute(ctx, query, nil)
74+
return err
75+
})
76+
require.NoError(t, err)
77+
78+
res.NextResultSet(scope.Ctx)
79+
require.NoError(t, res.Err())
80+
res.NextRow()
81+
require.NoError(t, res.Err())
82+
83+
results := make([]rawInt64, columnsCount)
84+
resultsPointers := make([]indexed.RequiredOrOptional, columnsCount)
85+
for i := range results {
86+
resultsPointers[i] = &results[i]
87+
}
88+
err = res.Scan(resultsPointers...)
89+
require.NoError(t, err)
90+
91+
for i, val := range results {
92+
require.Equal(t, int64(i), val.val)
93+
}
94+
})
95+
}

0 commit comments

Comments
 (0)