11package scanner
22
33import (
4- "bytes"
54 "database/sql"
65 "encoding/json"
76 "errors"
@@ -15,6 +14,7 @@ import (
1514
1615 "github.com/ydb-platform/ydb-go-sdk/v3/internal/timeutil"
1716 "github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
17+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/value/allocator"
1818 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1919 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
2020 "github.com/ydb-platform/ydb-go-sdk/v3/table/options"
@@ -173,9 +173,9 @@ func (s *scanner) Scan(values ...indexed.RequiredOrOptional) (err error) {
173173 return s .Err ()
174174}
175175
176- func (s * scanner ) ScanNamed (namedValues ... named.Value ) ( err error ) {
177- if err = s .Err (); err != nil {
178- return
176+ func (s * scanner ) ScanNamed (namedValues ... named.Value ) error {
177+ if err : = s .Err (); err != nil {
178+ return err
179179 }
180180 if s .ColumnCount () < len (namedValues ) {
181181 panic (fmt .Sprintf ("scan row failed: count of columns less then values (%d < %d)" , s .ColumnCount (), len (namedValues )))
@@ -184,8 +184,8 @@ func (s *scanner) ScanNamed(namedValues ...named.Value) (err error) {
184184 panic ("scan row failed: double scan per row" )
185185 }
186186 for _ , v := range namedValues {
187- if err = s .seekItemByName (v .Name ); err != nil {
188- return
187+ if err : = s .seekItemByName (v .Name ); err != nil {
188+ return err
189189 }
190190 switch t := v .Type ; t {
191191 case named .TypeRequired :
@@ -250,8 +250,9 @@ func (s *scanner) reset(set *Ydb.ResultSet, columnNames ...string) {
250250}
251251
252252func (s * scanner ) path () string {
253- var buf bytes.Buffer
254- _ , _ = s .writePathTo (& buf )
253+ buf := allocator .Buffers .Get ()
254+ defer allocator .Buffers .Put (buf )
255+ _ , _ = s .writePathTo (buf )
255256 return buf .String ()
256257}
257258
@@ -280,7 +281,7 @@ func (s *scanner) hasItems() bool {
280281
281282func (s * scanner ) seekItemByID (id int ) error {
282283 if ! s .hasItems () || id >= len (s .set .Columns ) {
283- return s .noValueError ( )
284+ return s .notFoundColumnByIndex ( id )
284285 }
285286 col := s .set .Columns [id ]
286287 s .stack .scanItem .name = col .Name
@@ -291,7 +292,7 @@ func (s *scanner) seekItemByID(id int) error {
291292
292293func (s * scanner ) seekItemByName (name string ) error {
293294 if ! s .hasItems () {
294- return s .noValueError ( )
295+ return s .notFoundColumnName ( name )
295296 }
296297 for i , c := range s .set .Columns {
297298 if name == c .Name {
@@ -301,7 +302,7 @@ func (s *scanner) seekItemByName(name string) error {
301302 return s .Err ()
302303 }
303304 }
304- return s .noValueError ( )
305+ return s .notFoundColumnName ( name )
305306}
306307
307308func (s * scanner ) setColumnIndexes (columns []string ) {
@@ -1123,11 +1124,19 @@ func (s *scanner) valueTypeError(act, exp interface{}) {
11231124 )
11241125}
11251126
1126- func (s * scanner ) noValueError ( ) error {
1127+ func (s * scanner ) notFoundColumnByIndex ( idx int ) error {
11271128 return s .errorf (
11281129 2 ,
1129- "no value at %q" ,
1130- s .path (),
1130+ "not found %d column" ,
1131+ idx ,
1132+ )
1133+ }
1134+
1135+ func (s * scanner ) notFoundColumnName (name string ) error {
1136+ return s .errorf (
1137+ 2 ,
1138+ "not found column '%s'" ,
1139+ name ,
11311140 )
11321141}
11331142
0 commit comments