pub const BOOL: u32 = 16;
pub const BYTEA: u32 = 17;
pub const CHAR: u32 = 18;
pub const NAME: u32 = 19;
pub const INT8: u32 = 20;
pub const INT2: u32 = 21;
pub const INT4: u32 = 23;
pub const TEXT: u32 = 25;
pub const OID: u32 = 26;
pub const XID: u32 = 28;
pub const CID: u32 = 29;
pub const JSON: u32 = 114;
pub const XML: u32 = 142;
pub const FLOAT4: u32 = 700;
pub const FLOAT8: u32 = 701;
pub const MONEY: u32 = 790;
pub const MACADDR: u32 = 829;
pub const CIDR: u32 = 650;
pub const INET: u32 = 869;
pub const VARCHAR: u32 = 1043;
pub const BPCHAR: u32 = 1042;
pub const DATE: u32 = 1082;
pub const TIME: u32 = 1083;
pub const TIMESTAMP: u32 = 1114;
pub const TIMESTAMPTZ: u32 = 1184;
pub const INTERVAL: u32 = 1186;
pub const TIMETZ: u32 = 1266;
pub const BIT: u32 = 1560;
pub const VARBIT: u32 = 1562;
pub const NUMERIC: u32 = 1700;
pub const UUID: u32 = 2950;
pub const JSONB: u32 = 3802;
pub const INT4RANGE: u32 = 3904;
pub const INT8RANGE: u32 = 3926;
pub const NUMRANGE: u32 = 3906;
pub const TSRANGE: u32 = 3908;
pub const TSTZRANGE: u32 = 3910;
pub const DATERANGE: u32 = 3912;
pub const BOOL_ARRAY: u32 = 1000;
pub const BYTEA_ARRAY: u32 = 1001;
pub const CHAR_ARRAY: u32 = 1002;
pub const NAME_ARRAY: u32 = 1003;
pub const INT2_ARRAY: u32 = 1005;
pub const INT4_ARRAY: u32 = 1007;
pub const TEXT_ARRAY: u32 = 1009;
pub const VARCHAR_ARRAY: u32 = 1015;
pub const INT8_ARRAY: u32 = 1016;
pub const FLOAT4_ARRAY: u32 = 1021;
pub const FLOAT8_ARRAY: u32 = 1022;
pub const OID_ARRAY: u32 = 1028;
pub const TIMESTAMP_ARRAY: u32 = 1115;
pub const DATE_ARRAY: u32 = 1182;
pub const TIME_ARRAY: u32 = 1183;
pub const TIMESTAMPTZ_ARRAY: u32 = 1185;
pub const INTERVAL_ARRAY: u32 = 1187;
pub const NUMERIC_ARRAY: u32 = 1231;
pub const UUID_ARRAY: u32 = 2951;
pub const JSON_ARRAY: u32 = 199;
pub const JSONB_ARRAY: u32 = 3807;
pub const UNKNOWN: u32 = 705;
pub const VOID: u32 = 2278;
#[must_use]
pub const fn element_oid(array_oid: u32) -> Option<u32> {
match array_oid {
BOOL_ARRAY => Some(BOOL),
BYTEA_ARRAY => Some(BYTEA),
CHAR_ARRAY => Some(CHAR),
NAME_ARRAY => Some(NAME),
INT2_ARRAY => Some(INT2),
INT4_ARRAY => Some(INT4),
TEXT_ARRAY => Some(TEXT),
VARCHAR_ARRAY => Some(VARCHAR),
INT8_ARRAY => Some(INT8),
FLOAT4_ARRAY => Some(FLOAT4),
FLOAT8_ARRAY => Some(FLOAT8),
OID_ARRAY => Some(OID),
TIMESTAMP_ARRAY => Some(TIMESTAMP),
DATE_ARRAY => Some(DATE),
TIME_ARRAY => Some(TIME),
TIMESTAMPTZ_ARRAY => Some(TIMESTAMPTZ),
INTERVAL_ARRAY => Some(INTERVAL),
NUMERIC_ARRAY => Some(NUMERIC),
UUID_ARRAY => Some(UUID),
JSON_ARRAY => Some(JSON),
JSONB_ARRAY => Some(JSONB),
_ => None,
}
}
#[must_use]
pub const fn array_oid(element_oid: u32) -> Option<u32> {
match element_oid {
BOOL => Some(BOOL_ARRAY),
BYTEA => Some(BYTEA_ARRAY),
CHAR => Some(CHAR_ARRAY),
NAME => Some(NAME_ARRAY),
INT2 => Some(INT2_ARRAY),
INT4 => Some(INT4_ARRAY),
TEXT => Some(TEXT_ARRAY),
VARCHAR => Some(VARCHAR_ARRAY),
INT8 => Some(INT8_ARRAY),
FLOAT4 => Some(FLOAT4_ARRAY),
FLOAT8 => Some(FLOAT8_ARRAY),
OID => Some(OID_ARRAY),
TIMESTAMP => Some(TIMESTAMP_ARRAY),
DATE => Some(DATE_ARRAY),
TIME => Some(TIME_ARRAY),
TIMESTAMPTZ => Some(TIMESTAMPTZ_ARRAY),
INTERVAL => Some(INTERVAL_ARRAY),
NUMERIC => Some(NUMERIC_ARRAY),
UUID => Some(UUID_ARRAY),
JSON => Some(JSON_ARRAY),
JSONB => Some(JSONB_ARRAY),
_ => None,
}
}
#[must_use]
pub const fn is_array(type_oid: u32) -> bool {
element_oid(type_oid).is_some()
}
#[must_use]
pub const fn type_name(type_oid: u32) -> &'static str {
match type_oid {
BOOL => "bool",
BYTEA => "bytea",
CHAR => "char",
NAME => "name",
INT8 => "int8",
INT2 => "int2",
INT4 => "int4",
TEXT => "text",
OID => "oid",
XID => "xid",
CID => "cid",
JSON => "json",
XML => "xml",
FLOAT4 => "float4",
FLOAT8 => "float8",
MONEY => "money",
MACADDR => "macaddr",
CIDR => "cidr",
INET => "inet",
VARCHAR => "varchar",
BPCHAR => "bpchar",
DATE => "date",
TIME => "time",
TIMESTAMP => "timestamp",
TIMESTAMPTZ => "timestamptz",
INTERVAL => "interval",
TIMETZ => "timetz",
BIT => "bit",
VARBIT => "varbit",
NUMERIC => "numeric",
UUID => "uuid",
JSONB => "jsonb",
INT4RANGE => "int4range",
INT8RANGE => "int8range",
NUMRANGE => "numrange",
TSRANGE => "tsrange",
TSTZRANGE => "tstzrange",
DATERANGE => "daterange",
BOOL_ARRAY => "bool[]",
BYTEA_ARRAY => "bytea[]",
CHAR_ARRAY => "char[]",
NAME_ARRAY => "name[]",
INT2_ARRAY => "int2[]",
INT4_ARRAY => "int4[]",
TEXT_ARRAY => "text[]",
VARCHAR_ARRAY => "varchar[]",
INT8_ARRAY => "int8[]",
FLOAT4_ARRAY => "float4[]",
FLOAT8_ARRAY => "float8[]",
OID_ARRAY => "oid[]",
TIMESTAMP_ARRAY => "timestamp[]",
DATE_ARRAY => "date[]",
TIME_ARRAY => "time[]",
TIMESTAMPTZ_ARRAY => "timestamptz[]",
INTERVAL_ARRAY => "interval[]",
NUMERIC_ARRAY => "numeric[]",
UUID_ARRAY => "uuid[]",
JSON_ARRAY => "json[]",
JSONB_ARRAY => "jsonb[]",
UNKNOWN => "unknown",
VOID => "void",
_ => "unknown",
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_element_oid_mapping() {
assert_eq!(element_oid(INT4_ARRAY), Some(INT4));
assert_eq!(element_oid(TEXT_ARRAY), Some(TEXT));
assert_eq!(element_oid(UUID_ARRAY), Some(UUID));
assert_eq!(element_oid(INT4), None);
}
#[test]
fn test_array_oid_mapping() {
assert_eq!(array_oid(INT4), Some(INT4_ARRAY));
assert_eq!(array_oid(TEXT), Some(TEXT_ARRAY));
assert_eq!(array_oid(UUID), Some(UUID_ARRAY));
assert_eq!(array_oid(UNKNOWN), None);
}
#[test]
fn test_is_array() {
assert!(is_array(INT4_ARRAY));
assert!(is_array(TEXT_ARRAY));
assert!(!is_array(INT4));
assert!(!is_array(TEXT));
}
#[test]
fn test_type_names() {
assert_eq!(type_name(INT4), "int4");
assert_eq!(type_name(TEXT), "text");
assert_eq!(type_name(INT4_ARRAY), "int4[]");
assert_eq!(type_name(999_999), "unknown");
}
}