github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/table/scanner/scanner.go (about)

     1  package scanner
     2  
     3  import (
     4  	"database/sql"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"math"
     9  	"reflect"
    10  	"time"
    11  
    12  	"github.com/google/uuid"
    13  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
    14  
    15  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/decimal"
    16  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/scanner"
    17  	internalTypes "github.com/ydb-platform/ydb-go-sdk/v3/internal/types"
    18  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
    19  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
    20  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
    21  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
    22  	"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
    23  	"github.com/ydb-platform/ydb-go-sdk/v3/table/result"
    24  	"github.com/ydb-platform/ydb-go-sdk/v3/table/result/indexed"
    25  	"github.com/ydb-platform/ydb-go-sdk/v3/table/result/named"
    26  	"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
    27  )
    28  
    29  type valueScanner struct {
    30  	set                      *Ydb.ResultSet
    31  	row                      *Ydb.Value
    32  	converter                *rawConverter
    33  	stack                    scanStack
    34  	nextRow                  int
    35  	nextItem                 int
    36  	ignoreTruncated          bool
    37  	markTruncatedAsRetryable bool
    38  
    39  	columnIndexes []int
    40  
    41  	errMtx xsync.RWMutex
    42  	err    error
    43  }
    44  
    45  // ColumnCount returns number of columns in the current result set.
    46  func (s *valueScanner) ColumnCount() int {
    47  	if s.set == nil {
    48  		return 0
    49  	}
    50  
    51  	return len(s.set.GetColumns())
    52  }
    53  
    54  // Columns allows to iterate over all columns of the current result set.
    55  func (s *valueScanner) Columns(it func(options.Column)) {
    56  	if s.set == nil {
    57  		return
    58  	}
    59  	for _, m := range s.set.GetColumns() {
    60  		it(options.Column{
    61  			Name: m.GetName(),
    62  			Type: internalTypes.TypeFromYDB(m.GetType()),
    63  		})
    64  	}
    65  }
    66  
    67  // RowCount returns number of rows in the result set.
    68  func (s *valueScanner) RowCount() int {
    69  	if s.set == nil {
    70  		return 0
    71  	}
    72  
    73  	return len(s.set.GetRows())
    74  }
    75  
    76  // ItemCount returns number of items in the current row.
    77  func (s *valueScanner) ItemCount() int {
    78  	if s.row == nil {
    79  		return 0
    80  	}
    81  
    82  	return len(s.row.GetItems())
    83  }
    84  
    85  // HasNextRow reports whether result row may be advanced.
    86  // It may be useful to call HasNextRow() instead of NextRow() to look ahead
    87  // without advancing the result rows.
    88  func (s *valueScanner) HasNextRow() bool {
    89  	return s.err == nil && s.set != nil && s.nextRow < len(s.set.GetRows())
    90  }
    91  
    92  // NextRow selects next row in the current result set.
    93  // It returns false if there are no more rows in the result set.
    94  func (s *valueScanner) NextRow() bool {
    95  	if !s.HasNextRow() {
    96  		return false
    97  	}
    98  	s.row = s.set.GetRows()[s.nextRow]
    99  	s.nextRow++
   100  	s.nextItem = 0
   101  	s.stack.reset()
   102  
   103  	return true
   104  }
   105  
   106  func (s *valueScanner) preScanChecks(lenValues int) (err error) {
   107  	if s.columnIndexes != nil {
   108  		if len(s.columnIndexes) != lenValues {
   109  			return s.errorf(
   110  				1,
   111  				"scan row failed: count of values and column are different (%d != %d)",
   112  				len(s.columnIndexes),
   113  				lenValues,
   114  			)
   115  		}
   116  	}
   117  	if s.ColumnCount() < lenValues {
   118  		panic(fmt.Sprintf("scan row failed: count of columns less then values (%d < %d)", s.ColumnCount(), lenValues))
   119  	}
   120  	if s.nextItem != 0 {
   121  		panic("scan row failed: double scan per row")
   122  	}
   123  
   124  	return s.Err()
   125  }
   126  
   127  func (s *valueScanner) ScanWithDefaults(values ...indexed.Required) (err error) {
   128  	if err = s.preScanChecks(len(values)); err != nil {
   129  		return
   130  	}
   131  	for i := range values {
   132  		if _, ok := values[i].(named.Value); ok {
   133  			panic("dont use NamedValue with ScanWithDefaults. Use ScanNamed instead")
   134  		}
   135  		if s.columnIndexes == nil {
   136  			if err = s.seekItemByID(i); err != nil {
   137  				return
   138  			}
   139  		} else {
   140  			if err = s.seekItemByID(s.columnIndexes[i]); err != nil {
   141  				return
   142  			}
   143  		}
   144  		if s.isCurrentTypeOptional() {
   145  			s.scanOptional(values[i], true)
   146  		} else {
   147  			s.scanRequired(values[i])
   148  		}
   149  	}
   150  	s.nextItem += len(values)
   151  
   152  	return s.Err()
   153  }
   154  
   155  func (s *valueScanner) Scan(values ...indexed.RequiredOrOptional) (err error) {
   156  	if err = s.preScanChecks(len(values)); err != nil {
   157  		return
   158  	}
   159  	for i := range values {
   160  		if _, ok := values[i].(named.Value); ok {
   161  			panic("dont use NamedValue with Scan. Use ScanNamed instead")
   162  		}
   163  		if s.columnIndexes == nil {
   164  			if err = s.seekItemByID(i); err != nil {
   165  				return
   166  			}
   167  		} else {
   168  			if err = s.seekItemByID(s.columnIndexes[i]); err != nil {
   169  				return
   170  			}
   171  		}
   172  		if s.isCurrentTypeOptional() {
   173  			s.scanOptional(values[i], false)
   174  		} else {
   175  			s.scanRequired(values[i])
   176  		}
   177  	}
   178  	s.nextItem += len(values)
   179  
   180  	return s.Err()
   181  }
   182  
   183  func (s *valueScanner) ScanNamed(namedValues ...named.Value) error {
   184  	if err := s.Err(); err != nil {
   185  		return err
   186  	}
   187  	if s.ColumnCount() < len(namedValues) {
   188  		panic(fmt.Sprintf("scan row failed: count of columns less then values (%d < %d)", s.ColumnCount(), len(namedValues)))
   189  	}
   190  	if s.nextItem != 0 {
   191  		panic("scan row failed: double scan per row")
   192  	}
   193  	for i := range namedValues {
   194  		if err := s.seekItemByName(namedValues[i].Name); err != nil {
   195  			return err
   196  		}
   197  		switch t := namedValues[i].Type; t {
   198  		case named.TypeRequired:
   199  			s.scanRequired(namedValues[i].Value)
   200  		case named.TypeOptional:
   201  			s.scanOptional(namedValues[i].Value, false)
   202  		case named.TypeOptionalWithUseDefault:
   203  			s.scanOptional(namedValues[i].Value, true)
   204  		default:
   205  			panic(fmt.Sprintf("unknown type of named.valueType: %d", t))
   206  		}
   207  	}
   208  	s.nextItem += len(namedValues)
   209  
   210  	return s.Err()
   211  }
   212  
   213  // Truncated returns true if current result set has been truncated by server
   214  func (s *valueScanner) Truncated() bool {
   215  	if s.set == nil {
   216  		_ = s.errorf(0, "there are no sets in the scanner")
   217  
   218  		return false
   219  	}
   220  
   221  	return s.set.GetTruncated()
   222  }
   223  
   224  // Truncated returns true if current result set has been truncated by server
   225  func (s *valueScanner) truncated() bool {
   226  	if s.set == nil {
   227  		return false
   228  	}
   229  
   230  	return s.set.GetTruncated()
   231  }
   232  
   233  // Err returns error caused Scanner to be broken.
   234  func (s *valueScanner) Err() error {
   235  	s.errMtx.RLock()
   236  	defer s.errMtx.RUnlock()
   237  	if s.err != nil {
   238  		return s.err
   239  	}
   240  	if !s.ignoreTruncated && s.truncated() {
   241  		err := xerrors.Wrap(
   242  			fmt.Errorf("more than %d rows: %w", len(s.set.GetRows()), result.ErrTruncated),
   243  		)
   244  		if s.markTruncatedAsRetryable {
   245  			err = xerrors.Retryable(err)
   246  		}
   247  
   248  		return xerrors.WithStackTrace(err)
   249  	}
   250  
   251  	return nil
   252  }
   253  
   254  // Must not be exported.
   255  func (s *valueScanner) reset(set *Ydb.ResultSet, columnNames ...string) {
   256  	s.set = set
   257  	s.row = nil
   258  	s.nextRow = 0
   259  	s.nextItem = 0
   260  	s.columnIndexes = nil
   261  	s.setColumnIndexes(columnNames)
   262  	s.stack.reset()
   263  	s.converter = &rawConverter{
   264  		valueScanner: s,
   265  	}
   266  }
   267  
   268  func (s *valueScanner) path() string {
   269  	buf := xstring.Buffer()
   270  	defer buf.Free()
   271  	_, _ = s.writePathTo(buf)
   272  
   273  	return buf.String()
   274  }
   275  
   276  func (s *valueScanner) writePathTo(w io.Writer) (n int64, err error) {
   277  	x := s.stack.current()
   278  	st := x.name
   279  	m, err := io.WriteString(w, st)
   280  	if err != nil {
   281  		return n, xerrors.WithStackTrace(err)
   282  	}
   283  	n += int64(m)
   284  
   285  	return n, nil
   286  }
   287  
   288  func (s *valueScanner) getType() internalTypes.Type {
   289  	x := s.stack.current()
   290  	if x.isEmpty() {
   291  		return nil
   292  	}
   293  
   294  	return internalTypes.TypeFromYDB(x.t)
   295  }
   296  
   297  func (s *valueScanner) hasItems() bool {
   298  	return s.err == nil && s.set != nil && s.row != nil
   299  }
   300  
   301  func (s *valueScanner) seekItemByID(id int) error {
   302  	if !s.hasItems() || id >= len(s.set.GetColumns()) {
   303  		return s.notFoundColumnByIndex(id)
   304  	}
   305  	col := s.set.GetColumns()[id]
   306  	s.stack.scanItem.name = col.GetName()
   307  	s.stack.scanItem.t = col.GetType()
   308  	s.stack.scanItem.v = s.row.GetItems()[id]
   309  
   310  	return nil
   311  }
   312  
   313  func (s *valueScanner) seekItemByName(name string) error {
   314  	if !s.hasItems() {
   315  		return s.notFoundColumnName(name)
   316  	}
   317  	for i, c := range s.set.GetColumns() {
   318  		if name != c.GetName() {
   319  			continue
   320  		}
   321  		s.stack.scanItem.name = c.GetName()
   322  		s.stack.scanItem.t = c.GetType()
   323  		s.stack.scanItem.v = s.row.GetItems()[i]
   324  
   325  		return s.Err()
   326  	}
   327  
   328  	return s.notFoundColumnName(name)
   329  }
   330  
   331  func (s *valueScanner) setColumnIndexes(columns []string) {
   332  	if columns == nil {
   333  		s.columnIndexes = nil
   334  
   335  		return
   336  	}
   337  	s.columnIndexes = make([]int, len(columns))
   338  	for i, col := range columns {
   339  		found := false
   340  		for j, c := range s.set.GetColumns() {
   341  			if c.GetName() == col {
   342  				s.columnIndexes[i] = j
   343  				found = true
   344  
   345  				break
   346  			}
   347  		}
   348  		if !found {
   349  			_ = s.noColumnError(col)
   350  
   351  			return
   352  		}
   353  	}
   354  }
   355  
   356  // Any returns any primitive or optional value.
   357  // Currently, it may return one of these types:
   358  //
   359  //		bool
   360  //		int8
   361  //		uint8
   362  //		int16
   363  //		uint16
   364  //		int32
   365  //		uint32
   366  //		int64
   367  //		uint64
   368  //		float32
   369  //		float64
   370  //		[]byte
   371  //		string
   372  //		[16]byte
   373  //	    uuid
   374  //
   375  //nolint:gocyclo,funlen
   376  func (s *valueScanner) any() interface{} {
   377  	x := s.stack.current()
   378  	if s.Err() != nil || x.isEmpty() {
   379  		return nil
   380  	}
   381  
   382  	if s.isNull() {
   383  		return nil
   384  	}
   385  
   386  	if s.isCurrentTypeOptional() {
   387  		s.unwrap()
   388  		x = s.stack.current()
   389  	}
   390  
   391  	t := internalTypes.TypeFromYDB(x.t)
   392  	p, primitive := t.(internalTypes.Primitive)
   393  	if !primitive {
   394  		return s.value()
   395  	}
   396  
   397  	switch p {
   398  	case internalTypes.Bool:
   399  		return s.bool()
   400  	case internalTypes.Int8:
   401  		return s.int8()
   402  	case internalTypes.Uint8:
   403  		return s.uint8()
   404  	case internalTypes.Int16:
   405  		return s.int16()
   406  	case internalTypes.Uint16:
   407  		return s.uint16()
   408  	case internalTypes.Int32:
   409  		return s.int32()
   410  	case internalTypes.Float:
   411  		return s.float()
   412  	case internalTypes.Double:
   413  		return s.double()
   414  	case internalTypes.Bytes:
   415  		return s.bytes()
   416  	case internalTypes.UUID:
   417  		// replace to good uuid on migration
   418  		return s.uuidBytesWithIssue1501()
   419  	case internalTypes.Uint32:
   420  		return s.uint32()
   421  	case internalTypes.Date:
   422  		return value.DateToTime(s.uint32())
   423  	case internalTypes.Datetime:
   424  		return value.DatetimeToTime(s.uint32())
   425  	case internalTypes.Uint64:
   426  		return s.uint64()
   427  	case internalTypes.Timestamp:
   428  		return value.TimestampToTime(s.uint64())
   429  	case internalTypes.Int64:
   430  		return s.int64()
   431  	case internalTypes.Interval:
   432  		return value.IntervalToDuration(s.int64())
   433  	case internalTypes.TzDate:
   434  		src, err := value.TzDateToTime(s.text())
   435  		if err != nil {
   436  			_ = s.errorf(0, "valueScanner.any(): %w", err)
   437  		}
   438  
   439  		return src
   440  	case internalTypes.TzDatetime:
   441  		src, err := value.TzDatetimeToTime(s.text())
   442  		if err != nil {
   443  			_ = s.errorf(0, "valueScanner.any(): %w", err)
   444  		}
   445  
   446  		return src
   447  	case internalTypes.TzTimestamp:
   448  		src, err := value.TzTimestampToTime(s.text())
   449  		if err != nil {
   450  			_ = s.errorf(0, "valueScanner.any(): %w", err)
   451  		}
   452  
   453  		return src
   454  	case internalTypes.Text, internalTypes.DyNumber:
   455  		return s.text()
   456  	case
   457  		internalTypes.YSON,
   458  		internalTypes.JSON,
   459  		internalTypes.JSONDocument:
   460  		return xstring.ToBytes(s.text())
   461  	default:
   462  		_ = s.errorf(0, "unknown primitive types")
   463  
   464  		return nil
   465  	}
   466  }
   467  
   468  // valueType returns current item under scan as ydb.valueType types
   469  func (s *valueScanner) value() value.Value {
   470  	x := s.stack.current()
   471  
   472  	return value.FromYDB(x.t, x.v)
   473  }
   474  
   475  func (s *valueScanner) isCurrentTypeOptional() bool {
   476  	c := s.stack.current()
   477  
   478  	return isOptional(c.t)
   479  }
   480  
   481  func (s *valueScanner) isNull() bool {
   482  	_, yes := s.stack.currentValue().(*Ydb.Value_NullFlagValue)
   483  
   484  	return yes
   485  }
   486  
   487  // unwrap current item under scan interpreting it as Optional<Type> types
   488  // ignores if type is not optional
   489  func (s *valueScanner) unwrap() {
   490  	if s.Err() != nil {
   491  		return
   492  	}
   493  
   494  	t, _ := s.stack.currentType().(*Ydb.Type_OptionalType)
   495  	if t == nil {
   496  		return
   497  	}
   498  
   499  	if isOptional(t.OptionalType.GetItem()) {
   500  		s.stack.scanItem.v = s.unwrapValue()
   501  	}
   502  	s.stack.scanItem.t = t.OptionalType.GetItem()
   503  }
   504  
   505  func (s *valueScanner) unwrapValue() (v *Ydb.Value) {
   506  	x, _ := s.stack.currentValue().(*Ydb.Value_NestedValue)
   507  	if x == nil {
   508  		s.valueTypeError(s.stack.currentValue(), x)
   509  
   510  		return
   511  	}
   512  
   513  	return x.NestedValue
   514  }
   515  
   516  func (s *valueScanner) unwrapDecimal() decimal.Decimal {
   517  	if s.Err() != nil {
   518  		return decimal.Decimal{}
   519  	}
   520  	s.unwrap()
   521  	d := s.assertTypeDecimal(s.stack.current().t)
   522  	if d == nil {
   523  		return decimal.Decimal{}
   524  	}
   525  
   526  	return decimal.Decimal{
   527  		Bytes:     s.uint128(),
   528  		Precision: d.DecimalType.GetPrecision(),
   529  		Scale:     d.DecimalType.GetScale(),
   530  	}
   531  }
   532  
   533  func (s *valueScanner) assertTypeDecimal(typ *Ydb.Type) (t *Ydb.Type_DecimalType) {
   534  	if t, _ = typ.GetType().(*Ydb.Type_DecimalType); t == nil {
   535  		s.typeError(typ.GetType(), t)
   536  	}
   537  
   538  	return
   539  }
   540  
   541  func (s *valueScanner) bool() (v bool) {
   542  	x, _ := s.stack.currentValue().(*Ydb.Value_BoolValue)
   543  	if x == nil {
   544  		s.valueTypeError(s.stack.currentValue(), x)
   545  
   546  		return
   547  	}
   548  
   549  	return x.BoolValue
   550  }
   551  
   552  func (s *valueScanner) int8() (v int8) {
   553  	d := s.int32()
   554  	if d < math.MinInt8 || math.MaxInt8 < d {
   555  		_ = s.overflowError(d, v)
   556  
   557  		return
   558  	}
   559  
   560  	return int8(d)
   561  }
   562  
   563  func (s *valueScanner) uint8() (v uint8) {
   564  	d := s.uint32()
   565  	if d > math.MaxUint8 {
   566  		_ = s.overflowError(d, v)
   567  
   568  		return
   569  	}
   570  
   571  	return uint8(d)
   572  }
   573  
   574  func (s *valueScanner) int16() (v int16) {
   575  	d := s.int32()
   576  	if d < math.MinInt16 || math.MaxInt16 < d {
   577  		_ = s.overflowError(d, v)
   578  
   579  		return
   580  	}
   581  
   582  	return int16(d)
   583  }
   584  
   585  func (s *valueScanner) uint16() (v uint16) {
   586  	d := s.uint32()
   587  	if d > math.MaxUint16 {
   588  		_ = s.overflowError(d, v)
   589  
   590  		return
   591  	}
   592  
   593  	return uint16(d)
   594  }
   595  
   596  func (s *valueScanner) int32() (v int32) {
   597  	x, _ := s.stack.currentValue().(*Ydb.Value_Int32Value)
   598  	if x == nil {
   599  		s.valueTypeError(s.stack.currentValue(), x)
   600  
   601  		return
   602  	}
   603  
   604  	return x.Int32Value
   605  }
   606  
   607  func (s *valueScanner) uint32() (v uint32) {
   608  	x, _ := s.stack.currentValue().(*Ydb.Value_Uint32Value)
   609  	if x == nil {
   610  		s.valueTypeError(s.stack.currentValue(), x)
   611  
   612  		return
   613  	}
   614  
   615  	return x.Uint32Value
   616  }
   617  
   618  func (s *valueScanner) int64() (v int64) {
   619  	x, _ := s.stack.currentValue().(*Ydb.Value_Int64Value)
   620  	if x == nil {
   621  		s.valueTypeError(s.stack.currentValue(), x)
   622  
   623  		return
   624  	}
   625  
   626  	return x.Int64Value
   627  }
   628  
   629  func (s *valueScanner) uint64() (v uint64) {
   630  	x, _ := s.stack.currentValue().(*Ydb.Value_Uint64Value)
   631  	if x == nil {
   632  		s.valueTypeError(s.stack.currentValue(), x)
   633  
   634  		return
   635  	}
   636  
   637  	return x.Uint64Value
   638  }
   639  
   640  func (s *valueScanner) float() (v float32) {
   641  	x, _ := s.stack.currentValue().(*Ydb.Value_FloatValue)
   642  	if x == nil {
   643  		s.valueTypeError(s.stack.currentValue(), x)
   644  
   645  		return
   646  	}
   647  
   648  	return x.FloatValue
   649  }
   650  
   651  func (s *valueScanner) double() (v float64) {
   652  	x, _ := s.stack.currentValue().(*Ydb.Value_DoubleValue)
   653  	if x == nil {
   654  		s.valueTypeError(s.stack.currentValue(), x)
   655  
   656  		return
   657  	}
   658  
   659  	return x.DoubleValue
   660  }
   661  
   662  func (s *valueScanner) bytes() (v []byte) {
   663  	x, _ := s.stack.currentValue().(*Ydb.Value_BytesValue)
   664  	if x == nil {
   665  		s.valueTypeError(s.stack.currentValue(), x)
   666  
   667  		return
   668  	}
   669  
   670  	return x.BytesValue
   671  }
   672  
   673  func (s *valueScanner) text() (v string) {
   674  	x, _ := s.stack.currentValue().(*Ydb.Value_TextValue)
   675  	if x == nil {
   676  		s.valueTypeError(s.stack.currentValue(), x)
   677  
   678  		return
   679  	}
   680  
   681  	return x.TextValue
   682  }
   683  
   684  func (s *valueScanner) low128() (v uint64) {
   685  	x, _ := s.stack.currentValue().(*Ydb.Value_Low_128)
   686  	if x == nil {
   687  		s.valueTypeError(s.stack.currentValue(), x)
   688  
   689  		return
   690  	}
   691  
   692  	return x.Low_128
   693  }
   694  
   695  func (s *valueScanner) uint128() (v [16]byte) {
   696  	if s.stack.current().t.GetTypeId() == Ydb.Type_UUID {
   697  		_ = s.errorf(0, "ydb: failed to scan uuid: %w", value.ErrIssue1501BadUUID)
   698  	}
   699  
   700  	c := s.stack.current()
   701  	if c.isEmpty() {
   702  		_ = s.errorf(0, "not implemented convert to [16]byte")
   703  
   704  		return
   705  	}
   706  	lo := s.low128()
   707  	hi := c.v.GetHigh_128()
   708  
   709  	return value.BigEndianUint128(hi, lo)
   710  }
   711  
   712  func (s *valueScanner) uuidBytesWithIssue1501() (v types.UUIDBytesWithIssue1501Type) {
   713  	c := s.stack.current()
   714  	if c.isEmpty() {
   715  		_ = s.errorf(0, "not implemented convert to [16]byte")
   716  
   717  		return
   718  	}
   719  	lo := s.low128()
   720  	hi := c.v.GetHigh_128()
   721  
   722  	return value.NewUUIDIssue1501FixedBytesWrapper(value.BigEndianUint128(hi, lo))
   723  }
   724  
   725  func (s *valueScanner) uuid() uuid.UUID {
   726  	c := s.stack.current()
   727  	if c.isEmpty() {
   728  		_ = s.errorf(0, "not implemented convert to [16]byte")
   729  
   730  		return uuid.UUID{}
   731  	}
   732  	lo := s.low128()
   733  	hi := c.v.GetHigh_128()
   734  
   735  	val := value.UUIDFromYDBPair(hi, lo)
   736  
   737  	var uuidVal uuid.UUID
   738  	err := value.CastTo(val, &uuidVal)
   739  	if err != nil {
   740  		_ = s.errorf(0, "failed to cast internal uuid type to uuid: %w", err)
   741  
   742  		return uuid.UUID{}
   743  	}
   744  
   745  	return uuidVal
   746  }
   747  
   748  func (s *valueScanner) null() {
   749  	x, _ := s.stack.currentValue().(*Ydb.Value_NullFlagValue)
   750  	if x == nil {
   751  		s.valueTypeError(s.stack.currentValue(), x)
   752  	}
   753  }
   754  
   755  func (s *valueScanner) setTime(dst *time.Time) {
   756  	switch t := s.stack.current().t.GetTypeId(); t {
   757  	case Ydb.Type_DATE:
   758  		*dst = value.DateToTime(s.uint32())
   759  	case Ydb.Type_DATETIME:
   760  		*dst = value.DatetimeToTime(s.uint32())
   761  	case Ydb.Type_TIMESTAMP:
   762  		*dst = value.TimestampToTime(s.uint64())
   763  	case Ydb.Type_TZ_DATE:
   764  		src, err := value.TzDateToTime(s.text())
   765  		if err != nil {
   766  			_ = s.errorf(0, "valueScanner.setTime(): %w", err)
   767  		}
   768  		*dst = src
   769  	case Ydb.Type_TZ_DATETIME:
   770  		src, err := value.TzDatetimeToTime(s.text())
   771  		if err != nil {
   772  			_ = s.errorf(0, "valueScanner.setTime(): %w", err)
   773  		}
   774  		*dst = src
   775  	case Ydb.Type_TZ_TIMESTAMP:
   776  		src, err := value.TzTimestampToTime(s.text())
   777  		if err != nil {
   778  			_ = s.errorf(0, "valueScanner.setTime(): %w", err)
   779  		}
   780  		*dst = src
   781  	default:
   782  		_ = s.errorf(0, "valueScanner.setTime(): incorrect source types %s", t)
   783  	}
   784  }
   785  
   786  func (s *valueScanner) setString(dst *string) {
   787  	switch t := s.stack.current().t.GetTypeId(); t {
   788  	case Ydb.Type_UUID:
   789  		_ = s.errorf(0, "ydb: failed scan uuid: %w", value.ErrIssue1501BadUUID)
   790  	case Ydb.Type_UTF8, Ydb.Type_DYNUMBER, Ydb.Type_YSON, Ydb.Type_JSON, Ydb.Type_JSON_DOCUMENT:
   791  		*dst = s.text()
   792  	case Ydb.Type_STRING:
   793  		*dst = xstring.FromBytes(s.bytes())
   794  	default:
   795  		_ = s.errorf(0, "scan row failed: incorrect source types %s", t)
   796  	}
   797  }
   798  
   799  func (s *valueScanner) setByte(dst *[]byte) {
   800  	switch t := s.stack.current().t.GetTypeId(); t {
   801  	case Ydb.Type_UUID:
   802  		_ = s.errorf(0, "ydb: failed to scan uuid: %w", value.ErrIssue1501BadUUID)
   803  	case Ydb.Type_UTF8, Ydb.Type_DYNUMBER, Ydb.Type_YSON, Ydb.Type_JSON, Ydb.Type_JSON_DOCUMENT:
   804  		*dst = xstring.ToBytes(s.text())
   805  	case Ydb.Type_STRING:
   806  		*dst = s.bytes()
   807  	default:
   808  		_ = s.errorf(0, "scan row failed: incorrect source types %s", t)
   809  	}
   810  }
   811  
   812  func (s *valueScanner) trySetByteArray(v interface{}, optional, def bool) bool {
   813  	rv := reflect.ValueOf(v)
   814  	if rv.Kind() == reflect.Ptr {
   815  		rv = rv.Elem()
   816  	}
   817  	if rv.Kind() == reflect.Ptr {
   818  		if !optional {
   819  			return false
   820  		}
   821  		if s.isNull() {
   822  			rv.Set(reflect.Zero(rv.Type()))
   823  
   824  			return true
   825  		}
   826  		if rv.IsZero() {
   827  			nv := reflect.New(rv.Type().Elem())
   828  			rv.Set(nv)
   829  		}
   830  		rv = rv.Elem()
   831  	}
   832  	if rv.Kind() != reflect.Array {
   833  		return false
   834  	}
   835  	if rv.Type().Elem().Kind() != reflect.Uint8 {
   836  		return false
   837  	}
   838  	if def {
   839  		rv.Set(reflect.Zero(rv.Type()))
   840  
   841  		return true
   842  	}
   843  	var dst []byte
   844  	s.setByte(&dst)
   845  	if rv.Len() != len(dst) {
   846  		return false
   847  	}
   848  	reflect.Copy(rv, reflect.ValueOf(dst))
   849  
   850  	return true
   851  }
   852  
   853  //nolint:gocyclo,funlen
   854  func (s *valueScanner) scanRequired(v interface{}) {
   855  	switch v := v.(type) {
   856  	case *bool:
   857  		*v = s.bool()
   858  	case *int8:
   859  		*v = s.int8()
   860  	case *int16:
   861  		*v = s.int16()
   862  	case *int:
   863  		*v = int(s.int32())
   864  	case *int32:
   865  		*v = s.int32()
   866  	case *int64:
   867  		*v = s.int64()
   868  	case *uint8:
   869  		*v = s.uint8()
   870  	case *uint16:
   871  		*v = s.uint16()
   872  	case *uint32:
   873  		*v = s.uint32()
   874  	case *uint:
   875  		*v = uint(s.uint32())
   876  	case *uint64:
   877  		*v = s.uint64()
   878  	case *float32:
   879  		*v = s.float()
   880  	case *float64:
   881  		*v = s.double()
   882  	case *time.Time:
   883  		s.setTime(v)
   884  	case *time.Duration:
   885  		*v = value.IntervalToDuration(s.int64())
   886  	case *string:
   887  		s.setString(v)
   888  	case *[]byte:
   889  		s.setByte(v)
   890  	case *[16]byte:
   891  		*v = s.uint128()
   892  	case *types.UUIDBytesWithIssue1501Type:
   893  		*v = s.uuidBytesWithIssue1501()
   894  	case *uuid.UUID:
   895  		*v = s.uuid()
   896  	case *interface{}:
   897  		*v = s.any()
   898  	case *value.Value:
   899  		*v = s.value()
   900  	case *decimal.Decimal:
   901  		*v = s.unwrapDecimal()
   902  	case scanner.Scanner:
   903  		err := v.UnmarshalYDB(s.converter)
   904  		if err != nil {
   905  			_ = s.errorf(0, "ydb.Scanner error: %w", err)
   906  		}
   907  	case sql.Scanner:
   908  		err := v.Scan(s.any())
   909  		if err != nil {
   910  			_ = s.errorf(0, "sql.Scanner error: %w", err)
   911  		}
   912  	case json.Unmarshaler:
   913  		var err error
   914  		switch s.getType() {
   915  		case internalTypes.JSON:
   916  			err = v.UnmarshalJSON(s.converter.JSON())
   917  		case internalTypes.JSONDocument:
   918  			err = v.UnmarshalJSON(s.converter.JSONDocument())
   919  		default:
   920  			_ = s.errorf(0, "ydb required type %T not unsupported for applying to json.Unmarshaler", s.getType())
   921  		}
   922  		if err != nil {
   923  			_ = s.errorf(0, "json.Unmarshaler error: %w", err)
   924  		}
   925  	default:
   926  		ok := s.trySetByteArray(v, false, false)
   927  		if !ok {
   928  			_ = s.errorf(0, "scan row failed: type %T is unknown", v)
   929  		}
   930  	}
   931  }
   932  
   933  //nolint:gocyclo, funlen
   934  func (s *valueScanner) scanOptional(v interface{}, defaultValueForOptional bool) {
   935  	if defaultValueForOptional {
   936  		if s.isNull() {
   937  			s.setDefaultValue(v)
   938  		} else {
   939  			s.unwrap()
   940  			s.scanRequired(v)
   941  		}
   942  
   943  		return
   944  	}
   945  	switch v := v.(type) {
   946  	case **bool:
   947  		if s.isNull() {
   948  			*v = nil
   949  		} else {
   950  			src := s.bool()
   951  			*v = &src
   952  		}
   953  	case **int8:
   954  		if s.isNull() {
   955  			*v = nil
   956  		} else {
   957  			src := s.int8()
   958  			*v = &src
   959  		}
   960  	case **int16:
   961  		if s.isNull() {
   962  			*v = nil
   963  		} else {
   964  			src := s.int16()
   965  			*v = &src
   966  		}
   967  	case **int32:
   968  		if s.isNull() {
   969  			*v = nil
   970  		} else {
   971  			src := s.int32()
   972  			*v = &src
   973  		}
   974  	case **int:
   975  		if s.isNull() {
   976  			*v = nil
   977  		} else {
   978  			src := int(s.int32())
   979  			*v = &src
   980  		}
   981  	case **int64:
   982  		if s.isNull() {
   983  			*v = nil
   984  		} else {
   985  			src := s.int64()
   986  			*v = &src
   987  		}
   988  	case **uint8:
   989  		if s.isNull() {
   990  			*v = nil
   991  		} else {
   992  			src := s.uint8()
   993  			*v = &src
   994  		}
   995  	case **uint16:
   996  		if s.isNull() {
   997  			*v = nil
   998  		} else {
   999  			src := s.uint16()
  1000  			*v = &src
  1001  		}
  1002  	case **uint32:
  1003  		if s.isNull() {
  1004  			*v = nil
  1005  		} else {
  1006  			src := s.uint32()
  1007  			*v = &src
  1008  		}
  1009  	case **uint:
  1010  		if s.isNull() {
  1011  			*v = nil
  1012  		} else {
  1013  			src := uint(s.uint32())
  1014  			*v = &src
  1015  		}
  1016  	case **uint64:
  1017  		if s.isNull() {
  1018  			*v = nil
  1019  		} else {
  1020  			src := s.uint64()
  1021  			*v = &src
  1022  		}
  1023  	case **float32:
  1024  		if s.isNull() {
  1025  			*v = nil
  1026  		} else {
  1027  			src := s.float()
  1028  			*v = &src
  1029  		}
  1030  	case **float64:
  1031  		if s.isNull() {
  1032  			*v = nil
  1033  		} else {
  1034  			src := s.double()
  1035  			*v = &src
  1036  		}
  1037  	case **time.Time:
  1038  		if s.isNull() {
  1039  			*v = nil
  1040  		} else {
  1041  			s.unwrap()
  1042  			var src time.Time
  1043  			s.setTime(&src)
  1044  			*v = &src
  1045  		}
  1046  	case **time.Duration:
  1047  		if s.isNull() {
  1048  			*v = nil
  1049  		} else {
  1050  			src := value.IntervalToDuration(s.int64())
  1051  			*v = &src
  1052  		}
  1053  	case **string:
  1054  		if s.isNull() {
  1055  			*v = nil
  1056  		} else {
  1057  			s.unwrap()
  1058  			var src string
  1059  			s.setString(&src)
  1060  			*v = &src
  1061  		}
  1062  	case **[]byte:
  1063  		if s.isNull() {
  1064  			*v = nil
  1065  		} else {
  1066  			s.unwrap()
  1067  			var src []byte
  1068  			s.setByte(&src)
  1069  			*v = &src
  1070  		}
  1071  	case **[16]byte:
  1072  		if s.isNull() {
  1073  			*v = nil
  1074  		} else {
  1075  			src := s.uint128()
  1076  			*v = &src
  1077  		}
  1078  	case **value.UUIDIssue1501FixedBytesWrapper:
  1079  		if s.isNull() {
  1080  			*v = nil
  1081  		} else {
  1082  			src := s.uint128()
  1083  			val := value.NewUUIDIssue1501FixedBytesWrapper(src)
  1084  			*v = &val
  1085  		}
  1086  	case **uuid.UUID:
  1087  		if s.isNull() {
  1088  			*v = nil
  1089  		} else {
  1090  			src := s.uuid()
  1091  			*v = &src
  1092  		}
  1093  	case **interface{}:
  1094  		if s.isNull() {
  1095  			*v = nil
  1096  		} else {
  1097  			src := s.any()
  1098  			*v = &src
  1099  		}
  1100  	case *value.Value:
  1101  		*v = s.value()
  1102  	case **decimal.Decimal:
  1103  		if s.isNull() {
  1104  			*v = nil
  1105  		} else {
  1106  			src := s.unwrapDecimal()
  1107  			*v = &src
  1108  		}
  1109  	case scanner.Scanner:
  1110  		err := v.UnmarshalYDB(s.converter)
  1111  		if err != nil {
  1112  			_ = s.errorf(0, "ydb.Scanner error: %w", err)
  1113  		}
  1114  	case sql.Scanner:
  1115  		err := v.Scan(s.any())
  1116  		if err != nil {
  1117  			_ = s.errorf(0, "sql.Scanner error: %w", err)
  1118  		}
  1119  	case json.Unmarshaler:
  1120  		s.unwrap()
  1121  		var err error
  1122  		switch s.getType() {
  1123  		case internalTypes.JSON:
  1124  			if s.isNull() {
  1125  				err = v.UnmarshalJSON(nil)
  1126  			} else {
  1127  				err = v.UnmarshalJSON(s.converter.JSON())
  1128  			}
  1129  		case internalTypes.JSONDocument:
  1130  			if s.isNull() {
  1131  				err = v.UnmarshalJSON(nil)
  1132  			} else {
  1133  				err = v.UnmarshalJSON(s.converter.JSONDocument())
  1134  			}
  1135  		default:
  1136  			_ = s.errorf(0, "ydb optional type %T not unsupported for applying to json.Unmarshaler", s.getType())
  1137  		}
  1138  		if err != nil {
  1139  			_ = s.errorf(0, "json.Unmarshaler error: %w", err)
  1140  		}
  1141  	default:
  1142  		s.unwrap()
  1143  		ok := s.trySetByteArray(v, true, false)
  1144  		if !ok {
  1145  			rv := reflect.TypeOf(v)
  1146  			if rv.Kind() == reflect.Ptr && rv.Elem().Kind() == reflect.Ptr {
  1147  				_ = s.errorf(0, "scan row failed: type %T is unknown", v)
  1148  			} else {
  1149  				_ = s.errorf(0, "scan row failed: type %T is not optional! use double pointer or sql.Scanner.", v)
  1150  			}
  1151  		}
  1152  	}
  1153  }
  1154  
  1155  //nolint:funlen
  1156  func (s *valueScanner) setDefaultValue(dst interface{}) {
  1157  	switch v := dst.(type) {
  1158  	case *bool:
  1159  		*v = false
  1160  	case *int8:
  1161  		*v = 0
  1162  	case *int16:
  1163  		*v = 0
  1164  	case *int32:
  1165  		*v = 0
  1166  	case *int64:
  1167  		*v = 0
  1168  	case *uint8:
  1169  		*v = 0
  1170  	case *uint16:
  1171  		*v = 0
  1172  	case *uint32:
  1173  		*v = 0
  1174  	case *uint64:
  1175  		*v = 0
  1176  	case *float32:
  1177  		*v = 0
  1178  	case *float64:
  1179  		*v = 0
  1180  	case *time.Time:
  1181  		*v = time.Time{}
  1182  	case *time.Duration:
  1183  		*v = 0
  1184  	case *string:
  1185  		*v = ""
  1186  	case *[]byte:
  1187  		*v = nil
  1188  	case *[16]byte:
  1189  		*v = [16]byte{}
  1190  	case *interface{}:
  1191  		*v = nil
  1192  	case *value.Value:
  1193  		*v = s.value()
  1194  	case *decimal.Decimal:
  1195  		*v = decimal.Decimal{}
  1196  	case sql.Scanner:
  1197  		err := v.Scan(nil)
  1198  		if err != nil {
  1199  			_ = s.errorf(0, "sql.Scanner error: %w", err)
  1200  		}
  1201  	case scanner.Scanner:
  1202  		err := v.UnmarshalYDB(s.converter)
  1203  		if err != nil {
  1204  			_ = s.errorf(0, "ydb.Scanner error: %w", err)
  1205  		}
  1206  	case json.Unmarshaler:
  1207  		err := v.UnmarshalJSON(nil)
  1208  		if err != nil {
  1209  			_ = s.errorf(0, "json.Unmarshaler error: %w", err)
  1210  		}
  1211  	default:
  1212  		ok := s.trySetByteArray(v, false, true)
  1213  		if !ok {
  1214  			_ = s.errorf(0, "scan row failed: type %T is unknown", v)
  1215  		}
  1216  	}
  1217  }
  1218  
  1219  func (r *baseResult) SetErr(err error) {
  1220  	r.errMtx.WithLock(func() {
  1221  		r.err = err
  1222  	})
  1223  }
  1224  
  1225  func (s *valueScanner) errorf(depth int, f string, args ...interface{}) error {
  1226  	s.errMtx.Lock()
  1227  	defer s.errMtx.Unlock()
  1228  	if s.err != nil {
  1229  		return s.err
  1230  	}
  1231  	s.err = xerrors.WithStackTrace(fmt.Errorf(f, args...), xerrors.WithSkipDepth(depth+1))
  1232  
  1233  	return s.err
  1234  }
  1235  
  1236  func (s *valueScanner) typeError(act, exp interface{}) {
  1237  	_ = s.errorf(
  1238  		2, //nolint:gomnd
  1239  		"unexpected types during scan at %q %s: %s; want %s",
  1240  		s.path(),
  1241  		s.getType(),
  1242  		nameIface(act),
  1243  		nameIface(exp),
  1244  	)
  1245  }
  1246  
  1247  func (s *valueScanner) valueTypeError(act, exp interface{}) {
  1248  	// unexpected value during scan at \"migration_status\" Int64: NullFlag; want Int64
  1249  	_ = s.errorf(
  1250  		2, //nolint:gomnd
  1251  		"unexpected value during scan at %q %s: %s; want %s",
  1252  		s.path(),
  1253  		s.getType(),
  1254  		nameIface(act),
  1255  		nameIface(exp),
  1256  	)
  1257  }
  1258  
  1259  func (s *valueScanner) notFoundColumnByIndex(idx int) error {
  1260  	return s.errorf(
  1261  		2, //nolint:gomnd
  1262  		"not found %d column",
  1263  		idx,
  1264  	)
  1265  }
  1266  
  1267  func (s *valueScanner) notFoundColumnName(name string) error {
  1268  	return s.errorf(
  1269  		2, //nolint:gomnd
  1270  		"not found column '%s'",
  1271  		name,
  1272  	)
  1273  }
  1274  
  1275  func (s *valueScanner) noColumnError(name string) error {
  1276  	return s.errorf(
  1277  		2, //nolint:gomnd
  1278  		"no column %q",
  1279  		name,
  1280  	)
  1281  }
  1282  
  1283  func (s *valueScanner) overflowError(i, n interface{}) error {
  1284  	return s.errorf(
  1285  		2, //nolint:gomnd
  1286  		"overflow error: %d overflows capacity of %t",
  1287  		i,
  1288  		n,
  1289  	)
  1290  }
  1291  
  1292  var emptyItem item
  1293  
  1294  type item struct {
  1295  	name string
  1296  	i    int // Index in listing types
  1297  	t    *Ydb.Type
  1298  	v    *Ydb.Value
  1299  }
  1300  
  1301  func (x item) isEmpty() bool {
  1302  	return x.v == nil
  1303  }
  1304  
  1305  type scanStack struct {
  1306  	v        []item
  1307  	p        int
  1308  	scanItem item
  1309  }
  1310  
  1311  func (s *scanStack) size() int {
  1312  	if !s.scanItem.isEmpty() {
  1313  		s.set(s.scanItem)
  1314  	}
  1315  
  1316  	return s.p + 1
  1317  }
  1318  
  1319  func (s *scanStack) get(i int) item {
  1320  	return s.v[i]
  1321  }
  1322  
  1323  func (s *scanStack) reset() {
  1324  	s.scanItem = emptyItem
  1325  	s.p = 0
  1326  }
  1327  
  1328  func (s *scanStack) enter() {
  1329  	// support compatibility
  1330  	if !s.scanItem.isEmpty() {
  1331  		s.set(s.scanItem)
  1332  	}
  1333  	s.scanItem = emptyItem
  1334  	s.p++
  1335  }
  1336  
  1337  func (s *scanStack) leave() {
  1338  	s.set(emptyItem)
  1339  	if s.p > 0 {
  1340  		s.p--
  1341  	}
  1342  }
  1343  
  1344  func (s *scanStack) set(v item) {
  1345  	if s.p == len(s.v) {
  1346  		s.v = append(s.v, v)
  1347  	} else {
  1348  		s.v[s.p] = v
  1349  	}
  1350  }
  1351  
  1352  func (s *scanStack) parent() item {
  1353  	if s.p == 0 {
  1354  		return emptyItem
  1355  	}
  1356  
  1357  	return s.v[s.p-1]
  1358  }
  1359  
  1360  func (s *scanStack) current() item {
  1361  	if !s.scanItem.isEmpty() {
  1362  		return s.scanItem
  1363  	}
  1364  	if s.v == nil {
  1365  		return emptyItem
  1366  	}
  1367  
  1368  	return s.v[s.p]
  1369  }
  1370  
  1371  func (s *scanStack) currentValue() interface{} {
  1372  	if v := s.current().v; v != nil {
  1373  		return v.GetValue()
  1374  	}
  1375  
  1376  	return nil
  1377  }
  1378  
  1379  func (s *scanStack) currentType() interface{} {
  1380  	if t := s.current().t; t != nil {
  1381  		return t.GetType()
  1382  	}
  1383  
  1384  	return nil
  1385  }
  1386  
  1387  func isOptional(typ *Ydb.Type) bool {
  1388  	if typ == nil {
  1389  		return false
  1390  	}
  1391  	_, yes := typ.GetType().(*Ydb.Type_OptionalType)
  1392  
  1393  	return yes
  1394  }