...

Source file src/github.com/jackc/pgx/v5/pgtype/pgtype_default.go

Documentation: github.com/jackc/pgx/v5/pgtype

     1  package pgtype
     2  
     3  import (
     4  	"encoding/json"
     5  	"net"
     6  	"net/netip"
     7  	"reflect"
     8  	"sync"
     9  	"time"
    10  )
    11  
    12  var (
    13  	// defaultMap contains default mappings between PostgreSQL server types and Go type handling logic.
    14  	defaultMap         *Map
    15  	defaultMapInitOnce = sync.Once{}
    16  )
    17  
    18  func initDefaultMap() {
    19  	defaultMap = &Map{
    20  		oidToType:         make(map[uint32]*Type),
    21  		nameToType:        make(map[string]*Type),
    22  		reflectTypeToName: make(map[reflect.Type]string),
    23  		oidToFormatCode:   make(map[uint32]int16),
    24  
    25  		memoizedScanPlans:   make(map[uint32]map[reflect.Type][2]ScanPlan),
    26  		memoizedEncodePlans: make(map[uint32]map[reflect.Type][2]EncodePlan),
    27  
    28  		TryWrapEncodePlanFuncs: []TryWrapEncodePlanFunc{
    29  			TryWrapDerefPointerEncodePlan,
    30  			TryWrapBuiltinTypeEncodePlan,
    31  			TryWrapFindUnderlyingTypeEncodePlan,
    32  			TryWrapStructEncodePlan,
    33  			TryWrapSliceEncodePlan,
    34  			TryWrapMultiDimSliceEncodePlan,
    35  			TryWrapArrayEncodePlan,
    36  		},
    37  
    38  		TryWrapScanPlanFuncs: []TryWrapScanPlanFunc{
    39  			TryPointerPointerScanPlan,
    40  			TryWrapBuiltinTypeScanPlan,
    41  			TryFindUnderlyingTypeScanPlan,
    42  			TryWrapStructScanPlan,
    43  			TryWrapPtrSliceScanPlan,
    44  			TryWrapPtrMultiDimSliceScanPlan,
    45  			TryWrapPtrArrayScanPlan,
    46  		},
    47  	}
    48  
    49  	// Base types
    50  	defaultMap.RegisterType(&Type{Name: "aclitem", OID: ACLItemOID, Codec: &TextFormatOnlyCodec{TextCodec{}}})
    51  	defaultMap.RegisterType(&Type{Name: "bit", OID: BitOID, Codec: BitsCodec{}})
    52  	defaultMap.RegisterType(&Type{Name: "bool", OID: BoolOID, Codec: BoolCodec{}})
    53  	defaultMap.RegisterType(&Type{Name: "box", OID: BoxOID, Codec: BoxCodec{}})
    54  	defaultMap.RegisterType(&Type{Name: "bpchar", OID: BPCharOID, Codec: TextCodec{}})
    55  	defaultMap.RegisterType(&Type{Name: "bytea", OID: ByteaOID, Codec: ByteaCodec{}})
    56  	defaultMap.RegisterType(&Type{Name: "char", OID: QCharOID, Codec: QCharCodec{}})
    57  	defaultMap.RegisterType(&Type{Name: "cid", OID: CIDOID, Codec: Uint32Codec{}})
    58  	defaultMap.RegisterType(&Type{Name: "cidr", OID: CIDROID, Codec: InetCodec{}})
    59  	defaultMap.RegisterType(&Type{Name: "circle", OID: CircleOID, Codec: CircleCodec{}})
    60  	defaultMap.RegisterType(&Type{Name: "date", OID: DateOID, Codec: DateCodec{}})
    61  	defaultMap.RegisterType(&Type{Name: "float4", OID: Float4OID, Codec: Float4Codec{}})
    62  	defaultMap.RegisterType(&Type{Name: "float8", OID: Float8OID, Codec: Float8Codec{}})
    63  	defaultMap.RegisterType(&Type{Name: "inet", OID: InetOID, Codec: InetCodec{}})
    64  	defaultMap.RegisterType(&Type{Name: "int2", OID: Int2OID, Codec: Int2Codec{}})
    65  	defaultMap.RegisterType(&Type{Name: "int4", OID: Int4OID, Codec: Int4Codec{}})
    66  	defaultMap.RegisterType(&Type{Name: "int8", OID: Int8OID, Codec: Int8Codec{}})
    67  	defaultMap.RegisterType(&Type{Name: "interval", OID: IntervalOID, Codec: IntervalCodec{}})
    68  	defaultMap.RegisterType(&Type{Name: "json", OID: JSONOID, Codec: JSONCodec{}})
    69  	defaultMap.RegisterType(&Type{Name: "jsonb", OID: JSONBOID, Codec: JSONBCodec{}})
    70  	defaultMap.RegisterType(&Type{Name: "jsonpath", OID: JSONPathOID, Codec: &TextFormatOnlyCodec{TextCodec{}}})
    71  	defaultMap.RegisterType(&Type{Name: "line", OID: LineOID, Codec: LineCodec{}})
    72  	defaultMap.RegisterType(&Type{Name: "lseg", OID: LsegOID, Codec: LsegCodec{}})
    73  	defaultMap.RegisterType(&Type{Name: "macaddr", OID: MacaddrOID, Codec: MacaddrCodec{}})
    74  	defaultMap.RegisterType(&Type{Name: "name", OID: NameOID, Codec: TextCodec{}})
    75  	defaultMap.RegisterType(&Type{Name: "numeric", OID: NumericOID, Codec: NumericCodec{}})
    76  	defaultMap.RegisterType(&Type{Name: "oid", OID: OIDOID, Codec: Uint32Codec{}})
    77  	defaultMap.RegisterType(&Type{Name: "path", OID: PathOID, Codec: PathCodec{}})
    78  	defaultMap.RegisterType(&Type{Name: "point", OID: PointOID, Codec: PointCodec{}})
    79  	defaultMap.RegisterType(&Type{Name: "polygon", OID: PolygonOID, Codec: PolygonCodec{}})
    80  	defaultMap.RegisterType(&Type{Name: "record", OID: RecordOID, Codec: RecordCodec{}})
    81  	defaultMap.RegisterType(&Type{Name: "text", OID: TextOID, Codec: TextCodec{}})
    82  	defaultMap.RegisterType(&Type{Name: "tid", OID: TIDOID, Codec: TIDCodec{}})
    83  	defaultMap.RegisterType(&Type{Name: "time", OID: TimeOID, Codec: TimeCodec{}})
    84  	defaultMap.RegisterType(&Type{Name: "timestamp", OID: TimestampOID, Codec: TimestampCodec{}})
    85  	defaultMap.RegisterType(&Type{Name: "timestamptz", OID: TimestamptzOID, Codec: TimestamptzCodec{}})
    86  	defaultMap.RegisterType(&Type{Name: "unknown", OID: UnknownOID, Codec: TextCodec{}})
    87  	defaultMap.RegisterType(&Type{Name: "uuid", OID: UUIDOID, Codec: UUIDCodec{}})
    88  	defaultMap.RegisterType(&Type{Name: "varbit", OID: VarbitOID, Codec: BitsCodec{}})
    89  	defaultMap.RegisterType(&Type{Name: "varchar", OID: VarcharOID, Codec: TextCodec{}})
    90  	defaultMap.RegisterType(&Type{Name: "xid", OID: XIDOID, Codec: Uint32Codec{}})
    91  
    92  	// Range types
    93  	defaultMap.RegisterType(&Type{Name: "daterange", OID: DaterangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[DateOID]}})
    94  	defaultMap.RegisterType(&Type{Name: "int4range", OID: Int4rangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[Int4OID]}})
    95  	defaultMap.RegisterType(&Type{Name: "int8range", OID: Int8rangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[Int8OID]}})
    96  	defaultMap.RegisterType(&Type{Name: "numrange", OID: NumrangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[NumericOID]}})
    97  	defaultMap.RegisterType(&Type{Name: "tsrange", OID: TsrangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[TimestampOID]}})
    98  	defaultMap.RegisterType(&Type{Name: "tstzrange", OID: TstzrangeOID, Codec: &RangeCodec{ElementType: defaultMap.oidToType[TimestamptzOID]}})
    99  
   100  	// Multirange types
   101  	defaultMap.RegisterType(&Type{Name: "datemultirange", OID: DatemultirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[DaterangeOID]}})
   102  	defaultMap.RegisterType(&Type{Name: "int4multirange", OID: Int4multirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[Int4rangeOID]}})
   103  	defaultMap.RegisterType(&Type{Name: "int8multirange", OID: Int8multirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[Int8rangeOID]}})
   104  	defaultMap.RegisterType(&Type{Name: "nummultirange", OID: NummultirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[NumrangeOID]}})
   105  	defaultMap.RegisterType(&Type{Name: "tsmultirange", OID: TsmultirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[TsrangeOID]}})
   106  	defaultMap.RegisterType(&Type{Name: "tstzmultirange", OID: TstzmultirangeOID, Codec: &MultirangeCodec{ElementType: defaultMap.oidToType[TstzrangeOID]}})
   107  
   108  	// Array types
   109  	defaultMap.RegisterType(&Type{Name: "_aclitem", OID: ACLItemArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[ACLItemOID]}})
   110  	defaultMap.RegisterType(&Type{Name: "_bit", OID: BitArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[BitOID]}})
   111  	defaultMap.RegisterType(&Type{Name: "_bool", OID: BoolArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[BoolOID]}})
   112  	defaultMap.RegisterType(&Type{Name: "_box", OID: BoxArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[BoxOID]}})
   113  	defaultMap.RegisterType(&Type{Name: "_bpchar", OID: BPCharArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[BPCharOID]}})
   114  	defaultMap.RegisterType(&Type{Name: "_bytea", OID: ByteaArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[ByteaOID]}})
   115  	defaultMap.RegisterType(&Type{Name: "_char", OID: QCharArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[QCharOID]}})
   116  	defaultMap.RegisterType(&Type{Name: "_cid", OID: CIDArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[CIDOID]}})
   117  	defaultMap.RegisterType(&Type{Name: "_cidr", OID: CIDRArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[CIDROID]}})
   118  	defaultMap.RegisterType(&Type{Name: "_circle", OID: CircleArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[CircleOID]}})
   119  	defaultMap.RegisterType(&Type{Name: "_date", OID: DateArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[DateOID]}})
   120  	defaultMap.RegisterType(&Type{Name: "_daterange", OID: DaterangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[DaterangeOID]}})
   121  	defaultMap.RegisterType(&Type{Name: "_float4", OID: Float4ArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Float4OID]}})
   122  	defaultMap.RegisterType(&Type{Name: "_float8", OID: Float8ArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Float8OID]}})
   123  	defaultMap.RegisterType(&Type{Name: "_inet", OID: InetArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[InetOID]}})
   124  	defaultMap.RegisterType(&Type{Name: "_int2", OID: Int2ArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Int2OID]}})
   125  	defaultMap.RegisterType(&Type{Name: "_int4", OID: Int4ArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Int4OID]}})
   126  	defaultMap.RegisterType(&Type{Name: "_int4range", OID: Int4rangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Int4rangeOID]}})
   127  	defaultMap.RegisterType(&Type{Name: "_int8", OID: Int8ArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Int8OID]}})
   128  	defaultMap.RegisterType(&Type{Name: "_int8range", OID: Int8rangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[Int8rangeOID]}})
   129  	defaultMap.RegisterType(&Type{Name: "_interval", OID: IntervalArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[IntervalOID]}})
   130  	defaultMap.RegisterType(&Type{Name: "_json", OID: JSONArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[JSONOID]}})
   131  	defaultMap.RegisterType(&Type{Name: "_jsonb", OID: JSONBArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[JSONBOID]}})
   132  	defaultMap.RegisterType(&Type{Name: "_jsonpath", OID: JSONPathArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[JSONPathOID]}})
   133  	defaultMap.RegisterType(&Type{Name: "_line", OID: LineArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[LineOID]}})
   134  	defaultMap.RegisterType(&Type{Name: "_lseg", OID: LsegArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[LsegOID]}})
   135  	defaultMap.RegisterType(&Type{Name: "_macaddr", OID: MacaddrArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[MacaddrOID]}})
   136  	defaultMap.RegisterType(&Type{Name: "_name", OID: NameArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[NameOID]}})
   137  	defaultMap.RegisterType(&Type{Name: "_numeric", OID: NumericArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[NumericOID]}})
   138  	defaultMap.RegisterType(&Type{Name: "_numrange", OID: NumrangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[NumrangeOID]}})
   139  	defaultMap.RegisterType(&Type{Name: "_oid", OID: OIDArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[OIDOID]}})
   140  	defaultMap.RegisterType(&Type{Name: "_path", OID: PathArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[PathOID]}})
   141  	defaultMap.RegisterType(&Type{Name: "_point", OID: PointArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[PointOID]}})
   142  	defaultMap.RegisterType(&Type{Name: "_polygon", OID: PolygonArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[PolygonOID]}})
   143  	defaultMap.RegisterType(&Type{Name: "_record", OID: RecordArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[RecordOID]}})
   144  	defaultMap.RegisterType(&Type{Name: "_text", OID: TextArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TextOID]}})
   145  	defaultMap.RegisterType(&Type{Name: "_tid", OID: TIDArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TIDOID]}})
   146  	defaultMap.RegisterType(&Type{Name: "_time", OID: TimeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TimeOID]}})
   147  	defaultMap.RegisterType(&Type{Name: "_timestamp", OID: TimestampArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TimestampOID]}})
   148  	defaultMap.RegisterType(&Type{Name: "_timestamptz", OID: TimestamptzArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TimestamptzOID]}})
   149  	defaultMap.RegisterType(&Type{Name: "_tsrange", OID: TsrangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TsrangeOID]}})
   150  	defaultMap.RegisterType(&Type{Name: "_tstzrange", OID: TstzrangeArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[TstzrangeOID]}})
   151  	defaultMap.RegisterType(&Type{Name: "_uuid", OID: UUIDArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[UUIDOID]}})
   152  	defaultMap.RegisterType(&Type{Name: "_varbit", OID: VarbitArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[VarbitOID]}})
   153  	defaultMap.RegisterType(&Type{Name: "_varchar", OID: VarcharArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[VarcharOID]}})
   154  	defaultMap.RegisterType(&Type{Name: "_xid", OID: XIDArrayOID, Codec: &ArrayCodec{ElementType: defaultMap.oidToType[XIDOID]}})
   155  
   156  	// Integer types that directly map to a PostgreSQL type
   157  	registerDefaultPgTypeVariants[int16](defaultMap, "int2")
   158  	registerDefaultPgTypeVariants[int32](defaultMap, "int4")
   159  	registerDefaultPgTypeVariants[int64](defaultMap, "int8")
   160  
   161  	// Integer types that do not have a direct match to a PostgreSQL type
   162  	registerDefaultPgTypeVariants[int8](defaultMap, "int8")
   163  	registerDefaultPgTypeVariants[int](defaultMap, "int8")
   164  	registerDefaultPgTypeVariants[uint8](defaultMap, "int8")
   165  	registerDefaultPgTypeVariants[uint16](defaultMap, "int8")
   166  	registerDefaultPgTypeVariants[uint32](defaultMap, "int8")
   167  	registerDefaultPgTypeVariants[uint64](defaultMap, "numeric")
   168  	registerDefaultPgTypeVariants[uint](defaultMap, "numeric")
   169  
   170  	registerDefaultPgTypeVariants[float32](defaultMap, "float4")
   171  	registerDefaultPgTypeVariants[float64](defaultMap, "float8")
   172  
   173  	registerDefaultPgTypeVariants[bool](defaultMap, "bool")
   174  	registerDefaultPgTypeVariants[time.Time](defaultMap, "timestamptz")
   175  	registerDefaultPgTypeVariants[time.Duration](defaultMap, "interval")
   176  	registerDefaultPgTypeVariants[string](defaultMap, "text")
   177  	registerDefaultPgTypeVariants[json.RawMessage](defaultMap, "json")
   178  	registerDefaultPgTypeVariants[[]byte](defaultMap, "bytea")
   179  
   180  	registerDefaultPgTypeVariants[net.IP](defaultMap, "inet")
   181  	registerDefaultPgTypeVariants[net.IPNet](defaultMap, "cidr")
   182  	registerDefaultPgTypeVariants[netip.Addr](defaultMap, "inet")
   183  	registerDefaultPgTypeVariants[netip.Prefix](defaultMap, "cidr")
   184  
   185  	// pgtype provided structs
   186  	registerDefaultPgTypeVariants[Bits](defaultMap, "varbit")
   187  	registerDefaultPgTypeVariants[Bool](defaultMap, "bool")
   188  	registerDefaultPgTypeVariants[Box](defaultMap, "box")
   189  	registerDefaultPgTypeVariants[Circle](defaultMap, "circle")
   190  	registerDefaultPgTypeVariants[Date](defaultMap, "date")
   191  	registerDefaultPgTypeVariants[Range[Date]](defaultMap, "daterange")
   192  	registerDefaultPgTypeVariants[Multirange[Range[Date]]](defaultMap, "datemultirange")
   193  	registerDefaultPgTypeVariants[Float4](defaultMap, "float4")
   194  	registerDefaultPgTypeVariants[Float8](defaultMap, "float8")
   195  	registerDefaultPgTypeVariants[Range[Float8]](defaultMap, "numrange")                  // There is no PostgreSQL builtin float8range so map it to numrange.
   196  	registerDefaultPgTypeVariants[Multirange[Range[Float8]]](defaultMap, "nummultirange") // There is no PostgreSQL builtin float8multirange so map it to nummultirange.
   197  	registerDefaultPgTypeVariants[Int2](defaultMap, "int2")
   198  	registerDefaultPgTypeVariants[Int4](defaultMap, "int4")
   199  	registerDefaultPgTypeVariants[Range[Int4]](defaultMap, "int4range")
   200  	registerDefaultPgTypeVariants[Multirange[Range[Int4]]](defaultMap, "int4multirange")
   201  	registerDefaultPgTypeVariants[Int8](defaultMap, "int8")
   202  	registerDefaultPgTypeVariants[Range[Int8]](defaultMap, "int8range")
   203  	registerDefaultPgTypeVariants[Multirange[Range[Int8]]](defaultMap, "int8multirange")
   204  	registerDefaultPgTypeVariants[Interval](defaultMap, "interval")
   205  	registerDefaultPgTypeVariants[Line](defaultMap, "line")
   206  	registerDefaultPgTypeVariants[Lseg](defaultMap, "lseg")
   207  	registerDefaultPgTypeVariants[Numeric](defaultMap, "numeric")
   208  	registerDefaultPgTypeVariants[Range[Numeric]](defaultMap, "numrange")
   209  	registerDefaultPgTypeVariants[Multirange[Range[Numeric]]](defaultMap, "nummultirange")
   210  	registerDefaultPgTypeVariants[Path](defaultMap, "path")
   211  	registerDefaultPgTypeVariants[Point](defaultMap, "point")
   212  	registerDefaultPgTypeVariants[Polygon](defaultMap, "polygon")
   213  	registerDefaultPgTypeVariants[TID](defaultMap, "tid")
   214  	registerDefaultPgTypeVariants[Text](defaultMap, "text")
   215  	registerDefaultPgTypeVariants[Time](defaultMap, "time")
   216  	registerDefaultPgTypeVariants[Timestamp](defaultMap, "timestamp")
   217  	registerDefaultPgTypeVariants[Timestamptz](defaultMap, "timestamptz")
   218  	registerDefaultPgTypeVariants[Range[Timestamp]](defaultMap, "tsrange")
   219  	registerDefaultPgTypeVariants[Multirange[Range[Timestamp]]](defaultMap, "tsmultirange")
   220  	registerDefaultPgTypeVariants[Range[Timestamptz]](defaultMap, "tstzrange")
   221  	registerDefaultPgTypeVariants[Multirange[Range[Timestamptz]]](defaultMap, "tstzmultirange")
   222  	registerDefaultPgTypeVariants[UUID](defaultMap, "uuid")
   223  
   224  	defaultMap.buildReflectTypeToType()
   225  }
   226  

View as plain text