Convert a SQL literal expression to a Paimon Datum.
(expr: &SqlExpr, data_type: &PaimonDataType)
| 1837 | |
| 1838 | /// Convert a SQL literal expression to a Paimon Datum. |
| 1839 | fn 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 | |
| 1882 | fn parse_number_datum(n: &str, data_type: &PaimonDataType, negate: bool) -> DFResult<Datum> { |
| 1883 | let s: String = if negate { |
no test coverage detected