Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Vec<String>> {
/// Parse query file content into individual statements.
/// Handles both SQL (semicolon-separated) and PRQL (single query) files.
fn parse_query_file(content: &str) -> Result<Vec<String>> {
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<Vec<String>> {
use datafusion::sql::sqlparser::dialect::GenericDialect;
use datafusion::sql::sqlparser::parser::Parser;

Expand Down Expand Up @@ -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(());
};
Expand Down