Skip to content

Commit 8365d96

Browse files
authored
bump sqllogictest to 0.9.0 (#4547)
* bump sqllogictest to 0.9.0 * cargo update datafusion-cli * fix clippy * fix Cargo.lock * fix test case
1 parent f2eb3b2 commit 8365d96

File tree

8 files changed

+304
-280
lines changed

8 files changed

+304
-280
lines changed

datafusion-cli/Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ doc-comment = "0.3"
109109
env_logger = "0.10"
110110
parquet-test-utils = { path = "../../parquet-test-utils" }
111111
rstest = "0.16.0"
112-
sqllogictest = "0.8.0"
112+
sqllogictest = "0.9.0"
113113
sqlparser = "0.27"
114114
test-utils = { path = "../../test-utils" }
115115

datafusion/core/tests/sqllogictests/src/insert/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ use datafusion::prelude::SessionContext;
2525
use datafusion_common::{DFSchema, DataFusionError};
2626
use datafusion_expr::Expr as DFExpr;
2727
use datafusion_sql::planner::{object_name_to_table_reference, PlannerContext, SqlToRel};
28+
use sqllogictest::DBOutput;
2829
use sqlparser::ast::{Expr, SetExpr, Statement as SQLStatement};
2930
use std::sync::Arc;
3031

31-
pub async fn insert(ctx: &SessionContext, insert_stmt: SQLStatement) -> Result<String> {
32+
pub async fn insert(ctx: &SessionContext, insert_stmt: SQLStatement) -> Result<DBOutput> {
3233
// First, use sqlparser to get table name and insert values
3334
let table_reference;
3435
let insert_values: Vec<Vec<Expr>>;
@@ -60,6 +61,7 @@ pub async fn insert(ctx: &SessionContext, insert_stmt: SQLStatement) -> Result<S
6061
// Third, transfer insert values to `RecordBatch`
6162
// Attention: schema info can be ignored. (insert values don't contain schema info)
6263
let sql_to_rel = SqlToRel::new(&LogicTestContextProvider {});
64+
let num_rows = insert_values.len();
6365
for row in insert_values.into_iter() {
6466
let logical_exprs = row
6567
.into_iter()
@@ -85,5 +87,5 @@ pub async fn insert(ctx: &SessionContext, insert_stmt: SQLStatement) -> Result<S
8587
let new_provider = MemTable::try_new(schema, vec![origin_batches])?;
8688
ctx.register_table(&table_reference, Arc::new(new_provider))?;
8789

88-
Ok("".to_string())
90+
Ok(DBOutput::StatementComplete(num_rows as u64))
8991
}

datafusion/core/tests/sqllogictests/src/main.rs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use datafusion::prelude::{SessionConfig, SessionContext};
2222
use datafusion_sql::parser::{DFParser, Statement};
2323
use log::info;
2424
use normalize::normalize_batch;
25+
use sqllogictest::{ColumnType, DBOutput};
2526
use sqlparser::ast::Statement as SQLStatement;
2627
use std::path::{Path, PathBuf};
2728
use std::time::Duration;
@@ -46,7 +47,7 @@ pub struct DataFusion {
4647
impl sqllogictest::AsyncDB for DataFusion {
4748
type Error = DFSqlLogicTestError;
4849

49-
async fn run(&mut self, sql: &str) -> Result<String> {
50+
async fn run(&mut self, sql: &str) -> Result<DBOutput> {
5051
println!("[{}] Running query: \"{}\"", self.file_name, sql);
5152
let result = run_query(&self.ctx, sql).await?;
5253
Ok(result)
@@ -172,19 +173,42 @@ async fn context_for_test_file(file_name: &str) -> SessionContext {
172173
}
173174
}
174175

175-
fn format_batches(batches: Vec<RecordBatch>) -> Result<String> {
176+
fn convert_batches(batches: Vec<RecordBatch>) -> Result<DBOutput> {
176177
let mut bytes = vec![];
178+
if batches.is_empty() {
179+
return Ok(DBOutput::StatementComplete(0));
180+
}
181+
// TODO: use the actual types
182+
let types = vec![ColumnType::Any; batches[0].num_columns()];
183+
177184
{
178-
let builder = WriterBuilder::new().has_headers(false).with_delimiter(b' ');
185+
let builder = WriterBuilder::new()
186+
.has_headers(false)
187+
.with_delimiter(b'\t');
179188
let mut writer = builder.build(&mut bytes);
180189
for batch in batches {
181190
writer.write(&normalize_batch(batch)).unwrap();
182191
}
183192
}
184-
Ok(String::from_utf8(bytes).unwrap())
193+
let res = String::from_utf8(bytes).unwrap();
194+
let rows = res
195+
.lines()
196+
.map(|s| {
197+
s.split('\t')
198+
.map(|s| {
199+
if s.is_empty() {
200+
"NULL".to_string()
201+
} else {
202+
s.to_string()
203+
}
204+
})
205+
.collect()
206+
})
207+
.collect();
208+
Ok(DBOutput::Rows { types, rows })
185209
}
186210

187-
async fn run_query(ctx: &SessionContext, sql: impl Into<String>) -> Result<String> {
211+
async fn run_query(ctx: &SessionContext, sql: impl Into<String>) -> Result<DBOutput> {
188212
let sql = sql.into();
189213
// Check if the sql is `insert`
190214
if let Ok(mut statements) = DFParser::parse_sql(&sql) {
@@ -198,6 +222,6 @@ async fn run_query(ctx: &SessionContext, sql: impl Into<String>) -> Result<Strin
198222
}
199223
let df = ctx.sql(sql.as_str()).await?;
200224
let results: Vec<RecordBatch> = df.collect().await?;
201-
let formatted_batches = format_batches(results)?;
225+
let formatted_batches = convert_batches(results)?;
202226
Ok(formatted_batches)
203227
}

datafusion/core/tests/sqllogictests/src/normalize.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@ use arrow::{
2929
///
3030
/// This is to make the output comparable to the semi-standard .slt format
3131
///
32-
/// Normalizations applied:
33-
/// 1. Null Values (TODO)
34-
/// 2. [Empty Strings]
32+
/// Normalizations applied to [NULL Values and empty strings]
3533
///
36-
/// [Empty Strings]: https://duckdb.org/dev/sqllogictest/result_verification#null-values-and-empty-strings
34+
/// [NULL Values and empty strings]: https://duckdb.org/dev/sqllogictest/result_verification#null-values-and-empty-strings
3735
pub fn normalize_batch(batch: RecordBatch) -> RecordBatch {
3836
let new_columns = batch
3937
.columns()

0 commit comments

Comments
 (0)