nodedb_sql/resolver/expr/
value.rs1use sqlparser::ast::Value;
4
5use crate::error::{Result, SqlError};
6use crate::types::*;
7
8pub fn convert_value(val: &Value) -> Result<SqlValue> {
15 match val {
16 Value::Number(n, _) => {
17 if let Ok(i) = n.parse::<i64>() {
18 Ok(SqlValue::Int(i))
19 } else if n.contains('.') || n.contains('e') || n.contains('E') {
20 if let Ok(d) = rust_decimal::Decimal::from_str_exact(n) {
22 Ok(SqlValue::Decimal(d))
23 } else if let Ok(f) = n.parse::<f64>() {
24 Ok(SqlValue::Float(f))
25 } else {
26 Ok(SqlValue::String(n.clone()))
27 }
28 } else if let Ok(f) = n.parse::<f64>() {
29 Ok(SqlValue::Float(f))
30 } else {
31 Ok(SqlValue::String(n.clone()))
32 }
33 }
34 Value::SingleQuotedString(s) => Ok(SqlValue::String(s.clone())),
35 Value::Boolean(b) => Ok(SqlValue::Bool(*b)),
36 Value::Null => Ok(SqlValue::Null),
37 _ => Err(SqlError::Unsupported {
38 detail: format!("value literal: {val}"),
39 }),
40 }
41}
42
43pub(super) fn parse_interval_to_micros(s: &str) -> Option<i64> {
48 let s = s.trim();
49 if s.is_empty() {
50 return None;
51 }
52
53 if let Some(dur) = nodedb_types::NdbDuration::parse(s) {
55 return Some(dur.micros);
56 }
57
58 if let Ok(ms) = nodedb_types::kv_parsing::parse_interval_to_ms(s) {
60 return Some(ms as i64 * 1000); }
62
63 None
64}