This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new d901254dd6 Port tests in expr.rs to sqllogictest (#6240)
d901254dd6 is described below
commit d901254dd66d50f95a74f8851415ac0179d8fb6d
Author: parkma99 <[email protected]>
AuthorDate: Fri May 5 20:49:23 2023 +0800
Port tests in expr.rs to sqllogictest (#6240)
* Port tests in expr.rs to sqllogictest
* fix fmt and clippy error
---------
Co-authored-by: Andrew Lamb <[email protected]>
---
datafusion/core/tests/sql/expr.rs | 225 ---------------------
datafusion/core/tests/sql/mod.rs | 35 ----
.../core/tests/sqllogictests/test_files/scalar.slt | 136 +++++++++++++
3 files changed, 136 insertions(+), 260 deletions(-)
diff --git a/datafusion/core/tests/sql/expr.rs
b/datafusion/core/tests/sql/expr.rs
index 1aa0e137b7..6783670545 100644
--- a/datafusion/core/tests/sql/expr.rs
+++ b/datafusion/core/tests/sql/expr.rs
@@ -545,51 +545,6 @@ async fn test_uuid_expression() -> Result<()> {
Ok(())
}
-#[tokio::test]
-async fn case_with_bool_type_result() -> Result<()> {
- let ctx = SessionContext::new();
- let sql = "select case when 'cpu' != 'cpu' then true else false end";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
-
"+---------------------------------------------------------------------------------+",
- "| CASE WHEN Utf8(\"cpu\") != Utf8(\"cpu\") THEN Boolean(true) ELSE
Boolean(false) END |",
-
"+---------------------------------------------------------------------------------+",
- "| false
|",
-
"+---------------------------------------------------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn in_list_array() -> Result<()> {
- let ctx = SessionContext::new();
- register_aggregate_csv_by_sql(&ctx).await;
- let sql = "SELECT
- c1 IN ('a', 'c') AS utf8_in_true
- ,c1 IN ('x', 'y') AS utf8_in_false
- ,c1 NOT IN ('x', 'y') AS utf8_not_in_true
- ,c1 NOT IN ('a', 'c') AS utf8_not_in_false
- ,NULL IN ('a', 'c') AS utf8_in_null
- FROM aggregate_test_100 WHERE c12 < 0.05";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
-
"+--------------+---------------+------------------+-------------------+--------------+",
- "| utf8_in_true | utf8_in_false | utf8_not_in_true | utf8_not_in_false
| utf8_in_null |",
-
"+--------------+---------------+------------------+-------------------+--------------+",
- "| true | false | true | false
| |",
- "| true | false | true | false
| |",
- "| true | false | true | false
| |",
- "| false | false | true | true
| |",
- "| false | false | true | true
| |",
- "| false | false | true | true
| |",
- "| false | false | true | true
| |",
-
"+--------------+---------------+------------------+-------------------+--------------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
#[tokio::test]
async fn test_extract_date_part() -> Result<()> {
test_expression!("date_part('YEAR', CAST('2000-01-01' AS DATE))",
"2000.0");
@@ -818,115 +773,6 @@ async fn test_in_list_scalar() -> Result<()> {
Ok(())
}
-#[tokio::test]
-async fn csv_query_boolean_eq_neq() {
- let ctx = SessionContext::new();
- register_boolean(&ctx).await.unwrap();
- // verify the plumbing is all hooked up for eq and neq
- let sql = "SELECT a, b, a = b as eq, b = true as eq_scalar, a != b as neq,
a != true as neq_scalar FROM t1";
- let actual = execute_to_batches(&ctx, sql).await;
-
- let expected = vec![
- "+-------+-------+-------+-----------+-------+------------+",
- "| a | b | eq | eq_scalar | neq | neq_scalar |",
- "+-------+-------+-------+-----------+-------+------------+",
- "| true | true | true | true | false | false |",
- "| true | | | | | false |",
- "| true | false | false | false | true | false |",
- "| | true | | true | | |",
- "| | | | | | |",
- "| | false | | false | | |",
- "| false | true | false | true | true | true |",
- "| false | | | | | true |",
- "| false | false | true | false | false | true |",
- "+-------+-------+-------+-----------+-------+------------+",
- ];
- assert_batches_eq!(expected, &actual);
-}
-
-#[tokio::test]
-async fn csv_query_boolean_lt_lt_eq() {
- let ctx = SessionContext::new();
- register_boolean(&ctx).await.unwrap();
- // verify the plumbing is all hooked up for < and <=
- let sql = "SELECT a, b, a < b as lt, b = true as lt_scalar, a <= b as
lt_eq, a <= true as lt_eq_scalar FROM t1";
- let actual = execute_to_batches(&ctx, sql).await;
-
- let expected = vec![
- "+-------+-------+-------+-----------+-------+--------------+",
- "| a | b | lt | lt_scalar | lt_eq | lt_eq_scalar |",
- "+-------+-------+-------+-----------+-------+--------------+",
- "| true | true | false | true | true | true |",
- "| true | | | | | true |",
- "| true | false | false | false | false | true |",
- "| | true | | true | | |",
- "| | | | | | |",
- "| | false | | false | | |",
- "| false | true | true | true | true | true |",
- "| false | | | | | true |",
- "| false | false | false | false | true | true |",
- "+-------+-------+-------+-----------+-------+--------------+",
- ];
- assert_batches_eq!(expected, &actual);
-}
-
-#[tokio::test]
-async fn csv_query_boolean_gt_gt_eq() {
- let ctx = SessionContext::new();
- register_boolean(&ctx).await.unwrap();
- // verify the plumbing is all hooked up for > and >=
- let sql = "SELECT a, b, a > b as gt, b = true as gt_scalar, a >= b as
gt_eq, a >= true as gt_eq_scalar FROM t1";
- let actual = execute_to_batches(&ctx, sql).await;
-
- let expected = vec![
- "+-------+-------+-------+-----------+-------+--------------+",
- "| a | b | gt | gt_scalar | gt_eq | gt_eq_scalar |",
- "+-------+-------+-------+-----------+-------+--------------+",
- "| true | true | false | true | true | true |",
- "| true | | | | | true |",
- "| true | false | true | false | true | true |",
- "| | true | | true | | |",
- "| | | | | | |",
- "| | false | | false | | |",
- "| false | true | false | true | false | false |",
- "| false | | | | | false |",
- "| false | false | false | false | true | false |",
- "+-------+-------+-------+-----------+-------+--------------+",
- ];
- assert_batches_eq!(expected, &actual);
-}
-
-#[tokio::test]
-async fn csv_query_boolean_distinct_from() {
- let ctx = SessionContext::new();
- register_boolean(&ctx).await.unwrap();
- // verify the plumbing is all hooked up for is distinct from and is not
distinct from
- let sql = "SELECT a, b, \
- a is distinct from b as df, \
- b is distinct from true as df_scalar, \
- a is not distinct from b as ndf, \
- a is not distinct from true as ndf_scalar \
- FROM t1";
- let actual = execute_to_batches(&ctx, sql).await;
-
- let expected = vec![
- "+-------+-------+-------+-----------+-------+------------+",
- "| a | b | df | df_scalar | ndf | ndf_scalar |",
- "+-------+-------+-------+-----------+-------+------------+",
- "| true | true | false | false | true | true |",
- "| true | | true | true | false | true |",
- "| true | false | true | true | false | true |",
- "| | true | true | false | false | false |",
- "| | | false | true | true | false |",
- "| | false | true | true | false | false |",
- "| false | true | true | false | false | false |",
- "| false | | true | true | false | false |",
- "| false | false | false | true | true | false |",
- "+-------+-------+-------+-----------+-------+------------+",
- ];
- assert_batches_eq!(expected, &actual);
-}
-
#[tokio::test]
async fn csv_query_nullif_divide_by_0() -> Result<()> {
let ctx = SessionContext::new();
@@ -949,22 +795,6 @@ async fn csv_query_nullif_divide_by_0() -> Result<()> {
assert_eq!(expected, actual);
Ok(())
}
-#[tokio::test]
-async fn csv_count_star() -> Result<()> {
- let ctx = SessionContext::new();
- register_aggregate_csv(&ctx).await?;
- let sql = "SELECT COUNT(*), COUNT(1) AS c, COUNT(c1) FROM
aggregate_test_100";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+-----------------+-----+------------------------------+",
- "| COUNT(UInt8(1)) | c | COUNT(aggregate_test_100.c1) |",
- "+-----------------+-----+------------------------------+",
- "| 100 | 100 | 100 |",
- "+-----------------+-----+------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
#[tokio::test]
async fn csv_query_avg_sqrt() -> Result<()> {
@@ -978,31 +808,6 @@ async fn csv_query_avg_sqrt() -> Result<()> {
Ok(())
}
-// this query used to deadlock due to the call udf(udf())
-#[tokio::test]
-async fn csv_query_sqrt_sqrt() -> Result<()> {
- let ctx = create_ctx();
- register_aggregate_csv(&ctx).await?;
- let sql = "SELECT sqrt(sqrt(c12)) FROM aggregate_test_100 LIMIT 1";
- let actual = execute(&ctx, sql).await;
- // sqrt(sqrt(c12=0.9294097332465232)) = 0.9818650561397431
- let expected = vec![vec!["0.9818650561397431"]];
- assert_float_eq(&expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn csv_query_cbrt_cbrt() -> Result<()> {
- let ctx = create_ctx();
- register_aggregate_csv(&ctx).await?;
- let sql = "SELECT cbrt(cbrt(c12)) FROM aggregate_test_100 LIMIT 1";
- let actual = execute(&ctx, sql).await;
- // cbrt(cbrt(c12=0.9294097332465232)) = 0.9918990366780552
- let expected = vec![vec!["0.9918990366780552"]];
- assert_float_eq(&expected, &actual);
- Ok(())
-}
-
#[tokio::test]
async fn nested_subquery() -> Result<()> {
let ctx = SessionContext::new();
@@ -1032,36 +837,6 @@ async fn nested_subquery() -> Result<()> {
Ok(())
}
-#[tokio::test]
-async fn like_nlike_with_null_lt() {
- let ctx = SessionContext::new();
- let sql = "SELECT column1 like NULL as col_null, NULL like column1 as
null_col from (values('a'), ('b'), (NULL)) as t";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------+----------+",
- "| col_null | null_col |",
- "+----------+----------+",
- "| | |",
- "| | |",
- "| | |",
- "+----------+----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "SELECT column1 not like NULL as col_null, NULL not like column1
as null_col from (values('a'), ('b'), (NULL)) as t";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------+----------+",
- "| col_null | null_col |",
- "+----------+----------+",
- "| | |",
- "| | |",
- "| | |",
- "+----------+----------+",
- ];
- assert_batches_eq!(expected, &actual);
-}
-
#[tokio::test]
async fn comparisons_with_null_lt() {
let ctx = SessionContext::new();
diff --git a/datafusion/core/tests/sql/mod.rs b/datafusion/core/tests/sql/mod.rs
index ba2329839f..6109d69dfd 100644
--- a/datafusion/core/tests/sql/mod.rs
+++ b/datafusion/core/tests/sql/mod.rs
@@ -1039,41 +1039,6 @@ async fn register_aggregate_csv_by_sql(ctx:
&SessionContext) {
);
}
-/// Create table "t1" with two boolean columns "a" and "b"
-async fn register_boolean(ctx: &SessionContext) -> Result<()> {
- let a: BooleanArray = [
- Some(true),
- Some(true),
- Some(true),
- None,
- None,
- None,
- Some(false),
- Some(false),
- Some(false),
- ]
- .iter()
- .collect();
- let b: BooleanArray = [
- Some(true),
- None,
- Some(false),
- Some(true),
- None,
- Some(false),
- Some(true),
- None,
- Some(false),
- ]
- .iter()
- .collect();
-
- let data =
- RecordBatch::try_from_iter([("a", Arc::new(a) as _), ("b", Arc::new(b)
as _)])?;
- ctx.register_batch("t1", data)?;
- Ok(())
-}
-
async fn register_aggregate_simple_csv(ctx: &SessionContext) -> Result<()> {
// It's not possible to use aggregate_test_100 as it doesn't have enough
similar values to test grouping on floats.
let schema = Arc::new(Schema::new(vec![
diff --git a/datafusion/core/tests/sqllogictests/test_files/scalar.slt
b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
index 12248f894f..bdd28eb07a 100644
--- a/datafusion/core/tests/sqllogictests/test_files/scalar.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
@@ -641,6 +641,40 @@ SELECT arrow_typeof(c8), arrow_typeof(c6), arrow_typeof(c8
+ c6) FROM aggregate_
----
Int32 Int64 Int64
+# in list array
+query BBBBB rowsort
+SELECT c1 IN ('a', 'c') AS utf8_in_true
+ ,c1 IN ('x', 'y') AS utf8_in_false
+ ,c1 NOT IN ('x', 'y') AS utf8_not_in_true
+ ,c1 NOT IN ('a', 'c') AS utf8_not_in_false
+ ,NULL IN ('a', 'c') AS utf8_in_null
+FROM aggregate_test_100 WHERE c12 < 0.05
+----
+false false true true NULL
+false false true true NULL
+false false true true NULL
+false false true true NULL
+true false true false NULL
+true false true false NULL
+true false true false NULL
+
+# csv count star
+query III
+SELECT COUNT(*), COUNT(1) AS c, COUNT(c1) FROM aggregate_test_100
+----
+100 100 100
+
+# csv query sqrt sqrt
+query R
+SELECT sqrt(sqrt(c12)) FROM aggregate_test_100 LIMIT 1
+----
+0.98186505614
+
+# csv query cbrt cbrt
+query R
+SELECT cbrt(cbrt(c12)) FROM aggregate_test_100 LIMIT 1
+----
+0.991899036678
statement ok
drop table aggregate_test_100
@@ -857,3 +891,105 @@ query IRRR
SELECT 1ea, 1e-2a, 1E-2-2, 1E-1e2;
----
1 0.01 -1.99 0.1
+
+# case with bool type result
+query B
+SELECT CASE WHEN 'cpu' != 'cpu' THEN true ELSE false END
+----
+false
+
+statement ok
+CREATE TABLE t1(
+ a boolean,
+ b boolean,
+) as VALUES
+ (true, true),
+ (true, null),
+ (true, false),
+ (null, true),
+ (null, null),
+ (null, false),
+ (false, true),
+ (false, null),
+ (false, null)
+;
+
+# csv query boolean eq neq
+query BBBBBB rowsort
+SELECT a, b, a = b as eq, b = true as eq_scalar, a != b as neq, a != true as
neq_scalar FROM t1
+----
+NULL NULL NULL NULL NULL NULL
+NULL false NULL false NULL NULL
+NULL true NULL true NULL NULL
+false NULL NULL NULL NULL true
+false NULL NULL NULL NULL true
+false true false true true true
+true NULL NULL NULL NULL false
+true false false false true false
+true true true true false false
+
+# csv query boolean lt lt eq
+query BBBBBB rowsort
+SELECT a, b, a < b as lt, b = true as lt_scalar, a <= b as lt_eq, a <= true as
lt_eq_scalar FROM t1
+----
+NULL NULL NULL NULL NULL NULL
+NULL false NULL false NULL NULL
+NULL true NULL true NULL NULL
+false NULL NULL NULL NULL true
+false NULL NULL NULL NULL true
+false true true true true true
+true NULL NULL NULL NULL true
+true false false false false true
+true true false true true true
+
+# csv query boolean gt gt eq
+query BBBBBB rowsort
+SELECT a, b, a > b as gt, b = true as gt_scalar, a >= b as gt_eq, a >= true as
gt_eq_scalar FROM t1
+----
+----
+NULL NULL NULL NULL NULL NULL
+NULL false NULL false NULL NULL
+NULL true NULL true NULL NULL
+false NULL NULL NULL NULL false
+false NULL NULL NULL NULL false
+false true false true false false
+true NULL NULL NULL NULL true
+true false true false true true
+true true false true true true
+
+# csv query boolean distinct from
+query BBBBBB rowsort
+SELECT a, b,
+ a is distinct from b as df,
+ b is distinct from true as df_scalar,
+ a is not distinct from b as ndf,
+ a is not distinct from true as ndf_scalar
+FROM t1
+----
+NULL NULL false true true false
+NULL false true true false false
+NULL true true false false false
+false NULL true true false false
+false NULL true true false false
+false true true false false false
+true NULL true true false true
+true false true true false true
+true true false false true true
+
+statement ok
+drop table t1
+
+# like nlike with null lt
+query BB rowsort
+SELECT column1 like NULL as col_null, NULL like column1 as null_col from
(values('a'), ('b'), (NULL)) as t
+----
+NULL NULL
+NULL NULL
+NULL NULL
+
+query BB rowsort
+SELECT column1 not like NULL as col_null, NULL not like column1 as null_col
from (values('a'), ('b'), (NULL)) as t
+----
+NULL NULL
+NULL NULL
+NULL NULL