extern crate firn;
use anyhow::Result;
use arrow::util::pretty::pretty_format_batches;
use firn::{QueryData, SnowflakeApi};
const SQL: &str = "\
SELECT 1 AS a;
SELECT 'two' AS b, ? AS bind;
SELECT seq4() AS n FROM TABLE(GENERATOR(ROWCOUNT => 5));";
#[tokio::main]
async fn main() -> Result<()> {
let _ = dotenvy::dotenv();
pretty_env_logger::init();
let api = SnowflakeApi::from_env()?;
let results = api
.query(SQL)
.bind("hello from bind 1")
.execute_multi()
.await?;
println!("got {} child result(s)\n", results.len());
for (i, r) in results.iter().enumerate() {
println!("--- statement {i} ---");
println!(
"query_id = {}, rows = {}",
r.metadata.query_id,
r.metadata.total_rows.unwrap_or(0)
);
match &r.data {
QueryData::Arrow(batches) => {
if let Some(first) = batches.first() {
println!("{}", pretty_format_batches(std::slice::from_ref(first))?);
} else {
println!("(no batches)");
}
}
QueryData::Json(j) => println!("json: {j}"),
QueryData::Empty => println!("(empty)"),
}
println!();
}
let strict = api
.query(SQL)
.bind("strict-mode bind")
.execute_multi_exact(3)
.await?;
println!("strict mode returned {} result(s)", strict.len());
Ok(())
}