Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 43 additions & 34 deletions crates/duckdb/src/core/logical_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,40 +70,41 @@ pub enum LogicalTypeId {
TimestampTZ = DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_TZ,
}

impl From<u32> for LogicalTypeId {
/// Convert from u32 to LogicalTypeId
fn from(value: u32) -> Self {
impl TryFrom<u32> for LogicalTypeId {
type Error = String;

fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
DUCKDB_TYPE_DUCKDB_TYPE_BOOLEAN => Self::Boolean,
DUCKDB_TYPE_DUCKDB_TYPE_TINYINT => Self::Tinyint,
DUCKDB_TYPE_DUCKDB_TYPE_SMALLINT => Self::Smallint,
DUCKDB_TYPE_DUCKDB_TYPE_INTEGER => Self::Integer,
DUCKDB_TYPE_DUCKDB_TYPE_BIGINT => Self::Bigint,
DUCKDB_TYPE_DUCKDB_TYPE_UTINYINT => Self::UTinyint,
DUCKDB_TYPE_DUCKDB_TYPE_USMALLINT => Self::USmallint,
DUCKDB_TYPE_DUCKDB_TYPE_UINTEGER => Self::UInteger,
DUCKDB_TYPE_DUCKDB_TYPE_UBIGINT => Self::UBigint,
DUCKDB_TYPE_DUCKDB_TYPE_FLOAT => Self::Float,
DUCKDB_TYPE_DUCKDB_TYPE_DOUBLE => Self::Double,
DUCKDB_TYPE_DUCKDB_TYPE_VARCHAR => Self::Varchar,
DUCKDB_TYPE_DUCKDB_TYPE_BLOB => Self::Blob,
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP => Self::Timestamp,
DUCKDB_TYPE_DUCKDB_TYPE_DATE => Self::Date,
DUCKDB_TYPE_DUCKDB_TYPE_TIME => Self::Time,
DUCKDB_TYPE_DUCKDB_TYPE_INTERVAL => Self::Interval,
DUCKDB_TYPE_DUCKDB_TYPE_HUGEINT => Self::Hugeint,
DUCKDB_TYPE_DUCKDB_TYPE_DECIMAL => Self::Decimal,
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_S => Self::TimestampS,
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_MS => Self::TimestampMs,
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_NS => Self::TimestampNs,
DUCKDB_TYPE_DUCKDB_TYPE_ENUM => Self::Enum,
DUCKDB_TYPE_DUCKDB_TYPE_LIST => Self::List,
DUCKDB_TYPE_DUCKDB_TYPE_STRUCT => Self::Struct,
DUCKDB_TYPE_DUCKDB_TYPE_MAP => Self::Map,
DUCKDB_TYPE_DUCKDB_TYPE_UUID => Self::Uuid,
DUCKDB_TYPE_DUCKDB_TYPE_UNION => Self::Union,
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_TZ => Self::TimestampTZ,
_ => panic!(),
DUCKDB_TYPE_DUCKDB_TYPE_BOOLEAN => Ok(Self::Boolean),
DUCKDB_TYPE_DUCKDB_TYPE_TINYINT => Ok(Self::Tinyint),
DUCKDB_TYPE_DUCKDB_TYPE_SMALLINT => Ok(Self::Smallint),
DUCKDB_TYPE_DUCKDB_TYPE_INTEGER => Ok(Self::Integer),
DUCKDB_TYPE_DUCKDB_TYPE_BIGINT => Ok(Self::Bigint),
DUCKDB_TYPE_DUCKDB_TYPE_UTINYINT => Ok(Self::UTinyint),
DUCKDB_TYPE_DUCKDB_TYPE_USMALLINT => Ok(Self::USmallint),
DUCKDB_TYPE_DUCKDB_TYPE_UINTEGER => Ok(Self::UInteger),
DUCKDB_TYPE_DUCKDB_TYPE_UBIGINT => Ok(Self::UBigint),
DUCKDB_TYPE_DUCKDB_TYPE_FLOAT => Ok(Self::Float),
DUCKDB_TYPE_DUCKDB_TYPE_DOUBLE => Ok(Self::Double),
DUCKDB_TYPE_DUCKDB_TYPE_VARCHAR => Ok(Self::Varchar),
DUCKDB_TYPE_DUCKDB_TYPE_BLOB => Ok(Self::Blob),
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP => Ok(Self::Timestamp),
DUCKDB_TYPE_DUCKDB_TYPE_DATE => Ok(Self::Date),
DUCKDB_TYPE_DUCKDB_TYPE_TIME => Ok(Self::Time),
DUCKDB_TYPE_DUCKDB_TYPE_INTERVAL => Ok(Self::Interval),
DUCKDB_TYPE_DUCKDB_TYPE_HUGEINT => Ok(Self::Hugeint),
DUCKDB_TYPE_DUCKDB_TYPE_DECIMAL => Ok(Self::Decimal),
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_S => Ok(Self::TimestampS),
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_MS => Ok(Self::TimestampMs),
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_NS => Ok(Self::TimestampNs),
DUCKDB_TYPE_DUCKDB_TYPE_ENUM => Ok(Self::Enum),
DUCKDB_TYPE_DUCKDB_TYPE_LIST => Ok(Self::List),
DUCKDB_TYPE_DUCKDB_TYPE_STRUCT => Ok(Self::Struct),
DUCKDB_TYPE_DUCKDB_TYPE_MAP => Ok(Self::Map),
DUCKDB_TYPE_DUCKDB_TYPE_UUID => Ok(Self::Uuid),
DUCKDB_TYPE_DUCKDB_TYPE_UNION => Ok(Self::Union),
DUCKDB_TYPE_DUCKDB_TYPE_TIMESTAMP_TZ => Ok(Self::TimestampTZ),
_ => Err(format!("invalid logical type id: {}", value).into()),
}
}
}
Expand Down Expand Up @@ -246,10 +247,18 @@ impl LogicalTypeHandle {
}
}

/// is invalid
pub fn is_invalid(&self) -> bool {
let duckdb_type_id = unsafe { duckdb_get_type_id(self.ptr) };
TryInto::<LogicalTypeId>::try_into(duckdb_type_id).is_err()
}

/// Logical type ID
pub fn id(&self) -> LogicalTypeId {
let duckdb_type_id = unsafe { duckdb_get_type_id(self.ptr) };
duckdb_type_id.into()
duckdb_type_id
.try_into()
.unwrap_or_else(|_| panic!("invalid logical type id: {duckdb_type_id}"))
}

/// Logical type children num
Expand Down