Skip to main content

uqa_sql/ast/
ranges.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Declared subtype identity for `PostgreSQL`'s built-in range families.
8
9use serde::{Deserialize, Serialize};
10
11use super::ColumnType;
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
14pub enum RangeSubtype {
15    Integer,
16    BigInteger,
17    Numeric,
18    Date,
19    Timestamp,
20    TimestampTz,
21}
22
23impl RangeSubtype {
24    #[must_use]
25    pub const fn range_name(self) -> &'static str {
26        match self {
27            Self::Integer => "int4range",
28            Self::BigInteger => "int8range",
29            Self::Numeric => "numrange",
30            Self::Date => "daterange",
31            Self::Timestamp => "tsrange",
32            Self::TimestampTz => "tstzrange",
33        }
34    }
35
36    #[must_use]
37    pub const fn multirange_name(self) -> &'static str {
38        match self {
39            Self::Integer => "int4multirange",
40            Self::BigInteger => "int8multirange",
41            Self::Numeric => "nummultirange",
42            Self::Date => "datemultirange",
43            Self::Timestamp => "tsmultirange",
44            Self::TimestampTz => "tstzmultirange",
45        }
46    }
47
48    #[must_use]
49    pub const fn scalar_type(self) -> ColumnType {
50        match self {
51            Self::Integer => ColumnType::Integer,
52            Self::BigInteger => ColumnType::BigInteger,
53            Self::Numeric => ColumnType::Numeric {
54                precision: None,
55                scale: None,
56            },
57            Self::Date => ColumnType::Date,
58            Self::Timestamp => ColumnType::Timestamp,
59            Self::TimestampTz => ColumnType::TimestampTz,
60        }
61    }
62}