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
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
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
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
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
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
157 registerDefaultPgTypeVariants[int16](defaultMap, "int2")
158 registerDefaultPgTypeVariants[int32](defaultMap, "int4")
159 registerDefaultPgTypeVariants[int64](defaultMap, "int8")
160
161
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
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")
196 registerDefaultPgTypeVariants[Multirange[Range[Float8]]](defaultMap, "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