github.com/jackc/pgx/v5@v5.5.5/pgtype/pgtype_default.go (about) 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 }