From b75c43781d8a946719f5424f41f31533e2e9f117 Mon Sep 17 00:00:00 2001 From: Nikolay Denev Date: Sat, 17 Jan 2026 14:44:20 -0600 Subject: [PATCH] Fix prql queries form file --- src/main.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5478f3d..e502619 100644 --- a/src/main.rs +++ b/src/main.rs @@ -125,9 +125,24 @@ async fn main() -> Result<()> { run_interactive(&args).await } -/// Parse SQL file content into individual statements using sqlparser. -/// Returns statements as strings, preserving the original SQL text. -fn parse_sql_file(content: &str) -> Result> { +/// Parse query file content into individual statements. +/// Handles both SQL (semicolon-separated) and PRQL (single query) files. +fn parse_query_file(content: &str) -> Result> { + use datafusion_integration::prql::is_prql; + + // Check if content looks like PRQL + if is_prql(content) { + // PRQL: treat entire file as single query + // (PRQL doesn't use semicolons as statement separators) + Ok(vec![content.to_string()]) + } else { + // SQL: parse with sqlparser to split on semicolons + parse_sql_statements(content) + } +} + +/// Parse SQL content into individual statements using sqlparser. +fn parse_sql_statements(content: &str) -> Result> { use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; @@ -156,7 +171,7 @@ async fn run_batch(args: &Args) -> Result<()> { vec![query.clone()] } else if let Some(file) = &args.file { let content = std::fs::read_to_string(file)?; - parse_sql_file(&content)? + parse_query_file(&content)? } else { return Ok(()); };