use std::hash::{Hash, Hasher};
use crate::sql_value::SqlValue;
impl Hash for SqlValue {
fn hash<H: Hasher>(&self, state: &mut H) {
use SqlValue::*;
std::mem::discriminant(self).hash(state);
match self {
Integer(i) => i.hash(state),
Smallint(i) => i.hash(state),
Bigint(i) => i.hash(state),
Unsigned(u) => u.hash(state),
Numeric(f) => {
if f.is_nan() {
f64::NAN.to_bits().hash(state);
} else {
f.to_bits().hash(state);
}
}
Float(f) => {
if f.is_nan() {
f32::NAN.to_bits().hash(state);
} else {
f.to_bits().hash(state);
}
}
Real(f) => {
if f.is_nan() {
f32::NAN.to_bits().hash(state);
} else {
f.to_bits().hash(state);
}
}
Double(f) => {
if f.is_nan() {
f64::NAN.to_bits().hash(state);
} else {
f.to_bits().hash(state);
}
}
Character(s) => s.hash(state),
Varchar(s) => s.hash(state),
Boolean(b) => b.hash(state),
Date(s) => s.hash(state),
Time(s) => s.hash(state),
Timestamp(s) => s.hash(state),
Interval(s) => s.hash(state),
Vector(v) => {
for f in v.iter() {
if f.is_nan() {
f32::NAN.to_bits().hash(state);
} else {
f.to_bits().hash(state);
}
}
}
Blob(b) => b.hash(state),
Null => {}
}
}
}