github.com/jackc/pgx/v5@v5.5.5/pgtype/pgtype.go (about) 1 package pgtype 2 3 import ( 4 "database/sql" 5 "database/sql/driver" 6 "errors" 7 "fmt" 8 "net" 9 "net/netip" 10 "reflect" 11 "time" 12 ) 13 14 // PostgreSQL oids for common types 15 const ( 16 BoolOID = 16 17 ByteaOID = 17 18 QCharOID = 18 19 NameOID = 19 20 Int8OID = 20 21 Int2OID = 21 22 Int4OID = 23 23 TextOID = 25 24 OIDOID = 26 25 TIDOID = 27 26 XIDOID = 28 27 CIDOID = 29 28 JSONOID = 114 29 JSONArrayOID = 199 30 PointOID = 600 31 LsegOID = 601 32 PathOID = 602 33 BoxOID = 603 34 PolygonOID = 604 35 LineOID = 628 36 LineArrayOID = 629 37 CIDROID = 650 38 CIDRArrayOID = 651 39 Float4OID = 700 40 Float8OID = 701 41 CircleOID = 718 42 CircleArrayOID = 719 43 UnknownOID = 705 44 MacaddrOID = 829 45 InetOID = 869 46 BoolArrayOID = 1000 47 QCharArrayOID = 1002 48 NameArrayOID = 1003 49 Int2ArrayOID = 1005 50 Int4ArrayOID = 1007 51 TextArrayOID = 1009 52 TIDArrayOID = 1010 53 ByteaArrayOID = 1001 54 XIDArrayOID = 1011 55 CIDArrayOID = 1012 56 BPCharArrayOID = 1014 57 VarcharArrayOID = 1015 58 Int8ArrayOID = 1016 59 PointArrayOID = 1017 60 LsegArrayOID = 1018 61 PathArrayOID = 1019 62 BoxArrayOID = 1020 63 Float4ArrayOID = 1021 64 Float8ArrayOID = 1022 65 PolygonArrayOID = 1027 66 OIDArrayOID = 1028 67 ACLItemOID = 1033 68 ACLItemArrayOID = 1034 69 MacaddrArrayOID = 1040 70 InetArrayOID = 1041 71 BPCharOID = 1042 72 VarcharOID = 1043 73 DateOID = 1082 74 TimeOID = 1083 75 TimestampOID = 1114 76 TimestampArrayOID = 1115 77 DateArrayOID = 1182 78 TimeArrayOID = 1183 79 TimestamptzOID = 1184 80 TimestamptzArrayOID = 1185 81 IntervalOID = 1186 82 IntervalArrayOID = 1187 83 NumericArrayOID = 1231 84 TimetzOID = 1266 85 TimetzArrayOID = 1270 86 BitOID = 1560 87 BitArrayOID = 1561 88 VarbitOID = 1562 89 VarbitArrayOID = 1563 90 NumericOID = 1700 91 RecordOID = 2249 92 RecordArrayOID = 2287 93 UUIDOID = 2950 94 UUIDArrayOID = 2951 95 JSONBOID = 3802 96 JSONBArrayOID = 3807 97 DaterangeOID = 3912 98 DaterangeArrayOID = 3913 99 Int4rangeOID = 3904 100 Int4rangeArrayOID = 3905 101 NumrangeOID = 3906 102 NumrangeArrayOID = 3907 103 TsrangeOID = 3908 104 TsrangeArrayOID = 3909 105 TstzrangeOID = 3910 106 TstzrangeArrayOID = 3911 107 Int8rangeOID = 3926 108 Int8rangeArrayOID = 3927 109 JSONPathOID = 4072 110 JSONPathArrayOID = 4073 111 Int4multirangeOID = 4451 112 NummultirangeOID = 4532 113 TsmultirangeOID = 4533 114 TstzmultirangeOID = 4534 115 DatemultirangeOID = 4535 116 Int8multirangeOID = 4536 117 Int4multirangeArrayOID = 6150 118 NummultirangeArrayOID = 6151 119 TsmultirangeArrayOID = 6152 120 TstzmultirangeArrayOID = 6153 121 DatemultirangeArrayOID = 6155 122 Int8multirangeArrayOID = 6157 123 ) 124 125 type InfinityModifier int8 126 127 const ( 128 Infinity InfinityModifier = 1 129 Finite InfinityModifier = 0 130 NegativeInfinity InfinityModifier = -Infinity 131 ) 132 133 func (im InfinityModifier) String() string { 134 switch im { 135 case Finite: 136 return "finite" 137 case Infinity: 138 return "infinity" 139 case NegativeInfinity: 140 return "-infinity" 141 default: 142 return "invalid" 143 } 144 } 145 146 // PostgreSQL format codes 147 const ( 148 TextFormatCode = 0 149 BinaryFormatCode = 1 150 ) 151 152 // A Codec converts between Go and PostgreSQL values. A Codec must not be mutated after it is registered with a Map. 153 type Codec interface { 154 // FormatSupported returns true if the format is supported. 155 FormatSupported(int16) bool 156 157 // PreferredFormat returns the preferred format. 158 PreferredFormat() int16 159 160 // PlanEncode returns an EncodePlan for encoding value into PostgreSQL format for oid and format. If no plan can be 161 // found then nil is returned. 162 PlanEncode(m *Map, oid uint32, format int16, value any) EncodePlan 163 164 // PlanScan returns a ScanPlan for scanning a PostgreSQL value into a destination with the same type as target. If 165 // no plan can be found then nil is returned. 166 PlanScan(m *Map, oid uint32, format int16, target any) ScanPlan 167 168 // DecodeDatabaseSQLValue returns src decoded into a value compatible with the sql.Scanner interface. 169 DecodeDatabaseSQLValue(m *Map, oid uint32, format int16, src []byte) (driver.Value, error) 170 171 // DecodeValue returns src decoded into its default format. 172 DecodeValue(m *Map, oid uint32, format int16, src []byte) (any, error) 173 } 174 175 type nullAssignmentError struct { 176 dst any 177 } 178 179 func (e *nullAssignmentError) Error() string { 180 return fmt.Sprintf("cannot assign NULL to %T", e.dst) 181 } 182 183 // Type represents a PostgreSQL data type. It must not be mutated after it is registered with a Map. 184 type Type struct { 185 Codec Codec 186 Name string 187 OID uint32 188 } 189 190 // Map is the mapping between PostgreSQL server types and Go type handling logic. It can encode values for 191 // transmission to a PostgreSQL server and scan received values. 192 type Map struct { 193 oidToType map[uint32]*Type 194 nameToType map[string]*Type 195 reflectTypeToName map[reflect.Type]string 196 oidToFormatCode map[uint32]int16 197 198 reflectTypeToType map[reflect.Type]*Type 199 200 memoizedScanPlans map[uint32]map[reflect.Type][2]ScanPlan 201 memoizedEncodePlans map[uint32]map[reflect.Type][2]EncodePlan 202 203 // TryWrapEncodePlanFuncs is a slice of functions that will wrap a value that cannot be encoded by the Codec. Every 204 // time a wrapper is found the PlanEncode method will be recursively called with the new value. This allows several layers of wrappers 205 // to be built up. There are default functions placed in this slice by NewMap(). In most cases these functions 206 // should run last. i.e. Additional functions should typically be prepended not appended. 207 TryWrapEncodePlanFuncs []TryWrapEncodePlanFunc 208 209 // TryWrapScanPlanFuncs is a slice of functions that will wrap a target that cannot be scanned into by the Codec. Every 210 // time a wrapper is found the PlanScan method will be recursively called with the new target. This allows several layers of wrappers 211 // to be built up. There are default functions placed in this slice by NewMap(). In most cases these functions 212 // should run last. i.e. Additional functions should typically be prepended not appended. 213 TryWrapScanPlanFuncs []TryWrapScanPlanFunc 214 } 215 216 func NewMap() *Map { 217 defaultMapInitOnce.Do(initDefaultMap) 218 219 return &Map{ 220 oidToType: make(map[uint32]*Type), 221 nameToType: make(map[string]*Type), 222 reflectTypeToName: make(map[reflect.Type]string), 223 oidToFormatCode: make(map[uint32]int16), 224 225 memoizedScanPlans: make(map[uint32]map[reflect.Type][2]ScanPlan), 226 memoizedEncodePlans: make(map[uint32]map[reflect.Type][2]EncodePlan), 227 228 TryWrapEncodePlanFuncs: []TryWrapEncodePlanFunc{ 229 TryWrapDerefPointerEncodePlan, 230 TryWrapBuiltinTypeEncodePlan, 231 TryWrapFindUnderlyingTypeEncodePlan, 232 TryWrapStructEncodePlan, 233 TryWrapSliceEncodePlan, 234 TryWrapMultiDimSliceEncodePlan, 235 TryWrapArrayEncodePlan, 236 }, 237 238 TryWrapScanPlanFuncs: []TryWrapScanPlanFunc{ 239 TryPointerPointerScanPlan, 240 TryWrapBuiltinTypeScanPlan, 241 TryFindUnderlyingTypeScanPlan, 242 TryWrapStructScanPlan, 243 TryWrapPtrSliceScanPlan, 244 TryWrapPtrMultiDimSliceScanPlan, 245 TryWrapPtrArrayScanPlan, 246 }, 247 } 248 } 249 250 // RegisterType registers a data type with the Map. t must not be mutated after it is registered. 251 func (m *Map) RegisterType(t *Type) { 252 m.oidToType[t.OID] = t 253 m.nameToType[t.Name] = t 254 m.oidToFormatCode[t.OID] = t.Codec.PreferredFormat() 255 256 // Invalidated by type registration 257 m.reflectTypeToType = nil 258 for k := range m.memoizedScanPlans { 259 delete(m.memoizedScanPlans, k) 260 } 261 for k := range m.memoizedEncodePlans { 262 delete(m.memoizedEncodePlans, k) 263 } 264 } 265 266 // RegisterDefaultPgType registers a mapping of a Go type to a PostgreSQL type name. Typically the data type to be 267 // encoded or decoded is determined by the PostgreSQL OID. But if the OID of a value to be encoded or decoded is 268 // unknown, this additional mapping will be used by TypeForValue to determine a suitable data type. 269 func (m *Map) RegisterDefaultPgType(value any, name string) { 270 m.reflectTypeToName[reflect.TypeOf(value)] = name 271 272 // Invalidated by type registration 273 m.reflectTypeToType = nil 274 for k := range m.memoizedScanPlans { 275 delete(m.memoizedScanPlans, k) 276 } 277 for k := range m.memoizedEncodePlans { 278 delete(m.memoizedEncodePlans, k) 279 } 280 } 281 282 // TypeForOID returns the Type registered for the given OID. The returned Type must not be mutated. 283 func (m *Map) TypeForOID(oid uint32) (*Type, bool) { 284 if dt, ok := m.oidToType[oid]; ok { 285 return dt, true 286 } 287 288 dt, ok := defaultMap.oidToType[oid] 289 return dt, ok 290 } 291 292 // TypeForName returns the Type registered for the given name. The returned Type must not be mutated. 293 func (m *Map) TypeForName(name string) (*Type, bool) { 294 if dt, ok := m.nameToType[name]; ok { 295 return dt, true 296 } 297 dt, ok := defaultMap.nameToType[name] 298 return dt, ok 299 } 300 301 func (m *Map) buildReflectTypeToType() { 302 m.reflectTypeToType = make(map[reflect.Type]*Type) 303 304 for reflectType, name := range m.reflectTypeToName { 305 if dt, ok := m.TypeForName(name); ok { 306 m.reflectTypeToType[reflectType] = dt 307 } 308 } 309 } 310 311 // TypeForValue finds a data type suitable for v. Use RegisterType to register types that can encode and decode 312 // themselves. Use RegisterDefaultPgType to register that can be handled by a registered data type. The returned Type 313 // must not be mutated. 314 func (m *Map) TypeForValue(v any) (*Type, bool) { 315 if m.reflectTypeToType == nil { 316 m.buildReflectTypeToType() 317 } 318 319 if dt, ok := m.reflectTypeToType[reflect.TypeOf(v)]; ok { 320 return dt, true 321 } 322 323 dt, ok := defaultMap.reflectTypeToType[reflect.TypeOf(v)] 324 return dt, ok 325 } 326 327 // FormatCodeForOID returns the preferred format code for type oid. If the type is not registered it returns the text 328 // format code. 329 func (m *Map) FormatCodeForOID(oid uint32) int16 { 330 if fc, ok := m.oidToFormatCode[oid]; ok { 331 return fc 332 } 333 334 if fc, ok := defaultMap.oidToFormatCode[oid]; ok { 335 return fc 336 } 337 338 return TextFormatCode 339 } 340 341 // EncodePlan is a precompiled plan to encode a particular type into a particular OID and format. 342 type EncodePlan interface { 343 // Encode appends the encoded bytes of value to buf. If value is the SQL value NULL then append nothing and return 344 // (nil, nil). The caller of Encode is responsible for writing the correct NULL value or the length of the data 345 // written. 346 Encode(value any, buf []byte) (newBuf []byte, err error) 347 } 348 349 // ScanPlan is a precompiled plan to scan into a type of destination. 350 type ScanPlan interface { 351 // Scan scans src into target. src is only valid during the call to Scan. The ScanPlan must not retain a reference to 352 // src. 353 Scan(src []byte, target any) error 354 } 355 356 type scanPlanCodecSQLScanner struct { 357 c Codec 358 m *Map 359 oid uint32 360 formatCode int16 361 } 362 363 func (plan *scanPlanCodecSQLScanner) Scan(src []byte, dst any) error { 364 value, err := plan.c.DecodeDatabaseSQLValue(plan.m, plan.oid, plan.formatCode, src) 365 if err != nil { 366 return err 367 } 368 369 scanner := dst.(sql.Scanner) 370 return scanner.Scan(value) 371 } 372 373 type scanPlanSQLScanner struct { 374 formatCode int16 375 } 376 377 func (plan *scanPlanSQLScanner) Scan(src []byte, dst any) error { 378 scanner := dst.(sql.Scanner) 379 if src == nil { 380 // This is necessary because interface value []byte:nil does not equal nil:nil for the binary format path and the 381 // text format path would be converted to empty string. 382 return scanner.Scan(nil) 383 } else if plan.formatCode == BinaryFormatCode { 384 return scanner.Scan(src) 385 } else { 386 return scanner.Scan(string(src)) 387 } 388 } 389 390 type scanPlanString struct{} 391 392 func (scanPlanString) Scan(src []byte, dst any) error { 393 if src == nil { 394 return fmt.Errorf("cannot scan NULL into %T", dst) 395 } 396 397 p := (dst).(*string) 398 *p = string(src) 399 return nil 400 } 401 402 type scanPlanAnyTextToBytes struct{} 403 404 func (scanPlanAnyTextToBytes) Scan(src []byte, dst any) error { 405 dstBuf := dst.(*[]byte) 406 if src == nil { 407 *dstBuf = nil 408 return nil 409 } 410 411 *dstBuf = make([]byte, len(src)) 412 copy(*dstBuf, src) 413 return nil 414 } 415 416 type scanPlanFail struct { 417 m *Map 418 oid uint32 419 formatCode int16 420 } 421 422 func (plan *scanPlanFail) Scan(src []byte, dst any) error { 423 // If src is NULL it might be possible to scan into dst even though it is the types are not compatible. While this 424 // may seem to be a contrived case it can occur when selecting NULL directly. PostgreSQL assigns it the type of text. 425 // It would be surprising to the caller to have to cast the NULL (e.g. `select null::int`). So try to figure out a 426 // compatible data type for dst and scan with that. 427 // 428 // See https://github.com/jackc/pgx/issues/1326 429 if src == nil { 430 // As a horrible hack try all types to find anything that can scan into dst. 431 for oid := range plan.m.oidToType { 432 // using planScan instead of Scan or PlanScan to avoid polluting the planned scan cache. 433 plan := plan.m.planScan(oid, plan.formatCode, dst) 434 if _, ok := plan.(*scanPlanFail); !ok { 435 return plan.Scan(src, dst) 436 } 437 } 438 for oid := range defaultMap.oidToType { 439 if _, ok := plan.m.oidToType[oid]; !ok { 440 plan := plan.m.planScan(oid, plan.formatCode, dst) 441 if _, ok := plan.(*scanPlanFail); !ok { 442 return plan.Scan(src, dst) 443 } 444 } 445 } 446 } 447 448 var format string 449 switch plan.formatCode { 450 case TextFormatCode: 451 format = "text" 452 case BinaryFormatCode: 453 format = "binary" 454 default: 455 format = fmt.Sprintf("unknown %d", plan.formatCode) 456 } 457 458 var dataTypeName string 459 if t, ok := plan.m.TypeForOID(plan.oid); ok { 460 dataTypeName = t.Name 461 } else { 462 dataTypeName = "unknown type" 463 } 464 465 return fmt.Errorf("cannot scan %s (OID %d) in %v format into %T", dataTypeName, plan.oid, format, dst) 466 } 467 468 // TryWrapScanPlanFunc is a function that tries to create a wrapper plan for target. If successful it returns a plan 469 // that will convert the target passed to Scan and then call the next plan. nextTarget is target as it will be converted 470 // by plan. It must be used to find another suitable ScanPlan. When it is found SetNext must be called on plan for it 471 // to be usabled. ok indicates if a suitable wrapper was found. 472 type TryWrapScanPlanFunc func(target any) (plan WrappedScanPlanNextSetter, nextTarget any, ok bool) 473 474 type pointerPointerScanPlan struct { 475 dstType reflect.Type 476 next ScanPlan 477 } 478 479 func (plan *pointerPointerScanPlan) SetNext(next ScanPlan) { plan.next = next } 480 481 func (plan *pointerPointerScanPlan) Scan(src []byte, dst any) error { 482 el := reflect.ValueOf(dst).Elem() 483 if src == nil { 484 el.Set(reflect.Zero(el.Type())) 485 return nil 486 } 487 488 el.Set(reflect.New(el.Type().Elem())) 489 return plan.next.Scan(src, el.Interface()) 490 } 491 492 // TryPointerPointerScanPlan handles a pointer to a pointer by setting the target to nil for SQL NULL and allocating and 493 // scanning for non-NULL. 494 func TryPointerPointerScanPlan(target any) (plan WrappedScanPlanNextSetter, nextTarget any, ok bool) { 495 if dstValue := reflect.ValueOf(target); dstValue.Kind() == reflect.Ptr { 496 elemValue := dstValue.Elem() 497 if elemValue.Kind() == reflect.Ptr { 498 plan = &pointerPointerScanPlan{dstType: dstValue.Type()} 499 return plan, reflect.Zero(elemValue.Type()).Interface(), true 500 } 501 } 502 503 return nil, nil, false 504 } 505 506 // SkipUnderlyingTypePlanner prevents PlanScan and PlanDecode from trying to use the underlying type. 507 type SkipUnderlyingTypePlanner interface { 508 SkipUnderlyingTypePlan() 509 } 510 511 var elemKindToPointerTypes map[reflect.Kind]reflect.Type = map[reflect.Kind]reflect.Type{ 512 reflect.Int: reflect.TypeOf(new(int)), 513 reflect.Int8: reflect.TypeOf(new(int8)), 514 reflect.Int16: reflect.TypeOf(new(int16)), 515 reflect.Int32: reflect.TypeOf(new(int32)), 516 reflect.Int64: reflect.TypeOf(new(int64)), 517 reflect.Uint: reflect.TypeOf(new(uint)), 518 reflect.Uint8: reflect.TypeOf(new(uint8)), 519 reflect.Uint16: reflect.TypeOf(new(uint16)), 520 reflect.Uint32: reflect.TypeOf(new(uint32)), 521 reflect.Uint64: reflect.TypeOf(new(uint64)), 522 reflect.Float32: reflect.TypeOf(new(float32)), 523 reflect.Float64: reflect.TypeOf(new(float64)), 524 reflect.String: reflect.TypeOf(new(string)), 525 reflect.Bool: reflect.TypeOf(new(bool)), 526 } 527 528 type underlyingTypeScanPlan struct { 529 dstType reflect.Type 530 nextDstType reflect.Type 531 next ScanPlan 532 } 533 534 func (plan *underlyingTypeScanPlan) SetNext(next ScanPlan) { plan.next = next } 535 536 func (plan *underlyingTypeScanPlan) Scan(src []byte, dst any) error { 537 return plan.next.Scan(src, reflect.ValueOf(dst).Convert(plan.nextDstType).Interface()) 538 } 539 540 // TryFindUnderlyingTypeScanPlan tries to convert to a Go builtin type. e.g. If value was of type MyString and 541 // MyString was defined as a string then a wrapper plan would be returned that converts MyString to string. 542 func TryFindUnderlyingTypeScanPlan(dst any) (plan WrappedScanPlanNextSetter, nextDst any, ok bool) { 543 if _, ok := dst.(SkipUnderlyingTypePlanner); ok { 544 return nil, nil, false 545 } 546 547 dstValue := reflect.ValueOf(dst) 548 549 if dstValue.Kind() == reflect.Ptr { 550 var elemValue reflect.Value 551 if dstValue.IsNil() { 552 elemValue = reflect.New(dstValue.Type().Elem()).Elem() 553 } else { 554 elemValue = dstValue.Elem() 555 } 556 nextDstType := elemKindToPointerTypes[elemValue.Kind()] 557 if nextDstType == nil && elemValue.Kind() == reflect.Slice { 558 if elemValue.Type().Elem().Kind() == reflect.Uint8 { 559 var v *[]byte 560 nextDstType = reflect.TypeOf(v) 561 } 562 } 563 564 if nextDstType != nil && dstValue.Type() != nextDstType && dstValue.CanConvert(nextDstType) { 565 return &underlyingTypeScanPlan{dstType: dstValue.Type(), nextDstType: nextDstType}, dstValue.Convert(nextDstType).Interface(), true 566 } 567 568 } 569 570 return nil, nil, false 571 } 572 573 type WrappedScanPlanNextSetter interface { 574 SetNext(ScanPlan) 575 ScanPlan 576 } 577 578 // TryWrapBuiltinTypeScanPlan tries to wrap a builtin type with a wrapper that provides additional methods. e.g. If 579 // value was of type int32 then a wrapper plan would be returned that converts target to a value that implements 580 // Int64Scanner. 581 func TryWrapBuiltinTypeScanPlan(target any) (plan WrappedScanPlanNextSetter, nextDst any, ok bool) { 582 switch target := target.(type) { 583 case *int8: 584 return &wrapInt8ScanPlan{}, (*int8Wrapper)(target), true 585 case *int16: 586 return &wrapInt16ScanPlan{}, (*int16Wrapper)(target), true 587 case *int32: 588 return &wrapInt32ScanPlan{}, (*int32Wrapper)(target), true 589 case *int64: 590 return &wrapInt64ScanPlan{}, (*int64Wrapper)(target), true 591 case *int: 592 return &wrapIntScanPlan{}, (*intWrapper)(target), true 593 case *uint8: 594 return &wrapUint8ScanPlan{}, (*uint8Wrapper)(target), true 595 case *uint16: 596 return &wrapUint16ScanPlan{}, (*uint16Wrapper)(target), true 597 case *uint32: 598 return &wrapUint32ScanPlan{}, (*uint32Wrapper)(target), true 599 case *uint64: 600 return &wrapUint64ScanPlan{}, (*uint64Wrapper)(target), true 601 case *uint: 602 return &wrapUintScanPlan{}, (*uintWrapper)(target), true 603 case *float32: 604 return &wrapFloat32ScanPlan{}, (*float32Wrapper)(target), true 605 case *float64: 606 return &wrapFloat64ScanPlan{}, (*float64Wrapper)(target), true 607 case *string: 608 return &wrapStringScanPlan{}, (*stringWrapper)(target), true 609 case *time.Time: 610 return &wrapTimeScanPlan{}, (*timeWrapper)(target), true 611 case *time.Duration: 612 return &wrapDurationScanPlan{}, (*durationWrapper)(target), true 613 case *net.IPNet: 614 return &wrapNetIPNetScanPlan{}, (*netIPNetWrapper)(target), true 615 case *net.IP: 616 return &wrapNetIPScanPlan{}, (*netIPWrapper)(target), true 617 case *netip.Prefix: 618 return &wrapNetipPrefixScanPlan{}, (*netipPrefixWrapper)(target), true 619 case *netip.Addr: 620 return &wrapNetipAddrScanPlan{}, (*netipAddrWrapper)(target), true 621 case *map[string]*string: 622 return &wrapMapStringToPointerStringScanPlan{}, (*mapStringToPointerStringWrapper)(target), true 623 case *map[string]string: 624 return &wrapMapStringToStringScanPlan{}, (*mapStringToStringWrapper)(target), true 625 case *[16]byte: 626 return &wrapByte16ScanPlan{}, (*byte16Wrapper)(target), true 627 case *[]byte: 628 return &wrapByteSliceScanPlan{}, (*byteSliceWrapper)(target), true 629 } 630 631 return nil, nil, false 632 } 633 634 type wrapInt8ScanPlan struct { 635 next ScanPlan 636 } 637 638 func (plan *wrapInt8ScanPlan) SetNext(next ScanPlan) { plan.next = next } 639 640 func (plan *wrapInt8ScanPlan) Scan(src []byte, dst any) error { 641 return plan.next.Scan(src, (*int8Wrapper)(dst.(*int8))) 642 } 643 644 type wrapInt16ScanPlan struct { 645 next ScanPlan 646 } 647 648 func (plan *wrapInt16ScanPlan) SetNext(next ScanPlan) { plan.next = next } 649 650 func (plan *wrapInt16ScanPlan) Scan(src []byte, dst any) error { 651 return plan.next.Scan(src, (*int16Wrapper)(dst.(*int16))) 652 } 653 654 type wrapInt32ScanPlan struct { 655 next ScanPlan 656 } 657 658 func (plan *wrapInt32ScanPlan) SetNext(next ScanPlan) { plan.next = next } 659 660 func (plan *wrapInt32ScanPlan) Scan(src []byte, dst any) error { 661 return plan.next.Scan(src, (*int32Wrapper)(dst.(*int32))) 662 } 663 664 type wrapInt64ScanPlan struct { 665 next ScanPlan 666 } 667 668 func (plan *wrapInt64ScanPlan) SetNext(next ScanPlan) { plan.next = next } 669 670 func (plan *wrapInt64ScanPlan) Scan(src []byte, dst any) error { 671 return plan.next.Scan(src, (*int64Wrapper)(dst.(*int64))) 672 } 673 674 type wrapIntScanPlan struct { 675 next ScanPlan 676 } 677 678 func (plan *wrapIntScanPlan) SetNext(next ScanPlan) { plan.next = next } 679 680 func (plan *wrapIntScanPlan) Scan(src []byte, dst any) error { 681 return plan.next.Scan(src, (*intWrapper)(dst.(*int))) 682 } 683 684 type wrapUint8ScanPlan struct { 685 next ScanPlan 686 } 687 688 func (plan *wrapUint8ScanPlan) SetNext(next ScanPlan) { plan.next = next } 689 690 func (plan *wrapUint8ScanPlan) Scan(src []byte, dst any) error { 691 return plan.next.Scan(src, (*uint8Wrapper)(dst.(*uint8))) 692 } 693 694 type wrapUint16ScanPlan struct { 695 next ScanPlan 696 } 697 698 func (plan *wrapUint16ScanPlan) SetNext(next ScanPlan) { plan.next = next } 699 700 func (plan *wrapUint16ScanPlan) Scan(src []byte, dst any) error { 701 return plan.next.Scan(src, (*uint16Wrapper)(dst.(*uint16))) 702 } 703 704 type wrapUint32ScanPlan struct { 705 next ScanPlan 706 } 707 708 func (plan *wrapUint32ScanPlan) SetNext(next ScanPlan) { plan.next = next } 709 710 func (plan *wrapUint32ScanPlan) Scan(src []byte, dst any) error { 711 return plan.next.Scan(src, (*uint32Wrapper)(dst.(*uint32))) 712 } 713 714 type wrapUint64ScanPlan struct { 715 next ScanPlan 716 } 717 718 func (plan *wrapUint64ScanPlan) SetNext(next ScanPlan) { plan.next = next } 719 720 func (plan *wrapUint64ScanPlan) Scan(src []byte, dst any) error { 721 return plan.next.Scan(src, (*uint64Wrapper)(dst.(*uint64))) 722 } 723 724 type wrapUintScanPlan struct { 725 next ScanPlan 726 } 727 728 func (plan *wrapUintScanPlan) SetNext(next ScanPlan) { plan.next = next } 729 730 func (plan *wrapUintScanPlan) Scan(src []byte, dst any) error { 731 return plan.next.Scan(src, (*uintWrapper)(dst.(*uint))) 732 } 733 734 type wrapFloat32ScanPlan struct { 735 next ScanPlan 736 } 737 738 func (plan *wrapFloat32ScanPlan) SetNext(next ScanPlan) { plan.next = next } 739 740 func (plan *wrapFloat32ScanPlan) Scan(src []byte, dst any) error { 741 return plan.next.Scan(src, (*float32Wrapper)(dst.(*float32))) 742 } 743 744 type wrapFloat64ScanPlan struct { 745 next ScanPlan 746 } 747 748 func (plan *wrapFloat64ScanPlan) SetNext(next ScanPlan) { plan.next = next } 749 750 func (plan *wrapFloat64ScanPlan) Scan(src []byte, dst any) error { 751 return plan.next.Scan(src, (*float64Wrapper)(dst.(*float64))) 752 } 753 754 type wrapStringScanPlan struct { 755 next ScanPlan 756 } 757 758 func (plan *wrapStringScanPlan) SetNext(next ScanPlan) { plan.next = next } 759 760 func (plan *wrapStringScanPlan) Scan(src []byte, dst any) error { 761 return plan.next.Scan(src, (*stringWrapper)(dst.(*string))) 762 } 763 764 type wrapTimeScanPlan struct { 765 next ScanPlan 766 } 767 768 func (plan *wrapTimeScanPlan) SetNext(next ScanPlan) { plan.next = next } 769 770 func (plan *wrapTimeScanPlan) Scan(src []byte, dst any) error { 771 return plan.next.Scan(src, (*timeWrapper)(dst.(*time.Time))) 772 } 773 774 type wrapDurationScanPlan struct { 775 next ScanPlan 776 } 777 778 func (plan *wrapDurationScanPlan) SetNext(next ScanPlan) { plan.next = next } 779 780 func (plan *wrapDurationScanPlan) Scan(src []byte, dst any) error { 781 return plan.next.Scan(src, (*durationWrapper)(dst.(*time.Duration))) 782 } 783 784 type wrapNetIPNetScanPlan struct { 785 next ScanPlan 786 } 787 788 func (plan *wrapNetIPNetScanPlan) SetNext(next ScanPlan) { plan.next = next } 789 790 func (plan *wrapNetIPNetScanPlan) Scan(src []byte, dst any) error { 791 return plan.next.Scan(src, (*netIPNetWrapper)(dst.(*net.IPNet))) 792 } 793 794 type wrapNetIPScanPlan struct { 795 next ScanPlan 796 } 797 798 func (plan *wrapNetIPScanPlan) SetNext(next ScanPlan) { plan.next = next } 799 800 func (plan *wrapNetIPScanPlan) Scan(src []byte, dst any) error { 801 return plan.next.Scan(src, (*netIPWrapper)(dst.(*net.IP))) 802 } 803 804 type wrapNetipPrefixScanPlan struct { 805 next ScanPlan 806 } 807 808 func (plan *wrapNetipPrefixScanPlan) SetNext(next ScanPlan) { plan.next = next } 809 810 func (plan *wrapNetipPrefixScanPlan) Scan(src []byte, dst any) error { 811 return plan.next.Scan(src, (*netipPrefixWrapper)(dst.(*netip.Prefix))) 812 } 813 814 type wrapNetipAddrScanPlan struct { 815 next ScanPlan 816 } 817 818 func (plan *wrapNetipAddrScanPlan) SetNext(next ScanPlan) { plan.next = next } 819 820 func (plan *wrapNetipAddrScanPlan) Scan(src []byte, dst any) error { 821 return plan.next.Scan(src, (*netipAddrWrapper)(dst.(*netip.Addr))) 822 } 823 824 type wrapMapStringToPointerStringScanPlan struct { 825 next ScanPlan 826 } 827 828 func (plan *wrapMapStringToPointerStringScanPlan) SetNext(next ScanPlan) { plan.next = next } 829 830 func (plan *wrapMapStringToPointerStringScanPlan) Scan(src []byte, dst any) error { 831 return plan.next.Scan(src, (*mapStringToPointerStringWrapper)(dst.(*map[string]*string))) 832 } 833 834 type wrapMapStringToStringScanPlan struct { 835 next ScanPlan 836 } 837 838 func (plan *wrapMapStringToStringScanPlan) SetNext(next ScanPlan) { plan.next = next } 839 840 func (plan *wrapMapStringToStringScanPlan) Scan(src []byte, dst any) error { 841 return plan.next.Scan(src, (*mapStringToStringWrapper)(dst.(*map[string]string))) 842 } 843 844 type wrapByte16ScanPlan struct { 845 next ScanPlan 846 } 847 848 func (plan *wrapByte16ScanPlan) SetNext(next ScanPlan) { plan.next = next } 849 850 func (plan *wrapByte16ScanPlan) Scan(src []byte, dst any) error { 851 return plan.next.Scan(src, (*byte16Wrapper)(dst.(*[16]byte))) 852 } 853 854 type wrapByteSliceScanPlan struct { 855 next ScanPlan 856 } 857 858 func (plan *wrapByteSliceScanPlan) SetNext(next ScanPlan) { plan.next = next } 859 860 func (plan *wrapByteSliceScanPlan) Scan(src []byte, dst any) error { 861 return plan.next.Scan(src, (*byteSliceWrapper)(dst.(*[]byte))) 862 } 863 864 type pointerEmptyInterfaceScanPlan struct { 865 codec Codec 866 m *Map 867 oid uint32 868 formatCode int16 869 } 870 871 func (plan *pointerEmptyInterfaceScanPlan) Scan(src []byte, dst any) error { 872 value, err := plan.codec.DecodeValue(plan.m, plan.oid, plan.formatCode, src) 873 if err != nil { 874 return err 875 } 876 877 ptrAny := dst.(*any) 878 *ptrAny = value 879 880 return nil 881 } 882 883 // TryWrapStructPlan tries to wrap a struct with a wrapper that implements CompositeIndexGetter. 884 func TryWrapStructScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) { 885 targetValue := reflect.ValueOf(target) 886 if targetValue.Kind() != reflect.Ptr { 887 return nil, nil, false 888 } 889 890 var targetElemValue reflect.Value 891 if targetValue.IsNil() { 892 targetElemValue = reflect.Zero(targetValue.Type().Elem()) 893 } else { 894 targetElemValue = targetValue.Elem() 895 } 896 targetElemType := targetElemValue.Type() 897 898 if targetElemType.Kind() == reflect.Struct { 899 exportedFields := getExportedFieldValues(targetElemValue) 900 if len(exportedFields) == 0 { 901 return nil, nil, false 902 } 903 904 w := ptrStructWrapper{ 905 s: target, 906 exportedFields: exportedFields, 907 } 908 return &wrapAnyPtrStructScanPlan{}, &w, true 909 } 910 911 return nil, nil, false 912 } 913 914 type wrapAnyPtrStructScanPlan struct { 915 next ScanPlan 916 } 917 918 func (plan *wrapAnyPtrStructScanPlan) SetNext(next ScanPlan) { plan.next = next } 919 920 func (plan *wrapAnyPtrStructScanPlan) Scan(src []byte, target any) error { 921 w := ptrStructWrapper{ 922 s: target, 923 exportedFields: getExportedFieldValues(reflect.ValueOf(target).Elem()), 924 } 925 926 return plan.next.Scan(src, &w) 927 } 928 929 // TryWrapPtrSliceScanPlan tries to wrap a pointer to a single dimension slice. 930 func TryWrapPtrSliceScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) { 931 // Avoid using reflect path for common types. 932 switch target := target.(type) { 933 case *[]int16: 934 return &wrapPtrSliceScanPlan[int16]{}, (*FlatArray[int16])(target), true 935 case *[]int32: 936 return &wrapPtrSliceScanPlan[int32]{}, (*FlatArray[int32])(target), true 937 case *[]int64: 938 return &wrapPtrSliceScanPlan[int64]{}, (*FlatArray[int64])(target), true 939 case *[]float32: 940 return &wrapPtrSliceScanPlan[float32]{}, (*FlatArray[float32])(target), true 941 case *[]float64: 942 return &wrapPtrSliceScanPlan[float64]{}, (*FlatArray[float64])(target), true 943 case *[]string: 944 return &wrapPtrSliceScanPlan[string]{}, (*FlatArray[string])(target), true 945 case *[]time.Time: 946 return &wrapPtrSliceScanPlan[time.Time]{}, (*FlatArray[time.Time])(target), true 947 } 948 949 targetType := reflect.TypeOf(target) 950 if targetType.Kind() != reflect.Ptr { 951 return nil, nil, false 952 } 953 954 targetElemType := targetType.Elem() 955 956 if targetElemType.Kind() == reflect.Slice { 957 slice := reflect.New(targetElemType).Elem() 958 return &wrapPtrSliceReflectScanPlan{}, &anySliceArrayReflect{slice: slice}, true 959 } 960 return nil, nil, false 961 } 962 963 type wrapPtrSliceScanPlan[T any] struct { 964 next ScanPlan 965 } 966 967 func (plan *wrapPtrSliceScanPlan[T]) SetNext(next ScanPlan) { plan.next = next } 968 969 func (plan *wrapPtrSliceScanPlan[T]) Scan(src []byte, target any) error { 970 return plan.next.Scan(src, (*FlatArray[T])(target.(*[]T))) 971 } 972 973 type wrapPtrSliceReflectScanPlan struct { 974 next ScanPlan 975 } 976 977 func (plan *wrapPtrSliceReflectScanPlan) SetNext(next ScanPlan) { plan.next = next } 978 979 func (plan *wrapPtrSliceReflectScanPlan) Scan(src []byte, target any) error { 980 return plan.next.Scan(src, &anySliceArrayReflect{slice: reflect.ValueOf(target).Elem()}) 981 } 982 983 // TryWrapPtrMultiDimSliceScanPlan tries to wrap a pointer to a multi-dimension slice. 984 func TryWrapPtrMultiDimSliceScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) { 985 targetValue := reflect.ValueOf(target) 986 if targetValue.Kind() != reflect.Ptr { 987 return nil, nil, false 988 } 989 990 targetElemValue := targetValue.Elem() 991 992 if targetElemValue.Kind() == reflect.Slice { 993 elemElemKind := targetElemValue.Type().Elem().Kind() 994 if elemElemKind == reflect.Slice { 995 if !isRagged(targetElemValue) { 996 return &wrapPtrMultiDimSliceScanPlan{}, &anyMultiDimSliceArray{slice: targetValue.Elem()}, true 997 } 998 } 999 } 1000 1001 return nil, nil, false 1002 } 1003 1004 type wrapPtrMultiDimSliceScanPlan struct { 1005 next ScanPlan 1006 } 1007 1008 func (plan *wrapPtrMultiDimSliceScanPlan) SetNext(next ScanPlan) { plan.next = next } 1009 1010 func (plan *wrapPtrMultiDimSliceScanPlan) Scan(src []byte, target any) error { 1011 return plan.next.Scan(src, &anyMultiDimSliceArray{slice: reflect.ValueOf(target).Elem()}) 1012 } 1013 1014 // TryWrapPtrArrayScanPlan tries to wrap a pointer to a single dimension array. 1015 func TryWrapPtrArrayScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) { 1016 targetValue := reflect.ValueOf(target) 1017 if targetValue.Kind() != reflect.Ptr { 1018 return nil, nil, false 1019 } 1020 1021 targetElemValue := targetValue.Elem() 1022 1023 if targetElemValue.Kind() == reflect.Array { 1024 return &wrapPtrArrayReflectScanPlan{}, &anyArrayArrayReflect{array: targetElemValue}, true 1025 } 1026 return nil, nil, false 1027 } 1028 1029 type wrapPtrArrayReflectScanPlan struct { 1030 next ScanPlan 1031 } 1032 1033 func (plan *wrapPtrArrayReflectScanPlan) SetNext(next ScanPlan) { plan.next = next } 1034 1035 func (plan *wrapPtrArrayReflectScanPlan) Scan(src []byte, target any) error { 1036 return plan.next.Scan(src, &anyArrayArrayReflect{array: reflect.ValueOf(target).Elem()}) 1037 } 1038 1039 // PlanScan prepares a plan to scan a value into target. 1040 func (m *Map) PlanScan(oid uint32, formatCode int16, target any) ScanPlan { 1041 oidMemo := m.memoizedScanPlans[oid] 1042 if oidMemo == nil { 1043 oidMemo = make(map[reflect.Type][2]ScanPlan) 1044 m.memoizedScanPlans[oid] = oidMemo 1045 } 1046 targetReflectType := reflect.TypeOf(target) 1047 typeMemo := oidMemo[targetReflectType] 1048 plan := typeMemo[formatCode] 1049 if plan == nil { 1050 plan = m.planScan(oid, formatCode, target) 1051 typeMemo[formatCode] = plan 1052 oidMemo[targetReflectType] = typeMemo 1053 } 1054 1055 return plan 1056 } 1057 1058 func (m *Map) planScan(oid uint32, formatCode int16, target any) ScanPlan { 1059 if target == nil { 1060 return &scanPlanFail{m: m, oid: oid, formatCode: formatCode} 1061 } 1062 1063 if _, ok := target.(*UndecodedBytes); ok { 1064 return scanPlanAnyToUndecodedBytes{} 1065 } 1066 1067 switch formatCode { 1068 case BinaryFormatCode: 1069 switch target.(type) { 1070 case *string: 1071 switch oid { 1072 case TextOID, VarcharOID: 1073 return scanPlanString{} 1074 } 1075 } 1076 case TextFormatCode: 1077 switch target.(type) { 1078 case *string: 1079 return scanPlanString{} 1080 case *[]byte: 1081 if oid != ByteaOID { 1082 return scanPlanAnyTextToBytes{} 1083 } 1084 case TextScanner: 1085 return scanPlanTextAnyToTextScanner{} 1086 } 1087 } 1088 1089 var dt *Type 1090 1091 if dataType, ok := m.TypeForOID(oid); ok { 1092 dt = dataType 1093 } else if dataType, ok := m.TypeForValue(target); ok { 1094 dt = dataType 1095 oid = dt.OID // Preserve assumed OID in case we are recursively called below. 1096 } 1097 1098 if dt != nil { 1099 if plan := dt.Codec.PlanScan(m, oid, formatCode, target); plan != nil { 1100 return plan 1101 } 1102 } 1103 1104 // This needs to happen before trying m.TryWrapScanPlanFuncs. Otherwise, a sql.Scanner would not get called if it was 1105 // defined on a type that could be unwrapped such as `type myString string`. 1106 // 1107 // https://github.com/jackc/pgtype/issues/197 1108 if _, ok := target.(sql.Scanner); ok { 1109 if dt == nil { 1110 return &scanPlanSQLScanner{formatCode: formatCode} 1111 } else { 1112 return &scanPlanCodecSQLScanner{c: dt.Codec, m: m, oid: oid, formatCode: formatCode} 1113 } 1114 } 1115 1116 for _, f := range m.TryWrapScanPlanFuncs { 1117 if wrapperPlan, nextDst, ok := f(target); ok { 1118 if nextPlan := m.planScan(oid, formatCode, nextDst); nextPlan != nil { 1119 if _, failed := nextPlan.(*scanPlanFail); !failed { 1120 wrapperPlan.SetNext(nextPlan) 1121 return wrapperPlan 1122 } 1123 } 1124 } 1125 } 1126 1127 if dt != nil { 1128 if _, ok := target.(*any); ok { 1129 return &pointerEmptyInterfaceScanPlan{codec: dt.Codec, m: m, oid: oid, formatCode: formatCode} 1130 } 1131 } 1132 1133 return &scanPlanFail{m: m, oid: oid, formatCode: formatCode} 1134 } 1135 1136 func (m *Map) Scan(oid uint32, formatCode int16, src []byte, dst any) error { 1137 if dst == nil { 1138 return nil 1139 } 1140 1141 plan := m.PlanScan(oid, formatCode, dst) 1142 return plan.Scan(src, dst) 1143 } 1144 1145 var ErrScanTargetTypeChanged = errors.New("scan target type changed") 1146 1147 func codecScan(codec Codec, m *Map, oid uint32, format int16, src []byte, dst any) error { 1148 scanPlan := codec.PlanScan(m, oid, format, dst) 1149 if scanPlan == nil { 1150 return fmt.Errorf("PlanScan did not find a plan") 1151 } 1152 return scanPlan.Scan(src, dst) 1153 } 1154 1155 func codecDecodeToTextFormat(codec Codec, m *Map, oid uint32, format int16, src []byte) (driver.Value, error) { 1156 if src == nil { 1157 return nil, nil 1158 } 1159 1160 if format == TextFormatCode { 1161 return string(src), nil 1162 } else { 1163 value, err := codec.DecodeValue(m, oid, format, src) 1164 if err != nil { 1165 return nil, err 1166 } 1167 buf, err := m.Encode(oid, TextFormatCode, value, nil) 1168 if err != nil { 1169 return nil, err 1170 } 1171 return string(buf), nil 1172 } 1173 } 1174 1175 // PlanEncode returns an Encode plan for encoding value into PostgreSQL format for oid and format. If no plan can be 1176 // found then nil is returned. 1177 func (m *Map) PlanEncode(oid uint32, format int16, value any) EncodePlan { 1178 oidMemo := m.memoizedEncodePlans[oid] 1179 if oidMemo == nil { 1180 oidMemo = make(map[reflect.Type][2]EncodePlan) 1181 m.memoizedEncodePlans[oid] = oidMemo 1182 } 1183 targetReflectType := reflect.TypeOf(value) 1184 typeMemo := oidMemo[targetReflectType] 1185 plan := typeMemo[format] 1186 if plan == nil { 1187 plan = m.planEncode(oid, format, value) 1188 typeMemo[format] = plan 1189 oidMemo[targetReflectType] = typeMemo 1190 } 1191 1192 return plan 1193 } 1194 1195 func (m *Map) planEncode(oid uint32, format int16, value any) EncodePlan { 1196 if format == TextFormatCode { 1197 switch value.(type) { 1198 case string: 1199 return encodePlanStringToAnyTextFormat{} 1200 case TextValuer: 1201 return encodePlanTextValuerToAnyTextFormat{} 1202 } 1203 } 1204 1205 var dt *Type 1206 if dataType, ok := m.TypeForOID(oid); ok { 1207 dt = dataType 1208 } else { 1209 // If no type for the OID was found, then either it is unknowable (e.g. the simple protocol) or it is an 1210 // unregistered type. In either case try to find the type and OID that matches the value (e.g. a []byte would be 1211 // registered to PostgreSQL bytea). 1212 if dataType, ok := m.TypeForValue(value); ok { 1213 dt = dataType 1214 oid = dt.OID // Preserve assumed OID in case we are recursively called below. 1215 } 1216 } 1217 1218 if dt != nil { 1219 if plan := dt.Codec.PlanEncode(m, oid, format, value); plan != nil { 1220 return plan 1221 } 1222 } 1223 1224 for _, f := range m.TryWrapEncodePlanFuncs { 1225 if wrapperPlan, nextValue, ok := f(value); ok { 1226 if nextPlan := m.PlanEncode(oid, format, nextValue); nextPlan != nil { 1227 wrapperPlan.SetNext(nextPlan) 1228 return wrapperPlan 1229 } 1230 } 1231 } 1232 1233 if _, ok := value.(driver.Valuer); ok { 1234 return &encodePlanDriverValuer{m: m, oid: oid, formatCode: format} 1235 } 1236 1237 return nil 1238 } 1239 1240 type encodePlanStringToAnyTextFormat struct{} 1241 1242 func (encodePlanStringToAnyTextFormat) Encode(value any, buf []byte) (newBuf []byte, err error) { 1243 s := value.(string) 1244 return append(buf, s...), nil 1245 } 1246 1247 type encodePlanTextValuerToAnyTextFormat struct{} 1248 1249 func (encodePlanTextValuerToAnyTextFormat) Encode(value any, buf []byte) (newBuf []byte, err error) { 1250 t, err := value.(TextValuer).TextValue() 1251 if err != nil { 1252 return nil, err 1253 } 1254 if !t.Valid { 1255 return nil, nil 1256 } 1257 1258 return append(buf, t.String...), nil 1259 } 1260 1261 type encodePlanDriverValuer struct { 1262 m *Map 1263 oid uint32 1264 formatCode int16 1265 } 1266 1267 func (plan *encodePlanDriverValuer) Encode(value any, buf []byte) (newBuf []byte, err error) { 1268 dv := value.(driver.Valuer) 1269 if dv == nil { 1270 return nil, nil 1271 } 1272 v, err := dv.Value() 1273 if err != nil { 1274 return nil, err 1275 } 1276 if v == nil { 1277 return nil, nil 1278 } 1279 1280 newBuf, err = plan.m.Encode(plan.oid, plan.formatCode, v, buf) 1281 if err == nil { 1282 return newBuf, nil 1283 } 1284 1285 s, ok := v.(string) 1286 if !ok { 1287 return nil, err 1288 } 1289 1290 var scannedValue any 1291 scanErr := plan.m.Scan(plan.oid, TextFormatCode, []byte(s), &scannedValue) 1292 if scanErr != nil { 1293 return nil, err 1294 } 1295 1296 // Prevent infinite loop. We can't encode this. See https://github.com/jackc/pgx/issues/1331. 1297 if reflect.TypeOf(value) == reflect.TypeOf(scannedValue) { 1298 return nil, fmt.Errorf("tried to encode %v via encoding to text and scanning but failed due to receiving same type back", value) 1299 } 1300 1301 var err2 error 1302 newBuf, err2 = plan.m.Encode(plan.oid, BinaryFormatCode, scannedValue, buf) 1303 if err2 != nil { 1304 return nil, err 1305 } 1306 1307 return newBuf, nil 1308 } 1309 1310 // TryWrapEncodePlanFunc is a function that tries to create a wrapper plan for value. If successful it returns a plan 1311 // that will convert the value passed to Encode and then call the next plan. nextValue is value as it will be converted 1312 // by plan. It must be used to find another suitable EncodePlan. When it is found SetNext must be called on plan for it 1313 // to be usabled. ok indicates if a suitable wrapper was found. 1314 type TryWrapEncodePlanFunc func(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) 1315 1316 type derefPointerEncodePlan struct { 1317 next EncodePlan 1318 } 1319 1320 func (plan *derefPointerEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1321 1322 func (plan *derefPointerEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1323 ptr := reflect.ValueOf(value) 1324 1325 if ptr.IsNil() { 1326 return nil, nil 1327 } 1328 1329 return plan.next.Encode(ptr.Elem().Interface(), buf) 1330 } 1331 1332 // TryWrapDerefPointerEncodePlan tries to dereference a pointer. e.g. If value was of type *string then a wrapper plan 1333 // would be returned that derefences the value. 1334 func TryWrapDerefPointerEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1335 if _, ok := value.(driver.Valuer); ok { 1336 return nil, nil, false 1337 } 1338 1339 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Ptr { 1340 return &derefPointerEncodePlan{}, reflect.New(valueType.Elem()).Elem().Interface(), true 1341 } 1342 1343 return nil, nil, false 1344 } 1345 1346 var kindToTypes map[reflect.Kind]reflect.Type = map[reflect.Kind]reflect.Type{ 1347 reflect.Int: reflect.TypeOf(int(0)), 1348 reflect.Int8: reflect.TypeOf(int8(0)), 1349 reflect.Int16: reflect.TypeOf(int16(0)), 1350 reflect.Int32: reflect.TypeOf(int32(0)), 1351 reflect.Int64: reflect.TypeOf(int64(0)), 1352 reflect.Uint: reflect.TypeOf(uint(0)), 1353 reflect.Uint8: reflect.TypeOf(uint8(0)), 1354 reflect.Uint16: reflect.TypeOf(uint16(0)), 1355 reflect.Uint32: reflect.TypeOf(uint32(0)), 1356 reflect.Uint64: reflect.TypeOf(uint64(0)), 1357 reflect.Float32: reflect.TypeOf(float32(0)), 1358 reflect.Float64: reflect.TypeOf(float64(0)), 1359 reflect.String: reflect.TypeOf(""), 1360 reflect.Bool: reflect.TypeOf(false), 1361 } 1362 1363 var byteSliceType = reflect.TypeOf([]byte{}) 1364 1365 type underlyingTypeEncodePlan struct { 1366 nextValueType reflect.Type 1367 next EncodePlan 1368 } 1369 1370 func (plan *underlyingTypeEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1371 1372 func (plan *underlyingTypeEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1373 return plan.next.Encode(reflect.ValueOf(value).Convert(plan.nextValueType).Interface(), buf) 1374 } 1375 1376 // TryWrapFindUnderlyingTypeEncodePlan tries to convert to a Go builtin type. e.g. If value was of type MyString and 1377 // MyString was defined as a string then a wrapper plan would be returned that converts MyString to string. 1378 func TryWrapFindUnderlyingTypeEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1379 if value == nil { 1380 return nil, nil, false 1381 } 1382 1383 if _, ok := value.(driver.Valuer); ok { 1384 return nil, nil, false 1385 } 1386 1387 if _, ok := value.(SkipUnderlyingTypePlanner); ok { 1388 return nil, nil, false 1389 } 1390 1391 refValue := reflect.ValueOf(value) 1392 1393 nextValueType := kindToTypes[refValue.Kind()] 1394 if nextValueType != nil && refValue.Type() != nextValueType { 1395 return &underlyingTypeEncodePlan{nextValueType: nextValueType}, refValue.Convert(nextValueType).Interface(), true 1396 } 1397 1398 // []byte is a special case. It is a slice but we treat it as a scalar type. In the case of a named type like 1399 // json.RawMessage which is defined as []byte the underlying type should be considered as []byte. But any other slice 1400 // does not have a special underlying type. 1401 // 1402 // https://github.com/jackc/pgx/issues/1763 1403 if refValue.Type() != byteSliceType && refValue.Type().AssignableTo(byteSliceType) { 1404 return &underlyingTypeEncodePlan{nextValueType: byteSliceType}, refValue.Convert(byteSliceType).Interface(), true 1405 } 1406 1407 return nil, nil, false 1408 } 1409 1410 type WrappedEncodePlanNextSetter interface { 1411 SetNext(EncodePlan) 1412 EncodePlan 1413 } 1414 1415 // TryWrapBuiltinTypeEncodePlan tries to wrap a builtin type with a wrapper that provides additional methods. e.g. If 1416 // value was of type int32 then a wrapper plan would be returned that converts value to a type that implements 1417 // Int64Valuer. 1418 func TryWrapBuiltinTypeEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1419 if _, ok := value.(driver.Valuer); ok { 1420 return nil, nil, false 1421 } 1422 1423 switch value := value.(type) { 1424 case int8: 1425 return &wrapInt8EncodePlan{}, int8Wrapper(value), true 1426 case int16: 1427 return &wrapInt16EncodePlan{}, int16Wrapper(value), true 1428 case int32: 1429 return &wrapInt32EncodePlan{}, int32Wrapper(value), true 1430 case int64: 1431 return &wrapInt64EncodePlan{}, int64Wrapper(value), true 1432 case int: 1433 return &wrapIntEncodePlan{}, intWrapper(value), true 1434 case uint8: 1435 return &wrapUint8EncodePlan{}, uint8Wrapper(value), true 1436 case uint16: 1437 return &wrapUint16EncodePlan{}, uint16Wrapper(value), true 1438 case uint32: 1439 return &wrapUint32EncodePlan{}, uint32Wrapper(value), true 1440 case uint64: 1441 return &wrapUint64EncodePlan{}, uint64Wrapper(value), true 1442 case uint: 1443 return &wrapUintEncodePlan{}, uintWrapper(value), true 1444 case float32: 1445 return &wrapFloat32EncodePlan{}, float32Wrapper(value), true 1446 case float64: 1447 return &wrapFloat64EncodePlan{}, float64Wrapper(value), true 1448 case string: 1449 return &wrapStringEncodePlan{}, stringWrapper(value), true 1450 case time.Time: 1451 return &wrapTimeEncodePlan{}, timeWrapper(value), true 1452 case time.Duration: 1453 return &wrapDurationEncodePlan{}, durationWrapper(value), true 1454 case net.IPNet: 1455 return &wrapNetIPNetEncodePlan{}, netIPNetWrapper(value), true 1456 case net.IP: 1457 return &wrapNetIPEncodePlan{}, netIPWrapper(value), true 1458 case netip.Prefix: 1459 return &wrapNetipPrefixEncodePlan{}, netipPrefixWrapper(value), true 1460 case netip.Addr: 1461 return &wrapNetipAddrEncodePlan{}, netipAddrWrapper(value), true 1462 case map[string]*string: 1463 return &wrapMapStringToPointerStringEncodePlan{}, mapStringToPointerStringWrapper(value), true 1464 case map[string]string: 1465 return &wrapMapStringToStringEncodePlan{}, mapStringToStringWrapper(value), true 1466 case [16]byte: 1467 return &wrapByte16EncodePlan{}, byte16Wrapper(value), true 1468 case []byte: 1469 return &wrapByteSliceEncodePlan{}, byteSliceWrapper(value), true 1470 case fmt.Stringer: 1471 return &wrapFmtStringerEncodePlan{}, fmtStringerWrapper{value}, true 1472 } 1473 1474 return nil, nil, false 1475 } 1476 1477 type wrapInt8EncodePlan struct { 1478 next EncodePlan 1479 } 1480 1481 func (plan *wrapInt8EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1482 1483 func (plan *wrapInt8EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1484 return plan.next.Encode(int8Wrapper(value.(int8)), buf) 1485 } 1486 1487 type wrapInt16EncodePlan struct { 1488 next EncodePlan 1489 } 1490 1491 func (plan *wrapInt16EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1492 1493 func (plan *wrapInt16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1494 return plan.next.Encode(int16Wrapper(value.(int16)), buf) 1495 } 1496 1497 type wrapInt32EncodePlan struct { 1498 next EncodePlan 1499 } 1500 1501 func (plan *wrapInt32EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1502 1503 func (plan *wrapInt32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1504 return plan.next.Encode(int32Wrapper(value.(int32)), buf) 1505 } 1506 1507 type wrapInt64EncodePlan struct { 1508 next EncodePlan 1509 } 1510 1511 func (plan *wrapInt64EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1512 1513 func (plan *wrapInt64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1514 return plan.next.Encode(int64Wrapper(value.(int64)), buf) 1515 } 1516 1517 type wrapIntEncodePlan struct { 1518 next EncodePlan 1519 } 1520 1521 func (plan *wrapIntEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1522 1523 func (plan *wrapIntEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1524 return plan.next.Encode(intWrapper(value.(int)), buf) 1525 } 1526 1527 type wrapUint8EncodePlan struct { 1528 next EncodePlan 1529 } 1530 1531 func (plan *wrapUint8EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1532 1533 func (plan *wrapUint8EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1534 return plan.next.Encode(uint8Wrapper(value.(uint8)), buf) 1535 } 1536 1537 type wrapUint16EncodePlan struct { 1538 next EncodePlan 1539 } 1540 1541 func (plan *wrapUint16EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1542 1543 func (plan *wrapUint16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1544 return plan.next.Encode(uint16Wrapper(value.(uint16)), buf) 1545 } 1546 1547 type wrapUint32EncodePlan struct { 1548 next EncodePlan 1549 } 1550 1551 func (plan *wrapUint32EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1552 1553 func (plan *wrapUint32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1554 return plan.next.Encode(uint32Wrapper(value.(uint32)), buf) 1555 } 1556 1557 type wrapUint64EncodePlan struct { 1558 next EncodePlan 1559 } 1560 1561 func (plan *wrapUint64EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1562 1563 func (plan *wrapUint64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1564 return plan.next.Encode(uint64Wrapper(value.(uint64)), buf) 1565 } 1566 1567 type wrapUintEncodePlan struct { 1568 next EncodePlan 1569 } 1570 1571 func (plan *wrapUintEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1572 1573 func (plan *wrapUintEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1574 return plan.next.Encode(uintWrapper(value.(uint)), buf) 1575 } 1576 1577 type wrapFloat32EncodePlan struct { 1578 next EncodePlan 1579 } 1580 1581 func (plan *wrapFloat32EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1582 1583 func (plan *wrapFloat32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1584 return plan.next.Encode(float32Wrapper(value.(float32)), buf) 1585 } 1586 1587 type wrapFloat64EncodePlan struct { 1588 next EncodePlan 1589 } 1590 1591 func (plan *wrapFloat64EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1592 1593 func (plan *wrapFloat64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1594 return plan.next.Encode(float64Wrapper(value.(float64)), buf) 1595 } 1596 1597 type wrapStringEncodePlan struct { 1598 next EncodePlan 1599 } 1600 1601 func (plan *wrapStringEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1602 1603 func (plan *wrapStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1604 return plan.next.Encode(stringWrapper(value.(string)), buf) 1605 } 1606 1607 type wrapTimeEncodePlan struct { 1608 next EncodePlan 1609 } 1610 1611 func (plan *wrapTimeEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1612 1613 func (plan *wrapTimeEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1614 return plan.next.Encode(timeWrapper(value.(time.Time)), buf) 1615 } 1616 1617 type wrapDurationEncodePlan struct { 1618 next EncodePlan 1619 } 1620 1621 func (plan *wrapDurationEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1622 1623 func (plan *wrapDurationEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1624 return plan.next.Encode(durationWrapper(value.(time.Duration)), buf) 1625 } 1626 1627 type wrapNetIPNetEncodePlan struct { 1628 next EncodePlan 1629 } 1630 1631 func (plan *wrapNetIPNetEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1632 1633 func (plan *wrapNetIPNetEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1634 return plan.next.Encode(netIPNetWrapper(value.(net.IPNet)), buf) 1635 } 1636 1637 type wrapNetIPEncodePlan struct { 1638 next EncodePlan 1639 } 1640 1641 func (plan *wrapNetIPEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1642 1643 func (plan *wrapNetIPEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1644 return plan.next.Encode(netIPWrapper(value.(net.IP)), buf) 1645 } 1646 1647 type wrapNetipPrefixEncodePlan struct { 1648 next EncodePlan 1649 } 1650 1651 func (plan *wrapNetipPrefixEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1652 1653 func (plan *wrapNetipPrefixEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1654 return plan.next.Encode(netipPrefixWrapper(value.(netip.Prefix)), buf) 1655 } 1656 1657 type wrapNetipAddrEncodePlan struct { 1658 next EncodePlan 1659 } 1660 1661 func (plan *wrapNetipAddrEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1662 1663 func (plan *wrapNetipAddrEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1664 return plan.next.Encode(netipAddrWrapper(value.(netip.Addr)), buf) 1665 } 1666 1667 type wrapMapStringToPointerStringEncodePlan struct { 1668 next EncodePlan 1669 } 1670 1671 func (plan *wrapMapStringToPointerStringEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1672 1673 func (plan *wrapMapStringToPointerStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1674 return plan.next.Encode(mapStringToPointerStringWrapper(value.(map[string]*string)), buf) 1675 } 1676 1677 type wrapMapStringToStringEncodePlan struct { 1678 next EncodePlan 1679 } 1680 1681 func (plan *wrapMapStringToStringEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1682 1683 func (plan *wrapMapStringToStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1684 return plan.next.Encode(mapStringToStringWrapper(value.(map[string]string)), buf) 1685 } 1686 1687 type wrapByte16EncodePlan struct { 1688 next EncodePlan 1689 } 1690 1691 func (plan *wrapByte16EncodePlan) SetNext(next EncodePlan) { plan.next = next } 1692 1693 func (plan *wrapByte16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1694 return plan.next.Encode(byte16Wrapper(value.([16]byte)), buf) 1695 } 1696 1697 type wrapByteSliceEncodePlan struct { 1698 next EncodePlan 1699 } 1700 1701 func (plan *wrapByteSliceEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1702 1703 func (plan *wrapByteSliceEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1704 return plan.next.Encode(byteSliceWrapper(value.([]byte)), buf) 1705 } 1706 1707 type wrapFmtStringerEncodePlan struct { 1708 next EncodePlan 1709 } 1710 1711 func (plan *wrapFmtStringerEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1712 1713 func (plan *wrapFmtStringerEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1714 return plan.next.Encode(fmtStringerWrapper{value.(fmt.Stringer)}, buf) 1715 } 1716 1717 // TryWrapStructPlan tries to wrap a struct with a wrapper that implements CompositeIndexGetter. 1718 func TryWrapStructEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1719 if _, ok := value.(driver.Valuer); ok { 1720 return nil, nil, false 1721 } 1722 1723 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Struct { 1724 exportedFields := getExportedFieldValues(reflect.ValueOf(value)) 1725 if len(exportedFields) == 0 { 1726 return nil, nil, false 1727 } 1728 1729 w := structWrapper{ 1730 s: value, 1731 exportedFields: exportedFields, 1732 } 1733 return &wrapAnyStructEncodePlan{}, w, true 1734 } 1735 1736 return nil, nil, false 1737 } 1738 1739 type wrapAnyStructEncodePlan struct { 1740 next EncodePlan 1741 } 1742 1743 func (plan *wrapAnyStructEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1744 1745 func (plan *wrapAnyStructEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1746 w := structWrapper{ 1747 s: value, 1748 exportedFields: getExportedFieldValues(reflect.ValueOf(value)), 1749 } 1750 1751 return plan.next.Encode(w, buf) 1752 } 1753 1754 func getExportedFieldValues(structValue reflect.Value) []reflect.Value { 1755 structType := structValue.Type() 1756 exportedFields := make([]reflect.Value, 0, structValue.NumField()) 1757 for i := 0; i < structType.NumField(); i++ { 1758 sf := structType.Field(i) 1759 if sf.IsExported() { 1760 exportedFields = append(exportedFields, structValue.Field(i)) 1761 } 1762 } 1763 1764 return exportedFields 1765 } 1766 1767 func TryWrapSliceEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1768 if _, ok := value.(driver.Valuer); ok { 1769 return nil, nil, false 1770 } 1771 1772 // Avoid using reflect path for common types. 1773 switch value := value.(type) { 1774 case []int16: 1775 return &wrapSliceEncodePlan[int16]{}, (FlatArray[int16])(value), true 1776 case []int32: 1777 return &wrapSliceEncodePlan[int32]{}, (FlatArray[int32])(value), true 1778 case []int64: 1779 return &wrapSliceEncodePlan[int64]{}, (FlatArray[int64])(value), true 1780 case []float32: 1781 return &wrapSliceEncodePlan[float32]{}, (FlatArray[float32])(value), true 1782 case []float64: 1783 return &wrapSliceEncodePlan[float64]{}, (FlatArray[float64])(value), true 1784 case []string: 1785 return &wrapSliceEncodePlan[string]{}, (FlatArray[string])(value), true 1786 case []time.Time: 1787 return &wrapSliceEncodePlan[time.Time]{}, (FlatArray[time.Time])(value), true 1788 } 1789 1790 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Slice { 1791 w := anySliceArrayReflect{ 1792 slice: reflect.ValueOf(value), 1793 } 1794 return &wrapSliceEncodeReflectPlan{}, w, true 1795 } 1796 1797 return nil, nil, false 1798 } 1799 1800 type wrapSliceEncodePlan[T any] struct { 1801 next EncodePlan 1802 } 1803 1804 func (plan *wrapSliceEncodePlan[T]) SetNext(next EncodePlan) { plan.next = next } 1805 1806 func (plan *wrapSliceEncodePlan[T]) Encode(value any, buf []byte) (newBuf []byte, err error) { 1807 return plan.next.Encode((FlatArray[T])(value.([]T)), buf) 1808 } 1809 1810 type wrapSliceEncodeReflectPlan struct { 1811 next EncodePlan 1812 } 1813 1814 func (plan *wrapSliceEncodeReflectPlan) SetNext(next EncodePlan) { plan.next = next } 1815 1816 func (plan *wrapSliceEncodeReflectPlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1817 w := anySliceArrayReflect{ 1818 slice: reflect.ValueOf(value), 1819 } 1820 1821 return plan.next.Encode(w, buf) 1822 } 1823 1824 func TryWrapMultiDimSliceEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1825 if _, ok := value.(driver.Valuer); ok { 1826 return nil, nil, false 1827 } 1828 1829 sliceValue := reflect.ValueOf(value) 1830 if sliceValue.Kind() == reflect.Slice { 1831 valueElemType := sliceValue.Type().Elem() 1832 1833 if valueElemType.Kind() == reflect.Slice { 1834 if !isRagged(sliceValue) { 1835 w := anyMultiDimSliceArray{ 1836 slice: reflect.ValueOf(value), 1837 } 1838 return &wrapMultiDimSliceEncodePlan{}, &w, true 1839 } 1840 } 1841 } 1842 1843 return nil, nil, false 1844 } 1845 1846 type wrapMultiDimSliceEncodePlan struct { 1847 next EncodePlan 1848 } 1849 1850 func (plan *wrapMultiDimSliceEncodePlan) SetNext(next EncodePlan) { plan.next = next } 1851 1852 func (plan *wrapMultiDimSliceEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1853 w := anyMultiDimSliceArray{ 1854 slice: reflect.ValueOf(value), 1855 } 1856 1857 return plan.next.Encode(&w, buf) 1858 } 1859 1860 func TryWrapArrayEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) { 1861 if _, ok := value.(driver.Valuer); ok { 1862 return nil, nil, false 1863 } 1864 1865 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Array { 1866 w := anyArrayArrayReflect{ 1867 array: reflect.ValueOf(value), 1868 } 1869 return &wrapArrayEncodeReflectPlan{}, w, true 1870 } 1871 1872 return nil, nil, false 1873 } 1874 1875 type wrapArrayEncodeReflectPlan struct { 1876 next EncodePlan 1877 } 1878 1879 func (plan *wrapArrayEncodeReflectPlan) SetNext(next EncodePlan) { plan.next = next } 1880 1881 func (plan *wrapArrayEncodeReflectPlan) Encode(value any, buf []byte) (newBuf []byte, err error) { 1882 w := anyArrayArrayReflect{ 1883 array: reflect.ValueOf(value), 1884 } 1885 1886 return plan.next.Encode(w, buf) 1887 } 1888 1889 func newEncodeError(value any, m *Map, oid uint32, formatCode int16, err error) error { 1890 var format string 1891 switch formatCode { 1892 case TextFormatCode: 1893 format = "text" 1894 case BinaryFormatCode: 1895 format = "binary" 1896 default: 1897 format = fmt.Sprintf("unknown (%d)", formatCode) 1898 } 1899 1900 var dataTypeName string 1901 if t, ok := m.TypeForOID(oid); ok { 1902 dataTypeName = t.Name 1903 } else { 1904 dataTypeName = "unknown type" 1905 } 1906 1907 return fmt.Errorf("unable to encode %#v into %s format for %s (OID %d): %w", value, format, dataTypeName, oid, err) 1908 } 1909 1910 // Encode appends the encoded bytes of value to buf. If value is the SQL value NULL then append nothing and return 1911 // (nil, nil). The caller of Encode is responsible for writing the correct NULL value or the length of the data 1912 // written. 1913 func (m *Map) Encode(oid uint32, formatCode int16, value any, buf []byte) (newBuf []byte, err error) { 1914 if value == nil { 1915 return nil, nil 1916 } 1917 1918 plan := m.PlanEncode(oid, formatCode, value) 1919 if plan == nil { 1920 return nil, newEncodeError(value, m, oid, formatCode, errors.New("cannot find encode plan")) 1921 } 1922 1923 newBuf, err = plan.Encode(value, buf) 1924 if err != nil { 1925 return nil, newEncodeError(value, m, oid, formatCode, err) 1926 } 1927 1928 return newBuf, nil 1929 } 1930 1931 // SQLScanner returns a database/sql.Scanner for v. This is necessary for types like Array[T] and Range[T] where the 1932 // type needs assistance from Map to implement the sql.Scanner interface. It is not necessary for types like Box that 1933 // implement sql.Scanner directly. 1934 // 1935 // This uses the type of v to look up the PostgreSQL OID that v presumably came from. This means v must be registered 1936 // with m by calling RegisterDefaultPgType. 1937 func (m *Map) SQLScanner(v any) sql.Scanner { 1938 if s, ok := v.(sql.Scanner); ok { 1939 return s 1940 } 1941 1942 return &sqlScannerWrapper{m: m, v: v} 1943 } 1944 1945 type sqlScannerWrapper struct { 1946 m *Map 1947 v any 1948 } 1949 1950 func (w *sqlScannerWrapper) Scan(src any) error { 1951 t, ok := w.m.TypeForValue(w.v) 1952 if !ok { 1953 return fmt.Errorf("cannot convert to sql.Scanner: cannot find registered type for %T", w.v) 1954 } 1955 1956 var bufSrc []byte 1957 if src != nil { 1958 switch src := src.(type) { 1959 case string: 1960 bufSrc = []byte(src) 1961 case []byte: 1962 bufSrc = src 1963 default: 1964 bufSrc = []byte(fmt.Sprint(bufSrc)) 1965 } 1966 } 1967 1968 return w.m.Scan(t.OID, TextFormatCode, bufSrc, w.v) 1969 }