diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 16021912bd..e9f85b7763 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,7 +30,8 @@ repos: (?x)^( tutorials/.*\.ipynb| docs/.*\.ipynb| - docs/source/user_guide/fotw/data/ + docs/source/user_guide/fotw/data/| + .*\.jsonl )$ args: - --autofix diff --git a/src/daft-sql/src/planner.rs b/src/daft-sql/src/planner.rs index cf869bc839..87c725e0c4 100644 --- a/src/daft-sql/src/planner.rs +++ b/src/daft-sql/src/planner.rs @@ -1,6 +1,7 @@ use std::{ cell::{Ref, RefCell, RefMut}, collections::{HashMap, HashSet}, + path::Path, rc::Rc, sync::Arc, }; @@ -21,10 +22,11 @@ use daft_functions::{ use daft_logical_plan::{LogicalPlanBuilder, LogicalPlanRef}; use sqlparser::{ ast::{ - ArrayElemTypeDef, BinaryOperator, CastKind, ColumnDef, DateTimeField, Distinct, - ExactNumberInfo, ExcludeSelectItem, GroupByExpr, Ident, ObjectName, Query, SelectItem, - SetExpr, Statement, StructField, Subscript, TableAlias, TableWithJoins, TimezoneInfo, - UnaryOperator, Value, WildcardAdditionalOptions, With, + self, ArrayElemTypeDef, BinaryOperator, CastKind, ColumnDef, DateTimeField, Distinct, + ExactNumberInfo, ExcludeSelectItem, FunctionArg, FunctionArgExpr, GroupByExpr, Ident, + ObjectName, Query, SelectItem, SetExpr, Statement, StructField, Subscript, TableAlias, + TableFunctionArgs, TableWithJoins, TimezoneInfo, UnaryOperator, Value, + WildcardAdditionalOptions, With, }, dialect::GenericDialect, parser::{Parser, ParserOptions}, @@ -1056,9 +1058,24 @@ impl<'a> SQLPlanner<'a> { } } - /// Plan a `FROM 'path/to/file.extension'` table factor. - fn plan_relation_path(&self, _name: &ObjectName) -> SQLPlannerResult { - unsupported_sql_err!("Unsupported table factor: Path") + /// Plan a `FROM ` table factor by rewriting to relevant table-value function. + fn plan_relation_path(&self, name: &ObjectName) -> SQLPlannerResult { + let path = name.to_string(); + let path = &path[1..path.len() - 1]; // strip single-quotes ' ' + let func = match Path::new(path).extension() { + Some(ext) if ext.eq_ignore_ascii_case("csv") => "read_csv", + Some(ext) if ext.eq_ignore_ascii_case("json") => "read_json", + Some(ext) if ext.eq_ignore_ascii_case("parquet") => "read_parquet", + Some(_) => invalid_operation_err!("unsupported file path extension: {}", name), + None => invalid_operation_err!("unsupported file path, no extension: {}", name), + }; + let args = TableFunctionArgs { + args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr( + ast::Expr::Value(Value::SingleQuotedString(path.to_string())), + ))], + settings: None, + }; + self.plan_table_function(func, &args) } /// Plan a `FROM ` table factor. @@ -2280,8 +2297,9 @@ fn unresolve_alias(expr: ExprRef, projection: &[ExprRef]) -> SQLPlannerResult