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 }