MCPcopy Create free account
hub / github.com/apache/paimon-rust / sql_expr_to_datum

Function sql_expr_to_datum

crates/integrations/datafusion/src/sql_context.rs:1839–1880  ·  view source on GitHub ↗

Convert a SQL literal expression to a Paimon Datum.

(expr: &SqlExpr, data_type: &PaimonDataType)

Source from the content-addressed store, hash-verified

1837
1838/// Convert a SQL literal expression to a Paimon Datum.
1839fn sql_expr_to_datum(expr: &SqlExpr, data_type: &PaimonDataType) -> DFResult<Datum> {
1840 let (value, negate) = match expr {
1841 SqlExpr::Value(v) => (&v.value, false),
1842 SqlExpr::UnaryOp {
1843 op: datafusion::sql::sqlparser::ast::UnaryOperator::Minus,
1844 expr: inner,
1845 } => {
1846 if let SqlExpr::Value(v) = inner.as_ref() {
1847 (&v.value, true)
1848 } else {
1849 return Err(DataFusionError::Plan(format!(
1850 "Unsupported partition value expression: {expr}"
1851 )));
1852 }
1853 }
1854 other => {
1855 return Err(DataFusionError::Plan(format!(
1856 "Unsupported partition value expression: {other}"
1857 )))
1858 }
1859 };
1860
1861 match (value, data_type) {
1862 (SqlValue::Number(n, _), _) => parse_number_datum(n, data_type, negate),
1863 (SqlValue::SingleQuotedString(s), PaimonDataType::VarChar(_)) if !negate => {
1864 Ok(Datum::String(s.clone()))
1865 }
1866 (SqlValue::SingleQuotedString(s), PaimonDataType::Date(_)) if !negate => {
1867 let date = chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d")
1868 .map_err(|e| DataFusionError::Plan(format!("Invalid DATE '{s}': {e}")))?;
1869 let epoch = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
1870 Ok(Datum::Date((date - epoch).num_days() as i32))
1871 }
1872 (SqlValue::Boolean(b), PaimonDataType::Boolean(_)) if !negate => Ok(Datum::Bool(*b)),
1873 _ if negate => Err(DataFusionError::Plan(format!(
1874 "Cannot negate value for type {data_type:?}"
1875 ))),
1876 _ => Err(DataFusionError::Plan(format!(
1877 "Cannot convert {value} to {data_type:?}"
1878 ))),
1879 }
1880}
1881
1882fn parse_number_datum(n: &str, data_type: &PaimonDataType, negate: bool) -> DFResult<Datum> {
1883 let s: String = if negate {

Callers 2

parse_partition_valuesFunction · 0.85
parse_static_partitionsFunction · 0.85

Calls 3

parse_number_datumFunction · 0.85
DateTypeAlias · 0.85
PlanClass · 0.50

Tested by

no test coverage detected