Skip to main content

sqlmodel_postgres/types/
oid.rs

1//! PostgreSQL type Object IDs (OIDs).
2//!
3//! PostgreSQL identifies types by numeric OIDs. This module defines
4//! the well-known OIDs for built-in types.
5
6/// Boolean type
7pub const BOOL: u32 = 16;
8
9/// Byte array (bytea)
10pub const BYTEA: u32 = 17;
11
12/// Single character (char)
13pub const CHAR: u32 = 18;
14
15/// Name type (internal, 63-byte identifier)
16pub const NAME: u32 = 19;
17
18/// 8-byte signed integer (int8/bigint)
19pub const INT8: u32 = 20;
20
21/// 2-byte signed integer (int2/smallint)
22pub const INT2: u32 = 21;
23
24/// 4-byte signed integer (int4/integer)
25pub const INT4: u32 = 23;
26
27/// Variable-length text (text)
28pub const TEXT: u32 = 25;
29
30/// Object identifier (oid)
31pub const OID: u32 = 26;
32
33/// Transaction ID (xid)
34pub const XID: u32 = 28;
35
36/// Command ID (cid)
37pub const CID: u32 = 29;
38
39/// JSON (text-based)
40pub const JSON: u32 = 114;
41
42/// XML data
43pub const XML: u32 = 142;
44
45/// Single-precision floating point (float4/real)
46pub const FLOAT4: u32 = 700;
47
48/// Double-precision floating point (float8/double precision)
49pub const FLOAT8: u32 = 701;
50
51/// Money type
52pub const MONEY: u32 = 790;
53
54/// MAC address (6 bytes)
55pub const MACADDR: u32 = 829;
56
57/// IPv4/IPv6 CIDR address
58pub const CIDR: u32 = 650;
59
60/// IPv4/IPv6 host address
61pub const INET: u32 = 869;
62
63/// Variable-length character with limit (varchar)
64pub const VARCHAR: u32 = 1043;
65
66/// Fixed-length character (bpchar)
67pub const BPCHAR: u32 = 1042;
68
69/// Date (no time)
70pub const DATE: u32 = 1082;
71
72/// Time without time zone
73pub const TIME: u32 = 1083;
74
75/// Timestamp without time zone
76pub const TIMESTAMP: u32 = 1114;
77
78/// Timestamp with time zone
79pub const TIMESTAMPTZ: u32 = 1184;
80
81/// Time interval
82pub const INTERVAL: u32 = 1186;
83
84/// Time with time zone
85pub const TIMETZ: u32 = 1266;
86
87/// Bit string (fixed-length)
88pub const BIT: u32 = 1560;
89
90/// Bit string (variable-length)
91pub const VARBIT: u32 = 1562;
92
93/// Arbitrary precision numeric
94pub const NUMERIC: u32 = 1700;
95
96/// UUID (16-byte identifier)
97pub const UUID: u32 = 2950;
98
99/// JSONB (binary JSON)
100pub const JSONB: u32 = 3802;
101
102/// Integer range
103pub const INT4RANGE: u32 = 3904;
104
105/// Bigint range
106pub const INT8RANGE: u32 = 3926;
107
108/// Numeric range
109pub const NUMRANGE: u32 = 3906;
110
111/// Timestamp range
112pub const TSRANGE: u32 = 3908;
113
114/// Timestamp with time zone range
115pub const TSTZRANGE: u32 = 3910;
116
117/// Date range
118pub const DATERANGE: u32 = 3912;
119
120// ==================== Array Types ====================
121// PostgreSQL array types have their own OIDs
122
123/// Boolean array
124pub const BOOL_ARRAY: u32 = 1000;
125
126/// Bytea array
127pub const BYTEA_ARRAY: u32 = 1001;
128
129/// Char array
130pub const CHAR_ARRAY: u32 = 1002;
131
132/// Name array
133pub const NAME_ARRAY: u32 = 1003;
134
135/// Int2 array
136pub const INT2_ARRAY: u32 = 1005;
137
138/// Int4 array
139pub const INT4_ARRAY: u32 = 1007;
140
141/// Text array
142pub const TEXT_ARRAY: u32 = 1009;
143
144/// Varchar array
145pub const VARCHAR_ARRAY: u32 = 1015;
146
147/// Int8 array
148pub const INT8_ARRAY: u32 = 1016;
149
150/// Float4 array
151pub const FLOAT4_ARRAY: u32 = 1021;
152
153/// Float8 array
154pub const FLOAT8_ARRAY: u32 = 1022;
155
156/// OID array
157pub const OID_ARRAY: u32 = 1028;
158
159/// Timestamp array
160pub const TIMESTAMP_ARRAY: u32 = 1115;
161
162/// Date array
163pub const DATE_ARRAY: u32 = 1182;
164
165/// Time array
166pub const TIME_ARRAY: u32 = 1183;
167
168/// Timestamptz array
169pub const TIMESTAMPTZ_ARRAY: u32 = 1185;
170
171/// Interval array
172pub const INTERVAL_ARRAY: u32 = 1187;
173
174/// Numeric array
175pub const NUMERIC_ARRAY: u32 = 1231;
176
177/// UUID array
178pub const UUID_ARRAY: u32 = 2951;
179
180/// JSON array
181pub const JSON_ARRAY: u32 = 199;
182
183/// JSONB array
184pub const JSONB_ARRAY: u32 = 3807;
185
186// ==================== Special Types ====================
187
188/// Unknown type (used for NULL)
189pub const UNKNOWN: u32 = 705;
190
191/// Void type (no return value)
192pub const VOID: u32 = 2278;
193
194/// Get the array element OID for an array type OID.
195///
196/// Returns `None` if the OID is not a known array type.
197#[must_use]
198pub const fn element_oid(array_oid: u32) -> Option<u32> {
199    match array_oid {
200        BOOL_ARRAY => Some(BOOL),
201        BYTEA_ARRAY => Some(BYTEA),
202        CHAR_ARRAY => Some(CHAR),
203        NAME_ARRAY => Some(NAME),
204        INT2_ARRAY => Some(INT2),
205        INT4_ARRAY => Some(INT4),
206        TEXT_ARRAY => Some(TEXT),
207        VARCHAR_ARRAY => Some(VARCHAR),
208        INT8_ARRAY => Some(INT8),
209        FLOAT4_ARRAY => Some(FLOAT4),
210        FLOAT8_ARRAY => Some(FLOAT8),
211        OID_ARRAY => Some(OID),
212        TIMESTAMP_ARRAY => Some(TIMESTAMP),
213        DATE_ARRAY => Some(DATE),
214        TIME_ARRAY => Some(TIME),
215        TIMESTAMPTZ_ARRAY => Some(TIMESTAMPTZ),
216        INTERVAL_ARRAY => Some(INTERVAL),
217        NUMERIC_ARRAY => Some(NUMERIC),
218        UUID_ARRAY => Some(UUID),
219        JSON_ARRAY => Some(JSON),
220        JSONB_ARRAY => Some(JSONB),
221        _ => None,
222    }
223}
224
225/// Get the array type OID for an element type OID.
226///
227/// Returns `None` if the OID doesn't have a known array type.
228#[must_use]
229pub const fn array_oid(element_oid: u32) -> Option<u32> {
230    match element_oid {
231        BOOL => Some(BOOL_ARRAY),
232        BYTEA => Some(BYTEA_ARRAY),
233        CHAR => Some(CHAR_ARRAY),
234        NAME => Some(NAME_ARRAY),
235        INT2 => Some(INT2_ARRAY),
236        INT4 => Some(INT4_ARRAY),
237        TEXT => Some(TEXT_ARRAY),
238        VARCHAR => Some(VARCHAR_ARRAY),
239        INT8 => Some(INT8_ARRAY),
240        FLOAT4 => Some(FLOAT4_ARRAY),
241        FLOAT8 => Some(FLOAT8_ARRAY),
242        OID => Some(OID_ARRAY),
243        TIMESTAMP => Some(TIMESTAMP_ARRAY),
244        DATE => Some(DATE_ARRAY),
245        TIME => Some(TIME_ARRAY),
246        TIMESTAMPTZ => Some(TIMESTAMPTZ_ARRAY),
247        INTERVAL => Some(INTERVAL_ARRAY),
248        NUMERIC => Some(NUMERIC_ARRAY),
249        UUID => Some(UUID_ARRAY),
250        JSON => Some(JSON_ARRAY),
251        JSONB => Some(JSONB_ARRAY),
252        _ => None,
253    }
254}
255
256/// Check if the OID represents an array type.
257#[must_use]
258pub const fn is_array(type_oid: u32) -> bool {
259    element_oid(type_oid).is_some()
260}
261
262/// Get a human-readable name for a type OID.
263#[must_use]
264pub const fn type_name(type_oid: u32) -> &'static str {
265    match type_oid {
266        BOOL => "bool",
267        BYTEA => "bytea",
268        CHAR => "char",
269        NAME => "name",
270        INT8 => "int8",
271        INT2 => "int2",
272        INT4 => "int4",
273        TEXT => "text",
274        OID => "oid",
275        XID => "xid",
276        CID => "cid",
277        JSON => "json",
278        XML => "xml",
279        FLOAT4 => "float4",
280        FLOAT8 => "float8",
281        MONEY => "money",
282        MACADDR => "macaddr",
283        CIDR => "cidr",
284        INET => "inet",
285        VARCHAR => "varchar",
286        BPCHAR => "bpchar",
287        DATE => "date",
288        TIME => "time",
289        TIMESTAMP => "timestamp",
290        TIMESTAMPTZ => "timestamptz",
291        INTERVAL => "interval",
292        TIMETZ => "timetz",
293        BIT => "bit",
294        VARBIT => "varbit",
295        NUMERIC => "numeric",
296        UUID => "uuid",
297        JSONB => "jsonb",
298        INT4RANGE => "int4range",
299        INT8RANGE => "int8range",
300        NUMRANGE => "numrange",
301        TSRANGE => "tsrange",
302        TSTZRANGE => "tstzrange",
303        DATERANGE => "daterange",
304        BOOL_ARRAY => "bool[]",
305        BYTEA_ARRAY => "bytea[]",
306        CHAR_ARRAY => "char[]",
307        NAME_ARRAY => "name[]",
308        INT2_ARRAY => "int2[]",
309        INT4_ARRAY => "int4[]",
310        TEXT_ARRAY => "text[]",
311        VARCHAR_ARRAY => "varchar[]",
312        INT8_ARRAY => "int8[]",
313        FLOAT4_ARRAY => "float4[]",
314        FLOAT8_ARRAY => "float8[]",
315        OID_ARRAY => "oid[]",
316        TIMESTAMP_ARRAY => "timestamp[]",
317        DATE_ARRAY => "date[]",
318        TIME_ARRAY => "time[]",
319        TIMESTAMPTZ_ARRAY => "timestamptz[]",
320        INTERVAL_ARRAY => "interval[]",
321        NUMERIC_ARRAY => "numeric[]",
322        UUID_ARRAY => "uuid[]",
323        JSON_ARRAY => "json[]",
324        JSONB_ARRAY => "jsonb[]",
325        UNKNOWN => "unknown",
326        VOID => "void",
327        _ => "unknown",
328    }
329}
330
331#[cfg(test)]
332mod tests {
333    use super::*;
334
335    #[test]
336    fn test_element_oid_mapping() {
337        assert_eq!(element_oid(INT4_ARRAY), Some(INT4));
338        assert_eq!(element_oid(TEXT_ARRAY), Some(TEXT));
339        assert_eq!(element_oid(UUID_ARRAY), Some(UUID));
340        assert_eq!(element_oid(INT4), None);
341    }
342
343    #[test]
344    fn test_array_oid_mapping() {
345        assert_eq!(array_oid(INT4), Some(INT4_ARRAY));
346        assert_eq!(array_oid(TEXT), Some(TEXT_ARRAY));
347        assert_eq!(array_oid(UUID), Some(UUID_ARRAY));
348        assert_eq!(array_oid(UNKNOWN), None);
349    }
350
351    #[test]
352    fn test_is_array() {
353        assert!(is_array(INT4_ARRAY));
354        assert!(is_array(TEXT_ARRAY));
355        assert!(!is_array(INT4));
356        assert!(!is_array(TEXT));
357    }
358
359    #[test]
360    fn test_type_names() {
361        assert_eq!(type_name(INT4), "int4");
362        assert_eq!(type_name(TEXT), "text");
363        assert_eq!(type_name(INT4_ARRAY), "int4[]");
364        assert_eq!(type_name(999_999), "unknown");
365    }
366}