From c5171b50f126a0b8b65fbe01a4b1c7520a2c9006 Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Sat, 11 Feb 2023 14:08:47 +0100 Subject: [PATCH 1/7] [sqllogictest] Define output types and check them in tests --- datafusion/core/tests/sqllogictests/README.md | 11 +- .../src/engines/datafusion/create_table.rs | 3 +- .../src/engines/datafusion/insert.rs | 3 +- .../src/engines/datafusion/mod.rs | 2 +- .../src/engines/datafusion/normalize.rs | 39 +++- .../tests/sqllogictests/src/engines/mod.rs | 1 + .../tests/sqllogictests/src/engines/output.rs | 57 ++++++ .../sqllogictests/src/engines/postgres/mod.rs | 150 ++++++++------- .../core/tests/sqllogictests/src/main.rs | 3 +- .../core/tests/sqllogictests/src/output.rs | 26 --- .../sqllogictests/test_files/aggregate.slt | 180 +++++++++--------- .../sqllogictests/test_files/arrow_typeof.slt | 12 +- .../tests/sqllogictests/test_files/dates.slt | 10 +- .../tests/sqllogictests/test_files/ddl.slt | 34 ++-- .../sqllogictests/test_files/decimal.slt | 102 +++++----- .../sqllogictests/test_files/describe.slt | 4 +- .../test_files/information_schema.slt | 41 ++-- .../tests/sqllogictests/test_files/join.slt | 4 +- .../tests/sqllogictests/test_files/misc.slt | 4 +- .../tests/sqllogictests/test_files/nullif.slt | 16 +- .../tests/sqllogictests/test_files/order.slt | 35 ++-- .../test_files/pg_compat/pg_compat_simple.slt | 14 +- .../pg_compat/pg_compat_type_coercion.slt | 126 +----------- .../test_files/pg_compat/pg_compat_types.slt | 24 +-- .../test_files/pg_compat/pg_compat_union.slt | 4 +- .../test_files/pg_compat/pg_compat_window.slt | 13 +- .../sqllogictests/test_files/prepare.slt | 2 +- .../tests/sqllogictests/test_files/select.slt | 9 +- .../sqllogictests/test_files/strings.slt | 10 +- .../sqllogictests/test_files/subquery.slt | 4 +- .../sqllogictests/test_files/timestamps.slt | 16 +- .../tests/sqllogictests/test_files/tpch.slt | 59 +++--- .../tests/sqllogictests/test_files/union.slt | 8 +- 33 files changed, 492 insertions(+), 534 deletions(-) create mode 100644 datafusion/core/tests/sqllogictests/src/engines/output.rs delete mode 100644 datafusion/core/tests/sqllogictests/src/output.rs diff --git a/datafusion/core/tests/sqllogictests/README.md b/datafusion/core/tests/sqllogictests/README.md index afd6f7d3c150f..3d56e41fa258f 100644 --- a/datafusion/core/tests/sqllogictests/README.md +++ b/datafusion/core/tests/sqllogictests/README.md @@ -105,10 +105,13 @@ query - `test_name`: Uniquely identify the test name (arrow-datafusion only) - `type_string`: A short string that specifies the number of result columns and the expected datatype of each result column. There is one character in the for each result column. The characters codes are: - - "T" for a text result, - - "I" for an integer result, - - "R" for a floating-point result, - - "?" for any other type. + - 'B' - **B**oolean, + - 'D' - **D**atetime, + - 'I' - **I**nteger, + - 'F' - **F**loating-point results, + - 'S' - **S**string, + - 'T' - **T**imestamp, + - "?" - any other types - `expected_result`: In the results section, some values are converted according to some rules: - floating point values are rounded to the scale of "12", - NULL values are rendered as `NULL`, diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs index b891ab8c8b6db..981dd75b56d7a 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs @@ -16,8 +16,9 @@ // under the License. use super::error::Result; +use crate::engines::datafusion::error::DFSqlLogicTestError; use crate::engines::datafusion::util::LogicTestContextProvider; -use crate::{engines::datafusion::error::DFSqlLogicTestError, output::DFOutput}; +use crate::engines::output::DFOutput; use datafusion::datasource::MemTable; use datafusion::prelude::SessionContext; use datafusion_common::{DataFusionError, OwnedTableReference}; diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs index cb8e15591d249..a8fca3b16c06d 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs @@ -16,7 +16,8 @@ // under the License. use super::error::Result; -use crate::{engines::datafusion::util::LogicTestContextProvider, output::DFOutput}; +use crate::engines::datafusion::util::LogicTestContextProvider; +use crate::engines::output::DFOutput; use arrow::record_batch::RecordBatch; use datafusion::datasource::MemTable; use datafusion::prelude::SessionContext; diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs index 918419370ffbb..db9410db61f60 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs @@ -18,7 +18,7 @@ use std::path::PathBuf; use std::time::Duration; -use crate::output::{DFColumnType, DFOutput}; +use crate::engines::output::{DFColumnType, DFOutput}; use self::error::{DFSqlLogicTestError, Result}; use async_trait::async_trait; diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs index 601033e6ac3c8..cb4f2bcfaaf9e 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs @@ -15,11 +15,12 @@ // specific language governing permissions and limitations // under the License. +use arrow::datatypes::SchemaRef; use arrow::{array, array::ArrayRef, datatypes::DataType, record_batch::RecordBatch}; use datafusion::error::DataFusionError; use sqllogictest::DBOutput; -use crate::output::{DFColumnType, DFOutput}; +use crate::engines::output::{DFColumnType, DFOutput}; use super::super::conversion::*; use super::error::{DFSqlLogicTestError, Result}; @@ -35,10 +36,7 @@ pub fn convert_batches(batches: Vec) -> Result { } let schema = batches[0].schema(); - - // TODO: report the the actual types of the result - // https://github.com/apache/arrow-datafusion/issues/4499 - let types = vec![DFColumnType::Any; batches[0].num_columns()]; + let types = convert_schema_to_types(&schema); let mut rows = vec![]; for batch in batches { @@ -125,3 +123,34 @@ pub fn cell_to_string(col: &ArrayRef, row: usize) -> Result { .map_err(DFSqlLogicTestError::Arrow) } } + +fn convert_schema_to_types(schema: &SchemaRef) -> Vec { + schema + .fields() + .iter() + .map(|f| f.data_type()) + .map(|data_type| match data_type { + DataType::Boolean => DFColumnType::Boolean, + DataType::Int8 + | DataType::Int16 + | DataType::Int32 + | DataType::Int64 + | DataType::UInt8 + | DataType::UInt16 + | DataType::UInt32 + | DataType::UInt64 => DFColumnType::Integer, + DataType::Float16 + | DataType::Float32 + | DataType::Float64 + | DataType::Decimal128(_, _) + | DataType::Decimal256(_, _) => DFColumnType::FloatingPoint, + DataType::Utf8 | DataType::LargeUtf8 => DFColumnType::String, + DataType::Date32 + | DataType::Date64 + | DataType::Time32(_) + | DataType::Time64(_) => DFColumnType::DateTime, + DataType::Timestamp(_, _) => DFColumnType::Timestamp, + _ => DFColumnType::Another, + }) + .collect() +} diff --git a/datafusion/core/tests/sqllogictests/src/engines/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/mod.rs index 2d05e5d584a09..a2657bb60017b 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/mod.rs @@ -17,4 +17,5 @@ mod conversion; pub mod datafusion; +mod output; pub mod postgres; diff --git a/datafusion/core/tests/sqllogictests/src/engines/output.rs b/datafusion/core/tests/sqllogictests/src/engines/output.rs new file mode 100644 index 0000000000000..4e3575fe13989 --- /dev/null +++ b/datafusion/core/tests/sqllogictests/src/engines/output.rs @@ -0,0 +1,57 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use sqllogictest::{ColumnType, DBOutput}; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum DFColumnType { + Boolean, + DateTime, + Integer, + FloatingPoint, + String, + Timestamp, + Another, +} + +impl ColumnType for DFColumnType { + fn from_char(value: char) -> Option { + match value { + 'B' => Some(Self::Boolean), + 'D' => Some(Self::DateTime), + 'I' => Some(Self::Integer), + 'F' => Some(Self::FloatingPoint), + 'S' => Some(Self::String), + 'T' => Some(Self::Timestamp), + _ => Some(Self::Another), + } + } + + fn to_char(&self) -> char { + match self { + Self::Boolean => 'B', + Self::DateTime => 'D', + Self::Integer => 'I', + Self::FloatingPoint => 'F', + Self::String => 'S', + Self::Timestamp => 'T', + Self::Another => '?', + } + } +} + +pub type DFOutput = DBOutput; diff --git a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs index 5284111887fe6..f483a61f0851b 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs @@ -25,9 +25,8 @@ use log::debug; use sqllogictest::DBOutput; use tokio::task::JoinHandle; -use crate::output::{DFColumnType, DFOutput}; - use super::conversion::*; +use crate::engines::output::{DFColumnType, DFOutput}; use chrono::{NaiveDate, NaiveDateTime, NaiveTime}; use postgres_types::Type; use rust_decimal::Decimal; @@ -212,55 +211,15 @@ impl Drop for Postgres { } } -macro_rules! make_string { - ($row:ident, $idx:ident, $t:ty) => {{ - let value: Option<$t> = $row.get($idx); - match value { - Some(value) => value.to_string(), - None => NULL_STR.to_string(), - } - }}; - ($row:ident, $idx:ident, $t:ty, $convert:ident) => {{ - let value: Option<$t> = $row.get($idx); - match value { - Some(value) => $convert(value).to_string(), - None => NULL_STR.to_string(), - } - }}; -} - -fn cell_to_string(row: &Row, column: &Column, idx: usize) -> String { - match column.type_().clone() { - Type::CHAR => make_string!(row, idx, i8), - Type::INT2 => make_string!(row, idx, i16), - Type::INT4 => make_string!(row, idx, i32), - Type::INT8 => make_string!(row, idx, i64), - Type::NUMERIC => make_string!(row, idx, Decimal, decimal_to_str), - Type::DATE => make_string!(row, idx, NaiveDate), - Type::TIME => make_string!(row, idx, NaiveTime), - Type::TIMESTAMP => { - let value: Option = row.get(idx); - value - .map(|d| format!("{d:?}")) - .unwrap_or_else(|| "NULL".to_string()) - } - Type::BOOL => make_string!(row, idx, bool, bool_to_str), - Type::BPCHAR | Type::VARCHAR | Type::TEXT => { - make_string!(row, idx, &str, varchar_to_str) - } - Type::FLOAT4 => make_string!(row, idx, f32, f32_to_str), - Type::FLOAT8 => make_string!(row, idx, f64, f64_to_str), - Type::REGTYPE => make_string!(row, idx, PgRegtype), - _ => unimplemented!("Unsupported type: {}", column.type_().name()), - } -} - #[async_trait] impl sqllogictest::AsyncDB for Postgres { type Error = Error; type ColumnType = DFColumnType; - async fn run(&mut self, sql: &str) -> Result { + async fn run( + &mut self, + sql: &str, + ) -> Result, Self::Error> { println!( "[{}] Running query: \"{}\"", self.relative_path.display(), @@ -290,27 +249,20 @@ impl sqllogictest::AsyncDB for Postgres { return Ok(DBOutput::StatementComplete(0)); } let rows = self.client.query(sql, &[]).await?; - let output = rows - .iter() - .map(|row| { - row.columns() - .iter() - .enumerate() - .map(|(idx, column)| cell_to_string(row, column, idx)) - .collect::>() - }) - .collect::>(); - if output.is_empty() { - let stmt = self.client.prepare(sql).await?; - Ok(DBOutput::Rows { - types: vec![DFColumnType::Any; stmt.columns().len()], - rows: vec![], - }) + if rows.is_empty() { + return Ok(DBOutput::StatementComplete(0)); } else { + let types = convert_types( + rows[0] + .columns() + .iter() + .map(|c| c.type_().clone()) + .collect(), + ); Ok(DBOutput::Rows { - types: vec![DFColumnType::Any; output[0].len()], - rows: output, + types, + rows: convert_rows(rows), }) } } @@ -319,3 +271,73 @@ impl sqllogictest::AsyncDB for Postgres { "postgres" } } + +fn convert_rows(rows: Vec) -> Vec> { + rows.iter() + .map(|row| { + row.columns() + .iter() + .enumerate() + .map(|(idx, column)| cell_to_string(row, column, idx)) + .collect::>() + }) + .collect::>() +} + +macro_rules! make_string { + ($row:ident, $idx:ident, $t:ty) => {{ + let value: Option<$t> = $row.get($idx); + match value { + Some(value) => value.to_string(), + None => NULL_STR.to_string(), + } + }}; + ($row:ident, $idx:ident, $t:ty, $convert:ident) => {{ + let value: Option<$t> = $row.get($idx); + match value { + Some(value) => $convert(value).to_string(), + None => NULL_STR.to_string(), + } + }}; +} + +fn cell_to_string(row: &Row, column: &Column, idx: usize) -> String { + match column.type_().clone() { + Type::CHAR => make_string!(row, idx, i8), + Type::INT2 => make_string!(row, idx, i16), + Type::INT4 => make_string!(row, idx, i32), + Type::INT8 => make_string!(row, idx, i64), + Type::NUMERIC => make_string!(row, idx, Decimal, decimal_to_str), + Type::DATE => make_string!(row, idx, NaiveDate), + Type::TIME => make_string!(row, idx, NaiveTime), + Type::TIMESTAMP => { + let value: Option = row.get(idx); + value + .map(|d| format!("{d:?}")) + .unwrap_or_else(|| "NULL".to_string()) + } + Type::BOOL => make_string!(row, idx, bool, bool_to_str), + Type::BPCHAR | Type::VARCHAR | Type::TEXT => { + make_string!(row, idx, &str, varchar_to_str) + } + Type::FLOAT4 => make_string!(row, idx, f32, f32_to_str), + Type::FLOAT8 => make_string!(row, idx, f64, f64_to_str), + Type::REGTYPE => make_string!(row, idx, PgRegtype), + _ => unimplemented!("Unsupported type: {}", column.type_().name()), + } +} + +fn convert_types(types: Vec) -> Vec { + types + .into_iter() + .map(|t| match t { + Type::BOOL => DFColumnType::Boolean, + Type::INT2 | Type::INT4 | Type::INT8 => DFColumnType::Integer, + Type::BPCHAR | Type::VARCHAR | Type::TEXT => DFColumnType::String, + Type::FLOAT4 | Type::FLOAT8 | Type::NUMERIC => DFColumnType::FloatingPoint, + Type::DATE | Type::TIME => DFColumnType::DateTime, + Type::TIMESTAMP => DFColumnType::Timestamp, + _ => DFColumnType::Another, + }) + .collect() +} diff --git a/datafusion/core/tests/sqllogictests/src/main.rs b/datafusion/core/tests/sqllogictests/src/main.rs index 430d4b496660f..07d44e1187eef 100644 --- a/datafusion/core/tests/sqllogictests/src/main.rs +++ b/datafusion/core/tests/sqllogictests/src/main.rs @@ -19,6 +19,7 @@ use std::error::Error; use std::path::{Path, PathBuf}; use log::info; +use sqllogictest::strict_column_validator; use datafusion::prelude::{SessionConfig, SessionContext}; @@ -26,7 +27,6 @@ use crate::engines::datafusion::DataFusion; use crate::engines::postgres::Postgres; mod engines; -mod output; mod setup; mod utils; @@ -68,6 +68,7 @@ async fn run_test_file( info!("Running with DataFusion runner: {}", path.display()); let ctx = context_for_test_file(&relative_path).await; let mut runner = sqllogictest::Runner::new(DataFusion::new(ctx, relative_path)); + runner.with_column_validator(strict_column_validator); runner.run_file_async(path).await?; Ok(()) } diff --git a/datafusion/core/tests/sqllogictests/src/output.rs b/datafusion/core/tests/sqllogictests/src/output.rs deleted file mode 100644 index 26d26eabaad10..0000000000000 --- a/datafusion/core/tests/sqllogictests/src/output.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -use sqllogictest::{DBOutput, DefaultColumnType}; - -pub type DFColumnType = DefaultColumnType; - -/// The output type fed to the sqllogictest Runner -/// -/// See for -/// potentially more full featured support. -pub type DFOutput = DBOutput; diff --git a/datafusion/core/tests/sqllogictests/test_files/aggregate.slt b/datafusion/core/tests/sqllogictests/test_files/aggregate.slt index 2b280a5c85244..e1a1ae6e61dae 100644 --- a/datafusion/core/tests/sqllogictests/test_files/aggregate.slt +++ b/datafusion/core/tests/sqllogictests/test_files/aggregate.slt @@ -76,37 +76,37 @@ SELECT array_agg(c13 LIMIT 1) FROM aggregate_test_100 # csv_query_avg_multi_batch # csv_query_avg -query R +query F SELECT avg(c12) FROM aggregate_test_100 ---- 0.508972509913 # csv_query_covariance_1 -query R +query F SELECT covar_pop(c2, c12) FROM aggregate_test_100 ---- -0.079169322354 # csv_query_covariance_2 -query R +query F SELECT covar(c2, c12) FROM aggregate_test_100 ---- -0.079969012479 # single_row_query_covar_1 -query R +query F select covar_samp(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- NULL # single_row_query_covar_2 -query R +query F select covar_pop(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- 0 # all_nulls_query_covar -query R +query FF with data as ( select null::int as f, null::int as b union all @@ -118,7 +118,7 @@ from data NULL NULL # covar_query_with_nulls -query R +query FF with data as ( select 1 as f, 4 as b union all @@ -138,19 +138,19 @@ from data 1 0.666666666667 # csv_query_correlation -query R +query F SELECT corr(c2, c12) FROM aggregate_test_100 ---- -0.190645441906 # single_row_query_correlation -query R +query F select corr(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- 0 # all_nulls_query_correlation -query R +query F with data as ( select null::int as f, null::int as b union all @@ -162,7 +162,7 @@ from data NULL # correlation_query_with_nulls -query R +query F with data as ( select 1 as f, 4 as b union all @@ -182,67 +182,67 @@ from data 1 # csv_query_variance_1 -query R +query F SELECT var_pop(c2) FROM aggregate_test_100 ---- 1.8675 # csv_query_variance_2 -query R +query F SELECT var_pop(c6) FROM aggregate_test_100 ---- 26156334342021890000000000000000000000 # csv_query_variance_3 -query R +query F SELECT var_pop(c12) FROM aggregate_test_100 ---- 0.092342237216 # csv_query_variance_4 -query R +query F SELECT var(c2) FROM aggregate_test_100 ---- 1.886363636364 # csv_query_variance_5 -query R +query F SELECT var_samp(c2) FROM aggregate_test_100 ---- 1.886363636364 # csv_query_stddev_1 -query R +query F SELECT stddev_pop(c2) FROM aggregate_test_100 ---- 1.366565036872 # csv_query_stddev_2 -query R +query F SELECT stddev_pop(c6) FROM aggregate_test_100 ---- 5114326382039172000 # csv_query_stddev_3 -query R +query F SELECT stddev_pop(c12) FROM aggregate_test_100 ---- 0.303878655413 # csv_query_stddev_4 -query R +query F SELECT stddev(c12) FROM aggregate_test_100 ---- 0.305409539941 # csv_query_stddev_5 -query R +query F SELECT stddev_samp(c12) FROM aggregate_test_100 ---- 0.305409539941 # csv_query_stddev_6 -query R +query F select stddev(sq.column1) from (values (1.1), (2.0), (3.0)) as sq ---- 0.950438495292 @@ -260,7 +260,7 @@ SELECT approx_median(c6) FROM aggregate_test_100 1146409980542786560 # csv_query_approx_median_3 -query R +query F SELECT approx_median(c12) FROM aggregate_test_100 ---- 0.555006541052 @@ -278,7 +278,7 @@ SELECT median(c6) FROM aggregate_test_100 1125553990140691277 # csv_query_median_3 -query R +query F SELECT median(c12) FROM aggregate_test_100 ---- 0.551390054439 @@ -332,25 +332,25 @@ SELECT median(a) FROM median_u64 50 # median_f32 -query R +query F SELECT median(a) FROM median_f32 ---- 3.3 # median_f64 -query R +query F SELECT median(a) FROM median_f64 ---- 3.3 # median_f64_nan -query T +query F SELECT median(a) FROM median_f64_nan ---- NaN # approx_median_f64_nan -query T +query F SELECT approx_median(a) FROM median_f64_nan ---- NaN @@ -365,13 +365,13 @@ create table cpu (host string, usage float) as select * from (values ('host1', 90.4) ); -query CI rowsort +query SF rowsort select host, median(usage) from cpu group by host; ---- host0 90.1 host1 90.3 -query CI +query F select median(usage) from cpu; ---- 90.2 @@ -395,7 +395,7 @@ create table cpu (host string, usage float) as select * from (values ('host1', 89.3) ); -query CI rowsort +query SF rowsort select host, median(usage) from cpu group by host; ---- host0 90.2 @@ -410,7 +410,7 @@ drop table cpu; statement ok create table cpu (host string, usage float) as select * from (values ('host0', 90.2), ('host1', 90.1), ('host1', 90.5), ('host0', 90.5), ('host1', 90.0), ('host1', 90.3), ('host1', 90.2), ('host1', 90.3)); -query CI rowsort +query SF rowsort select host, median(usage) from cpu group by host; ---- host0 90.35 @@ -499,167 +499,167 @@ SELECT approx_distinct(c9) AS a, approx_distinct(c9) AS b FROM aggregate_test_10 ## float values. #csv_query_approx_percentile_cont (c2) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c2, 0.1) AS DOUBLE) / 1.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c2, 0.5) AS DOUBLE) / 3.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c2, 0.9) AS DOUBLE) / 5.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c3) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c3, 0.1) AS DOUBLE) / -95.3) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c3, 0.5) AS DOUBLE) / 15.5) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c3, 0.9) AS DOUBLE) / 102.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c4) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c4, 0.1) AS DOUBLE) / -22925.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c4, 0.5) AS DOUBLE) / 4599.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c4, 0.9) AS DOUBLE) / 25334.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c5) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c5, 0.1) AS DOUBLE) / -1882606710.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c5, 0.5) AS DOUBLE) / 377164262.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c5, 0.9) AS DOUBLE) / 1991374996.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c6) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c6, 0.1) AS DOUBLE) / -7250000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c6, 0.5) AS DOUBLE) / 1130000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c6, 0.9) AS DOUBLE) / 7370000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c7) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c7, 0.1) AS DOUBLE) / 18.9) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c7, 0.5) AS DOUBLE) / 134.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c7, 0.9) AS DOUBLE) / 231.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c8) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c8, 0.1) AS DOUBLE) / 2671.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c8, 0.5) AS DOUBLE) / 30634.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c8, 0.9) AS DOUBLE) / 57518.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c9) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c9, 0.1) AS DOUBLE) / 472608672.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c9, 0.5) AS DOUBLE) / 2365817608.0) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c9, 0.9) AS DOUBLE) / 3776538487.0) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c10) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c10, 0.1) AS DOUBLE) / 1830000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c10, 0.5) AS DOUBLE) / 9300000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c10, 0.9) AS DOUBLE) / 16100000000000000000) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_approx_percentile_cont (c11) -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c11, 0.1) AS DOUBLE) / 0.109) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c11, 0.5) AS DOUBLE) / 0.491) < 0.05) AS q FROM aggregate_test_100 ---- true -query T +query B SELECT (ABS(1 - CAST(approx_percentile_cont(c11, 0.9) AS DOUBLE) / 0.834) < 0.05) AS q FROM aggregate_test_100 ---- true # csv_query_cube_avg -query TIR +query SIF SELECT c1, c2, AVG(c3) FROM aggregate_test_100_by_sql GROUP BY CUBE (c1, c2) ORDER BY c1, c2 ---- a 1 -17.6 @@ -700,7 +700,7 @@ NULL 5 -13.857142857143 NULL NULL 7.81 # csv_query_rollup_avg -query TIIR +query SIIF SELECT c1, c2, c3, AVG(c4) FROM aggregate_test_100_by_sql WHERE c1 IN ('a', 'b', NULL) GROUP BY ROLLUP (c1, c2, c3) ORDER BY c1, c2, c3 ---- a 1 -85 -15154 @@ -757,7 +757,7 @@ b NULL NULL 7732.315789473684 NULL NULL NULL 3833.525 # csv_query_approx_percentile_cont_with_weight -query TI +query SI SELECT c1, approx_percentile_cont(c3, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -767,7 +767,7 @@ d 124 e 115 # csv_query_approx_percentile_cont_with_weight (2) -query TI +query SI SELECT c1, approx_percentile_cont_with_weight(c3, 1, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -777,7 +777,7 @@ d 124 e 115 # csv_query_approx_percentile_cont_with_histogram_bins -query TI +query SI SELECT c1, approx_percentile_cont(c3, 0.95, 200) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -786,7 +786,7 @@ c 122 d 124 e 115 -query TI +query SI SELECT c1, approx_percentile_cont_with_weight(c3, c2, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 74 @@ -796,7 +796,7 @@ d 124 e 115 # csv_query_sum_crossjoin -query TTI +query SSI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY a.c1, b.c1 ORDER BY a.c1, b.c1 ---- a a 1260 @@ -826,7 +826,7 @@ e d 1134 e e 1323 # csv_query_cube_sum_crossjoin -query TTI +query SSI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY CUBE (a.c1, b.c1) ORDER BY a.c1, b.c1 ---- a a 1260 @@ -867,7 +867,7 @@ NULL e 5985 NULL NULL 28500 # csv_query_cube_distinct_count -query TII +query SII SELECT c1, c2, COUNT(DISTINCT c3) FROM aggregate_test_100 GROUP BY CUBE (c1,c2) ORDER BY c1,c2 ---- a 1 5 @@ -908,7 +908,7 @@ NULL 5 14 NULL NULL 80 # csv_query_rollup_distinct_count -query TII +query SII SELECT c1, c2, COUNT(DISTINCT c3) FROM aggregate_test_100 GROUP BY ROLLUP (c1,c2) ORDER BY c1,c2 ---- a 1 5 @@ -944,7 +944,7 @@ e NULL 18 NULL NULL 80 # csv_query_rollup_sum_crossjoin -query TTI +query SSI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY ROLLUP (a.c1, b.c1) ORDER BY a.c1, b.c1 ---- a a 1260 @@ -986,25 +986,25 @@ SELECT count(1 + 1) 1 # csv_query_array_agg -query T +query ? SELECT array_agg(c13) FROM (SELECT * FROM aggregate_test_100 ORDER BY c13 LIMIT 2) test ---- [0VVIHzxWtNOFLtnhjHEKjXaJOSLJfm, 0keZ5G8BffGwgF2RwQD59TFzMStxCB] # csv_query_array_agg_empty -query I +query ? SELECT array_agg(c13) FROM (SELECT * FROM aggregate_test_100 LIMIT 0) test ---- [] # csv_query_array_agg_one -query I +query ? SELECT array_agg(c13) FROM (SELECT * FROM aggregate_test_100 ORDER BY c13 LIMIT 1) test ---- [0VVIHzxWtNOFLtnhjHEKjXaJOSLJfm] # csv_query_array_agg_with_overflow -query IIRIII +query IIFIII select c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count(c3) count_c3 from aggregate_test_100 group by c2 order by c2 ---- 1 367 16.681818181818 125 -99 22 @@ -1018,7 +1018,7 @@ select c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count # SELECT array_agg(c13 ORDER BY c1) FROM aggregate_test_100; # csv_query_array_cube_agg_with_overflow -query TIIRIII +query SIIFIII select c1, c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count(c3) count_c3 from aggregate_test_100 group by CUBE (c1,c2) order by c1, c2 ---- a 1 -88 -17.6 83 -85 5 @@ -1095,33 +1095,33 @@ NULL NULL 781 7.81 125 -117 100 # TODO: aggregate_timestamps_avg # aggregate_time_min_and_max -query TT +query SS select min(t), max(t) from (select '00:00:00' as t union select '00:00:01' union select '00:00:02') ---- 00:00:00 00:00:02 # aggregate_decimal_min -query R +query F select min(c1) from d_table ---- -100.009 # aggregate_decimal_max -query R +query F select max(c1) from d_table ---- 110.009 # FIX: doesn't check datatype # aggregate_decimal_sum -query R +query F select sum(c1) from d_table ---- 100 # FIX: doesn't check datatype # aggregate_decimal_avg -query R +query F select avg(c1) from d_table ---- 5 @@ -1168,7 +1168,7 @@ select avg(c1) from d_table # TODO: simple_mean # query_sum_distinct - 2 different aggregate functions: avg and sum(distinct) -query RI +query FI SELECT AVG(c1), SUM(DISTINCT c2) FROM test ---- 1.75 3 @@ -1206,7 +1206,7 @@ SELECT COUNT(DISTINCT c1) FROM test # [[1]] # test_approx_percentile_cont_decimal_support -query TI +query SI SELECT c1, approx_percentile_cont(c2, cast(0.85 as decimal(10,2))) apc FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 4 @@ -1218,25 +1218,25 @@ e 4 # array_agg_zero -query U +query ? SELECT ARRAY_AGG([]); ---- [] # array_agg_one -query U +query ? SELECT ARRAY_AGG([1]); ---- [[1]] # variance_single_value -query RRRR +query FFFF select var(sq.column1), var_pop(sq.column1), stddev(sq.column1), stddev_pop(sq.column1) from (values (1.0)) as sq; ---- NULL 0 NULL 0 # variance_two_values -query RRRR +query FFFF select var(sq.column1), var_pop(sq.column1), stddev(sq.column1), stddev_pop(sq.column1) from (values (1.0), (3.0)) as sq; ---- 2 1 1.414213562373 1 @@ -1261,7 +1261,7 @@ NULL 1 NULL 2 # avg should be null -query II +query FI SELECT avg(column1), column2 from the_nulls group by column2 order by column2; ---- NULL 1 diff --git a/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt b/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt index 8f1c006510f68..d9dbb99520ce5 100644 --- a/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt +++ b/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt @@ -16,37 +16,37 @@ # under the License. # arrow_typeof_null -query T +query S SELECT arrow_typeof(null) ---- Null # arrow_typeof_boolean -query T +query S SELECT arrow_typeof(true) ---- Boolean # arrow_typeof_i64 -query T +query S SELECT arrow_typeof(1) ---- Int64 # arrow_typeof_i32 -query T +query S SELECT arrow_typeof(1::int) ---- Int32 # arrow_typeof_f64 -query T +query S SELECT arrow_typeof(1.0) ---- Float64 # arrow_typeof_f32 -query T +query S SELECT arrow_typeof(1.0::float) ---- Float32 diff --git a/datafusion/core/tests/sqllogictests/test_files/dates.slt b/datafusion/core/tests/sqllogictests/test_files/dates.slt index f66fd9eeb4da4..3c777a9bc363b 100644 --- a/datafusion/core/tests/sqllogictests/test_files/dates.slt +++ b/datafusion/core/tests/sqllogictests/test_files/dates.slt @@ -38,7 +38,7 @@ CREATE TABLE test( ; -query C rowsort +query S rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '1 days'; @@ -50,7 +50,7 @@ f g h -query C rowsort +query S rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days'; @@ -59,7 +59,7 @@ g h # date and other predicate -query C rowsort +query S rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days' AND i_item_desc != 'g'; @@ -67,7 +67,7 @@ where d3_date > d2_date + INTERVAL '5 days' AND i_item_desc != 'g'; h # swap predicate order -query C rowsort +query S rowsort select i_item_desc from test where i_item_desc != 'g' AND d3_date > d2_date + INTERVAL '5 days'; @@ -75,7 +75,7 @@ where i_item_desc != 'g' AND d3_date > d2_date + INTERVAL '5 days'; h ## Use OR -query C rowsort +query S rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days' OR d3_date = d2_date + INTERVAL '3 days'; diff --git a/datafusion/core/tests/sqllogictests/test_files/ddl.slt b/datafusion/core/tests/sqllogictests/test_files/ddl.slt index e59971ee9ec7c..85319c4281358 100644 --- a/datafusion/core/tests/sqllogictests/test_files/ddl.slt +++ b/datafusion/core/tests/sqllogictests/test_files/ddl.slt @@ -209,7 +209,7 @@ CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as statement ok CREATE TABLE my_table AS SELECT * FROM aggregate_simple -query II rowsort +query FFB rowsort SELECT * FROM my_table order by c1 LIMIT 1 ---- 0.00001 0.000000000001 true @@ -234,7 +234,7 @@ DROP TABLE non_existent_table; statement ok CREATE TABLE my_table(c1 float, c2 double, c3 boolean, c4 varchar) AS SELECT *,c3 as c4_tmp FROM aggregate_simple; -query II rowsort +query FFBS rowsort SELECT * FROM my_table order by c1 LIMIT 1 ---- 0.00001 0.000000000001 true 1 @@ -254,7 +254,7 @@ CREATE TABLE my_table(c1 float, c2 double, c3 boolean, c4 varchar) AS SELECT * F statement ok CREATE TABLE my_table(c1 int, c2 float, c3 varchar) AS VALUES(1, 2, 'hello') -query II rowsort +query IFS rowsort SELECT * FROM my_table; ---- 1 2 hello @@ -326,7 +326,7 @@ STORED AS CSV WITH HEADER ROW LOCATION '../../testing/data/csv/aggregate_test_100.csv'; -query IIIIIIIIIIIII +query SIIIIIIIIIFFS SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, 10, c11, c12, c13 FROM aggregate_test_100 LIMIT 1; ---- c 2 1 18109 2033001162 -6513304855495910254 25 43062 1491205016 10 0.110830784 0.929409733247 6WfVFBVGJSQb7FhA7E0lBwdvjfZnSW @@ -340,7 +340,7 @@ name VARCHAR, ts TIMESTAMP ) STORED AS CSV LOCATION 'tests/data/timestamps.csv'; -query CC +query ST SELECT * from csv_with_timestamps ---- Jorge 2018-12-13T12:12:10.011 @@ -366,7 +366,7 @@ STORED AS CSV PARTITIONED BY (c_date) LOCATION 'tests/data/partitioned_table'; -query CCC +query ST? SELECT * from csv_with_timestamps where c_date='2018-11-13' ---- Jorge 2018-12-13T12:12:10.011 2018-11-13 @@ -406,12 +406,12 @@ statement ok CREATE EXTERNAL TABLE aggregate_simple STORED AS CSV WITH HEADER ROW DELIMITER '|' LOCATION 'tests/data/aggregate_simple_pipe.csv'; -query CCC +query FFB SELECT * FROM aggregate_simple order by c1 LIMIT 1; ---- 0.00001 0.000000000001 true -query CCC +query FFB SELECT * FROM aggregate_simple order by c1 DESC LIMIT 1; ---- 0.00005 0.000000000005 true @@ -474,13 +474,13 @@ statement ok CREATE OR REPLACE TABLE TABLE_WITH_NORMALIZATION(FIELD1 BIGINT, FIELD2 BIGINT); # Check table name is in lowercase -query CCCC +query SSSS show create table table_with_normalization ---- datafusion public table_with_normalization NULL # Check column name is in uppercase -query CCC +query SSS describe table_with_normalization ---- field1 Int64 NO @@ -494,24 +494,24 @@ statement ok CREATE TABLE TABLE_WITHOUT_NORMALIZATION(FIELD1 BIGINT, FIELD2 BIGINT) AS VALUES (1,2); # Check table name is in uppercase -query CCCC +query SSSS show create table TABLE_WITHOUT_NORMALIZATION ---- datafusion public TABLE_WITHOUT_NORMALIZATION NULL # Check column name is in uppercase -query CCC +query SSS describe TABLE_WITHOUT_NORMALIZATION ---- FIELD1 Int64 YES FIELD2 Int64 YES -query R +query F select 10000000000000000000.01 ---- 10000000000000000000 -query C +query S select arrow_typeof(10000000000000000000.01) ---- Float64 @@ -519,12 +519,12 @@ Float64 statement ok set datafusion.sql_parser.parse_float_as_decimal = true; -query R +query F select 10000000000000000000.01 ---- 10000000000000000000.01 -query C +query S select arrow_typeof(10000000000000000000.01) ---- Decimal128(22, 2) @@ -534,4 +534,4 @@ statement ok set datafusion.sql_parser.parse_float_as_decimal = false; statement ok -set datafusion.sql_parser.enable_ident_normalization = true; \ No newline at end of file +set datafusion.sql_parser.enable_ident_normalization = true; diff --git a/datafusion/core/tests/sqllogictests/test_files/decimal.slt b/datafusion/core/tests/sqllogictests/test_files/decimal.slt index 10c11f574de24..917abebc9237d 100644 --- a/datafusion/core/tests/sqllogictests/test_files/decimal.slt +++ b/datafusion/core/tests/sqllogictests/test_files/decimal.slt @@ -15,27 +15,27 @@ # specific language governing permissions and limitations # under the License. -query ?R +query SF select arrow_typeof(cast(1.23 as decimal(10,4))), cast(1.23 as decimal(10,4)); ---- Decimal128(10, 4) 1.23 -query ?R +query SF select arrow_typeof(cast(cast(1.23 as decimal(10,3)) as decimal(10,4))), cast(cast(1.23 as decimal(10,3)) as decimal(10,4)); ---- Decimal128(10, 4) 1.23 -query ?R +query SF select arrow_typeof(cast(1.2345 as decimal(24,2))), cast(1.2345 as decimal(24,2)); ---- Decimal128(24, 2) 1.23 -query ok +statement ok CREATE EXTERNAL TABLE decimal_simple ( c1 DECIMAL(10,6) NOT NULL, c2 DOUBLE NOT NULL, @@ -48,13 +48,13 @@ WITH HEADER ROW LOCATION 'tests/data/decimal_data.csv'; -query ?? +query SS select arrow_typeof(c1), arrow_typeof(c5) from decimal_simple where c1 > c5 limit 1; ---- Decimal128(10, 6) Decimal128(12, 7) -query R rowsort +query F rowsort SELECT c1 from decimal_simple; ---- 0.00001 @@ -74,7 +74,7 @@ SELECT c1 from decimal_simple; 0.00005 -query R rowsort +query F rowsort select c1 from decimal_simple where c1 > 0.000030; ---- 0.00004 @@ -88,7 +88,7 @@ select c1 from decimal_simple where c1 > 0.000030; 0.00005 -query RRI?R rowsort +query FFIBF rowsort select * from decimal_simple where c1 > c5; ---- 0.00002 0.000000000002 3 false 0.000019 @@ -96,13 +96,13 @@ select * from decimal_simple where c1 > c5; 0.00005 0.000000000005 8 false 0.000033 -query ?R +query SF select arrow_typeof(min(c1)), min(c1) from decimal_simple where c4=false; ---- Decimal128(10, 6) 0.00002 -query ?R +query SF select arrow_typeof(max(c1)), max(c1) from decimal_simple where c4=false; ---- Decimal128(10, 6) 0.00005 @@ -110,7 +110,7 @@ Decimal128(10, 6) 0.00005 # inferred precision is 10+10 # inferred scale is the original scale -query R +query SF select arrow_typeof(sum(c1)), sum(c1) from decimal_simple; ---- Decimal128(20, 6) 0.00055 @@ -118,20 +118,20 @@ Decimal128(20, 6) 0.00055 # inferred precision is original precision + 4 # inferred scale is the original scale + 4 -query ?R +query SF select arrow_typeof(avg(c1)), avg(c1) from decimal_simple; ---- Decimal128(14, 10) 0.0000366666 -query RRI?R rowsort +query FFIBF rowsort select * from decimal_simple where c1=CAST(0.00002 as Decimal(10,8)); ---- 0.00002 0.000000000002 2 true 0.000025 0.00002 0.000000000002 3 false 0.000019 -query RI rowsort +query FI rowsort select c2,c3 from decimal_simple where c1!=0.00002; ---- 0.000000000001 1 @@ -149,13 +149,13 @@ select c2,c3 from decimal_simple where c1!=0.00002; 0.000000000005 9 -query RRI?R +query FFIBF select * from decimal_simple where 0.00002 > c1; ---- 0.00001 0.000000000001 1 true 0.000014 -query RRI?R rowsort +query FFIBF rowsort select * from decimal_simple where c1 <= 0.00002; ---- 0.00001 0.000000000001 1 true 0.000014 @@ -163,7 +163,7 @@ select * from decimal_simple where c1 <= 0.00002; 0.00002 0.000000000002 3 false 0.000019 -query RRI?R rowsort +query FFIBF rowsort select * from decimal_simple where c1 > 0.00002; ---- 0.00003 0.000000000003 4 true 0.000032 @@ -180,7 +180,7 @@ select * from decimal_simple where c1 > 0.00002; 0.00005 0.000000000005 9 true 0.000052 -query RRI?R rowsort +query FFIBF rowsort select * from decimal_simple where c1 >= 0.00002; ---- 0.00002 0.000000000002 2 true 0.000025 @@ -199,13 +199,13 @@ select * from decimal_simple where c1 >= 0.00002; 0.00005 0.000000000005 9 true 0.000052 -query ? +query S select arrow_typeof(c1+1) from decimal_simple limit 1; ---- Decimal128(27, 6) -query R rowsort +query F rowsort select c1+1 from decimal_simple; ---- 1.00001 @@ -226,13 +226,13 @@ select c1+1 from decimal_simple; # array decimal(10,6) + array decimal(12,7) => decimal(13,7) -query ? +query S select arrow_typeof(c1+c5) from decimal_simple limit 1; ---- Decimal128(13, 7) -query R rowsort +query F rowsort select c1+c5 from decimal_simple; ---- 0.000024 @@ -252,13 +252,13 @@ select c1+c5 from decimal_simple; 0.00015 -query ? +query S select arrow_typeof(c1-1) from decimal_simple limit 1; ---- Decimal128(27, 6) -query R rowsort +query F rowsort select c1-1 from decimal_simple; ---- -0.99995 @@ -278,13 +278,13 @@ select c1-1 from decimal_simple; -0.99999 -query ? +query S select arrow_typeof(c1-c5) from decimal_simple limit 1; ---- Decimal128(13, 7) -query R rowsort +query F rowsort select c1-c5 from decimal_simple; ---- -0.000002 @@ -304,13 +304,13 @@ select c1-c5 from decimal_simple; 0.000019 -query ? +query S select arrow_typeof(c1*20) from decimal_simple limit 1; ---- Decimal128(31, 6) -query R rowsort +query F rowsort select c1*20 from decimal_simple; ---- 0.0002 @@ -330,13 +330,13 @@ select c1*20 from decimal_simple; 0.001 -query ? +query S select arrow_typeof(c1*c5) from decimal_simple limit 1; ---- Decimal128(23, 13) -query R rowsort +query F rowsort select c1*c5 from decimal_simple; ---- 0.00000000014 @@ -356,13 +356,13 @@ select c1*c5 from decimal_simple; 0.000000005 -query ? +query S select arrow_typeof(c1/cast(0.00001 as decimal(5,5))) from decimal_simple limit 1; ---- Decimal128(21, 12) -query R rowsort +query F rowsort select c1/cast(0.00001 as decimal(5,5)) from decimal_simple; ---- 1 @@ -382,13 +382,13 @@ select c1/cast(0.00001 as decimal(5,5)) from decimal_simple; 5 -query ? +query S select arrow_typeof(c1/c5) from decimal_simple limit 1; ---- Decimal128(30, 19) -query R rowsort +query F rowsort select c1/c5 from decimal_simple; ---- 0.5 @@ -408,13 +408,13 @@ select c1/c5 from decimal_simple; 2.727272727273 -query ? +query S select arrow_typeof(c5%cast(0.00001 as decimal(5,5))) from decimal_simple limit 1; ---- Decimal128(7, 7) -query R rowsort +query F rowsort select c5%cast(0.00001 as decimal(5,5)) from decimal_simple; ---- 0 @@ -434,13 +434,13 @@ select c5%cast(0.00001 as decimal(5,5)) from decimal_simple; 0.000009 -query ? +query S select arrow_typeof(c1%c5) from decimal_simple limit 1; ---- Decimal128(11, 7) -query R rowsort +query F rowsort select c1%c5 from decimal_simple; ---- 0 @@ -460,13 +460,13 @@ select c1%c5 from decimal_simple; 0.00005 -query ? +query S select arrow_typeof(abs(c1)) from decimal_simple limit 1; ---- Float64 -query R rowsort +query F rowsort SELECT abs(c1) from decimal_simple; ---- 0.00001 @@ -486,7 +486,7 @@ SELECT abs(c1) from decimal_simple; 0.00005 -query RRI?R +query FFIBF select * from decimal_simple where c1 >= 0.00004 order by c1; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -500,7 +500,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1; 0.00005 0.000000000005 1 false 0.0001 -query RRI?R +query FFIBF select * from decimal_simple where c1 >= 0.00004 order by c1 limit 10; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -514,7 +514,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 limit 10; 0.00005 0.000000000005 1 false 0.0001 -query RRI?R +query FFIBF select * from decimal_simple where c1 >= 0.00004 order by c1 limit 5; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -524,7 +524,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 limit 5; 0.00005 0.000000000005 9 true 0.000052 -query RRI?R +query FFIBF select * from decimal_simple where c1 >= 0.00004 order by c1 desc; ---- 0.00005 0.000000000005 9 true 0.000052 @@ -538,7 +538,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 desc; 0.00004 0.000000000004 8 false 0.000044 -query RRI?R +query FFIBF select * from decimal_simple where c1 < 0.00003 order by c1 desc,c4; ---- 0.00002 0.000000000002 3 false 0.000019 @@ -546,7 +546,7 @@ select * from decimal_simple where c1 < 0.00003 order by c1 desc,c4; 0.00001 0.000000000001 1 true 0.000014 -query IR +query IF select count(*),c1 from decimal_simple group by c1 order by c1; ---- 1 0.00001 @@ -556,7 +556,7 @@ select count(*),c1 from decimal_simple group by c1 order by c1; 5 0.00005 -query IR? +query IFB select count(*),c1,c4 from decimal_simple group by c1,c4 order by c1,c4; ---- 1 0.00001 true @@ -570,25 +570,25 @@ select count(*),c1,c4 from decimal_simple group by c1,c4 order by c1,c4; 3 0.00005 true -query R +query SF select arrow_typeof(cast(400420638.54 as decimal(12,2))), cast(400420638.54 as decimal(12,2)); ---- Decimal128(12, 2) 400420638.54 -query R +query SF select arrow_typeof(cast(400420638.54 as decimal(12,2)) * 1.0), cast(400420638.54 as decimal(12,2)) * 1.0; ---- Float64 400420638.54 -query ?? +query SB select arrow_typeof(a < null), a < null from (values (1.1::decimal)) as t(a); ---- Boolean NULL -query ?? +query SB select arrow_typeof(null <= a), null <= a from (values (1.1::decimal)) as t(a); ---- Boolean NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/describe.slt b/datafusion/core/tests/sqllogictests/test_files/describe.slt index 2b7f118a48296..127c388f28515 100644 --- a/datafusion/core/tests/sqllogictests/test_files/describe.slt +++ b/datafusion/core/tests/sqllogictests/test_files/describe.slt @@ -26,7 +26,7 @@ set datafusion.catalog.information_schema = true statement ok CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as CSV WITH HEADER ROW LOCATION 'tests/data/aggregate_simple.csv'; -query C1 rowsort +query SSS rowsort DESCRIBE aggregate_simple; ---- c1 Float32 NO @@ -46,7 +46,7 @@ set datafusion.catalog.information_schema = false statement ok CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as CSV WITH HEADER ROW LOCATION 'tests/data/aggregate_simple.csv'; -query C2 rowsort +query SSS rowsort DESCRIBE aggregate_simple; ---- c1 Float32 NO diff --git a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt index 75eca2ddff46d..20176731a5600 100644 --- a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt +++ b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt @@ -30,7 +30,7 @@ statement ok set datafusion.catalog.information_schema = true; # Verify the information schema now does exist and is empty -query CCC rowsort +query SSSS rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -61,7 +61,7 @@ set datafusion.catalog.information_schema = true statement ok create table t as values (1); -query CCC rowsort +query SSSS rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -74,7 +74,7 @@ datafusion public t BASE TABLE statement ok create table t2 as values (1); -query CCC rowsort +query SSSS rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -102,7 +102,7 @@ statement ok SET datafusion.execution.target_partitions=7 # show all variables -query R rowsort +query SS rowsort SHOW ALL ---- datafusion.catalog.create_default_catalog_and_schema true @@ -142,21 +142,21 @@ datafusion.sql_parser.enable_ident_normalization true datafusion.sql_parser.parse_float_as_decimal false # show_variable_in_config_options -query R +query SS SHOW datafusion.execution.batch_size ---- datafusion.execution.batch_size 8192 # show_time_zone_default_utc # https://github.com/apache/arrow-datafusion/issues/3255 -query R +query SS SHOW TIME ZONE ---- datafusion.execution.time_zone +00:00 # show_timezone_default_utc # https://github.com/apache/arrow-datafusion/issues/3255 -query R +query SS SHOW TIMEZONE ---- datafusion.execution.time_zone +00:00 @@ -168,7 +168,7 @@ datafusion.execution.time_zone +00:00 statement ok CREATE OR REPLACE TABLE some_table AS VALUES (1,2),(3,4); -query R rowsort +query SSS rowsort DESCRIBE some_table ---- column1 Int64 YES @@ -182,7 +182,7 @@ DROP TABLE public.some_table; statement ok CREATE OR REPLACE TABLE public.some_table AS VALUES (1,2),(3,4); -query R rowsort +query SSS rowsort DESCRIBE public.some_table ---- column1 Int64 YES @@ -196,7 +196,7 @@ DROP TABLE public.some_table; statement ok CREATE OR REPLACE TABLE datafusion.public.some_table AS VALUES (1,2),(3,4); -query R rowsort +query SSS rowsort DESCRIBE datafusion.public.some_table ---- column1 Int64 YES @@ -212,7 +212,7 @@ describe table; # information_schema_show_tables -query CCCC rowsort +query SSSS rowsort SHOW TABLES ---- datafusion information_schema columns VIEW @@ -243,7 +243,7 @@ SHOW COLUMNS FROM t LIKE 'f'; statement error Error during planning: SHOW COLUMNS with WHERE or LIKE is not supported SHOW COLUMNS FROM t WHERE column_name = 'bar'; -query CCCCCC +query SSSSSS SHOW COLUMNS FROM t; ---- datafusion public t i Int32 NO @@ -253,13 +253,13 @@ statement error Error during planning: table 'datafusion.public.T' not found SHOW columns from "T" # information_schema_show_columns_full_extended -query CCCCCC +query SSSSISSSIIIIIIS SHOW FULL COLUMNS FROM t; ---- datafusion public t i 0 NULL NO Int32 NULL NULL 32 2 NULL NULL NULL # expect same as above -query CCCCCC +query SSSSISSSIIIIIIS SHOW EXTENDED COLUMNS FROM t; ---- datafusion public t i 0 NULL NO Int32 NULL NULL 32 2 NULL NULL NULL @@ -277,12 +277,12 @@ set datafusion.catalog.information_schema = true; # information_schema_show_columns_names() -query CCCCCC +query SSSSSS SHOW columns from public.t ---- datafusion public t i Int32 NO -query CCCCCC +query SSSSSS SHOW columns from datafusion.public.t ---- datafusion public t i Int32 NO @@ -297,9 +297,8 @@ SHOW columns from datafusion.public.t2 # show_non_existing_variable # FIXME # currently we cannot know whether a variable exists, this will output 0 row instead -query C +statement ok SHOW SOMETHING_UNKNOWN; ----- statement ok DROP TABLE t; @@ -324,7 +323,7 @@ CREATE TABLE abc AS VALUES (1,2,3), (4,5,6); statement ok CREATE VIEW xyz AS SELECT * FROM abc -query CCCC +query SSSS SHOW CREATE TABLE xyz ---- datafusion public xyz CREATE VIEW xyz AS SELECT * FROM abc @@ -345,7 +344,7 @@ CREATE SCHEMA test; statement ok CREATE VIEW test.xyz AS SELECT * FROM abc; -query CCCC +query SSSS SHOW CREATE TABLE test.xyz ---- datafusion test xyz CREATE VIEW test.xyz AS SELECT * FROM abc @@ -366,7 +365,7 @@ CREATE EXTERNAL TABLE abc STORED AS CSV WITH HEADER ROW LOCATION '../../testing/data/csv/aggregate_test_100.csv'; -query CCCC +query SSSS SHOW CREATE TABLE abc; ---- datafusion public abc CREATE EXTERNAL TABLE abc STORED AS CSV LOCATION ../../testing/data/csv/aggregate_test_100.csv diff --git a/datafusion/core/tests/sqllogictests/test_files/join.slt b/datafusion/core/tests/sqllogictests/test_files/join.slt index e78925a7faabe..834c0eb8a4357 100644 --- a/datafusion/core/tests/sqllogictests/test_files/join.slt +++ b/datafusion/core/tests/sqllogictests/test_files/join.slt @@ -36,7 +36,7 @@ CREATE TABLE grades(grade INT, min INT, max INT) AS VALUES (5, 80, 100); # Regression test: https://github.com/apache/arrow-datafusion/issues/4844 -query TII +query SII SELECT s.*, g.grade FROM students s join grades g on s.mark between g.min and g.max WHERE grade > 2 ORDER BY s.mark DESC ---- Amina 89 5 @@ -70,7 +70,7 @@ ON ( WHERE t2.t2_id > 1 # left semi join with on-filter -query ITI rowsort +query ISI rowsort SELECT t1.t1_id, t1.t1_name, t1.t1_int diff --git a/datafusion/core/tests/sqllogictests/test_files/misc.slt b/datafusion/core/tests/sqllogictests/test_files/misc.slt index ab17062ade003..acc36432d7a34 100644 --- a/datafusion/core/tests/sqllogictests/test_files/misc.slt +++ b/datafusion/core/tests/sqllogictests/test_files/misc.slt @@ -20,7 +20,7 @@ # Show string normalization working # '' --> (empty) # '' --> NULL -query II +query SS? select 'foo', '', NULL ---- -foo (empty) NULL \ No newline at end of file +foo (empty) NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/nullif.slt b/datafusion/core/tests/sqllogictests/test_files/nullif.slt index 9db3b5c01b1f8..c5e05b3ec4ea6 100644 --- a/datafusion/core/tests/sqllogictests/test_files/nullif.slt +++ b/datafusion/core/tests/sqllogictests/test_files/nullif.slt @@ -31,7 +31,7 @@ CREATE TABLE test( ; # Arrays tests -query T rowsort +query I rowsort SELECT NULLIF(int_field, 2) FROM test; ---- 1 @@ -42,7 +42,7 @@ NULL NULL -query T rowsort +query B rowsort SELECT NULLIF(bool_field, false) FROM test; ---- NULL @@ -53,7 +53,7 @@ true true -query T rowsort +query S rowsort SELECT NULLIF(text_field, 'zxc') FROM test; ---- NULL @@ -64,7 +64,7 @@ def ghij -query T rowsort +query I rowsort SELECT NULLIF(int_field, more_ints) FROM test; ---- 1 @@ -75,7 +75,7 @@ NULL NULL -query T rowsort +query I rowsort SELECT NULLIF(3, int_field) FROM test; ---- 3 @@ -87,17 +87,17 @@ NULL # Scalar values tests -query T +query I SELECT NULLIF(1, 1); ---- NULL -query T +query I SELECT NULLIF(1, 3); ---- 1 -query T +query I SELECT NULLIF(NULL, NULL); ---- NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/order.slt b/datafusion/core/tests/sqllogictests/test_files/order.slt index 0263781c58fb5..345ed1e74cf33 100644 --- a/datafusion/core/tests/sqllogictests/test_files/order.slt +++ b/datafusion/core/tests/sqllogictests/test_files/order.slt @@ -54,14 +54,14 @@ SELECT id FROM alltypes_plain ORDER BY int_col, double_col # test_order_by_agg_expr -query R +query F SELECT MIN(c12) FROM aggregate_test_100 ORDER BY MIN(c12) ---- 0.014793053078 # test_nulls_first_asc -query RC +query IS SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num ---- 1 one @@ -70,7 +70,7 @@ NULL three # test_nulls_first_desc() -query RC +query IS SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num DESC ---- NULL three @@ -79,7 +79,7 @@ NULL three # test_specific_nulls_last_desc -query RC +query IS SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num DESC NULLS LAST ---- 2 two @@ -87,7 +87,7 @@ SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) NULL three # test_specific_nulls_first_asc -query RT +query IS SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num ASC NULLS FIRST ---- NULL three @@ -101,13 +101,13 @@ CREATE EXTERNAL TABLE test (c1 int, c2 bigint, c3 boolean) STORED AS CSV LOCATION 'tests/data/partitioned_csv'; # Demonstrate types -query RC +query SSS SELECT arrow_typeof(c1), arrow_typeof(c2), arrow_typeof(c3) FROM test LIMIT 1; ---- Int32 Int64 Boolean -query RC +query II SELECT c1, c2 FROM test ORDER BY c1 DESC, c2 ASC ---- 3 0 @@ -160,9 +160,8 @@ SELECT c1, c2 FROM test ORDER BY c1 DESC, c2 ASC # sort_empty # The predicate on this query purposely generates no results -query RC +statement ok SELECT c1, c2 FROM test WHERE c1 > 100000 ORDER BY c1 DESC, c2 ASC ----- ##### # Sorting and Grouping @@ -170,42 +169,42 @@ SELECT c1, c2 FROM test WHERE c1 > 100000 ORDER BY c1 DESC, c2 ASC statement ok create table foo as values (1, 2), (3, 4), (5, 6); -query ok rowsort +query II rowsort select * from foo ---- 1 2 3 4 5 6 -query ok +query I select column1 from foo order by column2; ---- 1 3 5 -query ok +query I select column1 from foo order by column1 + column2; ---- 1 3 5 -query ok +query I select column1 from foo order by column1 + column2; ---- 1 3 5 -query ok rowsort +query I rowsort select column1 + column2 from foo group by column1, column2; ---- 11 3 7 -query ok +query I select column1 + column2 from foo group by column1, column2 ORDER BY column2 desc; ---- 11 @@ -230,7 +229,7 @@ create or replace table t as select column1 as value, column2 as time from (sele ) as sq) as sq -query I,I rowsort +query IT rowsort select sum(value) AS "value", date_trunc('hour',time) AS "time" @@ -242,7 +241,7 @@ GROUP BY time; 3 2022-01-02T00:00:00 # should work fine -query I,I +query IT select sum(value) AS "value", date_trunc('minute',time) AS "time" @@ -257,4 +256,4 @@ ORDER BY time; ## Cleanup statement ok -drop table t; \ No newline at end of file +drop table t; diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt index 344fe09d82309..9d595c5ba93d7 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt @@ -73,7 +73,7 @@ LOCATION '../../testing/data/csv/aggregate_test_100.csv' -query RRRRR +query FFFFF SELECT abs(-1.1) as abs, exp(2.0) as exp, @@ -96,7 +96,7 @@ SELECT 1 as num; 1 -query IIT +query IIS SELECT c2, c3, @@ -206,7 +206,7 @@ ORDER BY c2 ASC, c3 DESC, c10; 5 -101 2243924747182709810 -query IIT +query IIS SELECT c5, c4, @@ -316,7 +316,7 @@ ORDER BY c5 ASC, c4 DESC, c10; 2143473091 -14704 4602675983996931623 -query IRII rowsort +query IFII rowsort SELECT * FROM (VALUES (1,2.0,-3,1+1),(10,20.0,-30,2+2)) AS tbl(int_col, float_col, negative_col, summation); @@ -325,7 +325,7 @@ AS tbl(int_col, float_col, negative_col, summation); 10 20 -30 4 -query IIRIII +query IIFIII SELECT count(*) AS count_all, count(c3) AS count_c3, @@ -338,7 +338,7 @@ FROM aggregate_test_100_by_sql; 100 100 7.81 781 125 -117 -query IIRIII +query IIFIII select c2, sum(c3) sum_c3, @@ -467,7 +467,7 @@ ORDER BY result; 4268716378 -query TIIIIIIIITRRT +query SIIIIIIIISFFS select * from aggregate_test_100_by_sql order by c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13; ---- diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt index 4a85a835c0790..188841df94596 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt @@ -15,108 +15,37 @@ # specific language governing permissions and limitations # under the License. -query ?? +query BB select true and true, false and false; ---- true false -onlyif DataFusion -query ?? -select arrow_typeof(true and true), arrow_typeof(false and false); ----- -Boolean Boolean - - -onlyif postgres -query ?? -select pg_typeof(true and true), pg_typeof(false and false); ----- -bool bool - - -query ?? +query BB select true or true, false or false; ---- true false -onlyif DataFusion -query ?? -select arrow_typeof(true or true), arrow_typeof(false or false); ----- -Boolean Boolean - - -onlyif postgres -query ?? -select pg_typeof(true or true), pg_typeof(false or false); ----- -bool bool - - -query ?? +query BB select false and true, true and false; ---- false false -onlyif DataFusion -query ?? -select arrow_typeof(false and true), arrow_typeof(true and false); ----- -Boolean Boolean - - -onlyif postgres -query ?? -select pg_typeof(false and true), pg_typeof(true and false); ----- -bool bool - - -query ?? +query BB select false or true, true or false; ---- true true -onlyif DataFusion -query ?? -select arrow_typeof(false or true), arrow_typeof(true or false); ----- -Boolean Boolean - - -onlyif postgres -query ?? -select pg_typeof(false or true), pg_typeof(true or false); ----- -bool bool - - -query ?? +query BB select null and null, null or null; ---- NULL NULL -onlyif DataFusion -query ?? -select arrow_typeof(null and null), arrow_typeof(null or null); ----- -Boolean Boolean - - -onlyif postgres -query ?? -select pg_typeof(null and null), pg_typeof(null or null); ----- -bool bool - - -onlyif postgres -query ???? +query BBBB select true and null, false and null, null and true, @@ -125,51 +54,10 @@ select true and null, NULL false NULL false -onlyif DataFusion -query ???? -select arrow_typeof(true and null), - arrow_typeof(false and null), - arrow_typeof(null and true), - arrow_typeof(null and false); ----- -Boolean Boolean Boolean Boolean - - -onlyif postgres -query ???? -select pg_typeof(true and null), - pg_typeof(false and null), - pg_typeof(null and true), - pg_typeof(null and false); ----- -bool bool bool bool - - -onlyif postgres -query ???? +query BBBB select true or null, false or null, null or true, null or false; ---- true NULL true NULL - - -onlyif DataFusion -query ???? -select arrow_typeof(true or null), - arrow_typeof(false or null), - arrow_typeof(null or true), - arrow_typeof(null or false); ----- -Boolean Boolean Boolean Boolean - - -onlyif postgres -query ???? -select pg_typeof(true or null), - pg_typeof(false or null), - pg_typeof(null or true), - pg_typeof(null or false); ----- -bool bool bool bool diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt index ebe4df92ac73e..dc4c6f0163363 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt @@ -16,23 +16,23 @@ # under the License. -query T +query S select null::VARCHAR ---- NULL -query TT +query SS select 'a'::VARCHAR, ''::VARCHAR ---- a (empty) skipif postgres -query TT +query SS select 'a'::CHAR, ''::CHAR ---- a (empty) -query TT +query SS select 'a'::TEXT, ''::TEXT ---- a (empty) @@ -80,43 +80,43 @@ select 1::BIGINT UNSIGNED ---- 1 -query RRRRR +query FFFFF select 1.0::FLOAT, 1.023::FLOAT, 'NaN'::FLOAT,'+Inf'::FLOAT,'-Inf'::FLOAT ---- 1 1.023 NaN Infinity -Infinity -query RRRRR +query FFFFF select 1.0::REAL, 1.023::REAL, 'NaN'::REAL,'+Inf'::REAL,'-Inf'::REAL ---- 1 1.023 NaN Infinity -Infinity skipif postgres -query RRRRR +query FFFFF select 1.0::DOUBLE, 1.023::DOUBLE, 'NaN'::DOUBLE,'+Inf'::DOUBLE,'-Inf'::DOUBLE ---- 1 1.023 NaN Infinity -Infinity -query RRR +query FFF select 1.0::DECIMAL(5,3) as one, 2.023::DECIMAL(5,3) as two, 3.023::DECIMAL(5,2) as three ---- 1 2.023 3.02 -query ? +query D select '2018-01-01'::DATE ---- 2018-01-01 -query ? +query D select '12:00:01'::TIME ---- 12:00:01 -query ? +query T select '2018-01-01 12:00:00'::TIMESTAMP ---- 2018-01-01T12:00:00 -query I +query BB select true::BOOLEAN, 'false'::BOOLEAN ---- true false diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_union.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_union.slt index 5b1788bd7553d..05343de322683 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_union.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_union.slt @@ -151,7 +151,7 @@ SELECT * FROM ( 5 -query I rowsort +query I rowsort SELECT * FROM ( SELECT c2 FROM aggregate_test_100_by_sql t1 @@ -165,7 +165,7 @@ SELECT * FROM ( 4 -query I rowsort +query I rowsort SELECT * FROM ( SELECT c2 FROM aggregate_test_100_by_sql t1 diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt index 36b0fac14ffe0..24c4ec0ae5683 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt @@ -301,7 +301,7 @@ ORDER BY c9; 4268716378 100 NULL 4229654142 28774375 4268716378 4268716378 4268716378 63044568 NULL -query IIRIII +query IIFIII SELECT row_number() OVER () AS row_number, count(c3) OVER () AS count_c3, @@ -413,8 +413,7 @@ ORDER BY row_number; 99 100 7.81 781 125 -117 100 100 7.81 781 125 -117 - -query IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII +query IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII SELECT SUM(c4) OVER(ORDER BY c3 DESC GROUPS BETWEEN 3 PRECEDING AND 1 FOLLOWING) as summation1, SUM(c4) OVER(ORDER BY c3 DESC GROUPS BETWEEN 3 PRECEDING AND 2 PRECEDING) as summation2, @@ -687,7 +686,7 @@ ORDER BY c8; 64517 2809 63353 10 36599 56980 10 -query IIIRIII +query IIIFIII SELECT c9, row_number() OVER (ORDER BY c2, c9) AS row_number, @@ -801,7 +800,7 @@ ORDER BY row_number; 4268716378 100 100 7.81 781 125 -117 -query IIIRIII +query IIIFIII SELECT c9, row_number() OVER (PARTITION BY c2, c9) AS row_number, @@ -915,7 +914,7 @@ ORDER BY c9; 4268716378 1 14 -13.857142857143 -194 118 -101 -query IIIRIII +query IIIFIII SELECT c9, row_number() OVER (PARTITION BY c2 ORDER BY c9) AS row_number, @@ -1146,7 +1145,7 @@ ORDER BY c9; 2025611582 -2269 231997 199008 5 -45840 56 -15880 5 5 -query IIIII +query IFIIF select c9, cume_dist() OVER (PARTITION BY c2 ORDER BY c3) cume_dist_by_c3, diff --git a/datafusion/core/tests/sqllogictests/test_files/prepare.slt b/datafusion/core/tests/sqllogictests/test_files/prepare.slt index 813288e386737..6b10ce628b71e 100644 --- a/datafusion/core/tests/sqllogictests/test_files/prepare.slt +++ b/datafusion/core/tests/sqllogictests/test_files/prepare.slt @@ -22,7 +22,7 @@ statement ok create table person (id int, first_name varchar, last_name varchar, age int, state varchar, salary double, birthday timestamp, "😀" int) as values (1, 'jane', 'smith', 20, 'MA', 100000.45, '2000-11-12T00:00:00'::timestamp, 99); -query C rowsort +query ISSISFTI rowsort select * from person; ---- 1 jane smith 20 MA 100000.45 2000-11-12T00:00:00 99 diff --git a/datafusion/core/tests/sqllogictests/test_files/select.slt b/datafusion/core/tests/sqllogictests/test_files/select.slt index 1b5ede066c9c3..431b8c9c4f854 100644 --- a/datafusion/core/tests/sqllogictests/test_files/select.slt +++ b/datafusion/core/tests/sqllogictests/test_files/select.slt @@ -21,9 +21,8 @@ ########## # all where empty -query II +statement ok SELECT * FROM aggregate_test_100 WHERE 1=2 ----- # Simple values function query I @@ -38,7 +37,7 @@ VALUES (-1) -1 # foo bar -query IIC +query IIB VALUES (2+1,2-1,2>1) ---- 3 1 true @@ -51,8 +50,8 @@ VALUES (1),(2) 2 # multiple rows and columns from VALUES -query IC rowsort +query IS rowsort VALUES (1,'a'),(2,'b') ---- 1 a -2 b \ No newline at end of file +2 b diff --git a/datafusion/core/tests/sqllogictests/test_files/strings.slt b/datafusion/core/tests/sqllogictests/test_files/strings.slt index 27ed0e2d0983a..3345d476c7f4f 100644 --- a/datafusion/core/tests/sqllogictests/test_files/strings.slt +++ b/datafusion/core/tests/sqllogictests/test_files/strings.slt @@ -32,14 +32,14 @@ CREATE TABLE test( ; # LIKE -query T rowsort +query S rowsort SELECT s FROM test WHERE s LIKE 'p1%'; ---- p1 p1e1 p1m1e1 -query T rowsort +query S rowsort SELECT s FROM test WHERE s LIKE '%m1%'; ---- P1m1e1 @@ -47,7 +47,7 @@ p1m1e1 p2m1e1 # NOT LIKE -query T rowsort +query S rowsort SELECT s FROM test WHERE s NOT LIKE 'p1%'; ---- P1 @@ -60,7 +60,7 @@ p2m1e1 # ILIKE -query T rowsort +query S rowsort SELECT s FROM test WHERE s ILIKE 'p1%'; ---- P1 @@ -71,7 +71,7 @@ p1e1 p1m1e1 # NOT ILIKE -query T rowsort +query S rowsort SELECT s FROM test WHERE s NOT ILIKE 'p1%'; ---- e1 diff --git a/datafusion/core/tests/sqllogictests/test_files/subquery.slt b/datafusion/core/tests/sqllogictests/test_files/subquery.slt index 70c3c3e13df59..099d0dc0236bf 100644 --- a/datafusion/core/tests/sqllogictests/test_files/subquery.slt +++ b/datafusion/core/tests/sqllogictests/test_files/subquery.slt @@ -36,7 +36,7 @@ CREATE TABLE t2(t2_id INT, t2_name TEXT, t2_int INT) AS VALUES # in_subquery_to_join_with_correlated_outer_filter -query ITI rowsort +query ISI rowsort select t1.t1_id, t1.t1_name, t1.t1_int @@ -50,7 +50,7 @@ where t1.t1_id + 12 in ( 44 d 4 # not_in_subquery_to_join_with_correlated_outer_filter -query ITI rowsort +query ISI rowsort select t1.t1_id, t1.t1_name, t1.t1_int diff --git a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt index 6b13c42f49e85..73c33f29d414f 100644 --- a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt +++ b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt @@ -22,7 +22,7 @@ statement ok create table foo (val int, ts timestamp) as values (1, '2000-01-01T00:00:00'::timestamp), (2, '2000-02-01T00:00:00'::timestamp), (3, '2000-03-01T00:00:00'::timestamp); -query C rowsort +query IT rowsort select * from foo; ---- 1 2000-01-01T00:00:00 @@ -30,36 +30,36 @@ select * from foo; 3 2000-03-01T00:00:00 # Test that we can compare a timestamp to a casted string -query C rowsort +query IT rowsort select * from foo where ts > '2000-01-01T00:00:00'::timestamp; ---- 2 2000-02-01T00:00:00 3 2000-03-01T00:00:00 # Test that we can compare a timestamp to a string and it will be coerced -query C rowsort +query IT rowsort select * from foo where ts > '2000-01-01T00:00:00'; ---- 2 2000-02-01T00:00:00 3 2000-03-01T00:00:00 -query C rowsort +query IT rowsort select * from foo where ts < '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 -query C rowsort +query IT rowsort select * from foo where ts <= '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 2 2000-02-01T00:00:00 -query C rowsort +query IT rowsort select * from foo where ts = '2000-02-01T00:00:00'; ---- 2 2000-02-01T00:00:00 -query C rowsort +query IT rowsort select * from foo where ts != '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 @@ -122,7 +122,7 @@ SELECT DATE_BIN(INTERVAL '7 days', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP ' # demonstrates array values (rather than scalar) for the source argument -query T rowsort +query TF rowsort SELECT DATE_BIN(INTERVAL '15' minute, time, TIMESTAMP '2001-01-01T00:00:00Z') AS time, val diff --git a/datafusion/core/tests/sqllogictests/test_files/tpch.slt b/datafusion/core/tests/sqllogictests/test_files/tpch.slt index 313745113201f..efed4d0e01805 100644 --- a/datafusion/core/tests/sqllogictests/test_files/tpch.slt +++ b/datafusion/core/tests/sqllogictests/test_files/tpch.slt @@ -118,7 +118,7 @@ CREATE EXTERNAL TABLE IF NOT EXISTS supplier ( # q1 -query T +query SSFFFFFFFI select l_returnflag, l_linestatus, @@ -147,7 +147,7 @@ R F 94 100854.52 92931.39 92931.39 47 50427.26 0.08 2 # q2 -query T +statement ok select s_acctbal, s_name, @@ -191,11 +191,10 @@ order by n_name, s_name, p_partkey; ----- # q3 -query T +statement ok select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, @@ -218,11 +217,10 @@ group by order by revenue desc, o_orderdate; ----- # q4 -query T +statement ok select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, @@ -245,12 +243,11 @@ group by order by revenue desc, o_orderdate; ----- # q5 -query T +statement ok select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue @@ -275,11 +272,10 @@ group by n_name order by revenue desc; ----- # q6 -query T +query F select sum(l_extendedprice * l_discount) as revenue from @@ -294,7 +290,7 @@ NULL # q7 -query T +statement ok select supp_nation, cust_nation, @@ -334,11 +330,10 @@ order by supp_nation, cust_nation, l_year; ----- # q8 -query T +statement ok select o_year, sum(case @@ -376,11 +371,10 @@ group by o_year order by o_year; ----- # q9 -query T +statement ok select nation, o_year, @@ -413,11 +407,10 @@ group by order by nation, o_year desc; ----- # q10 -query T +statement ok select c_custkey, c_name, @@ -449,11 +442,10 @@ group by c_comment order by revenue desc; ----- # q11 -query T +statement ok select ps_partkey, sum(ps_supplycost * ps_availqty) as value @@ -481,11 +473,10 @@ group by ) order by value desc; ----- # q12 -query T +statement ok select l_shipmode, sum(case @@ -516,11 +507,10 @@ group by l_shipmode order by l_shipmode; ----- # q13 -query T +query II select c_count, count(*) as custdist @@ -545,7 +535,7 @@ order by 0 9 # q14 -query T +query F select 100.00 * sum(case when p_type like 'PROMO%' @@ -576,7 +566,7 @@ create view revenue0 (supplier_no, total_revenue) as l_suppkey; # q15 -query T +statement ok select s_suppkey, s_name, @@ -596,14 +586,13 @@ where ) order by s_suppkey; ----- statement ok drop view revenue0; # q16 -query T +statement ok select p_brand, p_type, @@ -634,11 +623,10 @@ order by p_brand, p_type, p_size; ----- # q17 -query T +query F select sum(l_extendedprice) / 7.0 as avg_yearly from @@ -660,7 +648,7 @@ where NULL # q18 -query T +statement ok select c_name, c_custkey, @@ -693,11 +681,10 @@ group by order by o_totalprice desc, o_orderdate; ----- # q19 -query T +query F select sum(l_extendedprice* (1 - l_discount)) as revenue from @@ -738,7 +725,7 @@ NULL # q20 -query T +statement ok select s_name, s_address @@ -776,11 +763,10 @@ where and n_name = 'CANADA' order by s_name; ----- # q21 -query T +statement ok select s_name, count(*) as numwait @@ -820,11 +806,10 @@ group by order by numwait desc, s_name; ----- # q22 -query T +query SIF select cntrycode, count(*) as numcust, diff --git a/datafusion/core/tests/sqllogictests/test_files/union.slt b/datafusion/core/tests/sqllogictests/test_files/union.slt index f8467dfc8e656..ee496ea9fef84 100644 --- a/datafusion/core/tests/sqllogictests/test_files/union.slt +++ b/datafusion/core/tests/sqllogictests/test_files/union.slt @@ -40,7 +40,7 @@ CREATE TABLE t2( ; # union with EXCEPT(JOIN) -query T rowsort +query S rowsort ( SELECT name FROM t1 EXCEPT @@ -57,7 +57,7 @@ Alice John # union with type coercion -query T rowsort +query IS rowsort ( SELECT * FROM t1 EXCEPT @@ -158,7 +158,7 @@ SELECT 1 UNION SELECT 2 2 # union_with_except_input -query T rowsort +query S rowsort ( SELECT name FROM t1 EXCEPT @@ -175,7 +175,7 @@ Alice John # union_with_type_coercion -query IT rowsort +query IS rowsort ( SELECT id, name FROM t1 EXCEPT From 1197c4fed35e404873c7590af29a8184d6576533 Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Sat, 11 Feb 2023 14:23:06 +0100 Subject: [PATCH 2/7] Don't change imports --- .../core/tests/sqllogictests/src/engines/datafusion/insert.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs index a8fca3b16c06d..cb8e15591d249 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs @@ -16,8 +16,7 @@ // under the License. use super::error::Result; -use crate::engines::datafusion::util::LogicTestContextProvider; -use crate::engines::output::DFOutput; +use crate::{engines::datafusion::util::LogicTestContextProvider, output::DFOutput}; use arrow::record_batch::RecordBatch; use datafusion::datasource::MemTable; use datafusion::prelude::SessionContext; From 7868f0b7d6460365280720b8bc09b6c9a97385e8 Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Sat, 11 Feb 2023 22:02:00 +0100 Subject: [PATCH 3/7] Fix import --- .../core/tests/sqllogictests/src/engines/datafusion/insert.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs index cb8e15591d249..a8fca3b16c06d 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/insert.rs @@ -16,7 +16,8 @@ // under the License. use super::error::Result; -use crate::{engines::datafusion::util::LogicTestContextProvider, output::DFOutput}; +use crate::engines::datafusion::util::LogicTestContextProvider; +use crate::engines::output::DFOutput; use arrow::record_batch::RecordBatch; use datafusion::datasource::MemTable; use datafusion::prelude::SessionContext; From e9733d76179f2a9cbb841d94f6239c12ab7115b8 Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Sat, 11 Feb 2023 22:44:02 +0100 Subject: [PATCH 4/7] Check types when results are empty --- .../src/engines/datafusion/mod.rs | 12 +++- .../src/engines/datafusion/normalize.rs | 56 ++++++++----------- .../sqllogictests/src/engines/postgres/mod.rs | 29 ++++++---- .../core/tests/sqllogictests/src/main.rs | 9 +-- .../test_files/pg_compat/pg_compat_simple.slt | 12 ++++ 5 files changed, 68 insertions(+), 50 deletions(-) diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs index db9410db61f60..1f8f7feb36e5b 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/mod.rs @@ -27,6 +27,7 @@ use datafusion::arrow::record_batch::RecordBatch; use datafusion::prelude::SessionContext; use datafusion_sql::parser::{DFParser, Statement}; use insert::insert; +use sqllogictest::DBOutput; use sqlparser::ast::Statement as SQLStatement; mod create_table; @@ -108,7 +109,14 @@ async fn run_query(ctx: &SessionContext, sql: impl Into) -> Result = df.collect().await?; - let formatted_batches = normalize::convert_batches(results)?; - Ok(formatted_batches) + let rows = normalize::convert_batches(results)?; + + if rows.is_empty() && types.is_empty() { + Ok(DBOutput::StatementComplete(0)) + } else { + Ok(DBOutput::Rows { types, rows }) + } } diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs index cb4f2bcfaaf9e..7b924f32e01b3 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs @@ -15,45 +15,37 @@ // specific language governing permissions and limitations // under the License. -use arrow::datatypes::SchemaRef; use arrow::{array, array::ArrayRef, datatypes::DataType, record_batch::RecordBatch}; use datafusion::error::DataFusionError; -use sqllogictest::DBOutput; +use datafusion_common::DFField; -use crate::engines::output::{DFColumnType, DFOutput}; +use crate::engines::output::DFColumnType; use super::super::conversion::*; use super::error::{DFSqlLogicTestError, Result}; -/// Converts `batches` to a DBOutput as expected by sqllogicteset. -/// -/// Assumes empty record batches are a successful statement completion -/// -pub fn convert_batches(batches: Vec) -> Result { +/// Converts `batches` to a result as expected by sqllogicteset. +pub fn convert_batches(batches: Vec) -> Result>> { if batches.is_empty() { - // DataFusion doesn't report number of rows complete - return Ok(DBOutput::StatementComplete(0)); - } - - let schema = batches[0].schema(); - let types = convert_schema_to_types(&schema); - - let mut rows = vec![]; - for batch in batches { - // Verify schema - if schema != batch.schema() { - return Err(DFSqlLogicTestError::DataFusion(DataFusionError::Internal( - format!( - "Schema mismatch. Previously had\n{:#?}\n\nGot:\n{:#?}", - schema, - batch.schema() - ), - ))); + Ok(vec![]) + } else { + let schema = batches[0].schema(); + let mut rows = vec![]; + for batch in batches { + // Verify schema + if schema != batch.schema() { + return Err(DFSqlLogicTestError::DataFusion(DataFusionError::Internal( + format!( + "Schema mismatch. Previously had\n{:#?}\n\nGot:\n{:#?}", + schema, + batch.schema() + ), + ))); + } + rows.append(&mut convert_batch(batch)?); } - rows.append(&mut convert_batch(batch)?); + Ok(rows) } - - Ok(DBOutput::Rows { types, rows }) } /// Convert a single batch to a `Vec>` for comparison @@ -124,9 +116,9 @@ pub fn cell_to_string(col: &ArrayRef, row: usize) -> Result { } } -fn convert_schema_to_types(schema: &SchemaRef) -> Vec { - schema - .fields() +/// Converts columns to a result as expected by sqllogicteset. +pub fn convert_schema_to_types(columns: &[DFField]) -> Vec { + columns .iter() .map(|f| f.data_type()) .map(|data_type| match data_type { diff --git a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs index f483a61f0851b..8110fc1307921 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs @@ -250,18 +250,27 @@ impl sqllogictest::AsyncDB for Postgres { } let rows = self.client.query(sql, &[]).await?; - if rows.is_empty() { - return Ok(DBOutput::StatementComplete(0)); + let types: Vec = if rows.is_empty() { + self.client + .prepare(sql) + .await? + .columns() + .iter() + .map(|c| c.type_().clone()) + .collect() + } else { + rows[0] + .columns() + .iter() + .map(|c| c.type_().clone()) + .collect() + }; + + if rows.is_empty() && types.is_empty() { + Ok(DBOutput::StatementComplete(0)) } else { - let types = convert_types( - rows[0] - .columns() - .iter() - .map(|c| c.type_().clone()) - .collect(), - ); Ok(DBOutput::Rows { - types, + types: convert_types(types), rows: convert_rows(rows), }) } diff --git a/datafusion/core/tests/sqllogictests/src/main.rs b/datafusion/core/tests/sqllogictests/src/main.rs index 07d44e1187eef..c2abf6df76589 100644 --- a/datafusion/core/tests/sqllogictests/src/main.rs +++ b/datafusion/core/tests/sqllogictests/src/main.rs @@ -78,13 +78,10 @@ async fn run_test_file_with_postgres( relative_path: PathBuf, ) -> Result<(), Box> { info!("Running with Postgres runner: {}", path.display()); - let postgres_client = Postgres::connect(relative_path).await?; - - sqllogictest::Runner::new(postgres_client) - .run_file_async(path) - .await?; - + let mut runner = sqllogictest::Runner::new(postgres_client); + runner.with_column_validator(strict_column_validator); + runner.run_file_async(path).await?; Ok(()) } diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt index 9d595c5ba93d7..7c6b859c3186b 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt @@ -577,3 +577,15 @@ e 5 64 -26526 1689098844 8950618259486183091 224 45253 662099130 161279954150608 ######## statement ok DROP TABLE aggregate_test_100_by_sql + + +statement ok +CREATE TABLE empty_table ( + c1 TEXT, + c2 INT +); + + +query SI +select * from empty_table; +---- From 7e32de81b1c238cd5932de707f12f8f40a0c9c9b Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Sat, 11 Feb 2023 22:51:36 +0100 Subject: [PATCH 5/7] Use Sqllite compatible types 'T','R','I' --- datafusion/core/tests/sqllogictests/README.md | 6 +- .../src/engines/datafusion/normalize.rs | 4 +- .../tests/sqllogictests/src/engines/output.rs | 16 +-- .../sqllogictests/src/engines/postgres/mod.rs | 4 +- .../sqllogictests/test_files/aggregate.slt | 110 +++++++++--------- .../sqllogictests/test_files/arrow_typeof.slt | 12 +- .../tests/sqllogictests/test_files/dates.slt | 10 +- .../tests/sqllogictests/test_files/ddl.slt | 32 ++--- .../sqllogictests/test_files/decimal.slt | 100 ++++++++-------- .../sqllogictests/test_files/describe.slt | 4 +- .../test_files/information_schema.slt | 38 +++--- .../tests/sqllogictests/test_files/join.slt | 4 +- .../tests/sqllogictests/test_files/misc.slt | 2 +- .../tests/sqllogictests/test_files/nullif.slt | 2 +- .../tests/sqllogictests/test_files/order.slt | 16 +-- .../test_files/pg_compat/pg_compat_simple.slt | 16 +-- .../test_files/pg_compat/pg_compat_types.slt | 18 +-- .../test_files/pg_compat/pg_compat_window.slt | 10 +- .../sqllogictests/test_files/prepare.slt | 2 +- .../tests/sqllogictests/test_files/select.slt | 2 +- .../sqllogictests/test_files/strings.slt | 10 +- .../sqllogictests/test_files/subquery.slt | 4 +- .../sqllogictests/test_files/timestamps.slt | 48 ++++---- .../tests/sqllogictests/test_files/tpch.slt | 12 +- .../tests/sqllogictests/test_files/union.slt | 8 +- 25 files changed, 245 insertions(+), 245 deletions(-) diff --git a/datafusion/core/tests/sqllogictests/README.md b/datafusion/core/tests/sqllogictests/README.md index 3d56e41fa258f..876d3806b2db5 100644 --- a/datafusion/core/tests/sqllogictests/README.md +++ b/datafusion/core/tests/sqllogictests/README.md @@ -108,9 +108,9 @@ query - 'B' - **B**oolean, - 'D' - **D**atetime, - 'I' - **I**nteger, - - 'F' - **F**loating-point results, - - 'S' - **S**string, - - 'T' - **T**imestamp, + - 'P' - timestam**P**, + - 'R' - floating-point results, + - 'T' - **T**ext, - "?" - any other types - `expected_result`: In the results section, some values are converted according to some rules: - floating point values are rounded to the scale of "12", diff --git a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs index 7b924f32e01b3..7b849b9fa2c09 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/normalize.rs @@ -135,8 +135,8 @@ pub fn convert_schema_to_types(columns: &[DFField]) -> Vec { | DataType::Float32 | DataType::Float64 | DataType::Decimal128(_, _) - | DataType::Decimal256(_, _) => DFColumnType::FloatingPoint, - DataType::Utf8 | DataType::LargeUtf8 => DFColumnType::String, + | DataType::Decimal256(_, _) => DFColumnType::Float, + DataType::Utf8 | DataType::LargeUtf8 => DFColumnType::Text, DataType::Date32 | DataType::Date64 | DataType::Time32(_) diff --git a/datafusion/core/tests/sqllogictests/src/engines/output.rs b/datafusion/core/tests/sqllogictests/src/engines/output.rs index 4e3575fe13989..0682f5df97c19 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/output.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/output.rs @@ -22,8 +22,8 @@ pub enum DFColumnType { Boolean, DateTime, Integer, - FloatingPoint, - String, + Float, + Text, Timestamp, Another, } @@ -34,9 +34,9 @@ impl ColumnType for DFColumnType { 'B' => Some(Self::Boolean), 'D' => Some(Self::DateTime), 'I' => Some(Self::Integer), - 'F' => Some(Self::FloatingPoint), - 'S' => Some(Self::String), - 'T' => Some(Self::Timestamp), + 'P' => Some(Self::Timestamp), + 'R' => Some(Self::Float), + 'T' => Some(Self::Text), _ => Some(Self::Another), } } @@ -46,9 +46,9 @@ impl ColumnType for DFColumnType { Self::Boolean => 'B', Self::DateTime => 'D', Self::Integer => 'I', - Self::FloatingPoint => 'F', - Self::String => 'S', - Self::Timestamp => 'T', + Self::Timestamp => 'P', + Self::Float => 'R', + Self::Text => 'T', Self::Another => '?', } } diff --git a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs index 8110fc1307921..2c6287b97bfd1 100644 --- a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs +++ b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs @@ -342,8 +342,8 @@ fn convert_types(types: Vec) -> Vec { .map(|t| match t { Type::BOOL => DFColumnType::Boolean, Type::INT2 | Type::INT4 | Type::INT8 => DFColumnType::Integer, - Type::BPCHAR | Type::VARCHAR | Type::TEXT => DFColumnType::String, - Type::FLOAT4 | Type::FLOAT8 | Type::NUMERIC => DFColumnType::FloatingPoint, + Type::BPCHAR | Type::VARCHAR | Type::TEXT => DFColumnType::Text, + Type::FLOAT4 | Type::FLOAT8 | Type::NUMERIC => DFColumnType::Float, Type::DATE | Type::TIME => DFColumnType::DateTime, Type::TIMESTAMP => DFColumnType::Timestamp, _ => DFColumnType::Another, diff --git a/datafusion/core/tests/sqllogictests/test_files/aggregate.slt b/datafusion/core/tests/sqllogictests/test_files/aggregate.slt index e1a1ae6e61dae..694b062c7f789 100644 --- a/datafusion/core/tests/sqllogictests/test_files/aggregate.slt +++ b/datafusion/core/tests/sqllogictests/test_files/aggregate.slt @@ -76,37 +76,37 @@ SELECT array_agg(c13 LIMIT 1) FROM aggregate_test_100 # csv_query_avg_multi_batch # csv_query_avg -query F +query R SELECT avg(c12) FROM aggregate_test_100 ---- 0.508972509913 # csv_query_covariance_1 -query F +query R SELECT covar_pop(c2, c12) FROM aggregate_test_100 ---- -0.079169322354 # csv_query_covariance_2 -query F +query R SELECT covar(c2, c12) FROM aggregate_test_100 ---- -0.079969012479 # single_row_query_covar_1 -query F +query R select covar_samp(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- NULL # single_row_query_covar_2 -query F +query R select covar_pop(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- 0 # all_nulls_query_covar -query FF +query RR with data as ( select null::int as f, null::int as b union all @@ -118,7 +118,7 @@ from data NULL NULL # covar_query_with_nulls -query FF +query RR with data as ( select 1 as f, 4 as b union all @@ -138,19 +138,19 @@ from data 1 0.666666666667 # csv_query_correlation -query F +query R SELECT corr(c2, c12) FROM aggregate_test_100 ---- -0.190645441906 # single_row_query_correlation -query F +query R select corr(sq.column1, sq.column2) from (values (1.1, 2.2)) as sq ---- 0 # all_nulls_query_correlation -query F +query R with data as ( select null::int as f, null::int as b union all @@ -162,7 +162,7 @@ from data NULL # correlation_query_with_nulls -query F +query R with data as ( select 1 as f, 4 as b union all @@ -182,67 +182,67 @@ from data 1 # csv_query_variance_1 -query F +query R SELECT var_pop(c2) FROM aggregate_test_100 ---- 1.8675 # csv_query_variance_2 -query F +query R SELECT var_pop(c6) FROM aggregate_test_100 ---- 26156334342021890000000000000000000000 # csv_query_variance_3 -query F +query R SELECT var_pop(c12) FROM aggregate_test_100 ---- 0.092342237216 # csv_query_variance_4 -query F +query R SELECT var(c2) FROM aggregate_test_100 ---- 1.886363636364 # csv_query_variance_5 -query F +query R SELECT var_samp(c2) FROM aggregate_test_100 ---- 1.886363636364 # csv_query_stddev_1 -query F +query R SELECT stddev_pop(c2) FROM aggregate_test_100 ---- 1.366565036872 # csv_query_stddev_2 -query F +query R SELECT stddev_pop(c6) FROM aggregate_test_100 ---- 5114326382039172000 # csv_query_stddev_3 -query F +query R SELECT stddev_pop(c12) FROM aggregate_test_100 ---- 0.303878655413 # csv_query_stddev_4 -query F +query R SELECT stddev(c12) FROM aggregate_test_100 ---- 0.305409539941 # csv_query_stddev_5 -query F +query R SELECT stddev_samp(c12) FROM aggregate_test_100 ---- 0.305409539941 # csv_query_stddev_6 -query F +query R select stddev(sq.column1) from (values (1.1), (2.0), (3.0)) as sq ---- 0.950438495292 @@ -260,7 +260,7 @@ SELECT approx_median(c6) FROM aggregate_test_100 1146409980542786560 # csv_query_approx_median_3 -query F +query R SELECT approx_median(c12) FROM aggregate_test_100 ---- 0.555006541052 @@ -278,7 +278,7 @@ SELECT median(c6) FROM aggregate_test_100 1125553990140691277 # csv_query_median_3 -query F +query R SELECT median(c12) FROM aggregate_test_100 ---- 0.551390054439 @@ -332,25 +332,25 @@ SELECT median(a) FROM median_u64 50 # median_f32 -query F +query R SELECT median(a) FROM median_f32 ---- 3.3 # median_f64 -query F +query R SELECT median(a) FROM median_f64 ---- 3.3 # median_f64_nan -query F +query R SELECT median(a) FROM median_f64_nan ---- NaN # approx_median_f64_nan -query F +query R SELECT approx_median(a) FROM median_f64_nan ---- NaN @@ -365,13 +365,13 @@ create table cpu (host string, usage float) as select * from (values ('host1', 90.4) ); -query SF rowsort +query TR rowsort select host, median(usage) from cpu group by host; ---- host0 90.1 host1 90.3 -query F +query R select median(usage) from cpu; ---- 90.2 @@ -395,7 +395,7 @@ create table cpu (host string, usage float) as select * from (values ('host1', 89.3) ); -query SF rowsort +query TR rowsort select host, median(usage) from cpu group by host; ---- host0 90.2 @@ -410,7 +410,7 @@ drop table cpu; statement ok create table cpu (host string, usage float) as select * from (values ('host0', 90.2), ('host1', 90.1), ('host1', 90.5), ('host0', 90.5), ('host1', 90.0), ('host1', 90.3), ('host1', 90.2), ('host1', 90.3)); -query SF rowsort +query TR rowsort select host, median(usage) from cpu group by host; ---- host0 90.35 @@ -659,7 +659,7 @@ SELECT (ABS(1 - CAST(approx_percentile_cont(c11, 0.9) AS DOUBLE) / 0.834) < 0.05 true # csv_query_cube_avg -query SIF +query TIR SELECT c1, c2, AVG(c3) FROM aggregate_test_100_by_sql GROUP BY CUBE (c1, c2) ORDER BY c1, c2 ---- a 1 -17.6 @@ -700,7 +700,7 @@ NULL 5 -13.857142857143 NULL NULL 7.81 # csv_query_rollup_avg -query SIIF +query TIIR SELECT c1, c2, c3, AVG(c4) FROM aggregate_test_100_by_sql WHERE c1 IN ('a', 'b', NULL) GROUP BY ROLLUP (c1, c2, c3) ORDER BY c1, c2, c3 ---- a 1 -85 -15154 @@ -757,7 +757,7 @@ b NULL NULL 7732.315789473684 NULL NULL NULL 3833.525 # csv_query_approx_percentile_cont_with_weight -query SI +query TI SELECT c1, approx_percentile_cont(c3, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -767,7 +767,7 @@ d 124 e 115 # csv_query_approx_percentile_cont_with_weight (2) -query SI +query TI SELECT c1, approx_percentile_cont_with_weight(c3, 1, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -777,7 +777,7 @@ d 124 e 115 # csv_query_approx_percentile_cont_with_histogram_bins -query SI +query TI SELECT c1, approx_percentile_cont(c3, 0.95, 200) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 73 @@ -786,7 +786,7 @@ c 122 d 124 e 115 -query SI +query TI SELECT c1, approx_percentile_cont_with_weight(c3, c2, 0.95) AS c3_p95 FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 74 @@ -796,7 +796,7 @@ d 124 e 115 # csv_query_sum_crossjoin -query SSI +query TTI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY a.c1, b.c1 ORDER BY a.c1, b.c1 ---- a a 1260 @@ -826,7 +826,7 @@ e d 1134 e e 1323 # csv_query_cube_sum_crossjoin -query SSI +query TTI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY CUBE (a.c1, b.c1) ORDER BY a.c1, b.c1 ---- a a 1260 @@ -867,7 +867,7 @@ NULL e 5985 NULL NULL 28500 # csv_query_cube_distinct_count -query SII +query TII SELECT c1, c2, COUNT(DISTINCT c3) FROM aggregate_test_100 GROUP BY CUBE (c1,c2) ORDER BY c1,c2 ---- a 1 5 @@ -908,7 +908,7 @@ NULL 5 14 NULL NULL 80 # csv_query_rollup_distinct_count -query SII +query TII SELECT c1, c2, COUNT(DISTINCT c3) FROM aggregate_test_100 GROUP BY ROLLUP (c1,c2) ORDER BY c1,c2 ---- a 1 5 @@ -944,7 +944,7 @@ e NULL 18 NULL NULL 80 # csv_query_rollup_sum_crossjoin -query SSI +query TTI SELECT a.c1, b.c1, SUM(a.c2) FROM aggregate_test_100 as a CROSS JOIN aggregate_test_100 as b GROUP BY ROLLUP (a.c1, b.c1) ORDER BY a.c1, b.c1 ---- a a 1260 @@ -1004,7 +1004,7 @@ SELECT array_agg(c13) FROM (SELECT * FROM aggregate_test_100 ORDER BY c13 LIMIT [0VVIHzxWtNOFLtnhjHEKjXaJOSLJfm] # csv_query_array_agg_with_overflow -query IIFIII +query IIRIII select c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count(c3) count_c3 from aggregate_test_100 group by c2 order by c2 ---- 1 367 16.681818181818 125 -99 22 @@ -1018,7 +1018,7 @@ select c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count # SELECT array_agg(c13 ORDER BY c1) FROM aggregate_test_100; # csv_query_array_cube_agg_with_overflow -query SIIFIII +query TIIRIII select c1, c2, sum(c3) sum_c3, avg(c3) avg_c3, max(c3) max_c3, min(c3) min_c3, count(c3) count_c3 from aggregate_test_100 group by CUBE (c1,c2) order by c1, c2 ---- a 1 -88 -17.6 83 -85 5 @@ -1095,33 +1095,33 @@ NULL NULL 781 7.81 125 -117 100 # TODO: aggregate_timestamps_avg # aggregate_time_min_and_max -query SS +query TT select min(t), max(t) from (select '00:00:00' as t union select '00:00:01' union select '00:00:02') ---- 00:00:00 00:00:02 # aggregate_decimal_min -query F +query R select min(c1) from d_table ---- -100.009 # aggregate_decimal_max -query F +query R select max(c1) from d_table ---- 110.009 # FIX: doesn't check datatype # aggregate_decimal_sum -query F +query R select sum(c1) from d_table ---- 100 # FIX: doesn't check datatype # aggregate_decimal_avg -query F +query R select avg(c1) from d_table ---- 5 @@ -1168,7 +1168,7 @@ select avg(c1) from d_table # TODO: simple_mean # query_sum_distinct - 2 different aggregate functions: avg and sum(distinct) -query FI +query RI SELECT AVG(c1), SUM(DISTINCT c2) FROM test ---- 1.75 3 @@ -1206,7 +1206,7 @@ SELECT COUNT(DISTINCT c1) FROM test # [[1]] # test_approx_percentile_cont_decimal_support -query SI +query TI SELECT c1, approx_percentile_cont(c2, cast(0.85 as decimal(10,2))) apc FROM aggregate_test_100 GROUP BY 1 ORDER BY 1 ---- a 4 @@ -1230,13 +1230,13 @@ SELECT ARRAY_AGG([1]); [[1]] # variance_single_value -query FFFF +query RRRR select var(sq.column1), var_pop(sq.column1), stddev(sq.column1), stddev_pop(sq.column1) from (values (1.0)) as sq; ---- NULL 0 NULL 0 # variance_two_values -query FFFF +query RRRR select var(sq.column1), var_pop(sq.column1), stddev(sq.column1), stddev_pop(sq.column1) from (values (1.0), (3.0)) as sq; ---- 2 1 1.414213562373 1 @@ -1261,7 +1261,7 @@ NULL 1 NULL 2 # avg should be null -query FI +query RI SELECT avg(column1), column2 from the_nulls group by column2 order by column2; ---- NULL 1 diff --git a/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt b/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt index d9dbb99520ce5..8f1c006510f68 100644 --- a/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt +++ b/datafusion/core/tests/sqllogictests/test_files/arrow_typeof.slt @@ -16,37 +16,37 @@ # under the License. # arrow_typeof_null -query S +query T SELECT arrow_typeof(null) ---- Null # arrow_typeof_boolean -query S +query T SELECT arrow_typeof(true) ---- Boolean # arrow_typeof_i64 -query S +query T SELECT arrow_typeof(1) ---- Int64 # arrow_typeof_i32 -query S +query T SELECT arrow_typeof(1::int) ---- Int32 # arrow_typeof_f64 -query S +query T SELECT arrow_typeof(1.0) ---- Float64 # arrow_typeof_f32 -query S +query T SELECT arrow_typeof(1.0::float) ---- Float32 diff --git a/datafusion/core/tests/sqllogictests/test_files/dates.slt b/datafusion/core/tests/sqllogictests/test_files/dates.slt index 3c777a9bc363b..65234b29d2b7b 100644 --- a/datafusion/core/tests/sqllogictests/test_files/dates.slt +++ b/datafusion/core/tests/sqllogictests/test_files/dates.slt @@ -38,7 +38,7 @@ CREATE TABLE test( ; -query S rowsort +query T rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '1 days'; @@ -50,7 +50,7 @@ f g h -query S rowsort +query T rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days'; @@ -59,7 +59,7 @@ g h # date and other predicate -query S rowsort +query T rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days' AND i_item_desc != 'g'; @@ -67,7 +67,7 @@ where d3_date > d2_date + INTERVAL '5 days' AND i_item_desc != 'g'; h # swap predicate order -query S rowsort +query T rowsort select i_item_desc from test where i_item_desc != 'g' AND d3_date > d2_date + INTERVAL '5 days'; @@ -75,7 +75,7 @@ where i_item_desc != 'g' AND d3_date > d2_date + INTERVAL '5 days'; h ## Use OR -query S rowsort +query T rowsort select i_item_desc from test where d3_date > d2_date + INTERVAL '5 days' OR d3_date = d2_date + INTERVAL '3 days'; diff --git a/datafusion/core/tests/sqllogictests/test_files/ddl.slt b/datafusion/core/tests/sqllogictests/test_files/ddl.slt index 85319c4281358..642093c364f3d 100644 --- a/datafusion/core/tests/sqllogictests/test_files/ddl.slt +++ b/datafusion/core/tests/sqllogictests/test_files/ddl.slt @@ -209,7 +209,7 @@ CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as statement ok CREATE TABLE my_table AS SELECT * FROM aggregate_simple -query FFB rowsort +query RRB rowsort SELECT * FROM my_table order by c1 LIMIT 1 ---- 0.00001 0.000000000001 true @@ -234,7 +234,7 @@ DROP TABLE non_existent_table; statement ok CREATE TABLE my_table(c1 float, c2 double, c3 boolean, c4 varchar) AS SELECT *,c3 as c4_tmp FROM aggregate_simple; -query FFBS rowsort +query RRBT rowsort SELECT * FROM my_table order by c1 LIMIT 1 ---- 0.00001 0.000000000001 true 1 @@ -254,7 +254,7 @@ CREATE TABLE my_table(c1 float, c2 double, c3 boolean, c4 varchar) AS SELECT * F statement ok CREATE TABLE my_table(c1 int, c2 float, c3 varchar) AS VALUES(1, 2, 'hello') -query IFS rowsort +query IRT rowsort SELECT * FROM my_table; ---- 1 2 hello @@ -326,7 +326,7 @@ STORED AS CSV WITH HEADER ROW LOCATION '../../testing/data/csv/aggregate_test_100.csv'; -query SIIIIIIIIIFFS +query TIIIIIIIIIRRT SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, 10, c11, c12, c13 FROM aggregate_test_100 LIMIT 1; ---- c 2 1 18109 2033001162 -6513304855495910254 25 43062 1491205016 10 0.110830784 0.929409733247 6WfVFBVGJSQb7FhA7E0lBwdvjfZnSW @@ -340,7 +340,7 @@ name VARCHAR, ts TIMESTAMP ) STORED AS CSV LOCATION 'tests/data/timestamps.csv'; -query ST +query TP SELECT * from csv_with_timestamps ---- Jorge 2018-12-13T12:12:10.011 @@ -366,7 +366,7 @@ STORED AS CSV PARTITIONED BY (c_date) LOCATION 'tests/data/partitioned_table'; -query ST? +query TP? SELECT * from csv_with_timestamps where c_date='2018-11-13' ---- Jorge 2018-12-13T12:12:10.011 2018-11-13 @@ -406,12 +406,12 @@ statement ok CREATE EXTERNAL TABLE aggregate_simple STORED AS CSV WITH HEADER ROW DELIMITER '|' LOCATION 'tests/data/aggregate_simple_pipe.csv'; -query FFB +query RRB SELECT * FROM aggregate_simple order by c1 LIMIT 1; ---- 0.00001 0.000000000001 true -query FFB +query RRB SELECT * FROM aggregate_simple order by c1 DESC LIMIT 1; ---- 0.00005 0.000000000005 true @@ -474,13 +474,13 @@ statement ok CREATE OR REPLACE TABLE TABLE_WITH_NORMALIZATION(FIELD1 BIGINT, FIELD2 BIGINT); # Check table name is in lowercase -query SSSS +query TTTT show create table table_with_normalization ---- datafusion public table_with_normalization NULL # Check column name is in uppercase -query SSS +query TTT describe table_with_normalization ---- field1 Int64 NO @@ -494,24 +494,24 @@ statement ok CREATE TABLE TABLE_WITHOUT_NORMALIZATION(FIELD1 BIGINT, FIELD2 BIGINT) AS VALUES (1,2); # Check table name is in uppercase -query SSSS +query TTTT show create table TABLE_WITHOUT_NORMALIZATION ---- datafusion public TABLE_WITHOUT_NORMALIZATION NULL # Check column name is in uppercase -query SSS +query TTT describe TABLE_WITHOUT_NORMALIZATION ---- FIELD1 Int64 YES FIELD2 Int64 YES -query F +query R select 10000000000000000000.01 ---- 10000000000000000000 -query S +query T select arrow_typeof(10000000000000000000.01) ---- Float64 @@ -519,12 +519,12 @@ Float64 statement ok set datafusion.sql_parser.parse_float_as_decimal = true; -query F +query R select 10000000000000000000.01 ---- 10000000000000000000.01 -query S +query T select arrow_typeof(10000000000000000000.01) ---- Decimal128(22, 2) diff --git a/datafusion/core/tests/sqllogictests/test_files/decimal.slt b/datafusion/core/tests/sqllogictests/test_files/decimal.slt index 917abebc9237d..f3692253564ea 100644 --- a/datafusion/core/tests/sqllogictests/test_files/decimal.slt +++ b/datafusion/core/tests/sqllogictests/test_files/decimal.slt @@ -15,21 +15,21 @@ # specific language governing permissions and limitations # under the License. -query SF +query TR select arrow_typeof(cast(1.23 as decimal(10,4))), cast(1.23 as decimal(10,4)); ---- Decimal128(10, 4) 1.23 -query SF +query TR select arrow_typeof(cast(cast(1.23 as decimal(10,3)) as decimal(10,4))), cast(cast(1.23 as decimal(10,3)) as decimal(10,4)); ---- Decimal128(10, 4) 1.23 -query SF +query TR select arrow_typeof(cast(1.2345 as decimal(24,2))), cast(1.2345 as decimal(24,2)); ---- Decimal128(24, 2) 1.23 @@ -48,13 +48,13 @@ WITH HEADER ROW LOCATION 'tests/data/decimal_data.csv'; -query SS +query TT select arrow_typeof(c1), arrow_typeof(c5) from decimal_simple where c1 > c5 limit 1; ---- Decimal128(10, 6) Decimal128(12, 7) -query F rowsort +query R rowsort SELECT c1 from decimal_simple; ---- 0.00001 @@ -74,7 +74,7 @@ SELECT c1 from decimal_simple; 0.00005 -query F rowsort +query R rowsort select c1 from decimal_simple where c1 > 0.000030; ---- 0.00004 @@ -88,7 +88,7 @@ select c1 from decimal_simple where c1 > 0.000030; 0.00005 -query FFIBF rowsort +query RRIBR rowsort select * from decimal_simple where c1 > c5; ---- 0.00002 0.000000000002 3 false 0.000019 @@ -96,13 +96,13 @@ select * from decimal_simple where c1 > c5; 0.00005 0.000000000005 8 false 0.000033 -query SF +query TR select arrow_typeof(min(c1)), min(c1) from decimal_simple where c4=false; ---- Decimal128(10, 6) 0.00002 -query SF +query TR select arrow_typeof(max(c1)), max(c1) from decimal_simple where c4=false; ---- Decimal128(10, 6) 0.00005 @@ -110,7 +110,7 @@ Decimal128(10, 6) 0.00005 # inferred precision is 10+10 # inferred scale is the original scale -query SF +query TR select arrow_typeof(sum(c1)), sum(c1) from decimal_simple; ---- Decimal128(20, 6) 0.00055 @@ -118,20 +118,20 @@ Decimal128(20, 6) 0.00055 # inferred precision is original precision + 4 # inferred scale is the original scale + 4 -query SF +query TR select arrow_typeof(avg(c1)), avg(c1) from decimal_simple; ---- Decimal128(14, 10) 0.0000366666 -query FFIBF rowsort +query RRIBR rowsort select * from decimal_simple where c1=CAST(0.00002 as Decimal(10,8)); ---- 0.00002 0.000000000002 2 true 0.000025 0.00002 0.000000000002 3 false 0.000019 -query FI rowsort +query RI rowsort select c2,c3 from decimal_simple where c1!=0.00002; ---- 0.000000000001 1 @@ -149,13 +149,13 @@ select c2,c3 from decimal_simple where c1!=0.00002; 0.000000000005 9 -query FFIBF +query RRIBR select * from decimal_simple where 0.00002 > c1; ---- 0.00001 0.000000000001 1 true 0.000014 -query FFIBF rowsort +query RRIBR rowsort select * from decimal_simple where c1 <= 0.00002; ---- 0.00001 0.000000000001 1 true 0.000014 @@ -163,7 +163,7 @@ select * from decimal_simple where c1 <= 0.00002; 0.00002 0.000000000002 3 false 0.000019 -query FFIBF rowsort +query RRIBR rowsort select * from decimal_simple where c1 > 0.00002; ---- 0.00003 0.000000000003 4 true 0.000032 @@ -180,7 +180,7 @@ select * from decimal_simple where c1 > 0.00002; 0.00005 0.000000000005 9 true 0.000052 -query FFIBF rowsort +query RRIBR rowsort select * from decimal_simple where c1 >= 0.00002; ---- 0.00002 0.000000000002 2 true 0.000025 @@ -199,13 +199,13 @@ select * from decimal_simple where c1 >= 0.00002; 0.00005 0.000000000005 9 true 0.000052 -query S +query T select arrow_typeof(c1+1) from decimal_simple limit 1; ---- Decimal128(27, 6) -query F rowsort +query R rowsort select c1+1 from decimal_simple; ---- 1.00001 @@ -226,13 +226,13 @@ select c1+1 from decimal_simple; # array decimal(10,6) + array decimal(12,7) => decimal(13,7) -query S +query T select arrow_typeof(c1+c5) from decimal_simple limit 1; ---- Decimal128(13, 7) -query F rowsort +query R rowsort select c1+c5 from decimal_simple; ---- 0.000024 @@ -252,13 +252,13 @@ select c1+c5 from decimal_simple; 0.00015 -query S +query T select arrow_typeof(c1-1) from decimal_simple limit 1; ---- Decimal128(27, 6) -query F rowsort +query R rowsort select c1-1 from decimal_simple; ---- -0.99995 @@ -278,13 +278,13 @@ select c1-1 from decimal_simple; -0.99999 -query S +query T select arrow_typeof(c1-c5) from decimal_simple limit 1; ---- Decimal128(13, 7) -query F rowsort +query R rowsort select c1-c5 from decimal_simple; ---- -0.000002 @@ -304,13 +304,13 @@ select c1-c5 from decimal_simple; 0.000019 -query S +query T select arrow_typeof(c1*20) from decimal_simple limit 1; ---- Decimal128(31, 6) -query F rowsort +query R rowsort select c1*20 from decimal_simple; ---- 0.0002 @@ -330,13 +330,13 @@ select c1*20 from decimal_simple; 0.001 -query S +query T select arrow_typeof(c1*c5) from decimal_simple limit 1; ---- Decimal128(23, 13) -query F rowsort +query R rowsort select c1*c5 from decimal_simple; ---- 0.00000000014 @@ -356,13 +356,13 @@ select c1*c5 from decimal_simple; 0.000000005 -query S +query T select arrow_typeof(c1/cast(0.00001 as decimal(5,5))) from decimal_simple limit 1; ---- Decimal128(21, 12) -query F rowsort +query R rowsort select c1/cast(0.00001 as decimal(5,5)) from decimal_simple; ---- 1 @@ -382,13 +382,13 @@ select c1/cast(0.00001 as decimal(5,5)) from decimal_simple; 5 -query S +query T select arrow_typeof(c1/c5) from decimal_simple limit 1; ---- Decimal128(30, 19) -query F rowsort +query R rowsort select c1/c5 from decimal_simple; ---- 0.5 @@ -408,13 +408,13 @@ select c1/c5 from decimal_simple; 2.727272727273 -query S +query T select arrow_typeof(c5%cast(0.00001 as decimal(5,5))) from decimal_simple limit 1; ---- Decimal128(7, 7) -query F rowsort +query R rowsort select c5%cast(0.00001 as decimal(5,5)) from decimal_simple; ---- 0 @@ -434,13 +434,13 @@ select c5%cast(0.00001 as decimal(5,5)) from decimal_simple; 0.000009 -query S +query T select arrow_typeof(c1%c5) from decimal_simple limit 1; ---- Decimal128(11, 7) -query F rowsort +query R rowsort select c1%c5 from decimal_simple; ---- 0 @@ -460,13 +460,13 @@ select c1%c5 from decimal_simple; 0.00005 -query S +query T select arrow_typeof(abs(c1)) from decimal_simple limit 1; ---- Float64 -query F rowsort +query R rowsort SELECT abs(c1) from decimal_simple; ---- 0.00001 @@ -486,7 +486,7 @@ SELECT abs(c1) from decimal_simple; 0.00005 -query FFIBF +query RRIBR select * from decimal_simple where c1 >= 0.00004 order by c1; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -500,7 +500,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1; 0.00005 0.000000000005 1 false 0.0001 -query FFIBF +query RRIBR select * from decimal_simple where c1 >= 0.00004 order by c1 limit 10; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -514,7 +514,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 limit 10; 0.00005 0.000000000005 1 false 0.0001 -query FFIBF +query RRIBR select * from decimal_simple where c1 >= 0.00004 order by c1 limit 5; ---- 0.00004 0.000000000004 5 true 0.000044 @@ -524,7 +524,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 limit 5; 0.00005 0.000000000005 9 true 0.000052 -query FFIBF +query RRIBR select * from decimal_simple where c1 >= 0.00004 order by c1 desc; ---- 0.00005 0.000000000005 9 true 0.000052 @@ -538,7 +538,7 @@ select * from decimal_simple where c1 >= 0.00004 order by c1 desc; 0.00004 0.000000000004 8 false 0.000044 -query FFIBF +query RRIBR select * from decimal_simple where c1 < 0.00003 order by c1 desc,c4; ---- 0.00002 0.000000000002 3 false 0.000019 @@ -546,7 +546,7 @@ select * from decimal_simple where c1 < 0.00003 order by c1 desc,c4; 0.00001 0.000000000001 1 true 0.000014 -query IF +query IR select count(*),c1 from decimal_simple group by c1 order by c1; ---- 1 0.00001 @@ -556,7 +556,7 @@ select count(*),c1 from decimal_simple group by c1 order by c1; 5 0.00005 -query IFB +query IRB select count(*),c1,c4 from decimal_simple group by c1,c4 order by c1,c4; ---- 1 0.00001 true @@ -570,25 +570,25 @@ select count(*),c1,c4 from decimal_simple group by c1,c4 order by c1,c4; 3 0.00005 true -query SF +query TR select arrow_typeof(cast(400420638.54 as decimal(12,2))), cast(400420638.54 as decimal(12,2)); ---- Decimal128(12, 2) 400420638.54 -query SF +query TR select arrow_typeof(cast(400420638.54 as decimal(12,2)) * 1.0), cast(400420638.54 as decimal(12,2)) * 1.0; ---- Float64 400420638.54 -query SB +query TB select arrow_typeof(a < null), a < null from (values (1.1::decimal)) as t(a); ---- Boolean NULL -query SB +query TB select arrow_typeof(null <= a), null <= a from (values (1.1::decimal)) as t(a); ---- Boolean NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/describe.slt b/datafusion/core/tests/sqllogictests/test_files/describe.slt index 127c388f28515..9862f658068bd 100644 --- a/datafusion/core/tests/sqllogictests/test_files/describe.slt +++ b/datafusion/core/tests/sqllogictests/test_files/describe.slt @@ -26,7 +26,7 @@ set datafusion.catalog.information_schema = true statement ok CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as CSV WITH HEADER ROW LOCATION 'tests/data/aggregate_simple.csv'; -query SSS rowsort +query TTT rowsort DESCRIBE aggregate_simple; ---- c1 Float32 NO @@ -46,7 +46,7 @@ set datafusion.catalog.information_schema = false statement ok CREATE external table aggregate_simple(c1 real, c2 double, c3 boolean) STORED as CSV WITH HEADER ROW LOCATION 'tests/data/aggregate_simple.csv'; -query SSS rowsort +query TTT rowsort DESCRIBE aggregate_simple; ---- c1 Float32 NO diff --git a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt index 20176731a5600..99fdfe30a6668 100644 --- a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt +++ b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt @@ -30,7 +30,7 @@ statement ok set datafusion.catalog.information_schema = true; # Verify the information schema now does exist and is empty -query SSSS rowsort +query TTTT rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -61,7 +61,7 @@ set datafusion.catalog.information_schema = true statement ok create table t as values (1); -query SSSS rowsort +query TTTT rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -74,7 +74,7 @@ datafusion public t BASE TABLE statement ok create table t2 as values (1); -query SSSS rowsort +query TTTT rowsort SELECT * from information_schema.tables; ---- datafusion information_schema columns VIEW @@ -102,7 +102,7 @@ statement ok SET datafusion.execution.target_partitions=7 # show all variables -query SS rowsort +query TT rowsort SHOW ALL ---- datafusion.catalog.create_default_catalog_and_schema true @@ -142,21 +142,21 @@ datafusion.sql_parser.enable_ident_normalization true datafusion.sql_parser.parse_float_as_decimal false # show_variable_in_config_options -query SS +query TT SHOW datafusion.execution.batch_size ---- datafusion.execution.batch_size 8192 # show_time_zone_default_utc # https://github.com/apache/arrow-datafusion/issues/3255 -query SS +query TT SHOW TIME ZONE ---- datafusion.execution.time_zone +00:00 # show_timezone_default_utc # https://github.com/apache/arrow-datafusion/issues/3255 -query SS +query TT SHOW TIMEZONE ---- datafusion.execution.time_zone +00:00 @@ -168,7 +168,7 @@ datafusion.execution.time_zone +00:00 statement ok CREATE OR REPLACE TABLE some_table AS VALUES (1,2),(3,4); -query SSS rowsort +query TTT rowsort DESCRIBE some_table ---- column1 Int64 YES @@ -182,7 +182,7 @@ DROP TABLE public.some_table; statement ok CREATE OR REPLACE TABLE public.some_table AS VALUES (1,2),(3,4); -query SSS rowsort +query TTT rowsort DESCRIBE public.some_table ---- column1 Int64 YES @@ -196,7 +196,7 @@ DROP TABLE public.some_table; statement ok CREATE OR REPLACE TABLE datafusion.public.some_table AS VALUES (1,2),(3,4); -query SSS rowsort +query TTT rowsort DESCRIBE datafusion.public.some_table ---- column1 Int64 YES @@ -212,7 +212,7 @@ describe table; # information_schema_show_tables -query SSSS rowsort +query TTTT rowsort SHOW TABLES ---- datafusion information_schema columns VIEW @@ -243,7 +243,7 @@ SHOW COLUMNS FROM t LIKE 'f'; statement error Error during planning: SHOW COLUMNS with WHERE or LIKE is not supported SHOW COLUMNS FROM t WHERE column_name = 'bar'; -query SSSSSS +query TTTTTT SHOW COLUMNS FROM t; ---- datafusion public t i Int32 NO @@ -253,13 +253,13 @@ statement error Error during planning: table 'datafusion.public.T' not found SHOW columns from "T" # information_schema_show_columns_full_extended -query SSSSISSSIIIIIIS +query TTTTITTTIIIIIIT SHOW FULL COLUMNS FROM t; ---- datafusion public t i 0 NULL NO Int32 NULL NULL 32 2 NULL NULL NULL # expect same as above -query SSSSISSSIIIIIIS +query TTTTITTTIIIIIIT SHOW EXTENDED COLUMNS FROM t; ---- datafusion public t i 0 NULL NO Int32 NULL NULL 32 2 NULL NULL NULL @@ -277,12 +277,12 @@ set datafusion.catalog.information_schema = true; # information_schema_show_columns_names() -query SSSSSS +query TTTTTT SHOW columns from public.t ---- datafusion public t i Int32 NO -query SSSSSS +query TTTTTT SHOW columns from datafusion.public.t ---- datafusion public t i Int32 NO @@ -323,7 +323,7 @@ CREATE TABLE abc AS VALUES (1,2,3), (4,5,6); statement ok CREATE VIEW xyz AS SELECT * FROM abc -query SSSS +query TTTT SHOW CREATE TABLE xyz ---- datafusion public xyz CREATE VIEW xyz AS SELECT * FROM abc @@ -344,7 +344,7 @@ CREATE SCHEMA test; statement ok CREATE VIEW test.xyz AS SELECT * FROM abc; -query SSSS +query TTTT SHOW CREATE TABLE test.xyz ---- datafusion test xyz CREATE VIEW test.xyz AS SELECT * FROM abc @@ -365,7 +365,7 @@ CREATE EXTERNAL TABLE abc STORED AS CSV WITH HEADER ROW LOCATION '../../testing/data/csv/aggregate_test_100.csv'; -query SSSS +query TTTT SHOW CREATE TABLE abc; ---- datafusion public abc CREATE EXTERNAL TABLE abc STORED AS CSV LOCATION ../../testing/data/csv/aggregate_test_100.csv diff --git a/datafusion/core/tests/sqllogictests/test_files/join.slt b/datafusion/core/tests/sqllogictests/test_files/join.slt index 834c0eb8a4357..e78925a7faabe 100644 --- a/datafusion/core/tests/sqllogictests/test_files/join.slt +++ b/datafusion/core/tests/sqllogictests/test_files/join.slt @@ -36,7 +36,7 @@ CREATE TABLE grades(grade INT, min INT, max INT) AS VALUES (5, 80, 100); # Regression test: https://github.com/apache/arrow-datafusion/issues/4844 -query SII +query TII SELECT s.*, g.grade FROM students s join grades g on s.mark between g.min and g.max WHERE grade > 2 ORDER BY s.mark DESC ---- Amina 89 5 @@ -70,7 +70,7 @@ ON ( WHERE t2.t2_id > 1 # left semi join with on-filter -query ISI rowsort +query ITI rowsort SELECT t1.t1_id, t1.t1_name, t1.t1_int diff --git a/datafusion/core/tests/sqllogictests/test_files/misc.slt b/datafusion/core/tests/sqllogictests/test_files/misc.slt index acc36432d7a34..848cdc9439147 100644 --- a/datafusion/core/tests/sqllogictests/test_files/misc.slt +++ b/datafusion/core/tests/sqllogictests/test_files/misc.slt @@ -20,7 +20,7 @@ # Show string normalization working # '' --> (empty) # '' --> NULL -query SS? +query TT? select 'foo', '', NULL ---- foo (empty) NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/nullif.slt b/datafusion/core/tests/sqllogictests/test_files/nullif.slt index c5e05b3ec4ea6..f8240f70e3633 100644 --- a/datafusion/core/tests/sqllogictests/test_files/nullif.slt +++ b/datafusion/core/tests/sqllogictests/test_files/nullif.slt @@ -53,7 +53,7 @@ true true -query S rowsort +query T rowsort SELECT NULLIF(text_field, 'zxc') FROM test; ---- NULL diff --git a/datafusion/core/tests/sqllogictests/test_files/order.slt b/datafusion/core/tests/sqllogictests/test_files/order.slt index 345ed1e74cf33..894c4a3c15f41 100644 --- a/datafusion/core/tests/sqllogictests/test_files/order.slt +++ b/datafusion/core/tests/sqllogictests/test_files/order.slt @@ -54,14 +54,14 @@ SELECT id FROM alltypes_plain ORDER BY int_col, double_col # test_order_by_agg_expr -query F +query R SELECT MIN(c12) FROM aggregate_test_100 ORDER BY MIN(c12) ---- 0.014793053078 # test_nulls_first_asc -query IS +query IT SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num ---- 1 one @@ -70,7 +70,7 @@ NULL three # test_nulls_first_desc() -query IS +query IT SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num DESC ---- NULL three @@ -79,7 +79,7 @@ NULL three # test_specific_nulls_last_desc -query IS +query IT SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num DESC NULLS LAST ---- 2 two @@ -87,7 +87,7 @@ SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) NULL three # test_specific_nulls_first_asc -query IS +query IT SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (null, 'three')) AS t (num,letter) ORDER BY num ASC NULLS FIRST ---- NULL three @@ -101,7 +101,7 @@ CREATE EXTERNAL TABLE test (c1 int, c2 bigint, c3 boolean) STORED AS CSV LOCATION 'tests/data/partitioned_csv'; # Demonstrate types -query SSS +query TTT SELECT arrow_typeof(c1), arrow_typeof(c2), arrow_typeof(c3) FROM test LIMIT 1; ---- Int32 Int64 Boolean @@ -229,7 +229,7 @@ create or replace table t as select column1 as value, column2 as time from (sele ) as sq) as sq -query IT rowsort +query IP rowsort select sum(value) AS "value", date_trunc('hour',time) AS "time" @@ -241,7 +241,7 @@ GROUP BY time; 3 2022-01-02T00:00:00 # should work fine -query IT +query IP select sum(value) AS "value", date_trunc('minute',time) AS "time" diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt index 7c6b859c3186b..6026d07b606cc 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_simple.slt @@ -73,7 +73,7 @@ LOCATION '../../testing/data/csv/aggregate_test_100.csv' -query FFFFF +query RRRRR SELECT abs(-1.1) as abs, exp(2.0) as exp, @@ -96,7 +96,7 @@ SELECT 1 as num; 1 -query IIS +query IIT SELECT c2, c3, @@ -206,7 +206,7 @@ ORDER BY c2 ASC, c3 DESC, c10; 5 -101 2243924747182709810 -query IIS +query IIT SELECT c5, c4, @@ -316,7 +316,7 @@ ORDER BY c5 ASC, c4 DESC, c10; 2143473091 -14704 4602675983996931623 -query IFII rowsort +query IRII rowsort SELECT * FROM (VALUES (1,2.0,-3,1+1),(10,20.0,-30,2+2)) AS tbl(int_col, float_col, negative_col, summation); @@ -325,7 +325,7 @@ AS tbl(int_col, float_col, negative_col, summation); 10 20 -30 4 -query IIFIII +query IIRIII SELECT count(*) AS count_all, count(c3) AS count_c3, @@ -338,7 +338,7 @@ FROM aggregate_test_100_by_sql; 100 100 7.81 781 125 -117 -query IIFIII +query IIRIII select c2, sum(c3) sum_c3, @@ -467,7 +467,7 @@ ORDER BY result; 4268716378 -query SIIIIIIIISFFS +query TIIIIIIIITRRT select * from aggregate_test_100_by_sql order by c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13; ---- @@ -586,6 +586,6 @@ CREATE TABLE empty_table ( ); -query SI +query TI select * from empty_table; ---- diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt index dc4c6f0163363..b7497429fa952 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_types.slt @@ -16,23 +16,23 @@ # under the License. -query S +query T select null::VARCHAR ---- NULL -query SS +query TT select 'a'::VARCHAR, ''::VARCHAR ---- a (empty) skipif postgres -query SS +query TT select 'a'::CHAR, ''::CHAR ---- a (empty) -query SS +query TT select 'a'::TEXT, ''::TEXT ---- a (empty) @@ -80,23 +80,23 @@ select 1::BIGINT UNSIGNED ---- 1 -query FFFFF +query RRRRR select 1.0::FLOAT, 1.023::FLOAT, 'NaN'::FLOAT,'+Inf'::FLOAT,'-Inf'::FLOAT ---- 1 1.023 NaN Infinity -Infinity -query FFFFF +query RRRRR select 1.0::REAL, 1.023::REAL, 'NaN'::REAL,'+Inf'::REAL,'-Inf'::REAL ---- 1 1.023 NaN Infinity -Infinity skipif postgres -query FFFFF +query RRRRR select 1.0::DOUBLE, 1.023::DOUBLE, 'NaN'::DOUBLE,'+Inf'::DOUBLE,'-Inf'::DOUBLE ---- 1 1.023 NaN Infinity -Infinity -query FFF +query RRR select 1.0::DECIMAL(5,3) as one, 2.023::DECIMAL(5,3) as two, 3.023::DECIMAL(5,2) as three ---- 1 2.023 3.02 @@ -111,7 +111,7 @@ select '12:00:01'::TIME ---- 12:00:01 -query T +query P select '2018-01-01 12:00:00'::TIMESTAMP ---- 2018-01-01T12:00:00 diff --git a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt index 24c4ec0ae5683..7218b7d8815c9 100644 --- a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt +++ b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_window.slt @@ -301,7 +301,7 @@ ORDER BY c9; 4268716378 100 NULL 4229654142 28774375 4268716378 4268716378 4268716378 63044568 NULL -query IIFIII +query IIRIII SELECT row_number() OVER () AS row_number, count(c3) OVER () AS count_c3, @@ -686,7 +686,7 @@ ORDER BY c8; 64517 2809 63353 10 36599 56980 10 -query IIIFIII +query IIIRIII SELECT c9, row_number() OVER (ORDER BY c2, c9) AS row_number, @@ -800,7 +800,7 @@ ORDER BY row_number; 4268716378 100 100 7.81 781 125 -117 -query IIIFIII +query IIIRIII SELECT c9, row_number() OVER (PARTITION BY c2, c9) AS row_number, @@ -914,7 +914,7 @@ ORDER BY c9; 4268716378 1 14 -13.857142857143 -194 118 -101 -query IIIFIII +query IIIRIII SELECT c9, row_number() OVER (PARTITION BY c2 ORDER BY c9) AS row_number, @@ -1145,7 +1145,7 @@ ORDER BY c9; 2025611582 -2269 231997 199008 5 -45840 56 -15880 5 5 -query IFIIF +query IRIIR select c9, cume_dist() OVER (PARTITION BY c2 ORDER BY c3) cume_dist_by_c3, diff --git a/datafusion/core/tests/sqllogictests/test_files/prepare.slt b/datafusion/core/tests/sqllogictests/test_files/prepare.slt index 6b10ce628b71e..ce4b7217f990e 100644 --- a/datafusion/core/tests/sqllogictests/test_files/prepare.slt +++ b/datafusion/core/tests/sqllogictests/test_files/prepare.slt @@ -22,7 +22,7 @@ statement ok create table person (id int, first_name varchar, last_name varchar, age int, state varchar, salary double, birthday timestamp, "😀" int) as values (1, 'jane', 'smith', 20, 'MA', 100000.45, '2000-11-12T00:00:00'::timestamp, 99); -query ISSISFTI rowsort +query ITTITRPI rowsort select * from person; ---- 1 jane smith 20 MA 100000.45 2000-11-12T00:00:00 99 diff --git a/datafusion/core/tests/sqllogictests/test_files/select.slt b/datafusion/core/tests/sqllogictests/test_files/select.slt index 431b8c9c4f854..8c0bcc558b608 100644 --- a/datafusion/core/tests/sqllogictests/test_files/select.slt +++ b/datafusion/core/tests/sqllogictests/test_files/select.slt @@ -50,7 +50,7 @@ VALUES (1),(2) 2 # multiple rows and columns from VALUES -query IS rowsort +query IT rowsort VALUES (1,'a'),(2,'b') ---- 1 a diff --git a/datafusion/core/tests/sqllogictests/test_files/strings.slt b/datafusion/core/tests/sqllogictests/test_files/strings.slt index 3345d476c7f4f..27ed0e2d0983a 100644 --- a/datafusion/core/tests/sqllogictests/test_files/strings.slt +++ b/datafusion/core/tests/sqllogictests/test_files/strings.slt @@ -32,14 +32,14 @@ CREATE TABLE test( ; # LIKE -query S rowsort +query T rowsort SELECT s FROM test WHERE s LIKE 'p1%'; ---- p1 p1e1 p1m1e1 -query S rowsort +query T rowsort SELECT s FROM test WHERE s LIKE '%m1%'; ---- P1m1e1 @@ -47,7 +47,7 @@ p1m1e1 p2m1e1 # NOT LIKE -query S rowsort +query T rowsort SELECT s FROM test WHERE s NOT LIKE 'p1%'; ---- P1 @@ -60,7 +60,7 @@ p2m1e1 # ILIKE -query S rowsort +query T rowsort SELECT s FROM test WHERE s ILIKE 'p1%'; ---- P1 @@ -71,7 +71,7 @@ p1e1 p1m1e1 # NOT ILIKE -query S rowsort +query T rowsort SELECT s FROM test WHERE s NOT ILIKE 'p1%'; ---- e1 diff --git a/datafusion/core/tests/sqllogictests/test_files/subquery.slt b/datafusion/core/tests/sqllogictests/test_files/subquery.slt index 099d0dc0236bf..70c3c3e13df59 100644 --- a/datafusion/core/tests/sqllogictests/test_files/subquery.slt +++ b/datafusion/core/tests/sqllogictests/test_files/subquery.slt @@ -36,7 +36,7 @@ CREATE TABLE t2(t2_id INT, t2_name TEXT, t2_int INT) AS VALUES # in_subquery_to_join_with_correlated_outer_filter -query ISI rowsort +query ITI rowsort select t1.t1_id, t1.t1_name, t1.t1_int @@ -50,7 +50,7 @@ where t1.t1_id + 12 in ( 44 d 4 # not_in_subquery_to_join_with_correlated_outer_filter -query ISI rowsort +query ITI rowsort select t1.t1_id, t1.t1_name, t1.t1_int diff --git a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt index 73c33f29d414f..dce6213f7eb49 100644 --- a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt +++ b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt @@ -22,7 +22,7 @@ statement ok create table foo (val int, ts timestamp) as values (1, '2000-01-01T00:00:00'::timestamp), (2, '2000-02-01T00:00:00'::timestamp), (3, '2000-03-01T00:00:00'::timestamp); -query IT rowsort +query IP rowsort select * from foo; ---- 1 2000-01-01T00:00:00 @@ -30,36 +30,36 @@ select * from foo; 3 2000-03-01T00:00:00 # Test that we can compare a timestamp to a casted string -query IT rowsort +query IP rowsort select * from foo where ts > '2000-01-01T00:00:00'::timestamp; ---- 2 2000-02-01T00:00:00 3 2000-03-01T00:00:00 # Test that we can compare a timestamp to a string and it will be coerced -query IT rowsort +query IP rowsort select * from foo where ts > '2000-01-01T00:00:00'; ---- 2 2000-02-01T00:00:00 3 2000-03-01T00:00:00 -query IT rowsort +query IP rowsort select * from foo where ts < '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 -query IT rowsort +query IP rowsort select * from foo where ts <= '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 2 2000-02-01T00:00:00 -query IT rowsort +query IP rowsort select * from foo where ts = '2000-02-01T00:00:00'; ---- 2 2000-02-01T00:00:00 -query IT rowsort +query IP rowsort select * from foo where ts != '2000-02-01T00:00:00'; ---- 1 2000-01-01T00:00:00 @@ -71,58 +71,58 @@ drop table foo; ### ## test date_bin function ### -query T +query P SELECT DATE_BIN(INTERVAL '15 minutes', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-01T00:00:00Z') ---- 2022-08-03T14:30:00 # Can coerce string interval arguments -query T +query P SELECT DATE_BIN('15 minutes', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-01T00:00:00Z') ---- 2022-08-03T14:30:00 # Can coerce all string arguments -query T +query P SELECT DATE_BIN('15 minutes', '2022-08-03 14:38:50Z', '1970-01-01T00:00:00Z') ---- 2022-08-03T14:30:00 # Shift forward by 5 minutes -query T +query P SELECT DATE_BIN(INTERVAL '15 minutes', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-01T00:05:00Z') ---- 2022-08-03T14:35:00 # Shift backward by 5 minutes -query T +query P SELECT DATE_BIN(INTERVAL '15 minutes', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-01T23:55:00Z') ---- 2022-08-03T14:25:00 # origin after source, timestamp in previous bucket -query T +query P SELECT DATE_BIN(INTERVAL '15 minutes', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '2022-08-03 14:40:00Z') ---- 2022-08-03T14:25:00 # stride by 7 days -query T +query P SELECT DATE_BIN(INTERVAL '7 days', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-01 00:00:00Z') ---- 2022-07-28T00:00:00 # origin shifts bins forward 1 day -query T +query P SELECT DATE_BIN(INTERVAL '7 days', TIMESTAMP '2022-08-03 14:38:50Z', TIMESTAMP '1970-01-02 00:00:00Z') ---- 2022-07-29T00:00:00 # demonstrates array values (rather than scalar) for the source argument -query TF rowsort +query PR rowsort SELECT DATE_BIN(INTERVAL '15' minute, time, TIMESTAMP '2001-01-01T00:00:00Z') AS time, val @@ -149,37 +149,37 @@ FROM ( ### ## test date_trunc function ### -query T +query P SELECT DATE_TRUNC('year', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-01-01T00:00:00 -query T +query P SELECT DATE_TRUNC('quarter', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-07-01T00:00:00 -query T +query P SELECT DATE_TRUNC('month', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-08-01T00:00:00 -query T +query P SELECT DATE_TRUNC('day', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-08-03T00:00:00 -query T +query P SELECT DATE_TRUNC('hour', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-08-03T14:00:00 -query T +query P SELECT DATE_TRUNC('minute', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-08-03T14:38:00 -query T +query P SELECT DATE_TRUNC('second', TIMESTAMP '2022-08-03 14:38:50Z'); ---- 2022-08-03T14:38:50 @@ -187,7 +187,7 @@ SELECT DATE_TRUNC('second', TIMESTAMP '2022-08-03 14:38:50Z'); # Demonstrate that strings are automatically coerced to timestamps (don't use TIMESTAMP) -query T +query P SELECT DATE_TRUNC('second', '2022-08-03 14:38:50Z'); ---- 2022-08-03T14:38:50 diff --git a/datafusion/core/tests/sqllogictests/test_files/tpch.slt b/datafusion/core/tests/sqllogictests/test_files/tpch.slt index efed4d0e01805..ee9b8d92d5ed4 100644 --- a/datafusion/core/tests/sqllogictests/test_files/tpch.slt +++ b/datafusion/core/tests/sqllogictests/test_files/tpch.slt @@ -118,7 +118,7 @@ CREATE EXTERNAL TABLE IF NOT EXISTS supplier ( # q1 -query SSFFFFFFFI +query TTRRRRRRRI select l_returnflag, l_linestatus, @@ -275,7 +275,7 @@ order by # q6 -query F +query R select sum(l_extendedprice * l_discount) as revenue from @@ -535,7 +535,7 @@ order by 0 9 # q14 -query F +query R select 100.00 * sum(case when p_type like 'PROMO%' @@ -626,7 +626,7 @@ order by # q17 -query F +query R select sum(l_extendedprice) / 7.0 as avg_yearly from @@ -684,7 +684,7 @@ order by # q19 -query F +query R select sum(l_extendedprice* (1 - l_discount)) as revenue from @@ -809,7 +809,7 @@ order by # q22 -query SIF +query TIR select cntrycode, count(*) as numcust, diff --git a/datafusion/core/tests/sqllogictests/test_files/union.slt b/datafusion/core/tests/sqllogictests/test_files/union.slt index ee496ea9fef84..8a13dfe36f273 100644 --- a/datafusion/core/tests/sqllogictests/test_files/union.slt +++ b/datafusion/core/tests/sqllogictests/test_files/union.slt @@ -40,7 +40,7 @@ CREATE TABLE t2( ; # union with EXCEPT(JOIN) -query S rowsort +query T rowsort ( SELECT name FROM t1 EXCEPT @@ -57,7 +57,7 @@ Alice John # union with type coercion -query IS rowsort +query IT rowsort ( SELECT * FROM t1 EXCEPT @@ -158,7 +158,7 @@ SELECT 1 UNION SELECT 2 2 # union_with_except_input -query S rowsort +query T rowsort ( SELECT name FROM t1 EXCEPT @@ -175,7 +175,7 @@ Alice John # union_with_type_coercion -query IS rowsort +query IT rowsort ( SELECT id, name FROM t1 EXCEPT From d6799690fbb2beb3a3841ea567acefc207d504a6 Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Thu, 16 Feb 2023 22:45:16 +0100 Subject: [PATCH 6/7] Update sqllogictest-rs to 0.13.0 --- datafusion/core/Cargo.toml | 2 +- datafusion/core/tests/sqllogictests/src/main.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml index ca00e64f294b8..15702c29c5251 100644 --- a/datafusion/core/Cargo.toml +++ b/datafusion/core/Cargo.toml @@ -117,7 +117,7 @@ postgres-protocol = "0.6.4" postgres-types = { version = "0.2.4", features = ["derive", "with-chrono-0_4"] } rstest = "0.16.0" rust_decimal = { version = "1.27.0", features = ["tokio-pg"] } -sqllogictest = "0.12.0" +sqllogictest = "0.13.0" test-utils = { path = "../../test-utils" } thiserror = "1.0.37" tokio-postgres = "0.7.7" diff --git a/datafusion/core/tests/sqllogictests/src/main.rs b/datafusion/core/tests/sqllogictests/src/main.rs index c2abf6df76589..556949ec6eb7d 100644 --- a/datafusion/core/tests/sqllogictests/src/main.rs +++ b/datafusion/core/tests/sqllogictests/src/main.rs @@ -96,9 +96,13 @@ async fn run_complete_file( let ctx = context_for_test_file(&relative_path).await; let mut runner = sqllogictest::Runner::new(DataFusion::new(ctx, relative_path)); let col_separator = " "; - let validator = default_validator; runner - .update_test_file(path, col_separator, validator) + .update_test_file( + path, + col_separator, + default_validator, + strict_column_validator, + ) .await .map_err(|e| e.to_string())?; From 14abe197c47976093e88ad8140916297906ac92d Mon Sep 17 00:00:00 2001 From: Yevhenii Melnyk Date: Thu, 16 Feb 2023 22:50:31 +0100 Subject: [PATCH 7/7] Complete types --- datafusion/core/tests/sqllogictests/test_files/explain.slt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datafusion/core/tests/sqllogictests/test_files/explain.slt b/datafusion/core/tests/sqllogictests/test_files/explain.slt index 9192a09471480..9eca732c45f32 100644 --- a/datafusion/core/tests/sqllogictests/test_files/explain.slt +++ b/datafusion/core/tests/sqllogictests/test_files/explain.slt @@ -35,7 +35,7 @@ STORED AS CSV WITH HEADER ROW LOCATION '../../testing/data/csv/aggregate_test_100.csv'; -query ?? +query TT explain SELECT c1 FROM aggregate_test_100 where c2 > 10 ---- logical_plan @@ -55,7 +55,7 @@ ProjectionExec: expr=[c1@0 as c1] statement ok set datafusion.explain.physical_plan_only = true -query ?? +query TT EXPLAIN select count(*) from (values ('a', 1, 100), ('a', 2, 150)) as t (c1,c2,c3) ---- physical_plan